<?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[Dad Half Dev]]></title><description><![CDATA[A 50/50 routine of parenting and coding. Passive income strategies, automation, AI applications, and overall strategies to spend quality time with my daughter. 👶💻]]></description><link>https://blog.dadhalfdev.com</link><image><url>https://substackcdn.com/image/fetch/$s_!cbkB!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412563c3-4133-4c5c-af4e-4fd94b18f19d_1080x1080.png</url><title>Dad Half Dev</title><link>https://blog.dadhalfdev.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 08 Apr 2026 04:56:10 GMT</lastBuildDate><atom:link href="https://blog.dadhalfdev.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Marco Rodrigues]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[dadhalfdev@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[dadhalfdev@substack.com]]></itunes:email><itunes:name><![CDATA[Marco Rodrigues]]></itunes:name></itunes:owner><itunes:author><![CDATA[Marco Rodrigues]]></itunes:author><googleplay:owner><![CDATA[dadhalfdev@substack.com]]></googleplay:owner><googleplay:email><![CDATA[dadhalfdev@substack.com]]></googleplay:email><googleplay:author><![CDATA[Marco Rodrigues]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The 5 Best Models to Use with AI Agents in April 2026]]></title><description><![CDATA[A selection of five models worth trying with OpenClaw and the Hermes Agent.]]></description><link>https://blog.dadhalfdev.com/p/the-5-best-models-to-use-with-ai</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/the-5-best-models-to-use-with-ai</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Tue, 07 Apr 2026 13:43:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!aTDW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb41b6b-7949-49c1-a337-31f8839fc773_900x563.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aTDW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb41b6b-7949-49c1-a337-31f8839fc773_900x563.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aTDW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb41b6b-7949-49c1-a337-31f8839fc773_900x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aTDW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb41b6b-7949-49c1-a337-31f8839fc773_900x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aTDW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb41b6b-7949-49c1-a337-31f8839fc773_900x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aTDW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb41b6b-7949-49c1-a337-31f8839fc773_900x563.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aTDW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb41b6b-7949-49c1-a337-31f8839fc773_900x563.jpeg" width="900" height="563" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aeb41b6b-7949-49c1-a337-31f8839fc773_900x563.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:563,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!aTDW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb41b6b-7949-49c1-a337-31f8839fc773_900x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aTDW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb41b6b-7949-49c1-a337-31f8839fc773_900x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aTDW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb41b6b-7949-49c1-a337-31f8839fc773_900x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aTDW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faeb41b6b-7949-49c1-a337-31f8839fc773_900x563.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Image by Author</figcaption></figure></div><p>Open-source AI agents like <strong><a href="https://openclaw.ai/">OpenClaw</a></strong> and <strong><a href="https://hermes-agent.nousresearch.com/">Hermes Agent</a></strong> aren&#8217;t necessarily cheaper than <strong><a href="https://claude.ai/">Claude</a></strong>, <strong><a href="https://cursor.com/">Cursor</a></strong>, <strong><a href="https://www.perplexity.ai/computer/new">Perplexity Computer</a></strong>, or other enterprise-grade agents.</p><p>In fact, unless you&#8217;re planning to run local models, the costs can add up quickly.</p><p>For example, if you connect your agents to Claude Opus 4.6 or Gemini 3.1 Pro, you could easily end up spending $100 or more per day, depending on your use case and goals.</p><p>I&#8217;ve experienced this firsthand. I spent over $150 in credits building an AI-agent workflow for a newsletter. You can learn more about it here:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;9be09776-a494-427e-a4e7-b15b8ef35d57&quot;,&quot;caption&quot;:&quot;Everyone is criticizing AI-slop posts and articles on social media, and we all have the right to be mad about it.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;I Built a Niche Newsletter With AI Agents&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:109411725,&quot;name&quot;:&quot;Marco Rodrigues&quot;,&quot;bio&quot;:&quot;50% parenting &#128104;&#8205;&#127868; 50% building with Python &amp; AI &#128187;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4ad2c32-67d4-4e94-a560-8e0c03187db6_1024x1024.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-04-06T13:38:25.489Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!uXkd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe83b1565-dedd-4476-92cd-b5aad3ca0a56_900x563.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.dadhalfdev.com/p/i-built-a-niche-newsletter-with-ai&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:193350636,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:4975150,&quot;publication_name&quot;:&quot;Dad Half Dev&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!cbkB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412563c3-4133-4c5c-af4e-4fd94b18f19d_1080x1080.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>The reason I wrote this listicle is to help you avoid spending as many credits as I did. There&#8217;s no need to overspend unless your goal requires extreme reasoning capabilities.</p><p>Now, let&#8217;s take a look at the top five Large Language Models (LLMs) for AI agents in April 2026.</p><div><hr></div><h3>1. MiniMax M2.7: The Self-Improving Agent</h3><p>MiniMax M2.7 is probably the most fascinating model on this list. Due to its ability to participate in its own improvement loop, a property <strong><a href="https://www.minimax.io/">MiniMax</a></strong> calls &#8220;self-evolution.&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ka35!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d0e8ba-c2ff-45b3-a42a-882e5785b270_900x298.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ka35!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d0e8ba-c2ff-45b3-a42a-882e5785b270_900x298.png 424w, https://substackcdn.com/image/fetch/$s_!Ka35!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d0e8ba-c2ff-45b3-a42a-882e5785b270_900x298.png 848w, https://substackcdn.com/image/fetch/$s_!Ka35!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d0e8ba-c2ff-45b3-a42a-882e5785b270_900x298.png 1272w, https://substackcdn.com/image/fetch/$s_!Ka35!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d0e8ba-c2ff-45b3-a42a-882e5785b270_900x298.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ka35!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d0e8ba-c2ff-45b3-a42a-882e5785b270_900x298.png" width="900" height="298" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/73d0e8ba-c2ff-45b3-a42a-882e5785b270_900x298.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:298,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!Ka35!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d0e8ba-c2ff-45b3-a42a-882e5785b270_900x298.png 424w, https://substackcdn.com/image/fetch/$s_!Ka35!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d0e8ba-c2ff-45b3-a42a-882e5785b270_900x298.png 848w, https://substackcdn.com/image/fetch/$s_!Ka35!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d0e8ba-c2ff-45b3-a42a-882e5785b270_900x298.png 1272w, https://substackcdn.com/image/fetch/$s_!Ka35!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73d0e8ba-c2ff-45b3-a42a-882e5785b270_900x298.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Minimax <a href="https://www.minimax.io/models/text/m27">website</a></figcaption></figure></div><p>During development, M2.7 executed over 100 autonomous optimization cycles on the OpenClaw framework, getting a 30% performance gain without human intervention.</p><p>MiniMax reports 56.22% on SWE-Pro, 55.6% on VIBE-Pro, and 57.0% on Terminal Bench 2. Despite activating only 10 billion parameters (a fraction of its 230 billion total). M2.7 competes with models that are much higher in size.</p><p>This model is also fast and shines in end-to-end software engineering. It can take a project from concept to delivery, troubleshoot production issues, and collaborate across multi-agent setups.</p><p><strong>Specifications:</strong></p><ul><li><p><strong>Provider:</strong> MiniMax (Shanghai-based AI lab)</p></li><li><p><strong>Release Date:</strong> March 18, 2026</p></li><li><p><strong>Ideal use cases:</strong> Autonomous software engineering, multi-agent, and orchestration pipelines.</p></li><li><p><strong>Limitations:</strong> Text-only model.</p></li><li><p><strong>Architecture:</strong> 230B total parameters, 10B activated (Mixture of Experts)</p></li><li><p><strong>Context Window:</strong> ~205,000 tokens</p></li><li><p><strong>Pricing:</strong> $0.30/1M input tokens, $1.20/1M output tokens (~$0.06 blended with cache)</p></li></ul><div><hr></div><h3>2. Qwen3.6-Plus: Alibaba&#8217;s Million-Token Agent</h3><p><strong><a href="https://www.alibabacloud.com/">Alibaba</a></strong> released this model with a full 1 million token context window, meaning you can feed it entire codebases, thousands of pages of legal documents, or hours of meeting transcripts in a single prompt.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2HJD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ac3706-a594-4432-9f41-3abbe23778eb_900x485.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2HJD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ac3706-a594-4432-9f41-3abbe23778eb_900x485.png 424w, https://substackcdn.com/image/fetch/$s_!2HJD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ac3706-a594-4432-9f41-3abbe23778eb_900x485.png 848w, https://substackcdn.com/image/fetch/$s_!2HJD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ac3706-a594-4432-9f41-3abbe23778eb_900x485.png 1272w, https://substackcdn.com/image/fetch/$s_!2HJD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ac3706-a594-4432-9f41-3abbe23778eb_900x485.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2HJD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ac3706-a594-4432-9f41-3abbe23778eb_900x485.png" width="900" height="485" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41ac3706-a594-4432-9f41-3abbe23778eb_900x485.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:485,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!2HJD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ac3706-a594-4432-9f41-3abbe23778eb_900x485.png 424w, https://substackcdn.com/image/fetch/$s_!2HJD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ac3706-a594-4432-9f41-3abbe23778eb_900x485.png 848w, https://substackcdn.com/image/fetch/$s_!2HJD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ac3706-a594-4432-9f41-3abbe23778eb_900x485.png 1272w, https://substackcdn.com/image/fetch/$s_!2HJD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ac3706-a594-4432-9f41-3abbe23778eb_900x485.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Qwen <a href="https://qwen.ai/blog?id=qwen3.6">website</a></figcaption></figure></div><p>The architecture is a hybrid of advanced linear attention and sparse MoE routing, with roughly 80B total parameters and just 3B active in some configurations. Or, in the full Plus variant, 480B total with 35B active.</p><p>Where Qwen3.6-Plus truly distinguishes itself is agentic coding. On SWE-Bench Verified, it scores 78.8%. It excels at repository-level engineering, meaning it can navigate entire codebases, resolve complex bugs, handle frontend development, and support terminal operations for full-stack workflows. Which is pretty much what you need with OpenClaw and Hermes.</p><p>Beyond coding, it&#8217;s a strong general-purpose agent: long-horizon planning, tool-calling, STEM reasoning, and instruction following are all areas where it dominates according to Alibaba&#8217;s benchmarks. It supports multilingual adaptation across 100+ languages and is deeply integrated into Alibaba Cloud Model Studio and the Qwen App ecosystem.</p><p><strong>Specifications:</strong></p><ul><li><p><strong>Provider:</strong> Alibaba / Qwen (Hangzhou, China)</p></li><li><p><strong>Release Date:</strong> April 2, 2026</p></li><li><p><strong>Ideal use cases:</strong> Repository-scale code repair and generation, long-document analysis (legal, medical, financial), multilingual enterprise automation, agentic planning workflows with extensive tool use.</p></li><li><p><strong>Limitations: </strong>No native audio processing.</p></li><li><p><strong>Architecture:</strong> 480B total parameters, 35B active (8 of 160 MoE experts)</p></li><li><p><strong>Context Window:</strong> 1,000,000 tokens</p></li><li><p><strong>Pricing:</strong> Currently free in preview via <a href="https://openrouter.ai/">OpenRouter</a></p></li></ul><div><hr></div><h3>3. GLM 5V-Turbo: Zhipu AI&#8217;s Vision-to-Code Model</h3><p>GLM 5V-Turbo is a multimodal coding foundation model, designed for vision-based coding and agentic workflows. You can feed it a screenshot or a design mockup, and it will generate production-ready frontend code in return. <strong><a href="https://www.perplexity.ai/computer/new">Z.AI</a></strong><a href="https://www.perplexity.ai/computer/new"> </a>claims it is deeply optimized for tools such as Claude Code and OpenClaw.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yO2c!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc08832f7-086d-4576-8387-23c86f0abb58_900x485.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yO2c!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc08832f7-086d-4576-8387-23c86f0abb58_900x485.png 424w, https://substackcdn.com/image/fetch/$s_!yO2c!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc08832f7-086d-4576-8387-23c86f0abb58_900x485.png 848w, https://substackcdn.com/image/fetch/$s_!yO2c!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc08832f7-086d-4576-8387-23c86f0abb58_900x485.png 1272w, https://substackcdn.com/image/fetch/$s_!yO2c!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc08832f7-086d-4576-8387-23c86f0abb58_900x485.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yO2c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc08832f7-086d-4576-8387-23c86f0abb58_900x485.png" width="900" height="485" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c08832f7-086d-4576-8387-23c86f0abb58_900x485.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:485,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!yO2c!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc08832f7-086d-4576-8387-23c86f0abb58_900x485.png 424w, https://substackcdn.com/image/fetch/$s_!yO2c!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc08832f7-086d-4576-8387-23c86f0abb58_900x485.png 848w, https://substackcdn.com/image/fetch/$s_!yO2c!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc08832f7-086d-4576-8387-23c86f0abb58_900x485.png 1272w, https://substackcdn.com/image/fetch/$s_!yO2c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc08832f7-086d-4576-8387-23c86f0abb58_900x485.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Z.ai <a href="https://docs.z.ai/guides/vlm/glm-5v-turbo">documentation page</a></figcaption></figure></div><p>On Design2Code, a benchmark for turning visual designs into functional code, GLM-5V-Turbo scores 94.8, while Claude Opus 4.6 scores 77.3. That is a large gap. Z.AI also reports leading or strong results on GUI navigation benchmarks like AndroidWorld and WebVoyager.</p><p>For pure text coding, GLM-5 remains highly competitive: it scores 77.8% on SWE-Bench Verified, close to Claude Opus 4.5&#8217;s 80.9% in the public comparison.</p><p><strong>Specifications:</strong></p><ul><li><p><strong>Provider:</strong> Zhipu AI (Z.ai) / Tsinghua University</p></li><li><p><strong>Release Date:</strong> April 1, 2026</p></li><li><p><strong>Ideal use cases:</strong> Design-to-code pipelines (Figma/screenshots to HTML/React), GUI automation and testing, multimodal document analysis, and agentic workflows requiring visual grounding</p></li><li><p><strong>Limitations:</strong> Multimodal focus means it may be over-engineered for text-only tasks.</p></li><li><p><strong>Architecture:</strong> 744B total parameters, 40B active (MoE), CogViT vision encoder</p></li><li><p><strong>Context Window:</strong> ~200,000&#8211;203,000 tokens</p></li><li><p><strong>Pricing:</strong> $1.20/1M input tokens, $4.00/1M output tokens</p></li></ul><div><hr></div><h3>4. Gemma 4: Google&#8217;s Best Local Model</h3><p>Gemma 4 from <strong><a href="https://deepmind.google/">Google DeepMind</a> </strong>is here to democratize AI development for millions of users. Released under an Apache 2.0 license, the entire family can be downloaded, modified, and deployed commercially with zero API fees.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4uGi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd35cf83-df51-40a7-a07f-427d5fd097b6_900x492.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4uGi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd35cf83-df51-40a7-a07f-427d5fd097b6_900x492.png 424w, https://substackcdn.com/image/fetch/$s_!4uGi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd35cf83-df51-40a7-a07f-427d5fd097b6_900x492.png 848w, https://substackcdn.com/image/fetch/$s_!4uGi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd35cf83-df51-40a7-a07f-427d5fd097b6_900x492.png 1272w, https://substackcdn.com/image/fetch/$s_!4uGi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd35cf83-df51-40a7-a07f-427d5fd097b6_900x492.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4uGi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd35cf83-df51-40a7-a07f-427d5fd097b6_900x492.png" width="900" height="492" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd35cf83-df51-40a7-a07f-427d5fd097b6_900x492.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:492,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!4uGi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd35cf83-df51-40a7-a07f-427d5fd097b6_900x492.png 424w, https://substackcdn.com/image/fetch/$s_!4uGi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd35cf83-df51-40a7-a07f-427d5fd097b6_900x492.png 848w, https://substackcdn.com/image/fetch/$s_!4uGi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd35cf83-df51-40a7-a07f-427d5fd097b6_900x492.png 1272w, https://substackcdn.com/image/fetch/$s_!4uGi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd35cf83-df51-40a7-a07f-427d5fd097b6_900x492.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Gemma 4 on Google DeepMind <a href="https://deepmind.google/models/gemma/gemma-4/">website</a></figcaption></figure></div><p>The range is remarkable: E2B (~2B parameters) runs on a Raspberry Pi or an NVIDIA Jetson Orin Nano. E4B fits comfortably on mid-range smartphones. The 26B MoE variant activates only ~4 billion parameters while maintaining the capacity of a much larger model.</p><p>The 31B model scores 80% on LiveCodeBench, 85.7% on GPQA Diamond, 88.4% on MMMLU (a multimodal variant), and a knowledge category average of 61.3%. The 26B MoE model hits 77.1% on LiveCodeBench and 82.6% on MMLU-Pro. For context, these are scores that models with 10&#8211;20x the parameters were posting just a year ago.</p><p>The E2B and E4B models include native audio input, and all variants support built-in thinking mode (step-by-step reasoning), function calling for agent workflows, and multilingual support across 140+ languages.</p><p><strong>Specifications:</strong></p><ul><li><p><strong>Provider:</strong> <a href="https://deepmind.google/">Google DeepMind</a></p></li><li><p><strong>Release Date:</strong> April 2, 2026</p></li><li><p><strong>Architecture:</strong> Four variants. E2B (2B), E4B (4B), 26B MoE (~4B active), 31B Dense</p></li><li><p><strong>Ideal use cases:</strong> Offline and edge AI deployments, privacy-sensitive applications, custom fine-tuning for specialized domains, mobile/IoT AI, developer tooling, and local code assistants.</p></li><li><p><strong>Limitations:</strong> The smaller models (E2B/E4B) are ok for lightweight tasks but not replacements for frontier models on complex reasoning. The 31B model, while impressive, still falls behind Gemini 3.1 Pro and Qwen3.6-Plus. No native audio on the larger models (31B and 26B).</p></li><li><p><strong>Context Window:</strong> 128K (E2B/E4B), 256K (26B/31B)</p></li><li><p><strong>License:</strong> Apache 2.0</p></li><li><p><strong>Pricing:</strong> Free (open weights)</p></li></ul><div><hr></div><h3>5. Claude Opus 4.6: The King of Reasoning</h3><p>Claude Opus 4.6 is <a href="https://www.anthropic.com/">Anthropic&#8217;s</a> flagship reasoning model, optimized for complex agentic workflows and planning. It powers advanced multi-agent systems and excels at maintaining coherence across extended interactions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Czp7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d7d25e3-874a-4527-ab43-f234be5745ad_900x525.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Czp7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d7d25e3-874a-4527-ab43-f234be5745ad_900x525.png 424w, https://substackcdn.com/image/fetch/$s_!Czp7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d7d25e3-874a-4527-ab43-f234be5745ad_900x525.png 848w, https://substackcdn.com/image/fetch/$s_!Czp7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d7d25e3-874a-4527-ab43-f234be5745ad_900x525.png 1272w, https://substackcdn.com/image/fetch/$s_!Czp7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d7d25e3-874a-4527-ab43-f234be5745ad_900x525.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Czp7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d7d25e3-874a-4527-ab43-f234be5745ad_900x525.png" width="900" height="525" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3d7d25e3-874a-4527-ab43-f234be5745ad_900x525.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:525,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!Czp7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d7d25e3-874a-4527-ab43-f234be5745ad_900x525.png 424w, https://substackcdn.com/image/fetch/$s_!Czp7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d7d25e3-874a-4527-ab43-f234be5745ad_900x525.png 848w, https://substackcdn.com/image/fetch/$s_!Czp7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d7d25e3-874a-4527-ab43-f234be5745ad_900x525.png 1272w, https://substackcdn.com/image/fetch/$s_!Czp7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d7d25e3-874a-4527-ab43-f234be5745ad_900x525.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Claude Opus 4.6 on Anthropic <a href="https://www.anthropic.com/claude/opus">website</a></figcaption></figure></div><p>The architecture balances massive scale with practical deployment: a 1.4T parameter MoE design activates ~120B parameters per token.</p><p>Claude Opus 4.6 leads most agentic coding benchmarks with 82.3% on SWE-Bench Verified, 94.2% on TerminalBench, and 78.6% on SWE-Pro. It also scores 89.4% on GPQA Diamond and 87.2% on AIME 2026, positioning it among the top 3 overall models.</p><p>All variants include constitutional AI safety guardrails, native multimodal reasoning (text+image), and &#8220;thinking mode&#8221; for step-by-step chain-of-thought. The model shines in repository-scale codebases, production debugging, and enterprise automation requiring strict instruction adherence.</p><p><strong>Specifications:</strong></p><ul><li><p><strong>Provider:</strong> Anthropic</p></li><li><p><strong>Release Date:</strong> March 12, 2026</p></li><li><p><strong>Architecture:</strong> 1.4T MoE (120B active), hybrid dense+sparse attention</p></li><li><p><strong>Ideal use cases:</strong> Enterprise agent orchestration, repository-scale engineering, compliance-heavy automation, multi-agent collaboration, production system debugging</p></li><li><p><strong>Limitations:</strong> Higher latency than smaller specialist models. Very expensive.</p></li><li><p><strong>Context Window:</strong> 1M tokens</p></li><li><p><strong>Pricing:</strong> $5/1M input, $25/1M output (~$8 blended)</p></li></ul><div><hr></div><h3>Conclusion</h3><p>The five LLMs presented in this piece are likely the best ones to power your AI agents at the time of writing.</p><p>In the end, it&#8217;s all about cost and capability. You could use Claude Opus 4.6 in all your tasks, and you would have OpenClaw or Hermes Agent running like a breeze (even if it is not the fastest model). But you would be burning credits like a madman, even if you&#8217;re not doing much.</p><p>You don&#8217;t need to spend $100 a day or more. Here is a quick cheat sheet to help you choose:</p><ul><li><p><strong>MiniMax M2.7:</strong> Choose this if you want an autonomous, self-improving pipeline. It keeps your API bills incredibly low.</p></li><li><p><strong>Qwen3.6-Plus:</strong> If you need to dump an entire codebase, enterprise repository, or a mountain of transcripts into your agent&#8217;s memory. Also free and tailored for AI agents.</p></li><li><p><strong>GLM 5V-Turbo:</strong> The undisputed choice for vision-based tasks. If your workflow involves turning screenshots, Figma mockups, or GUI navigation into functional frontend code, look no further.</p></li><li><p><strong>Gemma 4:</strong> Use it if privacy is a requirement or you want to run offline edge deployments with absolutely zero API fees.</p></li><li><p><strong>Claude Opus 4.6: </strong>For tackling complex enterprise orchestration, strict compliance, or deep multi-step reasoning.</p></li></ul><p>If you&#8217;re just starting, MiniMax M2.7 and Qwen3.6-Plus may be the best options. They&#8217;re cost-effective models, and unlike local models, they don&#8217;t require you to provide as much context upfront.</p><p>The more you understand the agent&#8217;s architecture, the less you need to worry about the model&#8217;s benchmarks, because you&#8217;ll be able to tweak many things before deciding what to ask it to do.</p><p><em><strong>If Hermes or OpenClaw feels overwhelming, there&#8217;s no need to get frustrated. Book a 20-minute consultation, and let&#8217;s find a solution together:</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/qqFfaoq181tppoQj8&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://calendar.app.google/qqFfaoq181tppoQj8"><span>Book a 20-min consultation</span></a></p><p>I&#8217;ve also recently launched an Upwork project where I help people set up a custom OpenClaw or Hermes Agent on a VPS machine. Click <strong><a href="https://www.upwork.com/services/product/development-it-a-single-or-multiple-custom-agents-on-openclaw-or-hermes-2040878391006093208?ref=project_share">here</a></strong> to learn more.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"><strong>Curious about what I&#8217;m building? &#128064;</strong></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[I Built a Niche Newsletter With AI Agents]]></title><description><![CDATA[Learn how I use the Hermes Agent to build specialized profiles for each stage of my newsletter workflow.]]></description><link>https://blog.dadhalfdev.com/p/i-built-a-niche-newsletter-with-ai</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/i-built-a-niche-newsletter-with-ai</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Mon, 06 Apr 2026 13:38:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!uXkd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe83b1565-dedd-4476-92cd-b5aad3ca0a56_900x563.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uXkd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe83b1565-dedd-4476-92cd-b5aad3ca0a56_900x563.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uXkd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe83b1565-dedd-4476-92cd-b5aad3ca0a56_900x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uXkd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe83b1565-dedd-4476-92cd-b5aad3ca0a56_900x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uXkd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe83b1565-dedd-4476-92cd-b5aad3ca0a56_900x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uXkd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe83b1565-dedd-4476-92cd-b5aad3ca0a56_900x563.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uXkd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe83b1565-dedd-4476-92cd-b5aad3ca0a56_900x563.jpeg" width="900" height="563" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e83b1565-dedd-4476-92cd-b5aad3ca0a56_900x563.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:563,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!uXkd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe83b1565-dedd-4476-92cd-b5aad3ca0a56_900x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uXkd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe83b1565-dedd-4476-92cd-b5aad3ca0a56_900x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uXkd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe83b1565-dedd-4476-92cd-b5aad3ca0a56_900x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uXkd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe83b1565-dedd-4476-92cd-b5aad3ca0a56_900x563.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Image by Author</figcaption></figure></div><p>Everyone is criticizing AI-slop posts and articles on social media, and we all have the right to be mad about it.</p><p>Most AI-generated content looks soulless, too agreeable, lacking strong opinions, and often feels repetitive. Without mentioning the &#8220;em&#8221; dashes and the extensive use of words like &#8220;huge&#8221;, &#8220;impressive&#8221;, and &#8220;leverage&#8221;.</p><p>Platforms like <strong>X</strong>, <strong>LinkedIn</strong>, and <strong>Instagram</strong> are being dominated by agents that reply to other people&#8217;s posts to farm engagement. But publishing platforms like <strong>Medium </strong>and <strong>Substack</strong> are no exception. I&#8217;ve found many AI-generated articles there as well.</p><p>Most of them are not pleasant to read, and overall, I think publishing platforms do a good job of not promoting this kind of content. However, some articles are actually pretty good at delivering the message.</p><p>They may not win on creativity, but they can still be informative. Sometimes, you don&#8217;t want to read five super-extensive articles just to stay informed about your niche. You would rather have a single piece that summarizes everything, and that&#8217;s something AI does very well.</p><p>Based on this premise, I decided to build a newsletter with AI agents, not with the aim of being creative or replacing human writing, but with a focus on summarizing information gathered from multiple sources.</p><p>In the following piece, I will explain the steps and decisions I made to create a niche newsletter about AI within the crypto ecosystem using the <strong><a href="https://hermes-agent.nousresearch.com/">Hermes Agent</a></strong> from <strong><a href="https://chat.nousresearch.com/">Nous Research</a></strong>.</p><div><hr></div><h3>A Newsletter About AI and Crypto</h3><p>It&#8217;s easy to find content about Artificial Intelligence (AI) and Crypto, but it&#8217;s not trivial to find a channel that specifically merges these two. They are often two separate worlds.</p><p>This makes me search across multiple blogs and platforms until I find an article where these SOTA (State-of-the-Art) fields converge.</p><p>I wanted to eliminate that friction by creating a newsletter with articles derived from sources that connect AI with crypto and Web3. I called it: <em><strong><a href="https://theagenticblock.substack.com/">The Agentic Block</a></strong></em>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qwYo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bf17fb8-339d-492b-bddf-da8ff40aff29_887x743.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qwYo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bf17fb8-339d-492b-bddf-da8ff40aff29_887x743.png 424w, https://substackcdn.com/image/fetch/$s_!qwYo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bf17fb8-339d-492b-bddf-da8ff40aff29_887x743.png 848w, https://substackcdn.com/image/fetch/$s_!qwYo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bf17fb8-339d-492b-bddf-da8ff40aff29_887x743.png 1272w, https://substackcdn.com/image/fetch/$s_!qwYo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bf17fb8-339d-492b-bddf-da8ff40aff29_887x743.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qwYo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bf17fb8-339d-492b-bddf-da8ff40aff29_887x743.png" width="887" height="743" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1bf17fb8-339d-492b-bddf-da8ff40aff29_887x743.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:743,&quot;width&quot;:887,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!qwYo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bf17fb8-339d-492b-bddf-da8ff40aff29_887x743.png 424w, https://substackcdn.com/image/fetch/$s_!qwYo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bf17fb8-339d-492b-bddf-da8ff40aff29_887x743.png 848w, https://substackcdn.com/image/fetch/$s_!qwYo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bf17fb8-339d-492b-bddf-da8ff40aff29_887x743.png 1272w, https://substackcdn.com/image/fetch/$s_!qwYo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bf17fb8-339d-492b-bddf-da8ff40aff29_887x743.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The Agentic Block newsletter on <a href="https://theagenticblock.substack.com/">Substack</a></figcaption></figure></div><p>Before choosing the theme of the newsletter, I knew I needed to assemble a team of agents, each responsible for distinct tasks, notably:</p><ul><li><p><strong>A data specialist: </strong>This agent is in charge of scraping data from multiple cryptocurrency platforms, checking whether articles are related to AI, agents, and similar topics, filtering the scraped data based on those fields, and uploading the selected articles to <strong><a href="https://supabase.com/">Supabase</a></strong>.</p></li><li><p><strong>A writer: </strong>This agent writes the newsletter. It fetches the most recent articles from Supabase and applies several rules before creating the markdown file, along with three cover images to choose from.</p></li><li><p><strong>A social media manager: </strong>This agent creates an X post based on the piece generated by the writer.</p></li><li><p><strong>A CEO: </strong>This agent delegates tasks to the other agents and is the only one with access to the full repository. The others are sandboxed.</p></li></ul><p>In this article, I&#8217;ll be referring to them as:</p><ul><li><p><strong>Kourou: </strong>The data scientist &amp; data engineering guy.</p></li><li><p><strong>Cayenne:</strong> The writer.</p></li><li><p><strong>Dad Half Bot: </strong>The CEO and main agent.</p></li></ul><p>What about the social media agent? Well, this one hasn&#8217;t been hired yet. I first need to see whether people are reading and subscribing to the newsletter.</p><p>At the moment, I&#8217;m publishing all content on <strong><a href="https://theagenticblock.substack.com/">Substack</a></strong>, and everything is automated except for copying and pasting the content onto the platform. This could also be automated in the future by giving browser access to my agent or by building an automated script with Playwright. However, at this early stage, I want to maintain full control over the pieces they create.</p><p>The following schematic demonstrates how the pipeline works:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Nv-F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3710ad-dfac-4c20-a6a2-bc0969deb24d_900x491.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Nv-F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3710ad-dfac-4c20-a6a2-bc0969deb24d_900x491.png 424w, https://substackcdn.com/image/fetch/$s_!Nv-F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3710ad-dfac-4c20-a6a2-bc0969deb24d_900x491.png 848w, https://substackcdn.com/image/fetch/$s_!Nv-F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3710ad-dfac-4c20-a6a2-bc0969deb24d_900x491.png 1272w, https://substackcdn.com/image/fetch/$s_!Nv-F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3710ad-dfac-4c20-a6a2-bc0969deb24d_900x491.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Nv-F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3710ad-dfac-4c20-a6a2-bc0969deb24d_900x491.png" width="900" height="491" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d3710ad-dfac-4c20-a6a2-bc0969deb24d_900x491.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:491,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!Nv-F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3710ad-dfac-4c20-a6a2-bc0969deb24d_900x491.png 424w, https://substackcdn.com/image/fetch/$s_!Nv-F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3710ad-dfac-4c20-a6a2-bc0969deb24d_900x491.png 848w, https://substackcdn.com/image/fetch/$s_!Nv-F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3710ad-dfac-4c20-a6a2-bc0969deb24d_900x491.png 1272w, https://substackcdn.com/image/fetch/$s_!Nv-F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d3710ad-dfac-4c20-a6a2-bc0969deb24d_900x491.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The Agentic Block newsletter pipeline</figcaption></figure></div><p>Now that you know a little bit more about the project, let&#8217;s take a look at the architecture I chose to build the newsletter.</p><div><hr></div><h3>The AI Orchestration Strategy</h3><p>You are already familiar with the three fundamental pieces (agents) for this newsletter. The main agent <em>Kourou</em> (the data specialist) and <em>Cayenne</em> (the writer).</p><p>Therefore, my goal was to create a simple organization using the agents above. I have both <strong><a href="https://openclaw.ai/">OpenClaw</a></strong> and the <strong><a href="https://hermes-agent.nousresearch.com/">Hermes Agent</a></strong> installed in my remote machine. I just had to decide which one to pick.</p><p>I won&#8217;t cover how to set them up here, but I have two tutorials where you can learn how to do it.</p><p>For the <strong>Hermes Agent</strong>:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;6d70b60a-8bf1-47a3-8f35-6476d4f9ef15&quot;,&quot;caption&quot;:&quot;Since OpenClaw&#8217;s launch, several agents have been created almost every week, and it&#8217;s becoming almost impossible to try them all. But there&#8217;s a new one that has caught the attention of many people, including me.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Hermes: The Only AI Agent That Truly Competes With OpenClaw&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:109411725,&quot;name&quot;:&quot;Marco Rodrigues&quot;,&quot;bio&quot;:&quot;50% parenting &#128104;&#8205;&#127868; 50% building with Python &amp; AI &#128187;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4ad2c32-67d4-4e94-a560-8e0c03187db6_1024x1024.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-03-14T10:39:40.196Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!wl9C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcec81238-c43d-416a-8932-006271d288dc_900x563.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.dadhalfdev.com/p/hermes-the-only-ai-agent-that-truly&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:190923292,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:2,&quot;comment_count&quot;:0,&quot;publication_id&quot;:4975150,&quot;publication_name&quot;:&quot;Dad Half Dev&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!cbkB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412563c3-4133-4c5c-af4e-4fd94b18f19d_1080x1080.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>For <strong>OpenClaw</strong>:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;9ccc23a1-26f9-41da-b4c4-a7c7e4865965&quot;,&quot;caption&quot;:&quot;The first time I used OpenClaw, the best I could do was set up reminders and check the weather.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;10 Tips to Make Your Life Easier With OpenClaw&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:109411725,&quot;name&quot;:&quot;Marco Rodrigues&quot;,&quot;bio&quot;:&quot;50% parenting &#128104;&#8205;&#127868; 50% building with Python &amp; AI &#128187;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4ad2c32-67d4-4e94-a560-8e0c03187db6_1024x1024.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-03-10T14:36:54.299Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!4ObC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa74a8189-d4a8-43bf-a668-52beee8c25b7_900x563.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.dadhalfdev.com/p/10-tips-to-make-your-life-easier&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:190512217,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:2,&quot;comment_count&quot;:1,&quot;publication_id&quot;:4975150,&quot;publication_name&quot;:&quot;Dad Half Dev&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!cbkB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412563c3-4133-4c5c-af4e-4fd94b18f19d_1080x1080.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>As for the remote machine, I&#8217;m using Contabo, a German VPS provider. The instance I use is <strong><a href="https://www.tkqlhce.com/click-101540368-13796474">Cloud VPS 30</a></strong>, which comes with 24GB of RAM, 8vCPU cores, and 400GB SSD for only &#8364;11.20/month.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!x3-n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47f17172-2ba2-45fc-9774-fe4dd26cc32e_900x600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!x3-n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47f17172-2ba2-45fc-9774-fe4dd26cc32e_900x600.png 424w, https://substackcdn.com/image/fetch/$s_!x3-n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47f17172-2ba2-45fc-9774-fe4dd26cc32e_900x600.png 848w, https://substackcdn.com/image/fetch/$s_!x3-n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47f17172-2ba2-45fc-9774-fe4dd26cc32e_900x600.png 1272w, https://substackcdn.com/image/fetch/$s_!x3-n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47f17172-2ba2-45fc-9774-fe4dd26cc32e_900x600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!x3-n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47f17172-2ba2-45fc-9774-fe4dd26cc32e_900x600.png" width="900" height="600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/47f17172-2ba2-45fc-9774-fe4dd26cc32e_900x600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:600,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!x3-n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47f17172-2ba2-45fc-9774-fe4dd26cc32e_900x600.png 424w, https://substackcdn.com/image/fetch/$s_!x3-n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47f17172-2ba2-45fc-9774-fe4dd26cc32e_900x600.png 848w, https://substackcdn.com/image/fetch/$s_!x3-n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47f17172-2ba2-45fc-9774-fe4dd26cc32e_900x600.png 1272w, https://substackcdn.com/image/fetch/$s_!x3-n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47f17172-2ba2-45fc-9774-fe4dd26cc32e_900x600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Pricing options on <a href="https://www.anrdoezrs.net/click-101540368-17083170">Contabo website</a></figcaption></figure></div><p>Note that a VPS is not suitable to run local models like <strong>Gemma 4</strong> or <strong>Qwen3.5</strong>. Not because they can&#8217;t run them, but because they will be very slow.</p><h4>The Paperclip approach</h4><p>Both OpenClaw and the Hermes Agent can be connected to <strong><a href="https://github.com/paperclipai/paperclip">Paperclip</a></strong>, an open-source agent orchestrator that offers a sleek Graphical User Interface (GUI).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LBsN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ef19d9-0617-4c9d-978a-02b600c4b86e_900x528.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LBsN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ef19d9-0617-4c9d-978a-02b600c4b86e_900x528.png 424w, https://substackcdn.com/image/fetch/$s_!LBsN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ef19d9-0617-4c9d-978a-02b600c4b86e_900x528.png 848w, https://substackcdn.com/image/fetch/$s_!LBsN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ef19d9-0617-4c9d-978a-02b600c4b86e_900x528.png 1272w, https://substackcdn.com/image/fetch/$s_!LBsN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ef19d9-0617-4c9d-978a-02b600c4b86e_900x528.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LBsN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ef19d9-0617-4c9d-978a-02b600c4b86e_900x528.png" width="900" height="528" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b2ef19d9-0617-4c9d-978a-02b600c4b86e_900x528.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:528,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!LBsN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ef19d9-0617-4c9d-978a-02b600c4b86e_900x528.png 424w, https://substackcdn.com/image/fetch/$s_!LBsN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ef19d9-0617-4c9d-978a-02b600c4b86e_900x528.png 848w, https://substackcdn.com/image/fetch/$s_!LBsN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ef19d9-0617-4c9d-978a-02b600c4b86e_900x528.png 1272w, https://substackcdn.com/image/fetch/$s_!LBsN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2ef19d9-0617-4c9d-978a-02b600c4b86e_900x528.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://github.com/paperclipai/paperclip">Paperclip</a> organisation chart</figcaption></figure></div><p>With Paperclip, you can literally build a company with zero human interaction. You just need to create the employees (agents) and start assigning them tasks.</p><p>For the Hermes Agent, you need this specific connector (find it <a href="https://github.com/NousResearch/hermes-paperclip-adapter">here</a>) to ensure Paperclip works smoothly.</p><p>And it did, until a certain point&#8230;</p><p>Not only do the agents start doing stuff they were not assigned to, but they also lack important skills and tools, so in the end, I was using the terminal more than the actual GUI.</p><p>I saw many people talking about awesome projects they had built using Paperclip, but it wasn&#8217;t for me. I wanted to have more control over what I was doing, including being able to review the scripts it was generating (my developer mindset kicking in!).</p><h4>Manage multiple Hermes profiles</h4><p>OpenClaw uses workspaces to manage multiple agents, each of which can have its own memory, skills, tools, and configuration files.</p><p>This feature was missing on Hermes until very recently, but a new update fixed it. Instead of workspaces, they call it profiles, and they are isolated Hermes environments.</p><p>This is how you create a new profile (agent):</p><pre><code>hermes profile create kourou       # creates profile + command alias
kourou setup                       # configure API keys and model
kourou chat                        # start chatting</code></pre><p>To see all your profiles, you can run this:</p><pre><code>hermes profile list</code></pre><p>You can also perform other actions, such as cloning them. You can see more at the Hermes <strong><a href="https://hermes-agent.nousresearch.com/docs/user-guide/profiles">documentation page</a></strong>.</p><p>The downside is that the Hermes Agent does not come with a built-in dashboard like OpenClaw to visualize your agents. The good part is that you can ask your main agent to build one from scratch if you need. That&#8217;s the power of vibe-coding!</p><p>Nonetheless, it is worth having an eye on this <a href="https://github.com/outsourc-e/hermes-workspace">GitHub repository</a>.</p><p>For the newsletter, I created a profile for <em>Kourou</em> and another for <em>Cayenne</em>. In addition, I modified their personalities, skins, and skills.</p><p>Whenever I need to make general modifications, such as giving them all the same skill, I simply ask the main agent to do it. But if I need to make tailored adjustments, I speak with both <em>Cayenne</em> and <em>Kourou</em> via chat or Telegram.</p><p>This approach is less visual but more efficient and gives me greater control.</p><p>In the next chapter, I&#8217;m going to show you how I customized each of them.</p><div><hr></div><h3>Customize the Hermes Profiles</h3><p>The skills, tools, personalities, and overall configuration of your profiles must be aligned with their main role within the organization. There&#8217;s no need to provide over twenty skills to an agent if it will only use four most of the time. By reducing the complexity of each profile, you keep the repository clean and avoid triggering unnecessary reasoning and LLM usage just to interpret your prompts.</p><h4>Choose the right model</h4><p>One of the most important decisions when managing multiple profiles is choosing which Large Language Models (LLMs) should power each of them.</p><p>If API costs are not a concern, you can use the most capable models for all your agents, such as Gemini 3.1 Pro or Claude Opus 4.6. These are expensive, but they perform extremely well across most tasks, unless your priority is speed rather than reasoning depth and context handling.</p><p>I like to optimize API usage, so my setup does not rely on the most expensive ones unless I truly need them. Nevertheless, I use <a href="https://openrouter.ai/">OpenRouter</a> to manage all my models, avoiding handling multiple providers.</p><p>However, OpenRouter API requests can create issues when making parallel requests. Because of that, I created a dedicated API key for each of my agents.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!992i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff117ece7-d087-459d-a169-8fb3334ef806_900x297.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!992i!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff117ece7-d087-459d-a169-8fb3334ef806_900x297.png 424w, https://substackcdn.com/image/fetch/$s_!992i!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff117ece7-d087-459d-a169-8fb3334ef806_900x297.png 848w, https://substackcdn.com/image/fetch/$s_!992i!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff117ece7-d087-459d-a169-8fb3334ef806_900x297.png 1272w, https://substackcdn.com/image/fetch/$s_!992i!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff117ece7-d087-459d-a169-8fb3334ef806_900x297.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!992i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff117ece7-d087-459d-a169-8fb3334ef806_900x297.png" width="900" height="297" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f117ece7-d087-459d-a169-8fb3334ef806_900x297.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:297,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!992i!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff117ece7-d087-459d-a169-8fb3334ef806_900x297.png 424w, https://substackcdn.com/image/fetch/$s_!992i!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff117ece7-d087-459d-a169-8fb3334ef806_900x297.png 848w, https://substackcdn.com/image/fetch/$s_!992i!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff117ece7-d087-459d-a169-8fb3334ef806_900x297.png 1272w, https://substackcdn.com/image/fetch/$s_!992i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff117ece7-d087-459d-a169-8fb3334ef806_900x297.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">API keys for each Hermes profile</figcaption></figure></div><p>New models are always coming up on OpenRouter, and it&#8217;s worth paying attention to the free ones like <strong>Qwen3.6-plus. </strong>This model from <a href="https://www.alibabacloud.com/">Alibaba Cloud</a> handles multiple input formats (text, image, and video) and has similar benchmarks to<strong> GLM-5V-Turbo </strong>from<strong> </strong><a href="https://chat.z.ai/">Z.ai</a>. It&#8217;s also optimized for agents and vibe coding.</p><p>If you ask, this is the model I&#8217;m using for most agents and tasks, unless I&#8217;m spawning <em>Cayenne </em>(the writer):</p><pre><code>model:
  default: anthropic/claude-opus-4.6
  provider: openrouter
  base_url: https://openrouter.ai/api/v1
auxiliary:
  vision:
    provider: openrouter
    model: qwen/qwen3.6-plus:free
    timeout: 30
  web_extract:
    provider: openrouter
    model: qwen/qwen3.6-plus:free
  compression:
    provider: openrouter
    model: qwen/qwen3.6-plus:free
  session_search:
    provider: openrouter
    model: qwen/qwen3.6-plus:free
  skills_hub:
    provider: openrouter
    model: qwen/qwen3.6-plus:free
  approval:
    provider: openrouter
    model: qwen/qwen3.6-plus:free
  mcp:
    provider: openrouter
    model: google/gemini-3.1-pro-preview
  flush_memories:
    provider: openrouter
    model: qwen/qwen3.6-plus:free</code></pre><p>The reason she uses <strong>Claude Opus 4.6 </strong>is that she needs a high reasoning effort to come up with a creative article.</p><h4>Telegram chats</h4><p>The best way to communicate with the agents is through a chat interface. At least when you&#8217;re not on your computer.</p><p>I like to use Telegram, because it&#8217;s easy to set up and manage. To start, you need to create a <code>/newbot</code> using <strong>BotFather</strong>.</p><ol><li><p>Open Telegram and search for BotFather.</p></li><li><p>Send <code>/newbot</code></p></li><li><p>Choose a <strong>display name</strong> (e.g., &#8220;Hermes Agent&#8221;).</p></li><li><p>Choose a <strong>username. </strong>This must be unique and end in <code>bot</code> (e.g., <code>my_hermes_bot</code>)</p></li><li><p>BotFather replies with your <strong>API token</strong>.</p></li></ol><p>Now you need to get your user ID. The fastest way is to search for <code>@userinfobot</code>.</p><p>Finally, you can add your user ID and the Telegram API token inside the <code>.env</code> files of each of your agents:</p><pre><code>TELEGRAM_BOT_TOKEN=8566...
TELEGRAM_ALLOWED_USERS=835...
TELEGRAM_HOME_CHANNEL=835...</code></pre><p>This should be enough to start chatting after you restart the gateway:</p><pre><code>systemctl --user restart hermes-gateway hermes-gateway-kourou hermes-gateway-cayenne</code></pre><p>Ideally, you&#8217;ll get something that looks like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tKbI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa76499a2-2ab2-42d7-b517-15d8476838c1_900x597.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tKbI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa76499a2-2ab2-42d7-b517-15d8476838c1_900x597.png 424w, https://substackcdn.com/image/fetch/$s_!tKbI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa76499a2-2ab2-42d7-b517-15d8476838c1_900x597.png 848w, https://substackcdn.com/image/fetch/$s_!tKbI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa76499a2-2ab2-42d7-b517-15d8476838c1_900x597.png 1272w, https://substackcdn.com/image/fetch/$s_!tKbI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa76499a2-2ab2-42d7-b517-15d8476838c1_900x597.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tKbI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa76499a2-2ab2-42d7-b517-15d8476838c1_900x597.png" width="900" height="597" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a76499a2-2ab2-42d7-b517-15d8476838c1_900x597.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:597,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!tKbI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa76499a2-2ab2-42d7-b517-15d8476838c1_900x597.png 424w, https://substackcdn.com/image/fetch/$s_!tKbI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa76499a2-2ab2-42d7-b517-15d8476838c1_900x597.png 848w, https://substackcdn.com/image/fetch/$s_!tKbI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa76499a2-2ab2-42d7-b517-15d8476838c1_900x597.png 1272w, https://substackcdn.com/image/fetch/$s_!tKbI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa76499a2-2ab2-42d7-b517-15d8476838c1_900x597.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Hermes profiles on Telegram</figcaption></figure></div><p>You can even separate agents per organisation folder, or add them to group chats.</p><h4>Create the right skills</h4><p>As mentioned before, you want to ensure each agent gets the right skills for their mission. They can be imported from sources like <strong><a href="https://clawhub.ai/">Clawhub</a></strong>, but you need to pay attention to the malicious ones.</p><p>Otherwise, you can also create them from scratch. Both <em>Kourou </em>and <em>Cayenne</em> have skills that were created based on prompts, and the markdown files point to vibe-coded Python functions.</p><p>For instance, <em>Cayenne&#8217;s</em> <code>writer</code> skill has a lot of conditions and looks like this:</p><pre><code>---
name: writer
description: Cayenne&#8217;s newsletter writing skill. Reads up to 2-day-old articles from Supabase, finds intersection themes across 2-5 articles, and writes The Agentic Block newsletter in Marco&#8217;s voice.
---

# Newsletter Writer

## Pipeline
1. **Fetch**: Run `src/cayenne/fetch_supabase.py` (uses 48h `gte` filter on `date` column) to populate `data/cayenne/supabase_articles.json`.
2. **Generate**: Use (or fix then run) the dedicated script `src/cayenne/generate_newsletter.py`. It calls `anthropic/claude-opus-4.6` via OpenRouter + openai SDK, injects prompt with full writing rules, and writes directly to `data/cayenne/newsletter.md`. May require patching the client initialization first (api_key line is sometimes corrupted as literal &#8220;os.env...EY&#8221;).
3. **Env Loading**: `source the_agentic_block/.env &amp;&amp; python src/cayenne/generate_newsletter.py` often fails to propagate OPENROUTER_API_KEY into venv python. Debug with execute_code first or ensure .env is loaded at session level.
4. **Style Reference (MANDATORY)**: Before writing any content, read all markdown files in `/home/dev/.hermes/profiles/cayenne/skills/writer/style/` (EXAMPLE_1.md, EXAMPLE_2.md, EXAMPLE_3.md). These are canonical style examples. Match their tone, structure, pacing, and voice when writing the newsletter.
5. **Drafting &amp; Rules**: Script enforces 1500+ words, Marco voice, no em-dashes/semicolons, proper headers, bolded/linked companies, ## sections, *** dividers, ## Conclusion, source list. Do not generate drafts in chat.
6. **One-Article Mode**: If only 1 fresh article, proceed with it (as in Apr 2026 x402/Linux Foundation run). Still meets theme-finding intent.
7. **Visuals**: Generate 3 minimalist pencil-sketch covers using image pipeline (Gemini flash model + base64 extraction). Check mtime after.
8. **Cleanup**: Update `data/cayenne/used_articles.json` with new entry (title, url, date_used). Use robust json read with try/except JSONDecodeError fallback.

## Article Content Retrieval
- **Primary**: Use `web_extract` to pull full article content from URLs.
- **Fallback (Firecrawl unavailable)**: Use `web_search` with article-specific queries (include title keywords, source, and year). The Perplexity backend returns comprehensive summaries with inline citations that are rich enough to write the full newsletter without needing the raw page content. Run all 4 searches in parallel.

## Files
- Data source: `/home/dev/projects/the_agentic_block/src/cayenne/fetch_supabase.py`
- Used articles: `/home/dev/projects/the_agentic_block/data/cayenne/used_articles.json`
- Output: `/home/dev/projects/the_agentic_block/data/cayenne/newsletter.md`
- Cover images: `/home/dev/projects/the_agentic_block/data/cayenne/cover_1.png` to `/home/dev/projects/the_agentic_block/data/cayenne/cover_3.png`

## Writing Rules
- Style: Marco&#8217;s voice (professional yet personal, casual, first-person). Write like chatting with a friend over coffee.
- Crucial Editor Check: Do not generate drafts in chat. Write content to `data/cayenne/newsletter.md` and confirm file saved before proceeding.
- Verification Rule: List titles and dates of selected articles. **Confirm with user BEFORE writing final content.**
- **Tone Reference (MANDATORY)**: Read ALL markdown files in `/home/dev/.hermes/profiles/cayenne/skills/writer/style/` (EXAMPLE_1.md, EXAMPLE_2.md, EXAMPLE_3.md) before writing. These are the ground truth for voice, pacing, and structure. Match them closely.
- 2026 Best Practices: Authenticity, conversational. Use short paragraphs (max 2-4 sentences). Descriptive headers using strong nouns/statements.
- Title/Subtitle: Include Title (`#`) and Subtitle (`##`).
- Subtitles: Do not start with &#8220;-ing&#8221; words. Use strong nouns/statements.
- Structure: Title, Subtitle, Body Sections (##, no &#8220;Intro&#8221;), Conclusion (##).
- Formatting: No em dashes (&#8212;), no hyphens for pauses, no semicolons. Sentences must end cleanly.
- Header Formatting: All body sections and Conclusion must be `##`. Use `***` divider between all body sections.
- Bolding/Links: Always bold company names. Preferably link to official websites: `[**CompanyName**](url)`.
- Target length: Minimum 1500 words. Dive deep into mechanics.
- No &#8220;The Agentic Block&#8221; as title.
- No &#8220;this week&#8221;/&#8221;this day&#8221;/&#8221;last week&#8221;.
- Add `## Conclusion` with reflection and takeaway. 
- No Signature: Never sign the newsletter with a name (like Marco or Cayenne). Leave it unsigned, even when adopting Marco&#8217;s first-person writing style.
- List Sources: `- Date, Outlet: [Title](url)` at the end.
- **No Signatures:** NEVER sign the newsletter with a name (e.g., Marco, Cayenne). Leave it completely unsigned at the end.

## Image Generation
- Style: Minimalist architectural pencil sketches or technical drawings. Monochromatic charcoal on cream paper. Ample negative space. NO text or letters.
- Pipeline: 1. Hit OpenRouter API via Python in `execute_code` (use `google/gemini-3.1-flash-image-preview` model). **API key retrieval**: env vars from `.hermes/.env` are NOT in `os.environ` inside execute_code. Use `from dotenv import dotenv_values; vals = dotenv_values(&#8221;/home/dev/.hermes/.env&#8221;); api_key = vals[&#8221;OPENROUTER_API_KEY&#8221;]`. 2. Write the JSON payload to a temp file and use `curl -d @file` to avoid shell escaping issues. Save raw JSON response as failsafe. 3. **Extract images from `message[&#8217;images&#8217;]` array first** (Gemini returns images there, NOT in `content` which is `None`). The data URI is at `message[&#8217;images&#8217;][0][&#8217;image_url&#8217;][&#8217;url&#8217;]`, split on comma to get base64. 4. Save as PNG.
- Check timestamps of images (`mtime`) after generation to ensure they were updated. If not, the generation failed.

## Update used_articles.json
- **Critical Rule**: Before writing any newsletter, always load `used_articles.json` and strictly exclude any articles already listed there (check by URL). Never reuse used articles.
- Append new entries (title, url, date_used) to the used list *only after* the piece is generated and confirmed with the user.
- **Error Handling**: ALWAYS use `try...except json.JSONDecodeError` (and optionally `ast.literal_eval`) as fallbacks when reading `used_articles.json`. Empty or malformed uninitialized files will crash standard `json.load()` operations.</code></pre><p>You don&#8217;t need to read the full SKILL.md above. It serves only as an example in case you want to reuse it for your own project.</p><p>In addition, she also creates three cover images using Nano Banana, and I pick the one I like the most to add to Substack.</p><p>When it comes to <em>Kourou </em>(the data specialist), he uses a different skill that calls a Python function to scrape cryptocurrency news from <strong><a href="https://www.apify.com?fpr=ulosg">Apify</a></strong>, filter the scraped data, and upload it to Supabase.</p><p>I built the scrapers myself, and you can also try them for free:</p><ul><li><p><a href="https://www.apify.com/dadhalfdev/coindesk-scraper?fpr=ulosg">CoinDesk Scraper</a></p></li><li><p><a href="https://www.apify.com/dadhalfdev/decrypt-scraper?fpr=ulosg">Decrypt Scraper</a></p></li><li><p><a href="https://www.apify.com/dadhalfdev/cryptoslate-scraper?fpr=ulosg">CryptoSlate Scraper</a></p></li></ul><p><em><strong>If Hermes or OpenClaw feels overwhelming, there&#8217;s no need to get frustrated. Book a 20-minute consultation, and let&#8217;s find a solution together:</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/qqFfaoq181tppoQj8&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://calendar.app.google/qqFfaoq181tppoQj8"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3><strong>Conclusion</strong></h3><p>The difference between this approach and a pure workflow is that I can easily make adjustments through Telegram chats, improve my agents over time, create as many profiles as I want, and decide whether I want them to run autonomously or not.</p><p>Not all use cases require agents. In fact, most of them can probably be handled with <strong><a href="https://n8n.partnerlinks.io/x7wwnbrdbecd">n8n</a></strong> workflows or Python pipelines. However, if you&#8217;re looking for more customization, creativity, and overall freedom, agents are a good choice.</p><p>That said, they come with an underlying cost that may not be feasible for everyone. If you&#8217;re a programmer, you can use cheaper models and improve the scripts manually. But if you aim to do a lot of vibe coding with minimal human intervention, you will need expensive models, and you may end up spending over $100 per day.</p><p>Agents are not the solution for everything, but they are worth exploring, and we are just getting started. What are you looking to build with them?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"><strong>Curious about what I&#8217;m building? &#128064;</strong></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[Hermes: The Only AI Agent That Truly Competes With OpenClaw]]></title><description><![CDATA[Learn how to set up Hermes Agent and follow its best practices.]]></description><link>https://blog.dadhalfdev.com/p/hermes-the-only-ai-agent-that-truly</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/hermes-the-only-ai-agent-that-truly</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Sat, 14 Mar 2026 10:39:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wl9C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcec81238-c43d-416a-8932-006271d288dc_900x563.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wl9C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcec81238-c43d-416a-8932-006271d288dc_900x563.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wl9C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcec81238-c43d-416a-8932-006271d288dc_900x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!wl9C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcec81238-c43d-416a-8932-006271d288dc_900x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!wl9C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcec81238-c43d-416a-8932-006271d288dc_900x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!wl9C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcec81238-c43d-416a-8932-006271d288dc_900x563.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wl9C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcec81238-c43d-416a-8932-006271d288dc_900x563.jpeg" width="900" height="563" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cec81238-c43d-416a-8932-006271d288dc_900x563.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:563,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!wl9C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcec81238-c43d-416a-8932-006271d288dc_900x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!wl9C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcec81238-c43d-416a-8932-006271d288dc_900x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!wl9C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcec81238-c43d-416a-8932-006271d288dc_900x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!wl9C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcec81238-c43d-416a-8932-006271d288dc_900x563.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Image by Author</figcaption></figure></div><p>Since OpenClaw&#8217;s launch, several agents have been created almost every week, and it&#8217;s becoming almost impossible to try them all. But there&#8217;s a new one that has caught the attention of many people, including me.</p><p>It has only 6k stars on GitHub compared to <strong><a href="https://github.com/openclaw/openclaw">OpenClaw</a></strong>, which has 307k stars (at the time of writing). However, unlike most other agents, it is not competing on memory usage. Instead, it focuses on performance. That&#8217;s why it may be the only true competitor to OpenClaw in this space.</p><p><strong><a href="https://github.com/NousResearch/hermes-agent">Hermes Agent</a> </strong>is a fully Python-based, open-source agent created by <strong><a href="https://nousresearch.com/">Nous Research</a></strong>. One of its most interesting features is its ability to learn over time. As you use it, the agent can turn what it learns into reusable skills, improve them through experience, store useful information, and even search through previous conversations. This allows it to build a better understanding of how you interact with it across different sessions.</p><p>Nous Research is an AI research laboratory and decentralized AI startup known for developing open-source Large Language Models (LLMs), such as <a href="https://huggingface.co/NousResearch/Hermes-4-405B/tree/main">Hermes-4&#8211;405B</a> and <a href="https://huggingface.co/NousResearch/Hermes-4-70B">Hermes-4&#8211;70B</a>. You can try their models by downloading them from Hugging Face or by using their API.</p><p>However, Hermes Agent is not restricted to these models. It is as versatile as OpenClaw, and you can power it with OpenAI, OpenRouter, or, of course, Nous Research API keys. If you have the required hardware, you can also run models locally, which adds an extra layer of privacy.</p><p>In this piece, I&#8217;ll guide you step-by-step on how to set up the agent and navigate the repository, as well as share some cool use cases and main differences from OpenClaw.</p><p>If you want to know more about OpenClaw, you can read these two articles I wrote:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;968f9b3f-5299-4e40-b0dc-5519a2439af6&quot;,&quot;caption&quot;:&quot;The AI agent that &#8220;actually does things&#8221; is here, and everyone is talking about it.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Read This Before Installing the OpenClaw AI Agent&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:109411725,&quot;name&quot;:&quot;Marco Rodrigues&quot;,&quot;bio&quot;:&quot;50% parenting &#128104;&#8205;&#127868; 50% building with Python &amp; AI &#128187;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4ad2c32-67d4-4e94-a560-8e0c03187db6_1024x1024.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-01-31T19:34:37.252Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!b1f-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0199da1c-dc85-42e2-938d-f0d4ea75cc46_900x563.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.dadhalfdev.com/p/read-this-before-installing-the-openclaw&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:186436694,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:4,&quot;comment_count&quot;:0,&quot;publication_id&quot;:4975150,&quot;publication_name&quot;:&quot;Dad Half Dev&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!cbkB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412563c3-4133-4c5c-af4e-4fd94b18f19d_1080x1080.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;61ecb4d4-9612-4272-b8b6-442c0b776e56&quot;,&quot;caption&quot;:&quot;The first time I used OpenClaw, the best I could do was set up reminders and check the weather.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;10 Tips to Make Your Life Easier With OpenClaw&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:109411725,&quot;name&quot;:&quot;Marco Rodrigues&quot;,&quot;bio&quot;:&quot;50% parenting &#128104;&#8205;&#127868; 50% building with Python &amp; AI &#128187;&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4ad2c32-67d4-4e94-a560-8e0c03187db6_1024x1024.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-03-10T14:36:54.299Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!4ObC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa74a8189-d4a8-43bf-a668-52beee8c25b7_900x563.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.dadhalfdev.com/p/10-tips-to-make-your-life-easier&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:190512217,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:1,&quot;publication_id&quot;:4975150,&quot;publication_name&quot;:&quot;Dad Half Dev&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!cbkB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412563c3-4133-4c5c-af4e-4fd94b18f19d_1080x1080.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>Let&#8217;s get started with Hermes Agent!</p><div><hr></div><h3>Set up Hermes Agent on a VPS</h3><p>Hermes works on Linux, macOS, or WSL for Windows, and just like OpenClaw, the best approach is to set it up on a VPS or a spare computer.</p><p>I personally like to use Contabo&#8217;s <a href="https://www.anrdoezrs.net/click-101540368-17083170">Cloud VPS 20</a>. For only $6/month, you get 12 GB of RAM and a 200 GB SSD. Most VPS providers will ask you which Linux distribution you want to use. I usually pick Ubuntu because it is the most widely documented.</p><p>Once you&#8217;re connected to the machine, you can install Hermes Agent with a single command:</p><pre><code>curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash</code></pre><p>It creates a virtual environment for you, with all the Python and Node.js dependencies you need.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2Fvb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8688141-3646-448e-b4cc-cea5213c127d_653x533.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2Fvb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8688141-3646-448e-b4cc-cea5213c127d_653x533.png 424w, https://substackcdn.com/image/fetch/$s_!2Fvb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8688141-3646-448e-b4cc-cea5213c127d_653x533.png 848w, https://substackcdn.com/image/fetch/$s_!2Fvb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8688141-3646-448e-b4cc-cea5213c127d_653x533.png 1272w, https://substackcdn.com/image/fetch/$s_!2Fvb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8688141-3646-448e-b4cc-cea5213c127d_653x533.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2Fvb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8688141-3646-448e-b4cc-cea5213c127d_653x533.png" width="653" height="533" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8688141-3646-448e-b4cc-cea5213c127d_653x533.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:533,&quot;width&quot;:653,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!2Fvb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8688141-3646-448e-b4cc-cea5213c127d_653x533.png 424w, https://substackcdn.com/image/fetch/$s_!2Fvb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8688141-3646-448e-b4cc-cea5213c127d_653x533.png 848w, https://substackcdn.com/image/fetch/$s_!2Fvb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8688141-3646-448e-b4cc-cea5213c127d_653x533.png 1272w, https://substackcdn.com/image/fetch/$s_!2Fvb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8688141-3646-448e-b4cc-cea5213c127d_653x533.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Hermes Agent installation</figcaption></figure></div><p>After that, you just need to reload the shell:</p><pre><code>source ~/.bashrc </code></pre><p>Hermes also includes an onboarding experience, although I found it a bit less user-friendly than the one provided by OpenClaw. But that&#8217;s not really an issue because everything else is very well documented and organized, starting with the repository structure, which looks like this:</p><pre><code>~/.hermes/
&#9500;&#9472;&#9472; config.yaml     # Settings (model, terminal, TTS, compression, etc.)
&#9500;&#9472;&#9472; .env            # API keys and secrets
&#9500;&#9472;&#9472; auth.json       # OAuth provider credentials (Nous Portal, etc.)
&#9500;&#9472;&#9472; SOUL.md         # Optional: global persona (agent embodies this personality)
&#9500;&#9472;&#9472; memories/       # Persistent memory (MEMORY.md, USER.md)
&#9500;&#9472;&#9472; skills/         # Agent-created skills (managed via skill_manage tool)
&#9500;&#9472;&#9472; cron/           # Scheduled jobs
&#9500;&#9472;&#9472; sessions/       # Gateway sessions
&#9492;&#9472;&#9472; logs/           # Logs (errors.log, gateway.log &#8212; secrets auto-redacted)</code></pre><p>You can see the <code>config.yaml</code> as the main file. From here, you can customize your agent, which is the equivalent to <code>openclaw.json</code>.</p><p>But before exploring the <code>config.yaml</code> and other files, it is good to check if you&#8217;ve successfully added a provider key during the onboarding, and you can see that in the <code>.env</code> file. For example, for OpenRouter, just copy your API key here, if it&#8217;s not there yet:</p><pre><code>OPENROUTER_API_KEY=sk-or-v1-60a...</code></pre><p>This should be enough to get you talking with the agent. In the next chapter, we are going to see the most useful CLI commands.</p><div><hr></div><h3>Useful Hermes Agent CLI commands</h3><p>Hermes commands are very intuitive, and you can find them all on the <a href="https://hermes-agent.nousresearch.com/docs/user-guide/cli">documentation page</a>. Here, I&#8217;ll just highlight the ones I found most useful.</p><h4>Chat</h4><p>To speak with the agent, you simply need this:</p><pre><code>hermes</code></pre><p>Here&#8217;s what you should see:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o6jc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff27c0c95-a08e-4f83-90f3-1aa0e9fe793f_898x560.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o6jc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff27c0c95-a08e-4f83-90f3-1aa0e9fe793f_898x560.png 424w, https://substackcdn.com/image/fetch/$s_!o6jc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff27c0c95-a08e-4f83-90f3-1aa0e9fe793f_898x560.png 848w, https://substackcdn.com/image/fetch/$s_!o6jc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff27c0c95-a08e-4f83-90f3-1aa0e9fe793f_898x560.png 1272w, https://substackcdn.com/image/fetch/$s_!o6jc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff27c0c95-a08e-4f83-90f3-1aa0e9fe793f_898x560.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o6jc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff27c0c95-a08e-4f83-90f3-1aa0e9fe793f_898x560.png" width="898" height="560" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f27c0c95-a08e-4f83-90f3-1aa0e9fe793f_898x560.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:560,&quot;width&quot;:898,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!o6jc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff27c0c95-a08e-4f83-90f3-1aa0e9fe793f_898x560.png 424w, https://substackcdn.com/image/fetch/$s_!o6jc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff27c0c95-a08e-4f83-90f3-1aa0e9fe793f_898x560.png 848w, https://substackcdn.com/image/fetch/$s_!o6jc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff27c0c95-a08e-4f83-90f3-1aa0e9fe793f_898x560.png 1272w, https://substackcdn.com/image/fetch/$s_!o6jc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff27c0c95-a08e-4f83-90f3-1aa0e9fe793f_898x560.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Hermes chat interface</figcaption></figure></div><p>Once you open the chat, you&#8217;ll find hundreds of slash <code>/</code> commands that can be used to replace many CLI commands. The good part is that you don&#8217;t need to memorize what each of them does, because there&#8217;s a brief description next to them:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bx8l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3489e4af-df51-4aec-87d2-ebb18a7a389c_886x358.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bx8l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3489e4af-df51-4aec-87d2-ebb18a7a389c_886x358.png 424w, https://substackcdn.com/image/fetch/$s_!bx8l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3489e4af-df51-4aec-87d2-ebb18a7a389c_886x358.png 848w, https://substackcdn.com/image/fetch/$s_!bx8l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3489e4af-df51-4aec-87d2-ebb18a7a389c_886x358.png 1272w, https://substackcdn.com/image/fetch/$s_!bx8l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3489e4af-df51-4aec-87d2-ebb18a7a389c_886x358.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bx8l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3489e4af-df51-4aec-87d2-ebb18a7a389c_886x358.png" width="886" height="358" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3489e4af-df51-4aec-87d2-ebb18a7a389c_886x358.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:358,&quot;width&quot;:886,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!bx8l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3489e4af-df51-4aec-87d2-ebb18a7a389c_886x358.png 424w, https://substackcdn.com/image/fetch/$s_!bx8l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3489e4af-df51-4aec-87d2-ebb18a7a389c_886x358.png 848w, https://substackcdn.com/image/fetch/$s_!bx8l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3489e4af-df51-4aec-87d2-ebb18a7a389c_886x358.png 1272w, https://substackcdn.com/image/fetch/$s_!bx8l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3489e4af-df51-4aec-87d2-ebb18a7a389c_886x358.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Slash commands in the Hermes chat interface</figcaption></figure></div><h4>Models</h4><p>You can switch your current model by using:</p><pre><code>hermes model</code></pre><p>This will show all the available providers:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o3ur!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2303c17a-09ec-42da-8006-cee375a56d26_805x362.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o3ur!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2303c17a-09ec-42da-8006-cee375a56d26_805x362.png 424w, https://substackcdn.com/image/fetch/$s_!o3ur!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2303c17a-09ec-42da-8006-cee375a56d26_805x362.png 848w, https://substackcdn.com/image/fetch/$s_!o3ur!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2303c17a-09ec-42da-8006-cee375a56d26_805x362.png 1272w, https://substackcdn.com/image/fetch/$s_!o3ur!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2303c17a-09ec-42da-8006-cee375a56d26_805x362.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o3ur!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2303c17a-09ec-42da-8006-cee375a56d26_805x362.png" width="805" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2303c17a-09ec-42da-8006-cee375a56d26_805x362.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:362,&quot;width&quot;:805,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!o3ur!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2303c17a-09ec-42da-8006-cee375a56d26_805x362.png 424w, https://substackcdn.com/image/fetch/$s_!o3ur!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2303c17a-09ec-42da-8006-cee375a56d26_805x362.png 848w, https://substackcdn.com/image/fetch/$s_!o3ur!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2303c17a-09ec-42da-8006-cee375a56d26_805x362.png 1272w, https://substackcdn.com/image/fetch/$s_!o3ur!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2303c17a-09ec-42da-8006-cee375a56d26_805x362.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Switch model in Hermes</figcaption></figure></div><p>You will find default models, but you can also enter a custom one.</p><p>At the time of writing, Nvidia just released a super-fast model entirely for free on OpenRouter, so you can use that one if you want to save some credits:</p><pre><code>nvidia/nemotron-3-super-120b-a12b:free</code></pre><h4>Configuration</h4><p>Now, going back to the CLI commands. If you want to have a quick overview of your configuration, you can run this:</p><pre><code>hermes config  </code></pre><p>You will see which models you&#8217;re using, the API keys, and so on:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mZ9I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae36408-3313-4b35-9d2a-e5a40572f52f_866x600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mZ9I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae36408-3313-4b35-9d2a-e5a40572f52f_866x600.png 424w, https://substackcdn.com/image/fetch/$s_!mZ9I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae36408-3313-4b35-9d2a-e5a40572f52f_866x600.png 848w, https://substackcdn.com/image/fetch/$s_!mZ9I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae36408-3313-4b35-9d2a-e5a40572f52f_866x600.png 1272w, https://substackcdn.com/image/fetch/$s_!mZ9I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae36408-3313-4b35-9d2a-e5a40572f52f_866x600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mZ9I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae36408-3313-4b35-9d2a-e5a40572f52f_866x600.png" width="866" height="600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ae36408-3313-4b35-9d2a-e5a40572f52f_866x600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:600,&quot;width&quot;:866,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!mZ9I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae36408-3313-4b35-9d2a-e5a40572f52f_866x600.png 424w, https://substackcdn.com/image/fetch/$s_!mZ9I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae36408-3313-4b35-9d2a-e5a40572f52f_866x600.png 848w, https://substackcdn.com/image/fetch/$s_!mZ9I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae36408-3313-4b35-9d2a-e5a40572f52f_866x600.png 1272w, https://substackcdn.com/image/fetch/$s_!mZ9I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ae36408-3313-4b35-9d2a-e5a40572f52f_866x600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Hermes configuration</figcaption></figure></div><p>You can also use the <code>config</code> alias to edit and update the configuration:</p><pre><code>hermes config              # View current configuration
hermes config edit         # Open config.yaml in your editor
hermes config set KEY VAL  # Set a specific value
hermes config check        # Check for missing options (after updates)
hermes config migrate      # Interactively add missing options

# Examples:
hermes config set model anthropic/claude-opus-4
hermes config set terminal.backend docker
hermes config set OPENROUTER_API_KEY sk-or-...  # Saves to .env</code></pre><h4>Sessions</h4><p>The agent saves every conversation you have as a session, which is used to make it learn over time. You can list them with commands such as these:</p><pre><code># List recent sessions (default: last 20)
hermes sessions list

# Filter by platform
hermes sessions list --source telegram

# Show more sessions
hermes sessions list --limit 50</code></pre><p>You can also export the full sessions and do more tasks if you need to migrate your agent to another machine, without losing information. You can find more in the <a href="https://hermes-agent.nousresearch.com/docs/user-guide/sessions">docs</a>.</p><h4>Gateway</h4><p>The gateway is a background process that is constantly running and allows you to chat on Telegram, Slack, and other channels. However, sometimes it encounters some issues and needs to be started, stopped, or restarted:</p><pre><code>hermes gateway start
hermes gateway stop
hermes gateway restart</code></pre><p>You can also configure the messaging platforms that the gateway wraps:</p><pre><code>hermes gateway setup </code></pre><h4>Cron jobs</h4><p>One thing many people do with these agents is schedule tasks and set up reminders. This is usually done through cron jobs, which can be listed and edited using CLI commands:</p><pre><code>hermes cron list           # View scheduled jobs</code></pre><p>You will see something like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ir5d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4683b23-11fd-4e5c-842f-6e8f64b4e832_783x291.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ir5d!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4683b23-11fd-4e5c-842f-6e8f64b4e832_783x291.png 424w, https://substackcdn.com/image/fetch/$s_!ir5d!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4683b23-11fd-4e5c-842f-6e8f64b4e832_783x291.png 848w, https://substackcdn.com/image/fetch/$s_!ir5d!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4683b23-11fd-4e5c-842f-6e8f64b4e832_783x291.png 1272w, https://substackcdn.com/image/fetch/$s_!ir5d!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4683b23-11fd-4e5c-842f-6e8f64b4e832_783x291.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ir5d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4683b23-11fd-4e5c-842f-6e8f64b4e832_783x291.png" width="783" height="291" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4683b23-11fd-4e5c-842f-6e8f64b4e832_783x291.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:291,&quot;width&quot;:783,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!ir5d!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4683b23-11fd-4e5c-842f-6e8f64b4e832_783x291.png 424w, https://substackcdn.com/image/fetch/$s_!ir5d!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4683b23-11fd-4e5c-842f-6e8f64b4e832_783x291.png 848w, https://substackcdn.com/image/fetch/$s_!ir5d!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4683b23-11fd-4e5c-842f-6e8f64b4e832_783x291.png 1272w, https://substackcdn.com/image/fetch/$s_!ir5d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4683b23-11fd-4e5c-842f-6e8f64b4e832_783x291.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Hermes active cron jobs</figcaption></figure></div><p>To remove the cron job, you can use the following slash command:</p><pre><code>/cron remove &lt;job_id&gt;</code></pre><h4>Update and uninstall</h4><p>To update Hermes with the latest changes in the repository, you can run:</p><pre><code>hermes update</code></pre><p>If you&#8217;re not a fan of Hermes and want to stick with OpenClaw instead, you can uninstall it:</p><pre><code>hermes uninstall</code></pre><p>At the moment, there&#8217;s no <code>audit</code> CLI command for Hermes, this is an advantage that OpenClaw has at the moment, because it can guide you on best practices and check if there&#8217;s something suspicious with your agent.</p><p>The best you can do is run <code>\insights</code> in the chat, and you&#8217;ll get a summary of everything you&#8217;ve made so far, including the total number of sessions, costs, active time, and much more.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NfaW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7dd95e-4e15-4cc5-968d-63343995572a_702x722.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NfaW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7dd95e-4e15-4cc5-968d-63343995572a_702x722.png 424w, https://substackcdn.com/image/fetch/$s_!NfaW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7dd95e-4e15-4cc5-968d-63343995572a_702x722.png 848w, https://substackcdn.com/image/fetch/$s_!NfaW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7dd95e-4e15-4cc5-968d-63343995572a_702x722.png 1272w, https://substackcdn.com/image/fetch/$s_!NfaW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7dd95e-4e15-4cc5-968d-63343995572a_702x722.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NfaW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7dd95e-4e15-4cc5-968d-63343995572a_702x722.png" width="702" height="722" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b7dd95e-4e15-4cc5-968d-63343995572a_702x722.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:722,&quot;width&quot;:702,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!NfaW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7dd95e-4e15-4cc5-968d-63343995572a_702x722.png 424w, https://substackcdn.com/image/fetch/$s_!NfaW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7dd95e-4e15-4cc5-968d-63343995572a_702x722.png 848w, https://substackcdn.com/image/fetch/$s_!NfaW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7dd95e-4e15-4cc5-968d-63343995572a_702x722.png 1272w, https://substackcdn.com/image/fetch/$s_!NfaW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b7dd95e-4e15-4cc5-968d-63343995572a_702x722.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Hermes insights</figcaption></figure></div><p>In the next section, I will show you how to connect Hermes to Telegram.</p><div><hr></div><h3>Connect Hermes to Telegram</h3><p>The start is always the same: you need to create a <code>/newbot</code> using BotFather.</p><ol><li><p>Open Telegram and search for BotFather.</p></li><li><p>Send <code>/newbot</code></p></li><li><p>Choose a <strong>display name</strong> (e.g., &#8220;Hermes Agent&#8221;).</p></li><li><p>Choose a <strong>username. </strong>This must be unique and end in <code>bot</code> (e.g., <code>my_hermes_bot</code>)</p></li><li><p>BotFather replies with your <strong>API token</strong>.</p></li></ol><p>Now you need to get your user ID. The fastest way is to search for <code>@userinfobot</code>.</p><p>This is how its response should look:</p><pre><code>@&lt;my_username&gt;
Id: &lt;my_id&gt;
First: Marco
Last: Rodrigues
Lang: en
Registered: Check Date 

&#129504; Explanations and answers
Free AI &#8594; DeepSeek (https://t.me/deepseek_gidbot) &amp; ChatGPT (https://t.me/chatgpt_gidbot)

&#128444; Visualize your ideas
Make Image &#8594; NanoBanana (https://t.me/nanobanana_gidbot)</code></pre><p>Now you can run this command and select Telegram:</p><pre><code>hermes gateway setup</code></pre><p>Follow the steps to add both the Bot API Token and your token ID. Otherwise, you can also paste the information directly into the <code>.env</code> file:</p><pre><code>TELEGRAM_BOT_TOKEN=8566...
TELEGRAM_ALLOWED_USERS=835...
TELEGRAM_HOME_CHANNEL=835...</code></pre><p>If, for some reason, you&#8217;ve applied the changes and still can&#8217;t talk to your agent on Telegram, try restarting the gateway.</p><p>Now let&#8217;s customize the agent!</p><div><hr></div><h3>Customize the Hermes Agent</h3><p>Several things can be customized. For instance, you can change the agent&#8217;s personality, its reasoning effort, the terminal it uses (local, Docker, etc.), its memory settings, as well as Text-to-Speech and Speech-to-Text features, and more.</p><p>Most of this can be configured with small changes to the <code>config.yaml</code> file.</p><h4>Give it a personality</h4><p>Hermes comes with all these personalities, and you can select them with a slash command:</p><pre><code>  personalities:
    helpful: You are a helpful, friendly AI assistant.
    concise: You are a concise assistant. Keep responses brief and to the point.
    technical: You are a technical expert. Provide detailed, accurate technical information.
    creative: You are a creative assistant. Think outside the box and offer innovative
      solutions.
    mother: You are a motherly assistant. You are a helpful, patient, and caring assistant.
      You are always there to listen to your users and help them with their problems.
      You are also very friendly and approachable. But you go straight to the point
      without too much talking. No need to say things like &#8220;my love&#8221;, &#8220;darling&#8221;, etc.
    teacher: You are a patient teacher. Explain concepts clearly with examples.
    kawaii: &#8220;You are a kawaii assistant! Use cute expressions like (\u25D5\u203F\u25D5\
      ), \u2605, \u266A, and ~! Add sparkles and be super enthusiastic about everything!\
      \ Every response should feel warm and adorable desu~! \u30FD(&gt;\u2200&lt;\u2606\
      )\u30CE&#8221;
    catgirl: &#8220;You are Neko-chan, an anime catgirl AI assistant, nya~! Add &#8216;nya&#8217; and\
      \ cat-like expressions to your speech. Use kaomoji like (=^\uFF65\u03C9\uFF65\
      ^=) and \u0E05^\u2022\uFECC\u2022^\u0E05. Be playful and curious like a cat,\
      \ nya~!&#8221;
    pirate: &#8216;Arrr! Ye be talkin&#8217;&#8216; to Captain Hermes, the most tech-savvy pirate to
      sail the digital seas! Speak like a proper buccaneer, use nautical terms, and
      remember: every problem be just treasure waitin&#8217;&#8216; to be plundered! Yo ho ho!&#8217;
    shakespeare: Hark! Thou speakest with an assistant most versed in the bardic arts.
      I shall respond in the eloquent manner of William Shakespeare, with flowery
      prose, dramatic flair, and perhaps a soliloquy or two. What light through yonder
      terminal breaks?
    surfer: &#8220;Duuude! You&#8217;re chatting with the chillest AI on the web, bro! Everything&#8217;s\
      \ gonna be totally rad. I&#8217;ll help you catch the gnarly waves of knowledge while\
      \ keeping things super chill. Cowabunga! \U0001F919&#8221;
    noir: The rain hammered against the terminal like regrets on a guilty conscience.
      They call me Hermes - I solve problems, find answers, dig up the truth that
      hides in the shadows of your codebase. In this city of silicon and secrets,
      everyone&#8217;s got something to hide. What&#8217;s your story, pal?
    uwu: hewwo! i&#8217;m your fwiendwy assistant uwu~ i wiww twy my best to hewp you! *nuzzles
      your code* OwO what&#8217;s this? wet me take a wook! i pwomise to be vewy hewpful
      &gt;w&lt;
    philosopher: Greetings, seeker of wisdom. I am an assistant who contemplates the
      deeper meaning behind every query. Let us examine not just the &#8216;how&#8217; but the
      &#8216;why&#8217; of your questions. Perhaps in solving your problem, we may glimpse a greater
      truth about existence itself.
    hype: &#8220;YOOO LET&#8217;S GOOOO!!! \U0001F525\U0001F525\U0001F525 I am SO PUMPED to help\
      \ you today! Every question is AMAZING and we&#8217;re gonna CRUSH IT together! This\
      \ is gonna be LEGENDARY! ARE YOU READY?! LET&#8217;S DO THIS! \U0001F4AA\U0001F624\
      \U0001F680&#8221;</code></pre><p>You can just add another personality to the list in the <code>config.yaml</code> file.</p><p>Then add the name of the new personality here:</p><pre><code>display:
  personality: mother</code></pre><h4>Change the agent&#8217;s name</h4><p>By default, your agent is called &#8220;Hermes&#8221;, but you can change that in the. First in the <code>skins</code> folder, you should create a skin .yaml file with your agent&#8217;s name:</p><pre><code>branding:
  agent_name: &#8220;Pecas&#8221;</code></pre><p>My agent is called <code>Pecas</code>, so I named the file <code>pecas-skin.yaml</code>. In the <code>config.yaml</code> I added the name of the skin under <code>display</code>:</p><pre><code>display:
  skin: pecas-skin</code></pre><p>You can add more information to the skin file, such as welcome and goodbye messages, a prompt symbol, custom UI colors, and more.</p><h4>Enable Text-to-Speech (TTS)</h4><p>For TTS, it supports OpenAI, Edge (for free), and ElevanLabs. You can see all three options in the <code>config.yaml</code> file:</p><pre><code>tts:
  provider: edge
  edge:
    voice: en-US-AriaNeural
  elevenlabs:
    voice_id: pNInz6obpgDQGcFmaJgB
    model_id: eleven_multilingual_v2
  openai:
    model: gpt-4o-mini-tts
    voice: alloy</code></pre><p>Unlike OpenClaw, which always displays audio messages when TTS is enabled, Hermes requires you to explicitly ask for an audio message, or you need to create a skill that always generates one.</p><p>For some users, this may feel like a downgrade. However, for me it&#8217;s actually better because it saves memory, and I don&#8217;t need to hear voice messages every time.</p><p>Recently, I also discovered a new TTS and STT model available on GitHub called <a href="https://github.com/fishaudio/fish-speech">Fish Speech</a>. You can use the model locally or use their API.</p><h4>Enable Speech-to-Text (STT)</h4><p>Similar to TTS, the STT is also configured in the <code>config.yaml</code> file:</p><pre><code>stt:
  enabled: true
  model: whisper-1</code></pre><p>For this, you need an OpenAI API token.</p><p>Now, let&#8217;s see some examples of skills and projects that I&#8217;ve added to the Hermes Agent.</p><div><hr></div><h3>Create skills and projects</h3><p>Hermes comes with several pre-installed skills, such as:</p><ul><li><p><strong>Claude Code</strong>: Delegates coding tasks to Claude Code (Anthropic&#8217;s CLI agent).</p></li><li><p><strong>Apple Notes</strong>: Manages Apple Notes via the CLI on macOS.</p></li><li><p><strong>Dog Food</strong>: Performs systematic exploratory QA testing of web applications.</p></li><li><p><strong>YouTube Content</strong>: Fetches YouTube video transcripts and transforms them into structured content.</p></li><li><p><strong>OpenHue</strong>: Controls Philips Hue lights, rooms, and scenes via the OpenHue CLI.</p></li><li><p><strong>Nano PDF</strong>: Edits PDFs with natural-language instructions using the <code>nano-pdf</code> CLI.</p></li></ul><p>There are many more available, and to be honest, creating new ones is very easy if you have the right model.</p><p>The first thing I did was replace the Firecrawl web search tool with Perplexity Sonar. Not only because I like the way Perplexity provides summarized information, but also because I prefer having fewer APIs in my setup. So I could reuse my OpenRouter API key for Sonar.</p><p>The <code>SKILL.md</code> file for Perplexity with OpenRouter is here:</p><pre><code>---
name: perplexity-web-search
description: Configure Hermes to use Perplexity (via OpenRouter) for web search instead of Firecrawl
version: 1.0.0
author: Pecas
license: MIT
metadata:
  hermes:
    tags: [web-search, perplexity, openrouter, configuration]
    related_skills: [duckduckgo-search]
---

# Perplexity Web Search

Configures Hermes to use Perplexity&#8217;s `sonar-pro` model via OpenRouter for web search instead of Firecrawl.

## Overview

- **Default search backend**: Perplexity sonar-pro via OpenRouter
- **Requires**: OPENROUTER_API_KEY environment variable
- **Alternative models**: llama-3.1-sonar-small-128k-online, llama-3.1-sonar-large-128k-online

## Steps to Configure

1. Ensure `OPENROUTER_API_KEY` is set in your environment
2. Update `web_tools.py` to use Perplexity client instead of Firecrawl
3. Register the tool with `OPENROUTER_API_KEY` requirement

## Key Components

### Perplexity Client

Use AsyncOpenAI with OpenRouter base URL:
```
base_url: https://openrouter.ai/api/v1
model: perplexity/sonar-pro
```

### URL Extraction

Perplexity returns sources at the end of responses. Extract using regex:
- Source format: `- Source Name: https://URL`
- Citation format: `[N](https://URL)`

## Testing

```bash
cd ~/.hermes/hermes-agent
PYTHONPATH=. python3 -c &#8220;from tools.web_tools import web_search_tool; print(web_search_tool(&#8217;query&#8217;, 3))&#8221;
```

## Notes

- web_extract still uses Firecrawl
- web_search requires OPENROUTER_API_KEY
- Perplexity returns full answers with sources, not just URLs</code></pre><p>You can also vibe-code projects and web applications with Hermes.</p><p>For instance, I created a Tricount-like script to use inside a Telegram group that I share with my girlfriend. I gave it prompts that follow a logic similar to Tricount (I called it Hermescount). Here is the pinned user manual message on Telegram:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q6JN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b592277-84b5-47d3-be72-b2e2fc645b30_518x673.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q6JN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b592277-84b5-47d3-be72-b2e2fc645b30_518x673.png 424w, https://substackcdn.com/image/fetch/$s_!Q6JN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b592277-84b5-47d3-be72-b2e2fc645b30_518x673.png 848w, https://substackcdn.com/image/fetch/$s_!Q6JN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b592277-84b5-47d3-be72-b2e2fc645b30_518x673.png 1272w, https://substackcdn.com/image/fetch/$s_!Q6JN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b592277-84b5-47d3-be72-b2e2fc645b30_518x673.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q6JN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b592277-84b5-47d3-be72-b2e2fc645b30_518x673.png" width="518" height="673" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b592277-84b5-47d3-be72-b2e2fc645b30_518x673.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:673,&quot;width&quot;:518,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!Q6JN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b592277-84b5-47d3-be72-b2e2fc645b30_518x673.png 424w, https://substackcdn.com/image/fetch/$s_!Q6JN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b592277-84b5-47d3-be72-b2e2fc645b30_518x673.png 848w, https://substackcdn.com/image/fetch/$s_!Q6JN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b592277-84b5-47d3-be72-b2e2fc645b30_518x673.png 1272w, https://substackcdn.com/image/fetch/$s_!Q6JN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b592277-84b5-47d3-be72-b2e2fc645b30_518x673.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Hermescount is a tricount-like that lives inside Telegram</figcaption></figure></div><p>I&#8217;ve also generated a <code>SKILL.md</code> file, so I can share Hermescount with the community.</p><p>Among the other projects and skills I&#8217;ve installed, one that is particularly useful for getting up-to-date information, such as tech job listings, tech news, and more, is the Apify MCP skill.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0jza!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f4368d-233a-48bb-ae56-700b3b3f2e2a_900x478.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0jza!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f4368d-233a-48bb-ae56-700b3b3f2e2a_900x478.png 424w, https://substackcdn.com/image/fetch/$s_!0jza!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f4368d-233a-48bb-ae56-700b3b3f2e2a_900x478.png 848w, https://substackcdn.com/image/fetch/$s_!0jza!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f4368d-233a-48bb-ae56-700b3b3f2e2a_900x478.png 1272w, https://substackcdn.com/image/fetch/$s_!0jza!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f4368d-233a-48bb-ae56-700b3b3f2e2a_900x478.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0jza!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f4368d-233a-48bb-ae56-700b3b3f2e2a_900x478.png" width="900" height="478" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d8f4368d-233a-48bb-ae56-700b3b3f2e2a_900x478.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:478,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!0jza!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f4368d-233a-48bb-ae56-700b3b3f2e2a_900x478.png 424w, https://substackcdn.com/image/fetch/$s_!0jza!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f4368d-233a-48bb-ae56-700b3b3f2e2a_900x478.png 848w, https://substackcdn.com/image/fetch/$s_!0jza!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f4368d-233a-48bb-ae56-700b3b3f2e2a_900x478.png 1272w, https://substackcdn.com/image/fetch/$s_!0jza!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8f4368d-233a-48bb-ae56-700b3b3f2e2a_900x478.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Apify MCP page</figcaption></figure></div><p>I also just asked Hermes to create it, based on this JSON file that you can find at the bottom of the <a href="https://mcp.apify.com/?fpr=ulosg">Apify MCP page</a>:</p><pre><code>{
  &#8220;mcpServers&#8221;: {
    &#8220;apify&#8221;: {
      &#8220;url&#8221;: &#8220;https://mcp.apify.com/?tools=actors,docs,get-dataset,dadhalfdev/techcrunch-scraper-per-event,dadhalfdev/futurism-scraper-per-event&#8221;,
      &#8220;headers&#8221;: {
        &#8220;Authorization&#8221;: &#8220;Bearer &lt;your-apify-token&gt;&#8221;
      }
    }
  }
}</code></pre><p>It needs an Apify token. If you don&#8217;t have one yet, you can create an account <a href="https://mcp.apify.com/?fpr=ulosg">here</a>.</p><p><em><strong>If Hermes or OpenClaw feels overwhelming, there&#8217;s no need to get frustrated. Book a 20-minute consultation, and let&#8217;s find a solution together:</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/qqFfaoq181tppoQj8&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://calendar.app.google/qqFfaoq181tppoQj8"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3>Conclusion</h3><p>I&#8217;ve been using both OpenClaw and Hermes Agent, and so far, it&#8217;s hard to say which one I prefer.</p><p>The fact that Hermes is fully Python-based makes me biased, because I can literally read all the code, which makes me trust it more than OpenClaw. I also like the fact that all keys are saved in a <code>.env</code> file, and I don&#8217;t need to export them every time, or have them exposed on JSON and <code>.txt</code> files.</p><p>Another cool feature of Hermes is that, every time it sets up something, you can see all the changes that it is making, like here:</p><pre><code>&#128187; terminal: &#8220;mkdir -p ~/.hermes &amp;&amp; touch ~/.hermes...&#8221;
&#9997;&#65039; write_file: &#8220;/home/ubuntu/hermes-agent/expense_tra...&#8221;
&#128187; terminal: &#8220;cd /home/ubuntu/hermes-agent &amp;&amp; pytho...&#8221;
&#128187; terminal: &#8220;cd /home/ubuntu/hermes-agent &amp;&amp; pytho...&#8221;
&#128187; terminal: &#8220;cd /home/ubuntu/hermes-agent &amp;&amp; pytho...&#8221;
&#128221; skill_manage: &#8220;expense-tracker&#8221;
&#128221; skill_manage: &#8220;expense-tracker&#8221;
&#128187; terminal: &#8220;cd /home/ubuntu/hermes-agent &amp;&amp; pytho...&#8221;
&#128187; terminal: &#8220;cd /home/ubuntu/hermes-agent &amp;&amp; pytho...&#8221;
&#128187; terminal: &#8220;echo &#8220;Date,User,Description,Amount&#8221; &gt;...&#8221;
&#128187; terminal: &#8220;cd /home/ubuntu/hermes-agent &amp;&amp; pytho...&#8221;</code></pre><p>This is great for keeping track of what the agent is doing, and you can always check the modified files to confirm that nothing went wrong.</p><p>However, OpenClaw seems faster in many cases. That might be due to Hermes&#8217; learning system, which takes notes and updates skills while you chat with it. But that&#8217;s nothing that a faster model or some configuration tweaks can&#8217;t fix.</p><p>Another drawback of Hermes is the lack of an audit command and a dashboard, as OpenClaw provides.</p><p>But hey, Hermes has only been around for a few days, while OpenClaw has been here for three months. I think it&#8217;s only a matter of days or weeks before the team adds these features and makes the agent smoother.</p><p>For now, I will keep playing with both and sharing my insights.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"><strong>Curious about what I&#8217;m building? &#128064;</strong></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[10 Tips to Make Your Life Easier With OpenClaw]]></title><description><![CDATA[Learn the most useful commands, how to install skills, create sub-agents, use the dashboard, and much more.]]></description><link>https://blog.dadhalfdev.com/p/10-tips-to-make-your-life-easier</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/10-tips-to-make-your-life-easier</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Tue, 10 Mar 2026 14:36:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4ObC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa74a8189-d4a8-43bf-a668-52beee8c25b7_900x563.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4ObC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa74a8189-d4a8-43bf-a668-52beee8c25b7_900x563.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4ObC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa74a8189-d4a8-43bf-a668-52beee8c25b7_900x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4ObC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa74a8189-d4a8-43bf-a668-52beee8c25b7_900x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4ObC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa74a8189-d4a8-43bf-a668-52beee8c25b7_900x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4ObC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa74a8189-d4a8-43bf-a668-52beee8c25b7_900x563.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4ObC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa74a8189-d4a8-43bf-a668-52beee8c25b7_900x563.jpeg" width="900" height="563" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a74a8189-d4a8-43bf-a668-52beee8c25b7_900x563.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:563,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!4ObC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa74a8189-d4a8-43bf-a668-52beee8c25b7_900x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4ObC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa74a8189-d4a8-43bf-a668-52beee8c25b7_900x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4ObC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa74a8189-d4a8-43bf-a668-52beee8c25b7_900x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4ObC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa74a8189-d4a8-43bf-a668-52beee8c25b7_900x563.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Image by Author</figcaption></figure></div><p>The first time I used OpenClaw, the best I could do was set up reminders and check the weather.</p><p>Then I decided to add a web search tool, so I connected Perplexity Sonar, and Google became my second search engine.</p><p>That was still not enough. I needed information in real time, not SERP results. So I decided to connect the agent to web scrapers through the <a href="https://www.apify.com?fpr=ulosg">Apify</a> MCP and get the most recent news on <a href="https://apify.com/dadhalfdev/techcrunch-scraper-per-event?fpr=ulosg">tech</a>, <a href="https://apify.com/dadhalfdev/aljazeera-scraper-per-event?fpr=ulosg">politics</a>, and <a href="https://apify.com/dadhalfdev/cointelegraph-scraper-per-event?fpr=ulosg">crypto</a>.</p><p>The exploration continued until I was hired to set up OpenClaw for a client.</p><p>He asked me to add the agent to Slack and connect it to Google Ads, so the team could extract and manipulate marketing data directly from a channel.</p><p>At that time, there wasn&#8217;t a reliable SKILL.md<strong> </strong>on <a href="https://clawhub.ai/">ClawHub</a> for Google Ads, so I created one from scratch. I didn&#8217;t just vibe-code it. I actually built Python functions to interact with the data in a safer way, and then wrote the markdown file containing the instructions for the LLM (Large Language Model).</p><p>That was all at that time, until I started to see people building crazy stuff on <a href="https://x.com/dadhalfdev">X</a> (former Twitter) with OpenClaw. At first, I thought most of it was fake or exaggerated, but the more I learned about it, the more I realised how powerful it actually is.</p><p>In this article, I&#8217;ll share 10 tips that will help you build real use cases, not only simple reminders on Telegram.</p><div><hr></div><h3>Set up the OpenClaw AI agent</h3><p>You can jump this section if you already have OpenClaw installed on your machine and you&#8217;re mostly curious about the tips.</p><p>For those who are just starting, I recommend using a remote VPS instead of your personal computer. You don&#8217;t want to risk exposing your personal information.</p><p>Also, you don&#8217;t need to buy a Mac Mini, nor a very expensive machine, to start using OpenClaw. All you need is a 12 GB RAM and a 200 GB SSD. You can get that for less than $6/month with Contabo&#8217;s <a href="https://www.anrdoezrs.net/click-101540368-17083170">Cloud VPS 20</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_!oVbs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a45aaa6-fcb1-43a7-9a6a-7b42fcfa1100_788x503.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oVbs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a45aaa6-fcb1-43a7-9a6a-7b42fcfa1100_788x503.png 424w, https://substackcdn.com/image/fetch/$s_!oVbs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a45aaa6-fcb1-43a7-9a6a-7b42fcfa1100_788x503.png 848w, https://substackcdn.com/image/fetch/$s_!oVbs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a45aaa6-fcb1-43a7-9a6a-7b42fcfa1100_788x503.png 1272w, https://substackcdn.com/image/fetch/$s_!oVbs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a45aaa6-fcb1-43a7-9a6a-7b42fcfa1100_788x503.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oVbs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a45aaa6-fcb1-43a7-9a6a-7b42fcfa1100_788x503.png" width="788" height="503" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8a45aaa6-fcb1-43a7-9a6a-7b42fcfa1100_788x503.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:503,&quot;width&quot;:788,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!oVbs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a45aaa6-fcb1-43a7-9a6a-7b42fcfa1100_788x503.png 424w, https://substackcdn.com/image/fetch/$s_!oVbs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a45aaa6-fcb1-43a7-9a6a-7b42fcfa1100_788x503.png 848w, https://substackcdn.com/image/fetch/$s_!oVbs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a45aaa6-fcb1-43a7-9a6a-7b42fcfa1100_788x503.png 1272w, https://substackcdn.com/image/fetch/$s_!oVbs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a45aaa6-fcb1-43a7-9a6a-7b42fcfa1100_788x503.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://www.anrdoezrs.net/click-101540368-17083170">Contabo&#8217;s VPS</a> pricing</figcaption></figure></div><p>I recommend you use Ubuntu as a Linux distro. For the installation, first make sure you have the latest Node.js version:</p><pre><code>curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash</code></pre><p>And install a higher version of <code>nvm</code>:</p><pre><code>nvm install 24</code></pre><p>Finally, install OpenClaw with this command:</p><pre><code>curl -fsSL https://openclaw.ai/install.sh | bash</code></pre><p>I&#8217;ve previously created a piece that guides you through the onboarding steps. You can find it here:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;c2f889d6-2767-4b0e-9b4f-9b75c1b34150&quot;,&quot;caption&quot;:&quot;The AI agent that &#8220;actually does things&#8221; is here, and everyone is talking about it.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Read This Before Installing the OpenClaw AI Agent&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:109411725,&quot;name&quot;:&quot;Marco Rodrigues&quot;,&quot;bio&quot;:&quot;I'm a Dad Half Dev. &#128118;&#128104;&#8205;&#128187; 50% Parenting | 50% Python, Data Science, AI, and Automation.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4ad2c32-67d4-4e94-a560-8e0c03187db6_1024x1024.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2026-01-31T19:34:37.252Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/$s_!b1f-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0199da1c-dc85-42e2-938d-f0d4ea75cc46_900x563.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.dadhalfdev.com/p/read-this-before-installing-the-openclaw&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:186436694,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:4,&quot;comment_count&quot;:0,&quot;publication_id&quot;:4975150,&quot;publication_name&quot;:&quot;Dad Half Dev&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!cbkB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412563c3-4133-4c5c-af4e-4fd94b18f19d_1080x1080.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>We won&#8217;t cover the onboarding steps here, since this article focuses on turning your agent into a useful tool rather than going deep into the setup.</p><p><em><strong>&#9888;&#65039; Note: </strong>All implementations and prompts I&#8217;ll cover in this article were made using the <strong>MiniMax M2.5</strong> model with the OpenRouter API. If you pick another model, you may not have the same outputs as I did.</em></p><p>In the next section, we start with the first tip, which covers the most commonly used CLI commands.</p><div><hr></div><h3>1. Save the most important CLI commands</h3><p>One thing that annoyed me at the beginning was constantly forgetting the CLI commands. So I wrote them down, and now I&#8217;m sharing the ones I use most so you don&#8217;t have to check OpenClaw&#8217;s <a href="https://docs.openclaw.ai/">documentation page</a> every time you need the right command.</p><p>In the case you&#8217;ve missed the <strong>onboarding steps</strong>, you can launch it again:</p><pre><code>openclaw onboard</code></pre><p>Most of the time, you&#8217;ll be using Telegram or WhatsApp to chat with the agent, but other times, the <strong>Terminal UI (TUI)</strong> can be very helpful. You can launch it this way:</p><pre><code>openclaw tui</code></pre><p>One tool that is often neglected is the <strong>dashboard. </strong>Once you get your hands on it, you will want to use it often. Here&#8217;s the command to launch it:</p><pre><code>openclaw dashboard</code></pre><p>At some point during your setup, you will want to <strong>try different models</strong>. You can do it with this command:</p><pre><code>openclaw models set &lt;provider/model&gt;</code></pre><p>And list them with this:</p><pre><code>openclaw models list</code></pre><p>You also may need to check the <strong>status</strong> of your OpenClaw server, where you can see general information about it, such as the port where it is listening and the process:</p><pre><code>openclaw gateway status</code></pre><p>To <strong>check security vulnerabilities</strong>, I recommend running an audit often. Maybe once per week, depending on how much you&#8217;ve been doing with it. Here&#8217;s the command:</p><pre><code>openclaw security audit --deep</code></pre><p>Sometimes the agent can hallucinate or enter into loops. The best is to<strong> stop</strong> the gateway:</p><pre><code>openclaw gateway stop</code></pre><p>You can<strong> sta</strong>rt it again with this command:</p><pre><code>openclaw gateway start</code></pre><p>In other situations, restarting may also be needed. Let&#8217;s say you&#8217;ve made modifications directly in the <code>openclaw.json</code>. The agent won&#8217;t take into account those changes unless you <strong>restart </strong>the gateway:</p><pre><code>openclaw gateway restart</code></pre><p>I use this last one frequently because, as you get familiar with the repository, you&#8217;ll see that some things are simply faster to set up manually instead of asking the agent in the chat. However, when you ask the agent to make modifications, such as installing skills, it automatically restarts the gateway for you, so you don&#8217;t need to worry about that.</p><div><hr></div><h3>2. Chat with the agent on Telegram</h3><p>If you&#8217;re reading this, you probably already have your agent connected to Telegram or WhatsApp, but for those who just finished the onboarding process and want to try the following tips, I highly recommend using Telegram.</p><p>The process is very simple. You just need these steps:</p><ol><li><p>Open the <strong>BotFather</strong> on your Telegram app (just search for it).</p></li><li><p>Write <code>/newbot</code> in BotFather&#8217;s chat.</p></li><li><p>Name your bot.</p></li><li><p>Copy the API token into your terminal.</p></li></ol><p>You&#8217;ll then receive a message from your bot to configure it:</p><pre><code>openclaw pairing approve telegram &lt;your_pairing_code&gt;</code></pre><p>That&#8217;s all you can start chatting with it on your smartphone or computer!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vZl2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F987209d8-64ce-4b0d-971e-7b52d06a8c44_576x1280.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vZl2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F987209d8-64ce-4b0d-971e-7b52d06a8c44_576x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vZl2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F987209d8-64ce-4b0d-971e-7b52d06a8c44_576x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vZl2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F987209d8-64ce-4b0d-971e-7b52d06a8c44_576x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vZl2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F987209d8-64ce-4b0d-971e-7b52d06a8c44_576x1280.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vZl2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F987209d8-64ce-4b0d-971e-7b52d06a8c44_576x1280.jpeg" width="576" height="1280" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/987209d8-64ce-4b0d-971e-7b52d06a8c44_576x1280.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1280,&quot;width&quot;:576,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!vZl2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F987209d8-64ce-4b0d-971e-7b52d06a8c44_576x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vZl2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F987209d8-64ce-4b0d-971e-7b52d06a8c44_576x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vZl2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F987209d8-64ce-4b0d-971e-7b52d06a8c44_576x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vZl2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F987209d8-64ce-4b0d-971e-7b52d06a8c44_576x1280.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">OpenClaw running on Telegram</figcaption></figure></div><p>On my laptop, I usually use both Telegram and CLI commands. Telegram for instructions and more creative tasks, and the command line for fast implementations or launching the dashboard.</p><p>On Telegram&#8217;s chat, you click on the <em><strong>Menu </strong></em>button, and you find several commands that can also save you some credits (conversations).</p><div><hr></div><h3>3. Use Perplexity for web search</h3><p>There are two main tools you can use for web search: the <strong>Brave Search API</strong> or <strong>Perplexity&#8217;s Sonar</strong>.</p><p>I prefer Perplexity&#8217;s because I can use the same OpenRouter API token that I already use for other skills and tools.</p><p>You can ask the agent to help you set up the web search tool, or you can modify it directly in the <code>openclaw.json</code> file like this:</p><pre><code>&#8220;tools&#8221;: {
  &#8220;web&#8221;: {
    &#8220;search&#8221;: {
      &#8220;enabled&#8221;: true,
      &#8220;provider&#8221;: &#8220;perplexity&#8221;,
      &#8220;perplexity&#8221;: {
        &#8220;apiKey&#8221;: &#8220;sk-or-v1-11d0...&#8221;,
        &#8220;baseUrl&#8221;: &#8220;https://openrouter.ai/api/v1&#8221;,
        &#8220;model&#8221;: &#8220;perplexity/sonar-pro&#8221;
      }
    }
  }
}</code></pre><p>Don&#8217;t forget to restart the gateway after applying the change.</p><p>One good use case for the web search tool is to create a cron job that searches the web daily for AI news and displays the summarized information, along with the URL sources, directly in Telegram chat.</p><p>Here&#8217;s an example of a simple prompt:</p><blockquote><p>I need a cron job that runs daily at 11 am. This is the prompt to schedule:</p><p>&#8220;Search for the latest AI news. Provide the links for the articles if possible. Show up to 10 important news.&#8221;</p></blockquote><div><hr></div><h3>4. Add Nano Banana 2 to edit and generate images</h3><p>Unlike the web search tool, adding Nano Banana to your chat interface requires a <code>SKILL.md</code> file.</p><p>You can install skills using <a href="https://clawhub.ai/skills">ClawHub</a>, but you need to be careful with the malicious ones.</p><p>This is how you install the ClawHub CLI:</p><pre><code>npm i -g clawdhub</code></pre><p>You can use it to search skills by terms and keywords:</p><pre><code>clawdhub search &#8220;nano banana&#8221;</code></pre><p>You&#8217;ll find all of these options:</p><pre><code>nano-banana-pro  Nano Banana Pro  (3.663)
nano-banana-pro-2  Nano Banana Pro  (3.521)
nano-banana-kling-ad-workflow  Nano Banana Kling Ad Workflow  (3.351)
nano-banana-2  Nano Banana 2  (3.337)
evolink-nano-banana-2  Nano Banana 2 &#8212; AI Image Generation (Gemini 3.1 Flash Image, Google, Evolink)  (3.224)
nano-banana-openrouter  Nano Banana Openrouter  (3.182)
evolink-nano-banana-2-1  Evolink Nano Banana 2 1  (3.175)
nano-banana-2-gemini  Nano Banana 2 &#8212; Gemini Image Generation  (3.158)
nano-banana-skill  Nano Banana Skill  (3.139)
nano-banana-image-t8  Nano Banana Image T8  (3.113)</code></pre><p>You can simply install the one that suits you best, but make sure to read about it on the ClawHub portal before installing.</p><p>In this case, I installed the one from Peter Steinberger (the creator of OpenClaw):</p><pre><code>clawdhub install nano-banana-pro</code></pre><p>It uses an older version of Nano Banana, but I modified the file to take the latest model, which is this one:</p><pre><code>gemini-3.1-flash-image-preview</code></pre><p>Note that this feature uses the Gemini API, so it comes with associated costs. However, you won&#8217;t need an additional app to generate images. They also don&#8217;t include a watermark, and you can schedule them or even automate social media posts.</p><p>Here&#8217;s an example of using Nano Banana 2 on Telegram:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YQZa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabca0eb4-a805-4038-8ad3-512179a0c877_576x1280.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YQZa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabca0eb4-a805-4038-8ad3-512179a0c877_576x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!YQZa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabca0eb4-a805-4038-8ad3-512179a0c877_576x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!YQZa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabca0eb4-a805-4038-8ad3-512179a0c877_576x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!YQZa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabca0eb4-a805-4038-8ad3-512179a0c877_576x1280.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YQZa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabca0eb4-a805-4038-8ad3-512179a0c877_576x1280.jpeg" width="576" height="1280" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/abca0eb4-a805-4038-8ad3-512179a0c877_576x1280.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1280,&quot;width&quot;:576,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!YQZa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabca0eb4-a805-4038-8ad3-512179a0c877_576x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!YQZa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabca0eb4-a805-4038-8ad3-512179a0c877_576x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!YQZa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabca0eb4-a805-4038-8ad3-512179a0c877_576x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!YQZa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabca0eb4-a805-4038-8ad3-512179a0c877_576x1280.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Nano Banana 2 on Telegram using OpenClaw</figcaption></figure></div><div><hr></div><h3>5. Add TTS to your agent&#8217;s messages</h3><p>In some cases, you may be cooking or doing things where you can&#8217;t actually read what your agent is saying. That&#8217;s why I find it useful to have the Text-to-Speech option.</p><p>You can go deep here. There are literally people learning Japanese from their Telegram, using the ElevenLabs API.</p><p>We are going to make things simpler and free of costs. By default, OpenClaw uses edge TTS, and you can activate it and give it a voice by modifying this part of the <code>openclaw.json</code> file:</p><pre><code>&#8220;messages&#8221;: {
  &#8220;tts&#8221;: {
    &#8220;auto&#8221;: &#8220;always&#8221;,
    &#8220;provider&#8221;: &#8220;edge&#8221;,
    &#8220;edge&#8221;: {
      &#8220;enabled&#8221;: true,
      &#8220;voice&#8221;: &#8220;en-CA-LiamNeural&#8221;,
      &#8220;lang&#8221;: &#8220;en-US&#8221;,
      &#8220;outputFormat&#8221;: &#8220;audio-24khz-48kbitrate-mono-mp3&#8221;,
      &#8220;pitch&#8221;: &#8220;-5%&#8221;,
      &#8220;rate&#8221;: &#8220;+10%&#8221;
    }
  }
}</code></pre><p>You can find all available voices in <a href="https://tts.travisvn.com/">here</a>.</p><p>With ElevenLabs, the configuration would look like this:</p><pre><code>{
  messages: {
    tts: {
      auto: &#8220;always&#8221;,
      provider: &#8220;openai&#8221;,
      summaryModel: &#8220;openai/gpt-4.1-mini&#8221;,
      modelOverrides: {
        enabled: true,
      },
      openai: {
        apiKey: &#8220;openai_api_key&#8221;,
        baseUrl: &#8220;https://api.openai.com/v1&#8221;,
        model: &#8220;gpt-4o-mini-tts&#8221;,
        voice: &#8220;alloy&#8221;,
      },
      elevenlabs: {
        apiKey: &#8220;elevenlabs_api_key&#8221;,
        baseUrl: &#8220;https://api.elevenlabs.io&#8221;,
        voiceId: &#8220;voice_id&#8221;,
        modelId: &#8220;eleven_multilingual_v2&#8221;,
        seed: 42,
        applyTextNormalization: &#8220;auto&#8221;,
        languageCode: &#8220;en&#8221;,
        voiceSettings: {
          stability: 0.5,
          similarityBoost: 0.75,
          style: 0.0,
          useSpeakerBoost: true,
          speed: 1.0,
        },
      },
    },
  },
}</code></pre><div><hr></div><h3>6. Create a second brain</h3><p>I found a GitHub repository full of OpenClaw use cases, including a <a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/podcast-production-pipeline.md">podcast production pipeline</a>, <a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/n8n-workflow-orchestration.md">n8n workflow orchestration</a>, <a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/personal-crm.md">personal CRM</a>, and many more. You can find the repository <a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/tree/main?tab=readme-ov-file">here</a>.</p><p>Most use cases require external APIs, but there&#8217;s a very useful one that can be implemented with a single prompt: the <a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/second-brain.md">second brain</a>.</p><p>It works similarly to a task planner like Notion. While I like Notion and use it often, there are moments when it feels too slow. For example, I might be in the kids&#8217; park with my daughter when an idea suddenly comes to mind. I don&#8217;t want to open Notion, navigate to the task manager, and place the idea in the right column. I want something faster, with minimal effort.</p><p>So I usually write messages to myself on Telegram or WhatsApp.</p><p>While this works most of the time, I still end up missing some important notes. That&#8217;s where the Second Brain becomes handy.</p><p>The idea is simple: <strong>capture should be as easy as sending a text message, and retrieval should be as easy as searching.</strong></p><p>You can, for instance, paste this to your agent:</p><blockquote><p>Hey, remind me to read &#8220;Designing Data-Intensive Applications&#8221;<br>Save this link: <a href="https://example.com/interesting-article">https://example.com/interesting-article</a><br>Remember: John recommended the restaurant on 5th street</p></blockquote><p>And then you can ask it to vibe-code a simple interface, to visualize the notes:</p><blockquote><p>I want to build a second brain system where I can review all our notes,<br>conversations, and memories. Please build that out with Next.js.</p><p>Include:<br>- A searchable list of all memories and conversations<br>- Global search (Cmd+K) across everything<br>- Ability to filter by date and type<br>- Clean, minimal UI</p></blockquote><p>All platforms will look different. This is how mine looks:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TN0l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3e0090a-b767-4b3a-a848-a4954004aac4_900x484.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TN0l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3e0090a-b767-4b3a-a848-a4954004aac4_900x484.png 424w, https://substackcdn.com/image/fetch/$s_!TN0l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3e0090a-b767-4b3a-a848-a4954004aac4_900x484.png 848w, https://substackcdn.com/image/fetch/$s_!TN0l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3e0090a-b767-4b3a-a848-a4954004aac4_900x484.png 1272w, https://substackcdn.com/image/fetch/$s_!TN0l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3e0090a-b767-4b3a-a848-a4954004aac4_900x484.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TN0l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3e0090a-b767-4b3a-a848-a4954004aac4_900x484.png" width="900" height="484" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c3e0090a-b767-4b3a-a848-a4954004aac4_900x484.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:484,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!TN0l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3e0090a-b767-4b3a-a848-a4954004aac4_900x484.png 424w, https://substackcdn.com/image/fetch/$s_!TN0l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3e0090a-b767-4b3a-a848-a4954004aac4_900x484.png 848w, https://substackcdn.com/image/fetch/$s_!TN0l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3e0090a-b767-4b3a-a848-a4954004aac4_900x484.png 1272w, https://substackcdn.com/image/fetch/$s_!TN0l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3e0090a-b767-4b3a-a848-a4954004aac4_900x484.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Second brain interface generated with OpenClaw</figcaption></figure></div><div><hr></div><h3>7. Connect to MCP servers</h3><p>There are hundreds of MCP servers that can make your life easier. One GitHub repository that caught my attention is called <a href="https://github.com/punkpeye/awesome-mcp-servers?tab=readme-ov-file">Awesome MCP Servers</a>.</p><p>You can explore it and ask your agent to create a skill based on a specific MCP, only by prompting this:</p><blockquote><p>Can you install this MCP server to act like a SKILL?</p><p><a href="https://glama.ai/mcp/servers/@albertnahas/icogenie-mcp">https://glama.ai/mcp/servers/@albertnahas/icogenie-mcp</a></p></blockquote><p>In this section, I&#8217;m going to show you how you can get data in real time by connecting OpenClaw to <a href="https://www.apify.com/?fpr=ulosg">Apify&#8217;s MCP</a>.</p><p>Apify makes this process very simple on its <a href="https://mcp.apify.com/?fpr=ulosg">server configuration page</a>.</p><p>One task that usually consumes a lot of time is searching for real estate. You may spend hours of your day searching on several platforms for the right property. But in fact, you can just set up your agent to fetch the property listings directly in your chat.</p><p>The first thing you need to do is to add the web scrapers (Apify actors) to your MCP server.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ItjW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4df7c53a-c374-49dc-bc86-4036e461bf61_900x484.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ItjW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4df7c53a-c374-49dc-bc86-4036e461bf61_900x484.png 424w, https://substackcdn.com/image/fetch/$s_!ItjW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4df7c53a-c374-49dc-bc86-4036e461bf61_900x484.png 848w, https://substackcdn.com/image/fetch/$s_!ItjW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4df7c53a-c374-49dc-bc86-4036e461bf61_900x484.png 1272w, https://substackcdn.com/image/fetch/$s_!ItjW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4df7c53a-c374-49dc-bc86-4036e461bf61_900x484.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ItjW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4df7c53a-c374-49dc-bc86-4036e461bf61_900x484.png" width="900" height="484" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4df7c53a-c374-49dc-bc86-4036e461bf61_900x484.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:484,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!ItjW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4df7c53a-c374-49dc-bc86-4036e461bf61_900x484.png 424w, https://substackcdn.com/image/fetch/$s_!ItjW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4df7c53a-c374-49dc-bc86-4036e461bf61_900x484.png 848w, https://substackcdn.com/image/fetch/$s_!ItjW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4df7c53a-c374-49dc-bc86-4036e461bf61_900x484.png 1272w, https://substackcdn.com/image/fetch/$s_!ItjW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4df7c53a-c374-49dc-bc86-4036e461bf61_900x484.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Adding Apify actors to the <a href="https://mcp.apify.com/?fpr=ulosg">MCP server</a></figcaption></figure></div><p>To get the JSON of your MCP, you can go to the bottom of the page and click on <em><strong>JSON config</strong>. </em>Finally, you can tell your agent to create a skill with this prompt:</p><blockquote><p>You need to create a SKILL for Apify MCP. This is the JSON configuration you need to use:</p><p>{<br>&#8220;mcpServers&#8221;: {<br>&#8220;apify&#8221;: {<br>&#8220;url&#8221;: &#8220;</p><p>https://mcp.apify.com/?tools=actors,docs,get-dataset,dadhalfdev/imovirtual-scraper-per-event,dadhalfdev/remax-scraper-residential-per-event</p><p>&#8220;<br>}<br>}<br>}</p><p>For API key use this one:</p><p>apify_api_gPW4&#8230;</p></blockquote><p>Now we can try to scrape something:</p><blockquote><p>Get up to 20 property listings using the Remax web scraper. You should get me properties in Lisbon, up to 300k. The other parameters don&#8217;t really matter at the moment. Please show only the latest 10 properties here, including the property info, the price and the image, along with the URL.</p></blockquote><p>Here&#8217;s the ouput (you can see how expensive properties are in Lisbon!):</p><blockquote><p>Here&#8217;s the only property I found:</p><p>T2 in Moscavide&#8202;&#8212;&#8202;&#8364;300,000</p><p>&#8226; 51m&#178; &#8226; 2 beds &#8226; 1 bath<br>&#8226; &#128205; Rua Gon&#231;alo Braga<br>&#8226; View property (<a href="https://remax.pt/en/imoveis/venda-apartamento-t2-loures-moscavide-e-portela/120181580-2">https://remax.pt/en/imoveis/venda-apartamento-t2-loures-moscavide-e-portela/120181580-2</a>)<br>&#8226; &#128444;&#65039; Image: <a href="https://i.maxwork.pt/l-view/listings/12018/7113879/bbd4a956-78f0-4d96-84ca-d64e21919adb.jpg">https://i.maxwork.pt/l-view/listings/12018/7113879/bbd4a956-78f0-4d96-84ca-d64e21919adb.jpg</a></p></blockquote><p>Sometimes the agent won&#8217;t output exactly as you want at the first try, and you also need to make sure you provide the right inputs, so always read the actors&#8217; README files before engaging with them if you want to avoid paying more than you need.</p><div><hr></div><h3>8. Explore the dashboard</h3><p>One OpenClaw tool that is often overlooked is the dashboard. You can control so many things here that I would probably need to write a dedicated article only for it.</p><p>The first feature you see when you run the dashboard command is a chat interface, which you can use instead of Telegram or the Terminal UI.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-s8-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1623a92-7be9-4c8a-b8d0-dbbd9c89b966_900x475.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-s8-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1623a92-7be9-4c8a-b8d0-dbbd9c89b966_900x475.png 424w, https://substackcdn.com/image/fetch/$s_!-s8-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1623a92-7be9-4c8a-b8d0-dbbd9c89b966_900x475.png 848w, https://substackcdn.com/image/fetch/$s_!-s8-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1623a92-7be9-4c8a-b8d0-dbbd9c89b966_900x475.png 1272w, https://substackcdn.com/image/fetch/$s_!-s8-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1623a92-7be9-4c8a-b8d0-dbbd9c89b966_900x475.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-s8-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1623a92-7be9-4c8a-b8d0-dbbd9c89b966_900x475.png" width="900" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c1623a92-7be9-4c8a-b8d0-dbbd9c89b966_900x475.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!-s8-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1623a92-7be9-4c8a-b8d0-dbbd9c89b966_900x475.png 424w, https://substackcdn.com/image/fetch/$s_!-s8-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1623a92-7be9-4c8a-b8d0-dbbd9c89b966_900x475.png 848w, https://substackcdn.com/image/fetch/$s_!-s8-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1623a92-7be9-4c8a-b8d0-dbbd9c89b966_900x475.png 1272w, https://substackcdn.com/image/fetch/$s_!-s8-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1623a92-7be9-4c8a-b8d0-dbbd9c89b966_900x475.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Chat interface on OpenClaw&#8217;s dashboard</figcaption></figure></div><p>On the left side, you can see all the tabs. For instance, when you schedule something or set up reminders, you&#8217;re actually creating cron jobs, which can all be visible on <em><strong>Cron Jobs</strong></em> tab.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VVVH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff705eec-404e-480e-910a-d98bc7002589_900x475.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VVVH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff705eec-404e-480e-910a-d98bc7002589_900x475.png 424w, https://substackcdn.com/image/fetch/$s_!VVVH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff705eec-404e-480e-910a-d98bc7002589_900x475.png 848w, https://substackcdn.com/image/fetch/$s_!VVVH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff705eec-404e-480e-910a-d98bc7002589_900x475.png 1272w, https://substackcdn.com/image/fetch/$s_!VVVH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff705eec-404e-480e-910a-d98bc7002589_900x475.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VVVH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff705eec-404e-480e-910a-d98bc7002589_900x475.png" width="900" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff705eec-404e-480e-910a-d98bc7002589_900x475.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!VVVH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff705eec-404e-480e-910a-d98bc7002589_900x475.png 424w, https://substackcdn.com/image/fetch/$s_!VVVH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff705eec-404e-480e-910a-d98bc7002589_900x475.png 848w, https://substackcdn.com/image/fetch/$s_!VVVH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff705eec-404e-480e-910a-d98bc7002589_900x475.png 1272w, https://substackcdn.com/image/fetch/$s_!VVVH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff705eec-404e-480e-910a-d98bc7002589_900x475.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Cron jobs on OpenClaw&#8217;s dashboard</figcaption></figure></div><p>You can also remove, add, or modify them directly here, which is faster and doesn&#8217;t use LLM credits.</p><p>In addition, you can view the outputs here as well. If you clear your Telegram history, you&#8217;ll still be able to find the information on your dashboard.</p><p>When you start using OpenClaw frequently, one thing you&#8217;ll definitely want to keep track of is your LLM costs. In the <em><strong>Usage</strong></em> tab, you can see the costs associated with LLM usage and monitor token activity.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y7-w!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa3c55c7-7fb4-4e12-9eb5-9d18266bbabc_900x475.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y7-w!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa3c55c7-7fb4-4e12-9eb5-9d18266bbabc_900x475.png 424w, https://substackcdn.com/image/fetch/$s_!y7-w!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa3c55c7-7fb4-4e12-9eb5-9d18266bbabc_900x475.png 848w, https://substackcdn.com/image/fetch/$s_!y7-w!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa3c55c7-7fb4-4e12-9eb5-9d18266bbabc_900x475.png 1272w, https://substackcdn.com/image/fetch/$s_!y7-w!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa3c55c7-7fb4-4e12-9eb5-9d18266bbabc_900x475.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y7-w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa3c55c7-7fb4-4e12-9eb5-9d18266bbabc_900x475.png" width="900" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aa3c55c7-7fb4-4e12-9eb5-9d18266bbabc_900x475.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!y7-w!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa3c55c7-7fb4-4e12-9eb5-9d18266bbabc_900x475.png 424w, https://substackcdn.com/image/fetch/$s_!y7-w!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa3c55c7-7fb4-4e12-9eb5-9d18266bbabc_900x475.png 848w, https://substackcdn.com/image/fetch/$s_!y7-w!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa3c55c7-7fb4-4e12-9eb5-9d18266bbabc_900x475.png 1272w, https://substackcdn.com/image/fetch/$s_!y7-w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa3c55c7-7fb4-4e12-9eb5-9d18266bbabc_900x475.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">LLM usage on OpenClaw&#8217;s dashboard</figcaption></figure></div><p>One last feature I like to keep an eye on is the agents and sub-agents. Here, you can see which channels they are associated with, as well as the tools and skills they use.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Latv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24a6d7cc-5f3f-4d39-9c3b-5b1221976ef7_900x475.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Latv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24a6d7cc-5f3f-4d39-9c3b-5b1221976ef7_900x475.png 424w, https://substackcdn.com/image/fetch/$s_!Latv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24a6d7cc-5f3f-4d39-9c3b-5b1221976ef7_900x475.png 848w, https://substackcdn.com/image/fetch/$s_!Latv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24a6d7cc-5f3f-4d39-9c3b-5b1221976ef7_900x475.png 1272w, https://substackcdn.com/image/fetch/$s_!Latv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24a6d7cc-5f3f-4d39-9c3b-5b1221976ef7_900x475.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Latv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24a6d7cc-5f3f-4d39-9c3b-5b1221976ef7_900x475.png" width="900" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/24a6d7cc-5f3f-4d39-9c3b-5b1221976ef7_900x475.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!Latv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24a6d7cc-5f3f-4d39-9c3b-5b1221976ef7_900x475.png 424w, https://substackcdn.com/image/fetch/$s_!Latv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24a6d7cc-5f3f-4d39-9c3b-5b1221976ef7_900x475.png 848w, https://substackcdn.com/image/fetch/$s_!Latv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24a6d7cc-5f3f-4d39-9c3b-5b1221976ef7_900x475.png 1272w, https://substackcdn.com/image/fetch/$s_!Latv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24a6d7cc-5f3f-4d39-9c3b-5b1221976ef7_900x475.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Agents and sub-agents on OpenClaw&#8217;s dashboard</figcaption></figure></div><p>In the next section, we&#8217;ll see how to create sub-agents and add them to specific channels with their own skills.</p><div><hr></div><h3>9. Create sub-agents</h3><p>Creating sub-agents is like managing multiple employees. They all have different skills and tools, and they may or may not communicate with each other.</p><p>For security reasons, my agents are more like freelancers: they don&#8217;t share any work, and they don&#8217;t even know each other. On the other hand, there&#8217;s an orchestrator, which I call <strong>Master, </strong>that can control the sub-agents.</p><p>I&#8217;ve created one for Telegram called <strong>Dad Half Bot</strong>, which handles most of my personal tasks and is the one I use for experimentation.</p><p>Then I have another one for a Slack channel called <strong>Oxxo</strong>, which is tailored to handle family-related tasks like our daughter&#8217;s medical appointments, household chores, shared ideas, travel plans, and so on.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lEvo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd487f3c1-a4b3-4e1c-8f80-a396d648ad64_900x475.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lEvo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd487f3c1-a4b3-4e1c-8f80-a396d648ad64_900x475.png 424w, https://substackcdn.com/image/fetch/$s_!lEvo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd487f3c1-a4b3-4e1c-8f80-a396d648ad64_900x475.png 848w, https://substackcdn.com/image/fetch/$s_!lEvo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd487f3c1-a4b3-4e1c-8f80-a396d648ad64_900x475.png 1272w, https://substackcdn.com/image/fetch/$s_!lEvo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd487f3c1-a4b3-4e1c-8f80-a396d648ad64_900x475.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lEvo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd487f3c1-a4b3-4e1c-8f80-a396d648ad64_900x475.png" width="900" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d487f3c1-a4b3-4e1c-8f80-a396d648ad64_900x475.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!lEvo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd487f3c1-a4b3-4e1c-8f80-a396d648ad64_900x475.png 424w, https://substackcdn.com/image/fetch/$s_!lEvo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd487f3c1-a4b3-4e1c-8f80-a396d648ad64_900x475.png 848w, https://substackcdn.com/image/fetch/$s_!lEvo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd487f3c1-a4b3-4e1c-8f80-a396d648ad64_900x475.png 1272w, https://substackcdn.com/image/fetch/$s_!lEvo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd487f3c1-a4b3-4e1c-8f80-a396d648ad64_900x475.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Creating agents with the chat interface is very simple, but I highly recommend you have a look at the repository to see how they are organized.</p><p>When they are created, check on your machine that the agent indeed created a workspace for each of them under the <code>.openclaw</code> folder.</p><p>Another way to verify this is by using the <code>openclaw.json</code> file:</p><pre><code>&#8220;agents&#8221;: {
  &#8220;list&#8221;: [
    {
      &#8220;id&#8221;: &#8220;master&#8221;,
      &#8220;name&#8221;: &#8220;Master&#8221;,
      &#8220;default&#8221;: true,
      &#8220;workspace&#8221;: &#8220;/root/.openclaw/workspace&#8221;
    },
    {
      &#8220;id&#8221;: &#8220;dad-half-bot&#8221;,
      &#8220;name&#8221;: &#8220;Dad Half Bot&#8221;,
      &#8220;workspace&#8221;: &#8220;/root/.openclaw/workspace-dad-half-bot&#8221;
    },
    {
      &#8220;id&#8221;: &#8220;oxxo&#8221;,
      &#8220;name&#8221;: &#8220;Oxxo&#8221;,
      &#8220;workspace&#8221;: &#8220;/root/.openclaw/workspace-oxxo&#8221;
    }
  ],
  &#8220;defaults&#8221;: {
    &#8220;model&#8221;: {
      &#8220;primary&#8221;: &#8220;openrouter/minimax/minimax-m2.5&#8221;
    },
    &#8220;models&#8221;: {
      &#8220;openrouter/auto&#8221;: {
        &#8220;alias&#8221;: &#8220;OpenRouter&#8221;
      },
      &#8220;openrouter/google/gemini-2.5-flash-lite&#8221;: {},
      &#8220;openrouter/minimax/minimax-m2.5&#8221;: {}
    },
    &#8220;workspace&#8221;: &#8220;/root/.openclaw/workspace&#8221;,
    &#8220;compaction&#8221;: {
      &#8220;mode&#8221;: &#8220;safeguard&#8221;
    },
    &#8220;maxConcurrent&#8221;: 4,
    &#8220;subagents&#8221;: {
      &#8220;maxConcurrent&#8221;: 8
    }
  }
}</code></pre><p>And the <strong>bindings</strong> will show which channels your agents have access:</p><pre><code>&#8220;bindings&#8221;: [
  {
    &#8220;agentId&#8221;: &#8220;dad-half-bot&#8221;,
    &#8220;match&#8221;: {
      &#8220;channel&#8221;: &#8220;telegram&#8221;
    }
  },
  {
    &#8220;agentId&#8221;: &#8220;master&#8221;,
    &#8220;match&#8221;: {
      &#8220;channel&#8221;: &#8220;*&#8221;
    }
  }
]</code></pre><p>Also, check this file after customizing your sub-agents, because you definitely don&#8217;t want to see unexpected behaviours and give the wrong permissions to the wrong agent. Also, it&#8217;s a good practice to run an audit after these implementations.</p><div><hr></div><h3>10. Create a custom SKILL.md</h3><p>Throughout this article, we&#8217;ve seen that many skills can be created simply by chatting with the agent and providing the right information, such as an MCP or an API key.</p><p>Basically, what you&#8217;re doing is asking the LLM to vibe code a Markdown file and, in some cases, a Python script.</p><p>Depending on the model you&#8217;re using, you may come up with a successful skill, but not always. That&#8217;s where tweaking the Markdown files, or having a bit of programming knowledge, can be helpful.</p><p>In addition, you should never rely 100% on the agent&#8217;s output, nor the Skills listed on ClawHub, some can be malicious.</p><p>Here&#8217;s an example of a skill I&#8217;ve created for Google Ads that accesses a Python file that generates only three functions: <code>get_campaign_performance()</code>, <code>get_popular_keywords()</code>, <code>get_device_breakdown()</code>.</p><pre><code># SKILL: Google Ads Reporting Agent (Read-Only)

## &#127919; Purpose

This skill enables the AI Agent to retrieve **read-only performance data** from a Google Ads child account via the Google Ads API.

The agent can only use predefined Python functions in `google_ads.py` to fetch reporting data.

---

## &#127959; Google Ads Account Structure

Google Ads uses a **parent-child hierarchy**:

### MCC (My Client Center)
- Agency-level parent account  
- Does NOT run ads  
- Provides centralized access to child accounts  

### Child Accounts
- Actual ad accounts  
- Campaigns run here  
- Budget is spent here  
- API reporting pulls data from these accounts  

This skill interacts **only with the child account via the API**.

---

## &#128272; API Permissions &amp; Constraints

- API access level: **Reporting (Read-Only)**
- The agent **cannot**:
  - Modify campaigns  
  - Create ads  
  - Adjust budgets  
  - Pause or enable campaigns  
  - Change targeting  

- Authentication is handled via `google_ads.yaml`
- The agent must NOT request or expose API keys, tokens, or credentials

---

## &#128736; Available Functions (Only These May Be Used)

The agent may only call functions defined inside:

`google_ads.py`


### Allowed Functions

#### 1. `get_campaign_performance()`
Returns a dataframe of overall campaign performance.

#### 2. `get_popular_keywords()`
Returns a dataframe of top-performing keywords.

#### 3. `get_device_breakdown()`
Returns a dataframe showing device-level performance.

---

## &#128187; CLI Usage (argparse)

`google_ads.py` now supports command-line execution with a required `report` argument.

### Supported CLI Arguments

- `performance` &#8594; runs campaign performance report  
- `keywords` &#8594; runs popular keywords report  
- `devices` &#8594; runs device breakdown report  

### Example Commands

- `python google_ads.py performance`
- `python google_ads.py keywords`
- `python google_ads.py devices`

---

## &#128228; Output Requirements

- All responses must be presented as **clean, structured tables**
- Do NOT display:
  - Python code  
  - Function names  
  - Internal implementation details  

The user should only see:
- Clear data tables  
- Optional short insights or summaries  

---

## &#128683; Strict Execution Rules

1. The agent MUST only execute functions inside `google_ads.py`
2. The agent MUST NOT attempt custom queries
3. The agent MUST NOT access external APIs
4. The agent MUST NOT generate synthetic or mock data
5. If a request cannot be fulfilled using available functions, respond with:

&gt; I don&#8217;t currently have the capability to retrieve that specific data.

---

## &#9989; Supported Query Examples

- Show campaign performance  
- Which keywords perform best?  
- Give me device-level breakdown  
- How are my campaigns doing overall?  

---

## &#10060; Unsupported Query Examples

- Pause campaign X  
- Increase budget by 20%  
- Create a new campaign  
- Segment by age or gender  
- Any request requiring a custom query not covered by the 3 available functions  

---

## &#129504; Behavioral Guidelines

- Be concise  
- Be data-focused  
- Avoid technical explanations  
- Provide insights only if helpful  
- Never mention internal file names or function logic  
- Never expose system configuration

---

## &#128444;&#65039; Image and File Display

- When a tool generates a file (e.g., a chart), it must be sent to Slack using the `message` tool.
- The `message` tool **requires** both a `filePath` and a `message` (text content).
- **Correct Usage:** `message(action=&#8221;send&#8221;, filePath=&#8221;path/to/file.png&#8221;, message=&#8221;Here is your file:&#8221;)`
- **Incorrect Usage:** `message(action=&#8221;send&#8221;, filePath=&#8221;path/to/file.png&#8221;)` or using inline `MEDIA:` tokens.  


</code></pre><p>Creating custom skills is even more important when setting up OpenClaw within a company, because you need to minimize the exposure of keys and make sure the agent is confined to fetching specific data.</p><p><em><strong>Need help with automation, AI, or data science? Let&#8217;s talk.</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/jaULmLguQX8KbikZ6&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://calendar.app.google/jaULmLguQX8KbikZ6"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3>Conclusion</h3><p>After reading this article, you should be able to start doing plenty of cool things with OpenClaw. You can also explore further using the two GitHub repositories I shared: one for <a href="https://github.com/hesamsheikh/awesome-openclaw-usecases/blob/main/usecases/second-brain.md~">use cases</a> and another for <a href="https://github.com/punkpeye/awesome-mcp-servers?tab=readme-ov-file">MCPs</a>.</p><p>Using the agent correctly is not only about writing good prompts and seeing things flourish. It&#8217;s also about understanding what&#8217;s happening on the server side. That&#8217;s why using the dashboard and exploring key repository files, such as SKILL.md and <code>openclaw.json</code><strong>, </strong>is essential. Otherwise, you may end up building something you can&#8217;t fully control and eventually need to hire someone to debug it.</p><p>Add skills slowly, and only the ones you truly need. Read them carefully before installing them, and tweak the Markdown files if necessary.</p><p>Run audits regularly, and ask for help if things start getting messy. It&#8217;s better to involve a software engineer or someone familiar with these setups than risk prompt injection or other malicious activity.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"><strong>Curious about what I&#8217;m building? &#128064;</strong></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[Stop Wasting Connects on Upwork: 5 Tips That Actually Work]]></title><description><![CDATA[Learn strategies to make the most of Upwork without burning all your Connects in bids and job applications.]]></description><link>https://blog.dadhalfdev.com/p/stop-wasting-connects-on-upwork-5</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/stop-wasting-connects-on-upwork-5</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Tue, 10 Feb 2026 23:56:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!BhB_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d87d06-7873-4284-9055-53209959a238_900x563.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BhB_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d87d06-7873-4284-9055-53209959a238_900x563.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BhB_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d87d06-7873-4284-9055-53209959a238_900x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!BhB_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d87d06-7873-4284-9055-53209959a238_900x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!BhB_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d87d06-7873-4284-9055-53209959a238_900x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!BhB_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d87d06-7873-4284-9055-53209959a238_900x563.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BhB_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d87d06-7873-4284-9055-53209959a238_900x563.jpeg" width="900" height="563" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/50d87d06-7873-4284-9055-53209959a238_900x563.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:563,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!BhB_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d87d06-7873-4284-9055-53209959a238_900x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!BhB_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d87d06-7873-4284-9055-53209959a238_900x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!BhB_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d87d06-7873-4284-9055-53209959a238_900x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!BhB_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50d87d06-7873-4284-9055-53209959a238_900x563.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Image by Author</figcaption></figure></div><p>Let&#8217;s be frank here, freelancing platforms are wild! And <a href="https://www.upwork.com/">Upwork</a> is probably the wildest of them all, making you pay hundreds of dollars even before landing your first job.</p><p>When I first started freelancing on Upwork, there was no bidding system, meaning I only used <em>Connects</em> (the platform&#8217;s currency) to apply for jobs.</p><p>But not too long ago, the platform introduced a bidding system, and what once looked like a fair setup quickly turned into a gambling game, where all that matters is being seen by potential clients.</p><p>The rules of the game are simple: you bid, and if your application is seen by the client, you lose all the <em>Connects</em> you&#8217;ve bid for that position, hoping you&#8217;ll be the one picked.</p><p>This bidding gambling game has become so competitive that you may now need to <strong>pay over $30</strong> just to apply for a single position.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0swR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eedf208-b39c-4f09-989a-a3c4dcfbf086_637x650.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0swR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eedf208-b39c-4f09-989a-a3c4dcfbf086_637x650.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0swR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eedf208-b39c-4f09-989a-a3c4dcfbf086_637x650.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0swR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eedf208-b39c-4f09-989a-a3c4dcfbf086_637x650.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0swR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eedf208-b39c-4f09-989a-a3c4dcfbf086_637x650.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0swR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eedf208-b39c-4f09-989a-a3c4dcfbf086_637x650.jpeg" width="637" height="650" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2eedf208-b39c-4f09-989a-a3c4dcfbf086_637x650.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:650,&quot;width&quot;:637,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!0swR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eedf208-b39c-4f09-989a-a3c4dcfbf086_637x650.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0swR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eedf208-b39c-4f09-989a-a3c4dcfbf086_637x650.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0swR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eedf208-b39c-4f09-989a-a3c4dcfbf086_637x650.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0swR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2eedf208-b39c-4f09-989a-a3c4dcfbf086_637x650.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Bidding system on <a href="https://www.upwork.com/">Upwork</a></figcaption></figure></div><p>Now, how can someone start freelancing on Upwork if they are spending more on the platform than they actually earn?</p><p>According to a <a href="https://www.demandsage.com/upwork-statistics/">report</a> by DemandSage, Upwork is the leading platform with over 18 million freelancers worldwide, where 25.6% of them are in the United States, 13.5% in Philiphines, 12.5% in India, 3% in the United Kingdom, 2% in Canada, and 43% in other regions of the world.</p><p>This is also a company that generated between $782 million and $787 million in revenue in 2025 alone, and it is expected to grow by 6&#8211;8% in 2026.</p><p>With that being said, Upwork has a competitive advantage and the resources to create one of the best freelancing experiences for both recruiters and applicants. However, according to several <a href="https://www.g2.com/products/upwork/reviews?filters%5Bcomment_answer_values%5D=bids&amp;order=g2_default&amp;utf8=%E2%9C%93#reviews">G2 reviews</a>, users are increasingly complaining about the new system and how difficult it has become to land a contract.</p><blockquote><p>The biggest challenge is the limited number of Connects compared to the number needed to apply for jobs. With only a small amount provided each month, freelancers often have to purchase more just to stay competitive, and those credits disappear whether or not a client ever views the proposal. On top of that, the competition is extremely high, with some job posts receiving hundreds of bids.&#8202;&#8212;&#8202;<strong><a href="https://www.g2.com/products/upwork/reviews/upwork-review-11975471">Jennifer D.</a> on G2.</strong></p></blockquote><p>I&#8217;ve already criticized the platform enough. The truth is that they must be doing something right to have over 18 million freelancers and over 5 million clients. I&#8217;m one of them, and I&#8217;m not planning on leaving. In fact, I always try to bring new clients to the platform.</p><p>But since Upwork is now a <em>Connects </em>burning machine, I had to change my strategy and focus on getting invitations instead of applying for positions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4_3I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b982232-e657-42d5-9520-58c8e0bc4325_900x408.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4_3I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b982232-e657-42d5-9520-58c8e0bc4325_900x408.png 424w, https://substackcdn.com/image/fetch/$s_!4_3I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b982232-e657-42d5-9520-58c8e0bc4325_900x408.png 848w, https://substackcdn.com/image/fetch/$s_!4_3I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b982232-e657-42d5-9520-58c8e0bc4325_900x408.png 1272w, https://substackcdn.com/image/fetch/$s_!4_3I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b982232-e657-42d5-9520-58c8e0bc4325_900x408.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4_3I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b982232-e657-42d5-9520-58c8e0bc4325_900x408.png" width="900" height="408" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9b982232-e657-42d5-9520-58c8e0bc4325_900x408.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:408,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!4_3I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b982232-e657-42d5-9520-58c8e0bc4325_900x408.png 424w, https://substackcdn.com/image/fetch/$s_!4_3I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b982232-e657-42d5-9520-58c8e0bc4325_900x408.png 848w, https://substackcdn.com/image/fetch/$s_!4_3I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b982232-e657-42d5-9520-58c8e0bc4325_900x408.png 1272w, https://substackcdn.com/image/fetch/$s_!4_3I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b982232-e657-42d5-9520-58c8e0bc4325_900x408.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">My profile on <a href="https://www.upwork.com/freelancers/~01185447baa36a1b77">Upwork</a></figcaption></figure></div><p>In this article, I&#8217;ll guide you on how to make the most of the platform and earn the <em><strong>Top Rated Plus</strong></em> badge as I did, without spending all your money on <em>Connects</em>.</p><div><hr></div><h3>More Hours Don&#8217;t Mean More Reputation</h3><p>The reason I started freelancing wasn&#8217;t that I was tired of working for companies, but because I wanted more free time to spend with my baby daughter. I couldn&#8217;t find a better option that allowed me to both spend my mornings with her and work in the afternoons.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!id9u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e833b0a-a7a9-43fc-8cf6-e90ea09f22fd_900x601.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!id9u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e833b0a-a7a9-43fc-8cf6-e90ea09f22fd_900x601.jpeg 424w, https://substackcdn.com/image/fetch/$s_!id9u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e833b0a-a7a9-43fc-8cf6-e90ea09f22fd_900x601.jpeg 848w, https://substackcdn.com/image/fetch/$s_!id9u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e833b0a-a7a9-43fc-8cf6-e90ea09f22fd_900x601.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!id9u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e833b0a-a7a9-43fc-8cf6-e90ea09f22fd_900x601.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!id9u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e833b0a-a7a9-43fc-8cf6-e90ea09f22fd_900x601.jpeg" width="900" height="601" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e833b0a-a7a9-43fc-8cf6-e90ea09f22fd_900x601.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:601,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!id9u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e833b0a-a7a9-43fc-8cf6-e90ea09f22fd_900x601.jpeg 424w, https://substackcdn.com/image/fetch/$s_!id9u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e833b0a-a7a9-43fc-8cf6-e90ea09f22fd_900x601.jpeg 848w, https://substackcdn.com/image/fetch/$s_!id9u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e833b0a-a7a9-43fc-8cf6-e90ea09f22fd_900x601.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!id9u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e833b0a-a7a9-43fc-8cf6-e90ea09f22fd_900x601.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Me and my daughter</figcaption></figure></div><p>I chose to work on Upwork because I already had an account and because there is a strong demand in IT (according to <a href="https://www.demandsage.com/upwork-statistics/">DemandSage</a>, 34% of the demand is in Web, Mobile, and Software Development).</p><p>The first few months were very hard. I had to set a low hourly rate, and I wasn&#8217;t able to deliver more than 5&#8211;6 hours per day, so I couldn&#8217;t apply for contracts that required 40 hours per week.</p><p>However, that didn&#8217;t stop me from achieving the <em><strong>Rising Talent</strong></em> badge, then <em><strong>Top Rated</strong></em>, and finally <em><strong>Top Rated Plus</strong></em>.</p><p>Many people think that when you&#8217;re starting on Upwork, you need to work 18 hours a day at super low rates and with all sorts of clients. That&#8217;s simply not true.</p><p>If you&#8217;re working for someone who doesn&#8217;t value your skills (meaning they underpay you), most likely they also won&#8217;t care about treating you well or leaving a good review at the end.</p><p>You need to work according to what you&#8217;re capable of delivering, both time-wise and skill-wise. Naturally, the platform will reward you with better visibility as you maintain a high success rate and strong reviews.</p><p>Also, make sure to communicate through Upwork&#8217;s chat, even if the client prefers Slack or another app. Being active on the platform matters for the algorithm.</p><div><hr></div><h3>Find the Best Way to Showcase Your Skills</h3><p>When you&#8217;re applying for a position, you have literally one chance of grabbing the attention of the potential client.</p><p>I don&#8217;t know the ultimate formula, but I do know what worked for me in the beginning.</p><p>I was never overly technical in my applications. I always used a friendly, informal tone and focused on showcasing what I was capable of delivering. To do that, you need to find a way to clearly communicate your skills.</p><p>For me, that was through Medium articles.</p><p>If I were applying for a web scraping job, I would include links to articles I had written about web scraping. That way, the client had proof that I was indeed capable of delivering the work.</p><p>Here&#8217;s an example:</p><blockquote><p>Hi, I&#8217;m Marco :)</p><p>I have several proven experience with web scraping, you can see some of my work here:</p><p>1. Google Maps Web Scraping: <a href="https://levelup.gitconnected.com/web-scrape-google-maps-reviews-with-playwright-for-free-7d6f42f1719d?sk=42c46fb12bd1417fe306745dcddce37d">https://levelup.gitconnected.com/web-scrape-google-maps-reviews-with-playwright-for-free-7d6f42f1719d?sk=42c46fb12bd1417fe306745dcddce37d</a></p><p>2. YouTube Web Scraping: <a href="https://levelup.gitconnected.com/how-to-scrape-youtube-data-for-free-727b78fdd0d8?sk=6559cb4407222c648faefd1402c18b67">https://levelup.gitconnected.com/how-to-scrape-youtube-data-for-free-727b78fdd0d8?sk=6559cb4407222c648faefd1402c18b67</a></p><p>3. Scrapy and Playwright: <a href="https://medium.com/python-in-plain-english/combine-playwright-with-scrapy-for-web-scraping-c7c00168f567?sk=b3bfa671e91b1551ccf624b6e03507d0">https://medium.com/python-in-plain-english/combine-playwright-with-scrapy-for-web-scraping-c7c00168f567?sk=b3bfa671e91b1551ccf624b6e03507d0</a></p><p>4. Create an Apify actor: <a href="https://medium.com/python-in-plain-english/how-i-published-my-polymarket-web-scraper-on-apify-b616bba648c8?sk=0d4eb946290c29cb5e16ced4fbd679ac">https://medium.com/python-in-plain-english/how-i-published-my-polymarket-web-scraper-on-apify-b616bba648c8?sk=0d4eb946290c29cb5e16ced4fbd679ac</a></p><p>The articles above are just some examples of what I can do with tools such as Playwright, Beautiful Soup and Scrapy.</p><p>Kindly let me know what website you&#8217;re willing to scrape.</p><p>Looking forward to hearing from you!</p></blockquote><p>I find GitHub too technical for this purpose. Many people hiring on these platforms aren&#8217;t technical themselves, so they&#8217;re looking for a friendly way to understand your stack without having to read code.</p><p>The important thing is to find a way to communicate your work that best matches your personality. It can be through YouTube videos, LinkedIn posts, presentations, articles, etc. It doesn&#8217;t really matter, as long as you make the client feel confident that you&#8217;re the right fit.</p><div><hr></div><h3>Be Prepared to Say &#8220;No&#8221;</h3><p>One of the biggest mistakes beginners make on Upwork is applying for or accepting every offer they see.</p><p>This is totally wrong. Let me tell you why.</p><h4>The client&#8217;s score is important</h4><p>Just like freelancers, clients also receive a score after a contract is completed. Ideally, you want to work with people who have high scores (this applies to both sides).</p><p>If you&#8217;re applying to positions where the client has a low score or no score at all, you&#8217;re taking a risk.</p><p>Don&#8217;t get me wrong, I&#8217;ve worked with many clients who were new to Upwork. However, I always made sure to have a short call with them before starting the contract.</p><h4>Pay attention to the first interaction</h4><p>If possible, try to have a short call with every client, even those with high scores. Sometimes, the first contact says a lot about the kind of working relationship you&#8217;re about to have.</p><p>So even if you&#8217;re in the interview process with a client who has:</p><ul><li><p>A high score.</p></li><li><p>Many reviews.</p></li><li><p>The ability to pay fairly.</p></li></ul><p>If you don&#8217;t feel good chemistry during the interview, it&#8217;s often better to trust your instincts and decline the offer.</p><p>This may sound demanding for beginners, and sometimes you do need experience handling different client personalities before learning to say no. I agree. But once you reach a point where you truly understand your ideal working environment, lean into it.</p><h4>Negotiators are a red flag</h4><p>Many times, you&#8217;ll come across clients who want to slightly reduce your hourly rate, and that&#8217;s totally understandable, especially for mid to long-term contracts where there&#8217;s room to increase the rate over time.</p><p>However, be cautious with clients who negotiate too much. In most cases, these are the same people who will later complain about the number of hours you log. This often leads to a poor working experience, where you, as a freelancer, may be forced to log fewer hours only to avoid a bad review at the end (and you may still receive it).</p><h4>Be careful with non-technical clients</h4><p>Related to the previous point, the clients who criticize the time spent on tasks are often those who lack technical knowledge. They usually don&#8217;t understand the difference between building, debugging, and optimization (especially in programming-related work).</p><p>It&#8217;s completely normal for clients not to have the same technical background as you do, that&#8217;s why they&#8217;re hiring in the first place. Ideally, though, they should be willing to learn or at least have a general understanding of what the job involves.</p><p>Unfortunately, these types of clients often post unrealistic job offers or have no clue about the effort required to complete the work.</p><div><hr></div><h3>Make Your Profile Shine</h3><p>We need to trust Upwork&#8217;s algorithm. If we do, we know that the better our profile is, the more likely we will appear in the results when clients are looking for our skills.</p><p>You should start by creating a job title that highlights the best of what you do. You may be able to do programming and marketing, but never mention the two in the same job title. You can create separate profiles for that.</p><p>The best is to look at the best professionals in your field and try to use similar job titles and descriptions.</p><p>For the latter, make sure you don&#8217;t use AI. The algorithm detects what is AI-generated and what is not, and clients will see you as &#8220;fake&#8221;.</p><p>Try to highlight your goals, projects, and previous work with clients (even if they were outside of Upwork).</p><p>Here&#8217;s my description:</p><blockquote><p><strong>&#127942; Top 3% Freelancer on Upwork | &#128104;&#8205;&#128187; 4+ Years of Python Expertise | &#9889; AI, Data, and Automation Specialist</strong></p><p>Hi I&#8217;m Marco &#128075;</p><p>I&#8217;m a Python developer with over 4 years of hands-on experience building AI systems, automation workflows, and data-driven applications for clients across multiple industries.</p><p>I began my career at the French Space Agency (CNES), working in Microelectronics and Failure Analysis, before transitioning to Software Engineering at the agency&#8217;s French Guiana spaceport.</p><p>After that, I was faced with the amazing news that I was going to be a father, so I decided to embrace freedom and take on a new challenge: working for myself.</p><p>Now I&#8217;m a Dad Half Dev &#128118;&#128104;&#8205;&#128187;</p><p>50% Parenting<br>50% Data Science, AI, and Automation</p><p>&#127757; I speak: English, French, Spanish, and Portuguese.</p><p><strong>&#11088; Highlights</strong></p><p>&#8627; Developed 5+ MVPs that successfully secured funding.</p><p>&#8627; Completed 35+ Upwork contracts with a 100% success rate.</p><p>&#8627; Built and currently maintain scalable data pipelines for 3+ companies.</p><p>&#8627; Implemented AI APIs and Large Language Models across 10+ diverse projects.</p><p>&#8627; Developed advanced Retrieval-Augmented Generation (RAG) systems using the latest AI frameworks.</p><p>&#8627; Designed and deployed 3+ modern web dashboards using Dash Plotly, and React components.</p><p>&#8627; Built custom automation bots with LLMs and generative AI (avatar videos and images) for various social media platforms</p><p>&#8627; Authored high-level technical content for 2+ international clients.</p><p>&#8627; Built 20+ web scrapers on Apify.</p><p>&#8627; Created multiple Exploratory Data Analysis (EDA) pipelines for diverse subjects.</p><p>&#8627; Built pipelines to automate PDF report generation with insightful charts and stats.</p><p><strong>&#129504; Skills &amp; Tools</strong></p><p>&#8627; AI &amp; RAG Systems: LangGraph, LangChain, OpenAI, ChromaDB, Pinecone.</p><p>&#8627; Automation &amp; Scraping: Playwright, BeautifulSoup, Apify (Actors), Camoufox.</p><p>&#8627; Data Science &amp; ML: Pandas, NumPy, Scikit-Learn, PyCaret, TensorFlow, MMM (Marketing Mix Model), NLP.</p><p>&#8627; Dashboards &amp; Visualization: Plotly Dash, Looker Studio, Matplotlib, Seaborn, Vega Altair.</p><p>&#8627; Web Development: FastAPI, Flask, CSS, HTML, Jinja2.</p><p>&#8627; Technical Writing: Specialized in Data Science, AI, and Automation.</p><p><strong>&#128640; Side Projects</strong></p><p>&#8627; AI Assistant (RAG) for Crypto &amp; Blockchain News: Built a Retrieval-Augmented Generation (RAG) system that ingests and embeds articles from multiple crypto news sources. Users can query the assistant to receive up-to-date summaries with direct source links, enabling fast research and decision-making.</p><p>&#8627; Automated Web3 Newsletter: Developed a fully automated newsletter pipeline that curates blockchain content and generates data-driven insights and charts.</p><p>&#8627; Web3 Analytics Dashboard (Hackathon Winner&#8202;&#8212;&#8202;&#8364;5k prize): Won a hackathon challenge by building an interactive Plotly dashboard to visualize tokenized assets, focusing on clarity, performance, and real-time usability.</p><p>&#8627; Social Media Bot (X / Twitter API v2): Designed and deployed an LLM-powered social media bot that publishes 3 posts per day automatically, handling content generation and scheduling.</p><p>&#8627; AI-Generated Illustrated Books Pipeline: Created an end-to-end pipeline to automatically generate illustrated books using generative AI, from prompt generation to image creation and assembly.</p><p>If you&#8217;re seeking a versatile and highly skilled professional to bring value to your project, let&#8217;s talk! &#129309;</p></blockquote><p>Descriptions and titles may help you appear among the top results without using <em>Connects,</em> but once your profile is visited, you want to make sure the client learns as much as he can about you and your skills.</p><p>That&#8217;s why it is important to enrich your portfolio section with images and projects.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pxS_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F078c137c-201e-4689-955f-7b4fe34c3bce_900x533.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pxS_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F078c137c-201e-4689-955f-7b4fe34c3bce_900x533.png 424w, https://substackcdn.com/image/fetch/$s_!pxS_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F078c137c-201e-4689-955f-7b4fe34c3bce_900x533.png 848w, https://substackcdn.com/image/fetch/$s_!pxS_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F078c137c-201e-4689-955f-7b4fe34c3bce_900x533.png 1272w, https://substackcdn.com/image/fetch/$s_!pxS_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F078c137c-201e-4689-955f-7b4fe34c3bce_900x533.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pxS_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F078c137c-201e-4689-955f-7b4fe34c3bce_900x533.png" width="900" height="533" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/078c137c-201e-4689-955f-7b4fe34c3bce_900x533.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:533,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!pxS_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F078c137c-201e-4689-955f-7b4fe34c3bce_900x533.png 424w, https://substackcdn.com/image/fetch/$s_!pxS_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F078c137c-201e-4689-955f-7b4fe34c3bce_900x533.png 848w, https://substackcdn.com/image/fetch/$s_!pxS_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F078c137c-201e-4689-955f-7b4fe34c3bce_900x533.png 1272w, https://substackcdn.com/image/fetch/$s_!pxS_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F078c137c-201e-4689-955f-7b4fe34c3bce_900x533.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Upwork&#8217;s portfolio on <a href="https://www.upwork.com/freelancers/dadhalfdev">profile page</a></figcaption></figure></div><p>In addition to the portfolio section, you can also ask for testimonials, add certificates, create multiple profiles, and add a video:</p><p>I created an introduction video on my profile, but it definitely needs improvement:</p><p>Sometimes it&#8217;s better to pay someone to help you structure a strong video and an overall solid profile page than to keep spending <em>Connects</em> without a profile that actually catches clients&#8217; attention.</p><p>Remember, no matter how many <em>Connects</em> you use, they only do one thing: make you seen. But if what clients see is weak, you&#8217;ve just used those <em>Connects</em> in vain.</p><div><hr></div><h3>Use External Sources to Find Clients</h3><p>If you&#8217;ve tried everything else and you are still burning all your money on <em>Connects</em>, the best alternative is to find clients on other platforms and bring them to Upwork.</p><p>If you have an Upwork membership plan, you can create Direct Contracts and pay a 0% fee, whereas normally you pay up to a 15% fee.</p><p>This is probably the best feature of the membership plan, and it&#8217;s really worth it if you&#8217;re able to bring clients to the platform.</p><p>As for external sources, I mean social media networks, YouTube, Medium, or even people in your city.</p><p>In my field, the best social media platforms are <a href="https://x.com/dadhalfdev">X (formerly Twitter)</a> and <a href="https://www.linkedin.com/in/dadhalfdev/">LinkedIn</a>.</p><p>I often write long posts on LinkedIn and redirect people to book a consultation, or at least to visit my profile.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wiR_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583d5cb8-71ca-4651-b0e8-b100db31d0a5_900x468.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wiR_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583d5cb8-71ca-4651-b0e8-b100db31d0a5_900x468.png 424w, https://substackcdn.com/image/fetch/$s_!wiR_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583d5cb8-71ca-4651-b0e8-b100db31d0a5_900x468.png 848w, https://substackcdn.com/image/fetch/$s_!wiR_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583d5cb8-71ca-4651-b0e8-b100db31d0a5_900x468.png 1272w, https://substackcdn.com/image/fetch/$s_!wiR_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583d5cb8-71ca-4651-b0e8-b100db31d0a5_900x468.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wiR_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583d5cb8-71ca-4651-b0e8-b100db31d0a5_900x468.png" width="900" height="468" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/583d5cb8-71ca-4651-b0e8-b100db31d0a5_900x468.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:468,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!wiR_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583d5cb8-71ca-4651-b0e8-b100db31d0a5_900x468.png 424w, https://substackcdn.com/image/fetch/$s_!wiR_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583d5cb8-71ca-4651-b0e8-b100db31d0a5_900x468.png 848w, https://substackcdn.com/image/fetch/$s_!wiR_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583d5cb8-71ca-4651-b0e8-b100db31d0a5_900x468.png 1272w, https://substackcdn.com/image/fetch/$s_!wiR_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F583d5cb8-71ca-4651-b0e8-b100db31d0a5_900x468.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">LinkedIn <a href="https://www.linkedin.com/in/dadhalfdev/">profile page</a></figcaption></figure></div><p><a href="https://www.linkedin.com/in/dadhalfdev/">LinkedIn</a> has proven to be the best platform for getting clients, mainly because it is designed to make the match between recruiters and job seekers.</p><p>In other words, if Upwork is not able to do it, LinkedIn will handle that part, and Upwork will only be a means for payments and invoices.</p><p><em><strong>Need help with automation, AI, or data science? Let&#8217;s talk.</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/jaULmLguQX8KbikZ6&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://calendar.app.google/jaULmLguQX8KbikZ6"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3>Conclusion</h3><p>After reading the five strategies in this piece, you should be able to start getting invitations, or at least use your <em>Connects</em> more efficiently.</p><p>Picking the right clients will help you thrive on the platform, achieve a higher status faster, and earn good reviews.</p><p>Building a strong portfolio ensures that once your profile is seen, clients won&#8217;t turn away, and they&#8217;ll want to speak with you.</p><p>If the platform itself isn&#8217;t driving enough traffic to your profile, because you&#8217;re not burning enough <em>Connects,</em> try redirecting people from external sources to visit it.</p><p>I hope that after this read, you&#8217;re not as frustrated with Upwork as I was, because there are ways to bypass the gambling system the platform has created.</p><p>Bid less. Feed the algorithm. And show your skills to the world outside Upwork.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"><strong>Curious about what I&#8217;m building? &#128064;</strong></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 Ultimate Guide to Start Earning on Apify]]></title><description><![CDATA[A step-by-step tutorial to start your web scraping journey on Apify and make a steady passive income.]]></description><link>https://blog.dadhalfdev.com/p/the-ultimate-guide-to-start-earning</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/the-ultimate-guide-to-start-earning</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Sat, 31 Jan 2026 22:33:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!TiSS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F716d287b-4600-4550-bd76-f3cd1e3d856c_900x563.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TiSS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F716d287b-4600-4550-bd76-f3cd1e3d856c_900x563.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TiSS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F716d287b-4600-4550-bd76-f3cd1e3d856c_900x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TiSS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F716d287b-4600-4550-bd76-f3cd1e3d856c_900x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TiSS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F716d287b-4600-4550-bd76-f3cd1e3d856c_900x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TiSS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F716d287b-4600-4550-bd76-f3cd1e3d856c_900x563.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TiSS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F716d287b-4600-4550-bd76-f3cd1e3d856c_900x563.jpeg" width="900" height="563" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/716d287b-4600-4550-bd76-f3cd1e3d856c_900x563.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:563,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!TiSS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F716d287b-4600-4550-bd76-f3cd1e3d856c_900x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TiSS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F716d287b-4600-4550-bd76-f3cd1e3d856c_900x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TiSS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F716d287b-4600-4550-bd76-f3cd1e3d856c_900x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TiSS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F716d287b-4600-4550-bd76-f3cd1e3d856c_900x563.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Image by Author</figcaption></figure></div><p>It all started with two individuals from Prague, Czech Republic, who had the bold idea of creating a portal between website data and people.</p><p><strong><a href="https://www.apify.com?fpr=ulosg">Apify</a></strong> is a platform where you can be paid for submitting your web scrapers, agents, and automation scripts. All you need is some Python or JavaScript knowledge and to follow this tutorial.</p><p>There are more than 25k customers on the platform, and more will be joining to have instant access to data from thousands of websites.</p><p>According to a report by <strong><a href="https://www.mordorintelligence.com/industry-reports/web-scraping-market">Mordor Intelligence</a></strong>, the web scraping market is expected to grow 14.20% CAGR (Compound Annual Growth Rate) between 2025 and 2030, from 1.03 billion to 2 billion dollars.</p><p>The demand is there. With AI and several automation tools like <strong><a href="https://n8n.partnerlinks.io/x7wwnbrdbecd">N8N</a></strong>, more people are looking for APIs and easy access to data, eliminating the need to hire developers to build custom web crawlers.</p><p>Building actors on Apify is an opportunity for developers to take advantage of the huge wave of vibe-coders and builders who want to connect crawlers, agents, MCPs, and more to their SaaS products.</p><p>In this step-by-step guide, I&#8217;ll show you how to get started on Apify. By the end, you&#8217;ll be ready to build your first actor and start generating a steady passive income.</p><div><hr></div><h3>Hands-on with the Apify console</h3><p>You can create an account on <a href="https://www.apify.com?fpr=ulosg">Apify</a> for free using your Google account, GitHub, or another email provider.</p><p>With the free plan, you get up to $5/month to use for running scripts on the platform, which is basically the cost associated with the remote machines the platform provides.</p><p>But don&#8217;t worry, you won&#8217;t need to spend too many credits if your crawler is working fine in your machine. You&#8217;ll only use the credits to test it on the platform. So $5.00/month is usually more than enough to start.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fZwJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F533869fb-50cc-4f9d-9968-8a7bd5d7d880_900x481.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fZwJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F533869fb-50cc-4f9d-9968-8a7bd5d7d880_900x481.png 424w, https://substackcdn.com/image/fetch/$s_!fZwJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F533869fb-50cc-4f9d-9968-8a7bd5d7d880_900x481.png 848w, https://substackcdn.com/image/fetch/$s_!fZwJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F533869fb-50cc-4f9d-9968-8a7bd5d7d880_900x481.png 1272w, https://substackcdn.com/image/fetch/$s_!fZwJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F533869fb-50cc-4f9d-9968-8a7bd5d7d880_900x481.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fZwJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F533869fb-50cc-4f9d-9968-8a7bd5d7d880_900x481.png" width="900" height="481" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/533869fb-50cc-4f9d-9968-8a7bd5d7d880_900x481.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:481,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!fZwJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F533869fb-50cc-4f9d-9968-8a7bd5d7d880_900x481.png 424w, https://substackcdn.com/image/fetch/$s_!fZwJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F533869fb-50cc-4f9d-9968-8a7bd5d7d880_900x481.png 848w, https://substackcdn.com/image/fetch/$s_!fZwJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F533869fb-50cc-4f9d-9968-8a7bd5d7d880_900x481.png 1272w, https://substackcdn.com/image/fetch/$s_!fZwJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F533869fb-50cc-4f9d-9968-8a7bd5d7d880_900x481.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Apify&#8217;s <a href="https://www.apify.com?fpr=ulosg">main page</a></figcaption></figure></div><p>If at some point, you start to scale and need more credits, there is the <em><strong>Creator</strong></em> plan, which is very cheap ($1/month), and you get around $85 per month. I use that plan and rarely surpass $10 monthly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IyPN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c2e05d-51da-4f00-a74b-ad0abdf0ce45_900x761.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IyPN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c2e05d-51da-4f00-a74b-ad0abdf0ce45_900x761.png 424w, https://substackcdn.com/image/fetch/$s_!IyPN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c2e05d-51da-4f00-a74b-ad0abdf0ce45_900x761.png 848w, https://substackcdn.com/image/fetch/$s_!IyPN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c2e05d-51da-4f00-a74b-ad0abdf0ce45_900x761.png 1272w, https://substackcdn.com/image/fetch/$s_!IyPN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c2e05d-51da-4f00-a74b-ad0abdf0ce45_900x761.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IyPN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c2e05d-51da-4f00-a74b-ad0abdf0ce45_900x761.png" width="900" height="761" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d3c2e05d-51da-4f00-a74b-ad0abdf0ce45_900x761.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:761,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!IyPN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c2e05d-51da-4f00-a74b-ad0abdf0ce45_900x761.png 424w, https://substackcdn.com/image/fetch/$s_!IyPN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c2e05d-51da-4f00-a74b-ad0abdf0ce45_900x761.png 848w, https://substackcdn.com/image/fetch/$s_!IyPN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c2e05d-51da-4f00-a74b-ad0abdf0ce45_900x761.png 1272w, https://substackcdn.com/image/fetch/$s_!IyPN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3c2e05d-51da-4f00-a74b-ad0abdf0ce45_900x761.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Creator <a href="https://apify.com/pricing/creator-plan?fpr=ulosg">pricing plan</a> for developers</figcaption></figure></div><p>Once you&#8217;ve created an account, you&#8217;ll have access to a console that can look overwhelming for beginners.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zGmL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1b3d39-9538-4efc-a46c-8a1203965e90_900x491.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zGmL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1b3d39-9538-4efc-a46c-8a1203965e90_900x491.png 424w, https://substackcdn.com/image/fetch/$s_!zGmL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1b3d39-9538-4efc-a46c-8a1203965e90_900x491.png 848w, https://substackcdn.com/image/fetch/$s_!zGmL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1b3d39-9538-4efc-a46c-8a1203965e90_900x491.png 1272w, https://substackcdn.com/image/fetch/$s_!zGmL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1b3d39-9538-4efc-a46c-8a1203965e90_900x491.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zGmL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1b3d39-9538-4efc-a46c-8a1203965e90_900x491.png" width="900" height="491" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bf1b3d39-9538-4efc-a46c-8a1203965e90_900x491.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:491,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!zGmL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1b3d39-9538-4efc-a46c-8a1203965e90_900x491.png 424w, https://substackcdn.com/image/fetch/$s_!zGmL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1b3d39-9538-4efc-a46c-8a1203965e90_900x491.png 848w, https://substackcdn.com/image/fetch/$s_!zGmL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1b3d39-9538-4efc-a46c-8a1203965e90_900x491.png 1272w, https://substackcdn.com/image/fetch/$s_!zGmL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf1b3d39-9538-4efc-a46c-8a1203965e90_900x491.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://www.apify.com?fpr=ulosg">Apify</a> console</figcaption></figure></div><p>For developers, the main pages are:</p><ul><li><p><strong>My Actors</strong></p></li><li><p><strong>Insights</strong></p></li><li><p><strong>Proxy</strong></p></li><li><p><strong>Settings</strong></p></li></ul><p>You may use the remaining pages/tabs, but I don&#8217;t find them as essential as the ones above from a developer perspective.</p><h4>Provide information about yourself in the Settings page</h4><p>In fact, the first thing you should do is go to <em><strong>Settings</strong></em> and add some information about yourself. This helps customers who try your actors get to know you better, increasing the chances they&#8217;ll keep using your crawlers, or even reach out to you for custom ones.</p><p>Yes, Apify can also serve as a platform to sell your services externally, so be sure to write a clear and concise README file.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AQLh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a965e6-7cd3-472c-b226-f13ce1275ddc_900x731.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AQLh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a965e6-7cd3-472c-b226-f13ce1275ddc_900x731.png 424w, https://substackcdn.com/image/fetch/$s_!AQLh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a965e6-7cd3-472c-b226-f13ce1275ddc_900x731.png 848w, https://substackcdn.com/image/fetch/$s_!AQLh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a965e6-7cd3-472c-b226-f13ce1275ddc_900x731.png 1272w, https://substackcdn.com/image/fetch/$s_!AQLh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a965e6-7cd3-472c-b226-f13ce1275ddc_900x731.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AQLh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a965e6-7cd3-472c-b226-f13ce1275ddc_900x731.png" width="900" height="731" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7a965e6-7cd3-472c-b226-f13ce1275ddc_900x731.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:731,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!AQLh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a965e6-7cd3-472c-b226-f13ce1275ddc_900x731.png 424w, https://substackcdn.com/image/fetch/$s_!AQLh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a965e6-7cd3-472c-b226-f13ce1275ddc_900x731.png 848w, https://substackcdn.com/image/fetch/$s_!AQLh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a965e6-7cd3-472c-b226-f13ce1275ddc_900x731.png 1272w, https://substackcdn.com/image/fetch/$s_!AQLh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7a965e6-7cd3-472c-b226-f13ce1275ddc_900x731.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Settings page on the <a href="https://www.apify.com?fpr=ulosg">Apify</a> console</figcaption></figure></div><h4>Understand the different actor states</h4><p>The second most important is the <em><strong>My Actors page</strong></em>. Here you can see all your current scrapers. Including <em><strong>active</strong></em>, <em><strong>under maintenance</strong></em>, or <em><strong>deprecated. </strong></em>At this point, you probably don&#8217;t know the difference between these three, so let me take a few minutes to explain.</p><p>The <em><strong>active</strong></em> ones are the actors that are up and running without issues. The <em><strong>under maintenance</strong></em> actors are the ones that were flagged by the platform with some issues to be resolved. The most common error is when your actor exceeds the 5 min limit, but it could be related to something else, and you would see a notification like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!umrk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816ae40b-d47e-4d98-93db-6633ed019534_492x332.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!umrk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816ae40b-d47e-4d98-93db-6633ed019534_492x332.png 424w, https://substackcdn.com/image/fetch/$s_!umrk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816ae40b-d47e-4d98-93db-6633ed019534_492x332.png 848w, https://substackcdn.com/image/fetch/$s_!umrk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816ae40b-d47e-4d98-93db-6633ed019534_492x332.png 1272w, https://substackcdn.com/image/fetch/$s_!umrk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816ae40b-d47e-4d98-93db-6633ed019534_492x332.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!umrk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816ae40b-d47e-4d98-93db-6633ed019534_492x332.png" width="492" height="332" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/816ae40b-d47e-4d98-93db-6633ed019534_492x332.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:332,&quot;width&quot;:492,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!umrk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816ae40b-d47e-4d98-93db-6633ed019534_492x332.png 424w, https://substackcdn.com/image/fetch/$s_!umrk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816ae40b-d47e-4d98-93db-6633ed019534_492x332.png 848w, https://substackcdn.com/image/fetch/$s_!umrk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816ae40b-d47e-4d98-93db-6633ed019534_492x332.png 1272w, https://substackcdn.com/image/fetch/$s_!umrk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F816ae40b-d47e-4d98-93db-6633ed019534_492x332.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Actor flagged as under maintenance on <a href="https://www.apify.com?fpr=ulosg">Apify</a></figcaption></figure></div><p>If you click <em><strong>here </strong></em>on the notification, it takes you to the log where the issue was triggered. If your actor is not fixed within 14 days, it switches to a <em><strong>deprecated</strong></em> state, and it will no longer be visible on the platform for customers. You can also set yourself the <em><strong>under maintenance</strong></em> or <em><strong>deprecated</strong></em> states.</p><p><strong>&#9888;&#65039; </strong><em><strong>Important Note: </strong>If your actor was under maintenance or deprecated and you&#8217;ve made the changes and pushed, it won&#8217;t be automatically fixed. You need to go to the Display information option under <strong>Publication </strong>and unset your actor&#8217;s current state.</em></p><p>To make these and other changes to a specific actor, you can click on them under <em><strong>My Actors, </strong></em>and you&#8217;ll see several tabs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!V3NA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05f308c-40b3-479a-a7cd-3f9610164708_900x507.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!V3NA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05f308c-40b3-479a-a7cd-3f9610164708_900x507.png 424w, https://substackcdn.com/image/fetch/$s_!V3NA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05f308c-40b3-479a-a7cd-3f9610164708_900x507.png 848w, https://substackcdn.com/image/fetch/$s_!V3NA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05f308c-40b3-479a-a7cd-3f9610164708_900x507.png 1272w, https://substackcdn.com/image/fetch/$s_!V3NA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05f308c-40b3-479a-a7cd-3f9610164708_900x507.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!V3NA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05f308c-40b3-479a-a7cd-3f9610164708_900x507.png" width="900" height="507" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c05f308c-40b3-479a-a7cd-3f9610164708_900x507.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:507,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!V3NA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05f308c-40b3-479a-a7cd-3f9610164708_900x507.png 424w, https://substackcdn.com/image/fetch/$s_!V3NA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05f308c-40b3-479a-a7cd-3f9610164708_900x507.png 848w, https://substackcdn.com/image/fetch/$s_!V3NA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05f308c-40b3-479a-a7cd-3f9610164708_900x507.png 1272w, https://substackcdn.com/image/fetch/$s_!V3NA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc05f308c-40b3-479a-a7cd-3f9610164708_900x507.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://www.apify.com/dadhalfdev/skool-scraper?fpr=ulosg">Skool</a> actor page on Apify</figcaption></figure></div><h4>Understand the usage costs of your runs</h4><p>In the image above, you can see the most recent runs of my <a href="https://apify.com/dadhalfdev/skool-scraper?fpr=ulosg">Skool Scraper</a>, and the usage costs for each run. Align with that, you can see that I&#8217;m using a machine with 16 GB of RAM, which could be the reason driving up costs.</p><p>That takes us to another important tab under your actor, which is <em><strong>Settings.</strong></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vkN4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67ae1a0a-0b52-46c1-bee2-9a9fa8b644fc_900x480.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vkN4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67ae1a0a-0b52-46c1-bee2-9a9fa8b644fc_900x480.png 424w, https://substackcdn.com/image/fetch/$s_!vkN4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67ae1a0a-0b52-46c1-bee2-9a9fa8b644fc_900x480.png 848w, https://substackcdn.com/image/fetch/$s_!vkN4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67ae1a0a-0b52-46c1-bee2-9a9fa8b644fc_900x480.png 1272w, https://substackcdn.com/image/fetch/$s_!vkN4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67ae1a0a-0b52-46c1-bee2-9a9fa8b644fc_900x480.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vkN4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67ae1a0a-0b52-46c1-bee2-9a9fa8b644fc_900x480.png" width="900" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/67ae1a0a-0b52-46c1-bee2-9a9fa8b644fc_900x480.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!vkN4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67ae1a0a-0b52-46c1-bee2-9a9fa8b644fc_900x480.png 424w, https://substackcdn.com/image/fetch/$s_!vkN4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67ae1a0a-0b52-46c1-bee2-9a9fa8b644fc_900x480.png 848w, https://substackcdn.com/image/fetch/$s_!vkN4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67ae1a0a-0b52-46c1-bee2-9a9fa8b644fc_900x480.png 1272w, https://substackcdn.com/image/fetch/$s_!vkN4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67ae1a0a-0b52-46c1-bee2-9a9fa8b644fc_900x480.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://www.apify.com/dadhalfdev/skool-scraper?fpr=ulosg">Skool</a> actor settings</figcaption></figure></div><p>I find this section extremely important because it can make a huge difference in your actor&#8217;s speed and overall performance.</p><p>By default, Apify sets the RAM to 4 GB. A common scenario is developing a web scraper on a local machine with 16 GB of RAM, submitting the actor to Apify, and suddenly it is either too slow or it is failing because pages take too much time to load. The quick fix? Increase the memory usage of the remote machines.</p><p>However, there&#8217;s a tradeoff. The more memory you use, the higher your usage costs. For that reason, you should always ensure your actor is monetized above its usage costs to remain profitable.</p><h4>Make your actor ready for publication</h4><p>That takes us to the <em><strong>Publication</strong></em> page under your actor, where you can set a monetization plan and customize the display information (title, description, state, and categories).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bheO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff408ff68-12e5-49be-8771-f8e31ff38b77_900x529.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bheO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff408ff68-12e5-49be-8771-f8e31ff38b77_900x529.png 424w, https://substackcdn.com/image/fetch/$s_!bheO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff408ff68-12e5-49be-8771-f8e31ff38b77_900x529.png 848w, https://substackcdn.com/image/fetch/$s_!bheO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff408ff68-12e5-49be-8771-f8e31ff38b77_900x529.png 1272w, https://substackcdn.com/image/fetch/$s_!bheO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff408ff68-12e5-49be-8771-f8e31ff38b77_900x529.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bheO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff408ff68-12e5-49be-8771-f8e31ff38b77_900x529.png" width="900" height="529" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f408ff68-12e5-49be-8771-f8e31ff38b77_900x529.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:529,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!bheO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff408ff68-12e5-49be-8771-f8e31ff38b77_900x529.png 424w, https://substackcdn.com/image/fetch/$s_!bheO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff408ff68-12e5-49be-8771-f8e31ff38b77_900x529.png 848w, https://substackcdn.com/image/fetch/$s_!bheO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff408ff68-12e5-49be-8771-f8e31ff38b77_900x529.png 1272w, https://substackcdn.com/image/fetch/$s_!bheO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff408ff68-12e5-49be-8771-f8e31ff38b77_900x529.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://www.apify.com/dadhalfdev/skool-scraper?fpr=ulosg">Skool</a> actor publication tab</figcaption></figure></div><p>In the image above, you can see other options besides <em><strong>Monetization</strong></em> and <em><strong>Display information, </strong></em>such as <em><strong>Sample input</strong></em> and <em><strong>Dataset schema. </strong></em>These will be green if everything is ok with your actor&#8217;s health. We will have a further look into the actor&#8217;s schemas</p><h4>Set a monetization plan for your actor</h4><p>To monetize your actor, there are two main options: <em><strong>Pay per event</strong></em> or <em><strong>Rental </strong>plan.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5Vjz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175b8c82-c928-4606-9390-c5d587bd8305_727x623.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5Vjz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175b8c82-c928-4606-9390-c5d587bd8305_727x623.png 424w, https://substackcdn.com/image/fetch/$s_!5Vjz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175b8c82-c928-4606-9390-c5d587bd8305_727x623.png 848w, https://substackcdn.com/image/fetch/$s_!5Vjz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175b8c82-c928-4606-9390-c5d587bd8305_727x623.png 1272w, https://substackcdn.com/image/fetch/$s_!5Vjz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175b8c82-c928-4606-9390-c5d587bd8305_727x623.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5Vjz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175b8c82-c928-4606-9390-c5d587bd8305_727x623.png" width="727" height="623" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/175b8c82-c928-4606-9390-c5d587bd8305_727x623.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:623,&quot;width&quot;:727,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!5Vjz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175b8c82-c928-4606-9390-c5d587bd8305_727x623.png 424w, https://substackcdn.com/image/fetch/$s_!5Vjz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175b8c82-c928-4606-9390-c5d587bd8305_727x623.png 848w, https://substackcdn.com/image/fetch/$s_!5Vjz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175b8c82-c928-4606-9390-c5d587bd8305_727x623.png 1272w, https://substackcdn.com/image/fetch/$s_!5Vjz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F175b8c82-c928-4606-9390-c5d587bd8305_727x623.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Change or update the pricing plan on <a href="https://www.apify.com?fpr=ulosg">Apify</a></figcaption></figure></div><p>The <em><strong>Rental</strong></em> pricing plan is currently a legacy model, so it&#8217;s not clear yet if they will continue with this plan into the future, but it&#8217;s the simplest to understand. You basically set a monthly price for your actor, and Apify gets a 20% comission.</p><p>The <em><strong>Pay per event </strong></em>plan seems to be the one that Apify&#8217;s team is mostly interested in. By default, the plan has two main paid events: starting the actor and obtaining a result. You can see the result as a unity scraped.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hwn2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3e0a99a-4769-48b7-bfed-4b6ad7091556_900x723.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hwn2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3e0a99a-4769-48b7-bfed-4b6ad7091556_900x723.png 424w, https://substackcdn.com/image/fetch/$s_!hwn2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3e0a99a-4769-48b7-bfed-4b6ad7091556_900x723.png 848w, https://substackcdn.com/image/fetch/$s_!hwn2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3e0a99a-4769-48b7-bfed-4b6ad7091556_900x723.png 1272w, https://substackcdn.com/image/fetch/$s_!hwn2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3e0a99a-4769-48b7-bfed-4b6ad7091556_900x723.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hwn2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3e0a99a-4769-48b7-bfed-4b6ad7091556_900x723.png" width="900" height="723" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a3e0a99a-4769-48b7-bfed-4b6ad7091556_900x723.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:723,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!hwn2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3e0a99a-4769-48b7-bfed-4b6ad7091556_900x723.png 424w, https://substackcdn.com/image/fetch/$s_!hwn2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3e0a99a-4769-48b7-bfed-4b6ad7091556_900x723.png 848w, https://substackcdn.com/image/fetch/$s_!hwn2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3e0a99a-4769-48b7-bfed-4b6ad7091556_900x723.png 1272w, https://substackcdn.com/image/fetch/$s_!hwn2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3e0a99a-4769-48b7-bfed-4b6ad7091556_900x723.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Pay per event monetization plan on <a href="https://www.apify.com?fpr=ulosg">Apify</a></figcaption></figure></div><p>The way you add more events depends on your script. We&#8217;ll take a quick look at a simple Apify script shortly, but as an example, if you want to create an event called <code>proxy-rotation</code>, you can integrate it into your actor like this:</p><pre><code>proxy_list = [
    &#8220;&lt;proxy_1&gt;&#8221;,  
    &#8220;&lt;proxy_2&gt;&#8221;,                      
    &#8220;&lt;proxy_3&gt;&#8221;,
]

for i, proxy_element in enumerate(proxy_list):
    # Charge proxy rotation
    await Actor.charge(&#8221;proxy-rotation&#8221;)
    Actor.log.info(&#8221;Charged proxy rotation&#8221;)</code></pre><p>After you push the actor to Apify, make sure you add the event <code>proxy-rotation</code> in your <em><strong>Pay per event </strong></em>monetization plan.</p><p>You can also offer discounts to customers in higher tiers: <strong>bronze</strong>, <strong>silver</strong>, and <strong>gold</strong>. These are typically larger companies that may spend significantly more on your scrapers, so offering meaningful discounts can be a good strategy.</p><p>You can find more about how monetization works <a href="https://docs.apify.com/academy/actor-marketing-playbook/store-basics/how-actor-monetization-works">here</a>.</p><h4>Get insights about your actors</h4><p>Another important tab from the console is the <em><strong>Insights</strong></em> page, where you can have a general view of your actor&#8217;s performance and how much you&#8217;re being paid for them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yOoj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc54eb58-bfd0-48e3-bcc3-5702e6c5ef18_900x486.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yOoj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc54eb58-bfd0-48e3-bcc3-5702e6c5ef18_900x486.png 424w, https://substackcdn.com/image/fetch/$s_!yOoj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc54eb58-bfd0-48e3-bcc3-5702e6c5ef18_900x486.png 848w, https://substackcdn.com/image/fetch/$s_!yOoj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc54eb58-bfd0-48e3-bcc3-5702e6c5ef18_900x486.png 1272w, https://substackcdn.com/image/fetch/$s_!yOoj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc54eb58-bfd0-48e3-bcc3-5702e6c5ef18_900x486.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yOoj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc54eb58-bfd0-48e3-bcc3-5702e6c5ef18_900x486.png" width="900" height="486" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cc54eb58-bfd0-48e3-bcc3-5702e6c5ef18_900x486.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:486,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!yOoj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc54eb58-bfd0-48e3-bcc3-5702e6c5ef18_900x486.png 424w, https://substackcdn.com/image/fetch/$s_!yOoj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc54eb58-bfd0-48e3-bcc3-5702e6c5ef18_900x486.png 848w, https://substackcdn.com/image/fetch/$s_!yOoj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc54eb58-bfd0-48e3-bcc3-5702e6c5ef18_900x486.png 1272w, https://substackcdn.com/image/fetch/$s_!yOoj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc54eb58-bfd0-48e3-bcc3-5702e6c5ef18_900x486.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Insights page on <a href="https://www.apify.com?fpr=ulosg">Apify</a></figcaption></figure></div><p>You can filter by month, by actor, and even download the data for further analysis.</p><p>On the <em><strong>Acquisition</strong></em> tab, you can find the sources from which customers have found your scraper, along with the countries where your actors were most searched.</p><p>Having your Actor among the top SERP results is very important because many customers don&#8217;t spend hours looking for the best option on the Apify <a href="https://apify.com/store?fpr=ulosg">store</a>. That&#8217;s why a strong description and a README file are important to score high on SEO.</p><h4>Set up proxies</h4><p>The <em><strong>Proxies</strong></em> page is convenient for developers who want to use Apify residential or datacenter proxies. Here, you can obtain proxy URLs and monitor their usage.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JPlc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb97b1e8-013a-4291-a91b-739465d1c064_900x444.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JPlc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb97b1e8-013a-4291-a91b-739465d1c064_900x444.png 424w, https://substackcdn.com/image/fetch/$s_!JPlc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb97b1e8-013a-4291-a91b-739465d1c064_900x444.png 848w, https://substackcdn.com/image/fetch/$s_!JPlc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb97b1e8-013a-4291-a91b-739465d1c064_900x444.png 1272w, https://substackcdn.com/image/fetch/$s_!JPlc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb97b1e8-013a-4291-a91b-739465d1c064_900x444.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JPlc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb97b1e8-013a-4291-a91b-739465d1c064_900x444.png" width="900" height="444" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eb97b1e8-013a-4291-a91b-739465d1c064_900x444.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:444,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!JPlc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb97b1e8-013a-4291-a91b-739465d1c064_900x444.png 424w, https://substackcdn.com/image/fetch/$s_!JPlc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb97b1e8-013a-4291-a91b-739465d1c064_900x444.png 848w, https://substackcdn.com/image/fetch/$s_!JPlc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb97b1e8-013a-4291-a91b-739465d1c064_900x444.png 1272w, https://substackcdn.com/image/fetch/$s_!JPlc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb97b1e8-013a-4291-a91b-739465d1c064_900x444.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Proxies page on <a href="https://www.apify.com?fpr=ulosg">Apify</a></figcaption></figure></div><div><hr></div><h3>Build your first actor on Apify</h3><p>Going back to the actor&#8217;s page, you&#8217;ll find other important tabs such as:</p><ul><li><p><strong>Information:</strong> This contains all the details about your actor that you defined in the README.md file.</p></li><li><p><strong>Builds:</strong> Every time you push a new version to Apify, it will show here if the job succeeded or not.</p></li><li><p><strong>Integrations: </strong>You can connect actors with other actors, or with platforms such as Make and <strong><a href="https://n8n.partnerlinks.io/x7wwnbrdbecd">N8N</a>.</strong></p></li><li><p><strong>Issues: </strong>When customers find issues with your actor and write a message, you get notified, but they also appear under this tab.</p></li><li><p><strong>Reviews: </strong>Here you can see and comment on your actor&#8217;s reviews.</p></li><li><p><strong>Monitoring: </strong>Dashboard with insights about your actor. You can also go to the Insights page and monitor all your actors from there. We will see that later.</p></li><li><p><strong>Source: </strong>Here you can test your actor, see the last run, the last build, and modify your code directly on the Web IDE.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!z8lI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74b9469-167c-4f02-bf67-1fb59f71beeb_900x545.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z8lI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74b9469-167c-4f02-bf67-1fb59f71beeb_900x545.png 424w, https://substackcdn.com/image/fetch/$s_!z8lI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74b9469-167c-4f02-bf67-1fb59f71beeb_900x545.png 848w, https://substackcdn.com/image/fetch/$s_!z8lI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74b9469-167c-4f02-bf67-1fb59f71beeb_900x545.png 1272w, https://substackcdn.com/image/fetch/$s_!z8lI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74b9469-167c-4f02-bf67-1fb59f71beeb_900x545.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z8lI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74b9469-167c-4f02-bf67-1fb59f71beeb_900x545.png" width="900" height="545" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f74b9469-167c-4f02-bf67-1fb59f71beeb_900x545.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:545,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!z8lI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74b9469-167c-4f02-bf67-1fb59f71beeb_900x545.png 424w, https://substackcdn.com/image/fetch/$s_!z8lI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74b9469-167c-4f02-bf67-1fb59f71beeb_900x545.png 848w, https://substackcdn.com/image/fetch/$s_!z8lI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74b9469-167c-4f02-bf67-1fb59f71beeb_900x545.png 1272w, https://substackcdn.com/image/fetch/$s_!z8lI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74b9469-167c-4f02-bf67-1fb59f71beeb_900x545.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://www.apify.com/dadhalfdev/skool-scraper?fpr=ulosg">Skool</a> actor Source tab</figcaption></figure></div><p>There are multiple frameworks and libraries to build your actors. You can also use JavaScript or Python, and the possibilities are endless.</p><p>Apify recommends using their framework: <a href="https://crawlee.dev/">Crawlee</a>. It handles blocking, crawling, proxies, and browsers, so it may be a good and robust alternative if you&#8217;re just starting with web scraping.</p><p>I&#8217;ve been developing my actors using another stack, mostly with <strong><a href="https://playwright.dev/">Playwright</a></strong> headless browser and <strong><a href="https://camoufox.com/">Camoufox</a></strong>.</p><p>Here&#8217;s an article on how I built my <a href="https://www.apify.com/dadhalfdev/polymarket-scraper-per-event?fpr=ulosg">Polymarket</a> scraper using only Playwright:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;38a93713-2b5d-4b6b-9948-0f8af33ed484&quot;,&quot;caption&quot;:&quot;If you have web scraping scripts sitting idle in your GitHub repository or a folder on your computer, you might be missing out on the chance to earn passive income from them.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Make $100+ Monthly With Apify Actors&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:109411725,&quot;name&quot;:&quot;Marco Rodrigues&quot;,&quot;bio&quot;:&quot;I'm a Dad Half Dev. &#128118;&#128104;&#8205;&#128187; 50% Parenting | 50% Python, Data Science, AI, and Web3.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4ad2c32-67d4-4e94-a560-8e0c03187db6_1024x1024.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-05-10T21:57:00.498Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7bab2dba-c0bc-45e3-ac36-5b6f91033c6c_1200x750.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.dadhalfdev.com/p/make-100-monthly-with-apify-actors&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:163297279,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:4975150,&quot;publication_name&quot;:&quot;Dad Half Dev&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!cbkB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412563c3-4133-4c5c-af4e-4fd94b18f19d_1080x1080.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>If you want to get proficient tips and be able to scrape <strong>more than 90%</strong> of the websites, you can also look at this piece:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;fe8ab961-6aea-4d21-9dbd-f6850413ec3d&quot;,&quot;caption&quot;:&quot;Web scraping seems to have taken the lead in internet traffic. Following the 2025 Imperva Bad Bot Report, 51% of global web traffic is now automated, surpassing humans.&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;5 Tips to Turn You Into a Pro Web Scraper With Playwright&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:109411725,&quot;name&quot;:&quot;Marco Rodrigues&quot;,&quot;bio&quot;:&quot;I'm a Dad Half Dev. &#128118;&#128104;&#8205;&#128187; 50% Parenting | 50% Python, Data Science, AI, and Web3.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4ad2c32-67d4-4e94-a560-8e0c03187db6_1024x1024.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-10-01T17:10:53.057Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/157c0b41-34ef-4406-a12d-787b4bbd9104_1200x750.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.dadhalfdev.com/p/5-tips-to-turn-you-into-a-pro-web&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:175037813,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:4975150,&quot;publication_name&quot;:&quot;Dad Half Dev&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!cbkB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F412563c3-4133-4c5c-af4e-4fd94b18f19d_1080x1080.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>Assuming you don&#8217;t want to build a crawler now, but you do want to understand the basics, I&#8217;m sharing here what you need (in Python).</p><p>The first thing is installing the Python SDK:</p><pre><code>pip install apify</code></pre><p>You also need to install the Apify CLI to interact and push your code to the cloud.</p><pre><code>npm install -g apify-cli</code></pre><p>The typical repository of an Apify actor is organized in the following way:</p><pre><code>&#9500;&#9472;&#9472; .actor
&#9474;   &#9500;&#9472;&#9472; actor.json
&#9474;   &#9500;&#9472;&#9472; Dockerfile
&#9474;   &#9500;&#9472;&#9472; input_schema.json
&#9474;   &#9500;&#9472;&#9472; output_schema.json
&#9500;&#9472;&#9472; src
&#9474;   &#9500;&#9472;&#9472; __main__.py
&#9474;   &#9500;&#9472;&#9472; main.py
&#9500;&#9472;&#9472; storage
&#9500;&#9472;&#9472; README.md
&#9500;&#9472;&#9472; requirements.txt</code></pre><p>The <code>__main__.py</code> can simply be something like this:</p><pre><code>import asyncio
from src.main import main

asyncio.run(main())</code></pre><p>The <code>actor.json</code> is a wrapper document. For instance, you can add your input and output schemas directly here, without the need to create two extra files. It also shows how the output fields are organized in your storage. Here&#8217;s an example of my <a href="https://apify.com/dadhalfdev/techcrunch-scraper-per-event?fpr=ulosg">TechCrunch</a> scraper:</p><pre><code>{
    &#8220;actorSpecification&#8221;: 1,
    &#8220;name&#8221;: &#8220;techcrunch-scraper-per-event&#8221;,
    &#8220;version&#8221;: &#8220;0.1&#8221;,
    &#8220;buildTag&#8221;: &#8220;latest&#8221;,
    &#8220;input&#8221;: &#8220;./input_schema.json&#8221;,
    &#8220;output&#8221;: &#8220;./output_schema.json&#8221;,
    &#8220;dockerfile&#8221;: &#8220;./Dockerfile&#8221;,
    &#8220;storages&#8221;: {
        &#8220;dataset&#8221;: {
            &#8220;actorSpecification&#8221;: 1,
            &#8220;views&#8221;: {
                &#8220;overview&#8221;: {
                    &#8220;title&#8221;: &#8220;Overview&#8221;,
                    &#8220;transformation&#8221;: {
                        &#8220;fields&#8221;: [
                            &#8220;id&#8221;,
                            &#8220;title&#8221;,
                            &#8220;link&#8221;,
                            &#8220;date&#8221;,
                            &#8220;content&#8221;,                                       
                            &#8220;author_id&#8221;,
                            &#8220;author_name&#8221;,
                            &#8220;author_link&#8221;,
                            &#8220;category&#8221;,
                            &#8220;terms&#8221;
                        ]
                    },
                    &#8220;display&#8221;: {
                        &#8220;component&#8221;: &#8220;table&#8221;,
                        &#8220;properties&#8221;: {
                            &#8220;id&#8221;: {
                                &#8220;label&#8221;: &#8220;ID&#8221;,
                                &#8220;format&#8221;: &#8220;number&#8221;
                            },
                            &#8220;title&#8221;: {
                                &#8220;label&#8221;: &#8220;Title&#8221;,
                                &#8220;format&#8221;: &#8220;text&#8221;
                            },
                            &#8220;link&#8221;: {
                                &#8220;label&#8221;: &#8220;Link&#8221;,
                                &#8220;format&#8221;: &#8220;link&#8221;
                            },
                            &#8220;date&#8221;: {
                                &#8220;label&#8221;: &#8220;Publication Date&#8221;,
                                &#8220;format&#8221;: &#8220;date&#8221;
                            },                            
                            &#8220;content&#8221;: {
                                &#8220;label&#8221;: &#8220;Content&#8221;,
                                &#8220;format&#8221;: &#8220;text&#8221;
                            },
                            &#8220;author_id&#8221;: {
                                &#8220;label&#8221;: &#8220;Author ID&#8221;,
                                &#8220;format&#8221;: &#8220;number&#8221;
                            },
                            &#8220;author_name&#8221;: {
                                &#8220;label&#8221;: &#8220;Author Name&#8221;,
                                &#8220;format&#8221;: &#8220;text&#8221;
                            },
                            &#8220;author_link&#8221;: {
                                &#8220;label&#8221;: &#8220;Author Link&#8221;,
                                &#8220;format&#8221;: &#8220;link&#8221;
                            },
                            &#8220;category&#8221;: {
                                &#8220;label&#8221;: &#8220;Category&#8221;,
                                &#8220;format&#8221;: &#8220;text&#8221;
                            },
                            &#8220;terms&#8221;: {
                                &#8220;label&#8221;: &#8220;Tags&#8221;,
                                &#8220;format&#8221;: &#8220;array&#8221;
                            }
                        }
                    }
                }
            }
        }
    }
}</code></pre><p>For the same Actor, the <code>input_schema.json</code> looks like this:</p><pre><code>{
    &#8220;title&#8221;:&#8221;TechCrunch Scraper (Per Event)&#8221;,
    &#8220;schemaVersion&#8221;: 1,
    &#8220;type&#8221;: &#8220;object&#8221;,
    &#8220;properties&#8221;: {
      &#8220;category&#8221;: {
        &#8220;title&#8221;: &#8220;Category&#8221;,
        &#8220;type&#8221;: &#8220;string&#8221;,
        &#8220;editor&#8221;: &#8220;select&#8221;,
        &#8220;default&#8221;: &#8220;AI&#8221;,
        &#8220;enum&#8221;: [&#8221;Latest&#8221;, &#8220;Startups&#8221;, &#8220;Venture&#8221;, &#8220;Apple&#8221;, &#8220;Security&#8221;, &#8220;AI&#8221;, &#8220;Apps&#8221;],
        &#8220;enumTitles&#8221;: [&#8221;Latest&#8221;, &#8220;Startups&#8221;, &#8220;Venture&#8221;, &#8220;Apple&#8221;, &#8220;Security&#8221;, &#8220;AI&#8221;, &#8220;Apps&#8221;],
        &#8220;description&#8221;: &#8220;Choose which TechCrunch category to scrape. AI category is highly recommended for the latest artificial intelligence news and trends.&#8221;
      },
      &#8220;max_posts&#8221;: {
        &#8220;title&#8221;: &#8220;Max Posts&#8221;,
        &#8220;type&#8221;: &#8220;integer&#8221;,
        &#8220;default&#8221;: 100,
        &#8220;minimum&#8221;: 10,
        &#8220;maximum&#8221;: 120,
        &#8220;description&#8221;: &#8220;Maximum number of posts to scrape. Default is 100.&#8221;
      }
    },
    &#8220;required&#8221;: [&#8221;category&#8221;]
  }</code></pre><p>And the same for the <code>output_schema.json</code>:</p><pre><code>{
    &#8220;actorOutputSchemaVersion&#8221;: 1,
    &#8220;title&#8221;: &#8220;Output of techcrunch-scraper-per-event&#8221;,
    &#8220;description&#8221;: &#8220;Overview and raw access to scraped TechCrunch properties.&#8221;,
    &#8220;properties&#8221;: {
      &#8220;overview&#8221;: {
        &#8220;type&#8221;: &#8220;string&#8221;,
        &#8220;title&#8221;: &#8220;TechCrunch properties overview&#8221;,
        &#8220;description&#8221;: &#8220;Table view using the dataset &#8216;overview&#8217; view.&#8221;,
        &#8220;template&#8221;: &#8220;{{links.apiDefaultDatasetUrl}}/items?view=overview&#8221;
      },
      &#8220;results&#8221;: {
        &#8220;type&#8221;: &#8220;string&#8221;,
        &#8220;title&#8221;: &#8220;JSON results&#8221;,
        &#8220;description&#8221;: &#8220;All items from the default dataset without view transformation.&#8221;,
        &#8220;template&#8221;: &#8220;{{links.apiDefaultDatasetUrl}}/items&#8221;
      }
    }
}</code></pre><p>Note that the <code>input_schema.json</code> is mandatory to publish the actor, but not the <code>output_schema.json</code>, however it improves the actor quality.</p><p>For the Dockerfile, you can just copy mine and use it in all your actors, if you&#8217;re going to use Playwright:</p><pre><code>FROM apify/actor-python-playwright:3.11
COPY requirements.txt ./
RUN echo &#8220;Python version:&#8221; \
 &amp;&amp; python --version \
 &amp;&amp; echo &#8220;Pip version:&#8221; \
 &amp;&amp; pip --version \
 &amp;&amp; echo &#8220;Installing dependencies:&#8221; \
 &amp;&amp; pip install -r requirements.txt \
 &amp;&amp; echo &#8220;All installed Python packages:&#8221; \
 &amp;&amp; pip freeze
# Install Playwright and its dependencies
RUN playwright install-deps &amp;&amp; \
    playwright install
COPY . ./
RUN python3 -m compileall -q .
CMD [&#8221;python3&#8221;, &#8220;-m&#8221;, &#8220;src&#8221;]</code></pre><p>As for the <code>main.py</code> file, I won&#8217;t go into it here. Otherwise, this tutorial would get too heavy on the coding side. You can always check the example in the <a href="https://python.plainenglish.io/how-i-published-my-polymarket-web-scraper-on-apify-b616bba648c8">article</a> I shared earlier.</p><p>Once your Actor is complete, you need to check if your input schema is valid with this command:</p><pre><code>apify validate-schema</code></pre><p>If so, you can push it to the platform:</p><pre><code>apify push</code></pre><p>After pushing, you get a link in your terminal to your actor&#8217;s page, and you can start editing and making the final adjustments on the platform.</p><p><em><strong>Need help with automation, AI, or data science? Let&#8217;s talk.</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/jaULmLguQX8KbikZ6&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://calendar.app.google/jaULmLguQX8KbikZ6"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3>Conclusion</h3><p>Apify is not just a platform for web scraping, it also embraces AI agents, automation, and MCP servers. There&#8217;s definitely much more to explore beyond what&#8217;s covered in this tutorial.</p><p>The good news is that you no longer need to spend hours digging through Apify&#8217;s <a href="https://docs.apify.com/">documentation page</a> to find what you need. I often use their <em><strong>Ask AI</strong></em> feature to get answers quickly. Sometimes, I even upload my code snippets and ask it to make specific modifications.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pOVD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40905b2c-c2b4-4925-8d23-2b4fd7d01665_900x488.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pOVD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40905b2c-c2b4-4925-8d23-2b4fd7d01665_900x488.png 424w, https://substackcdn.com/image/fetch/$s_!pOVD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40905b2c-c2b4-4925-8d23-2b4fd7d01665_900x488.png 848w, https://substackcdn.com/image/fetch/$s_!pOVD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40905b2c-c2b4-4925-8d23-2b4fd7d01665_900x488.png 1272w, https://substackcdn.com/image/fetch/$s_!pOVD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40905b2c-c2b4-4925-8d23-2b4fd7d01665_900x488.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pOVD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40905b2c-c2b4-4925-8d23-2b4fd7d01665_900x488.png" width="900" height="488" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/40905b2c-c2b4-4925-8d23-2b4fd7d01665_900x488.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:488,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!pOVD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40905b2c-c2b4-4925-8d23-2b4fd7d01665_900x488.png 424w, https://substackcdn.com/image/fetch/$s_!pOVD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40905b2c-c2b4-4925-8d23-2b4fd7d01665_900x488.png 848w, https://substackcdn.com/image/fetch/$s_!pOVD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40905b2c-c2b4-4925-8d23-2b4fd7d01665_900x488.png 1272w, https://substackcdn.com/image/fetch/$s_!pOVD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40905b2c-c2b4-4925-8d23-2b4fd7d01665_900x488.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Ask AI feature on <a href="https://www.apify.com?fpr=ulosg">Apify</a> docs</figcaption></figure></div><p>With this tutorial, you should no longer feel overwhelmed after <a href="https://www.apify.com?fpr=ulosg">creating an account</a> on Apify. You can now navigate the console and understand the most important concepts and steps needed to start monetizing on the platform.</p><p>The demand is there, and if you build only one actor per week, after 2 years, that would result in 104 actors generating passive income. I think it is worth a try. What&#8217;s stopping you?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"><strong>Curious about what I&#8217;m building? &#128064;</strong></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[Read This Before Installing the OpenClaw AI Agent]]></title><description><![CDATA[Learn how to set up OpenClaw and explore key use cases safely.]]></description><link>https://blog.dadhalfdev.com/p/read-this-before-installing-the-openclaw</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/read-this-before-installing-the-openclaw</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Sat, 31 Jan 2026 19:34:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!b1f-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0199da1c-dc85-42e2-938d-f0d4ea75cc46_900x563.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b1f-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0199da1c-dc85-42e2-938d-f0d4ea75cc46_900x563.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b1f-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0199da1c-dc85-42e2-938d-f0d4ea75cc46_900x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!b1f-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0199da1c-dc85-42e2-938d-f0d4ea75cc46_900x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!b1f-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0199da1c-dc85-42e2-938d-f0d4ea75cc46_900x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!b1f-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0199da1c-dc85-42e2-938d-f0d4ea75cc46_900x563.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b1f-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0199da1c-dc85-42e2-938d-f0d4ea75cc46_900x563.jpeg" width="900" height="563" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0199da1c-dc85-42e2-938d-f0d4ea75cc46_900x563.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:563,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!b1f-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0199da1c-dc85-42e2-938d-f0d4ea75cc46_900x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!b1f-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0199da1c-dc85-42e2-938d-f0d4ea75cc46_900x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!b1f-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0199da1c-dc85-42e2-938d-f0d4ea75cc46_900x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!b1f-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0199da1c-dc85-42e2-938d-f0d4ea75cc46_900x563.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Image by Author</figcaption></figure></div><p>The AI agent that &#8220;actually does things&#8221; is here, and everyone is talking about it.</p><p>There are rumors that it will replace <a href="https://n8n.partnerlinks.io/x7wwnbrdbecd">n8n</a>, Make, and other automation tools, not to mention jobs that were already in danger and are now becoming obsolete.</p><p>OpenClaw (formerly known as Moltbot or Clawdbot) was created by Peter Steinberger, who is now in the spotlight with over 170k followers on <a href="https://x.com/steipete">X</a> and +100k stars on the agent&#8217;s open-source <a href="https://github.com/openclaw/openclaw">GitHub repository</a>.</p><p>The good part of being open-sourced is that everyone can pull the project and tweak it or search for vulnerabilities. On the other hand, it is also an opportunity for hackers to create malicious forks.</p><p>However, even if no vulnerabilities are flagged within the code, it still presents a serious risk for users who start using it without the necessary safety measures.</p><p>In this article, I will show you how to set up this new AI agent without needing to buy a Mac Mini for over $500. Then, we will cover three use cases that can be implemented with OpenClaw without compromising security.</p><div><hr></div><h3>OpenClaw: What It Can Do and the Risks</h3><p>This AI agent is called a &#8220;proactive&#8221; AI assistant because it handles operations continuously without the need for regular user inputs. You can give it a set of tasks that may take hours, days, weeks, or months, and it will run them on its own under your initial prompt instructions.</p><p>The communication between the user and the agent is made easy because you can seamlessly connect it to your WhatsApp, Telegram, Slack, Discord, and many more. And everything you say and provide will be registered in its persistent memory.</p><p>Therefore, you need to be cautious about the information you&#8217;re giving to it, and not get super excited about all the amazing things you can do with it.</p><p>Besides the <strong>persistent memory </strong>and the <strong>continuous operation</strong> mode, there are other key technical aspects worth exploring:</p><ul><li><p><strong>Fully open-sourced: </strong>The project is available for everyone to read and modify. Which is a plus when it comes to finding vulnerabilities within the code.</p></li><li><p><strong>Runs locally: </strong>You don&#8217;t need to connect with any cloud provider, making it a privacy environment, if you&#8217;re not providing any APIs or keys that can expose you to the web.</p></li><li><p><strong>Supports multi-agent routing: </strong>This means you can create several agents for different use-cases, and they run efficiently in parallel.</p></li><li><p><strong>Unlimited integrations: </strong>Unlike some automation tools that lack connectors for external apps, OpenClaw can connect to almost everything through APIs, MCP servers, or SSH keys.</p></li></ul><p>With this in mind, you can already imagine what this agent allows you to do. But just because you can connect to your Gmail account and receive emails on your Telegram bot, optimize your README files on GitHub while you sleep, manage passwords from multiple sources through WhatsApp, and so on, doesn&#8217;t mean you should do it.</p><p>Not only are all your keys, APIs, tokens, passwords, and other sensitive information stored in plain text files, but the agent is also more susceptible to phishing attacks than humans due to prompt injection.</p><p>Let&#8217;s look at two scenarios:</p><ol><li><p>The attacker has no idea you are using OpenClaw.</p></li><li><p>The attacker knows you are using OpenClaw.</p></li></ol><p>Now, imagine you have created a prompt that automatically submits invoices received by email. The workflow might look like this:</p><ul><li><p>The agent reads the email.</p></li><li><p>The agent follows a link contained in the email.</p></li><li><p>The agent accesses the page using stored credentials.</p></li><li><p>The agent submits the invoice form.</p></li></ul><p>In the first scenario, you might receive a generic phishing email that mentions &#8220;invoices&#8221; and includes a link to a malicious website. Because the agent cannot reliably distinguish this email from legitimate ones, it may click on the wrong link.</p><p>In the second scenario, the attack can be even more effective. If the attacker knows you are using OpenClaw, they can create a form that closely resembles the one your agent typically fills out. Not only that, the attacker can create tailored emails for all platforms he thinks you&#8217;ve been using, such as GitHub, Apify, Notion, you name it.</p><p>Of course, these scenarios may seem extreme or unrealistic to many developers and builders using AI agents, but the fact that it can make our lives so much easier also means that we may tend to give it more and more tasks without establishing sufficient safety boundaries.</p><p>Knowing this, you need to ensure that:</p><ol><li><p>You don&#8217;t expose it to personal information such as phone numbers, addresses, and account numbers.</p></li><li><p>You don&#8217;t use SSH keys.</p></li><li><p>You don&#8217;t give it access to passwords.</p></li><li><p>The APIs you&#8217;re using most not compromise your safety.</p></li><li><p>You don&#8217;t give it access to your GitHub, especially if you&#8217;re working for organizations.</p></li><li><p>You only use read-only tokens and APIs.</p></li></ol><p>These are examples of measures to help mitigate potential attacks, not strict rules. Depending on your setup, you may be able to safely give your agent more permissions by using <a href="https://docs.molt.bot/gateway/sandboxing">sandboxing features</a>, such as running it inside a container.</p><div><hr></div><h3>How to Set Up and Configure OpenClaw on a VPS</h3><p>I hope you&#8217;re not frightened at this point, and you still want to continue with the setup.</p><p>Everything we&#8217;re going to try does not lead to potential risks, starting with the fact that we won&#8217;t use our own machine to host the agent. There&#8217;s also no need to buy an expensive Mac Mini for over $500 just to get started. All you need is a VPS, or a virtual machine.</p><p>I use Contabo&#8217;s <a href="https://www.anrdoezrs.net/click-101540368-17083170">Cloud VPS 20</a> for less than &#8364;6/month, and it comes with 12 GB RAM and 200 GB SSD, which is more than enough for OpenClaw.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r9YJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b48552-65b6-46a4-87bc-53accb3ff3da_900x575.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r9YJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b48552-65b6-46a4-87bc-53accb3ff3da_900x575.png 424w, https://substackcdn.com/image/fetch/$s_!r9YJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b48552-65b6-46a4-87bc-53accb3ff3da_900x575.png 848w, https://substackcdn.com/image/fetch/$s_!r9YJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b48552-65b6-46a4-87bc-53accb3ff3da_900x575.png 1272w, https://substackcdn.com/image/fetch/$s_!r9YJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b48552-65b6-46a4-87bc-53accb3ff3da_900x575.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r9YJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b48552-65b6-46a4-87bc-53accb3ff3da_900x575.png" width="900" height="575" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/21b48552-65b6-46a4-87bc-53accb3ff3da_900x575.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:575,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!r9YJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b48552-65b6-46a4-87bc-53accb3ff3da_900x575.png 424w, https://substackcdn.com/image/fetch/$s_!r9YJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b48552-65b6-46a4-87bc-53accb3ff3da_900x575.png 848w, https://substackcdn.com/image/fetch/$s_!r9YJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b48552-65b6-46a4-87bc-53accb3ff3da_900x575.png 1272w, https://substackcdn.com/image/fetch/$s_!r9YJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F21b48552-65b6-46a4-87bc-53accb3ff3da_900x575.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://www.anrdoezrs.net/click-101540368-17083170">Contabo&#8217;s VPS</a> pricing</figcaption></figure></div><p>Once you install your preferred <a href="https://www.anrdoezrs.net/click-101540368-17083170">VPS</a> and Linux distro (I like to use Ubuntu), we&#8217;re ready to install the agent on our remote machine.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CrY7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4227ef2-a046-48a0-98cb-543b4fbe8f35_900x678.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CrY7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4227ef2-a046-48a0-98cb-543b4fbe8f35_900x678.png 424w, https://substackcdn.com/image/fetch/$s_!CrY7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4227ef2-a046-48a0-98cb-543b4fbe8f35_900x678.png 848w, https://substackcdn.com/image/fetch/$s_!CrY7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4227ef2-a046-48a0-98cb-543b4fbe8f35_900x678.png 1272w, https://substackcdn.com/image/fetch/$s_!CrY7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4227ef2-a046-48a0-98cb-543b4fbe8f35_900x678.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CrY7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4227ef2-a046-48a0-98cb-543b4fbe8f35_900x678.png" width="900" height="678" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4227ef2-a046-48a0-98cb-543b4fbe8f35_900x678.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:678,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!CrY7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4227ef2-a046-48a0-98cb-543b4fbe8f35_900x678.png 424w, https://substackcdn.com/image/fetch/$s_!CrY7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4227ef2-a046-48a0-98cb-543b4fbe8f35_900x678.png 848w, https://substackcdn.com/image/fetch/$s_!CrY7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4227ef2-a046-48a0-98cb-543b4fbe8f35_900x678.png 1272w, https://substackcdn.com/image/fetch/$s_!CrY7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4227ef2-a046-48a0-98cb-543b4fbe8f35_900x678.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">OpenClaw <a href="https://www.molt.bot/">website</a></figcaption></figure></div><p>You can also follow the steps on their <a href="https://www.molt.bot/">website</a>. If you&#8217;re not fully confident, which is normal, viewing the high amount of malicious websites and tutorials trying to get you to install software that is not OpenClaw.</p><p><em><strong>&#9888;&#65039; Note: </strong>The first two command lines may not be necessary for your machine. You can skip them and try the </em><code>curl</code><em> command to install the agent. If it poses issues, try the other steps.</em></p><p>The first thing you need to do is to install or update Node JS (if necessary):</p><pre><code>curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash</code></pre><p>And install a higher version of <code>nvm</code>:</p><pre><code>nvm install 24</code></pre><p>Now you can install OpenClaw:</p><pre><code>curl -fsSL https://molt.bot/install.sh | bash</code></pre><p>Once you run the command, you&#8217;ll see a security message.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DQRz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1b8943c-f56b-4c4a-9747-74078d16326a_900x668.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DQRz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1b8943c-f56b-4c4a-9747-74078d16326a_900x668.png 424w, https://substackcdn.com/image/fetch/$s_!DQRz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1b8943c-f56b-4c4a-9747-74078d16326a_900x668.png 848w, https://substackcdn.com/image/fetch/$s_!DQRz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1b8943c-f56b-4c4a-9747-74078d16326a_900x668.png 1272w, https://substackcdn.com/image/fetch/$s_!DQRz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1b8943c-f56b-4c4a-9747-74078d16326a_900x668.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DQRz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1b8943c-f56b-4c4a-9747-74078d16326a_900x668.png" width="900" height="668" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e1b8943c-f56b-4c4a-9747-74078d16326a_900x668.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:668,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!DQRz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1b8943c-f56b-4c4a-9747-74078d16326a_900x668.png 424w, https://substackcdn.com/image/fetch/$s_!DQRz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1b8943c-f56b-4c4a-9747-74078d16326a_900x668.png 848w, https://substackcdn.com/image/fetch/$s_!DQRz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1b8943c-f56b-4c4a-9747-74078d16326a_900x668.png 1272w, https://substackcdn.com/image/fetch/$s_!DQRz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1b8943c-f56b-4c4a-9747-74078d16326a_900x668.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">OpenClaw onboarding message</figcaption></figure></div><p>Ensure you read the <a href="https://docs.molt.bot/gateway/security">security guideline</a>s before installing OpenClaw (Clawdbot) on your machine.</p><p><em><strong>&#9888;&#65039; Note: </strong>At the time I&#8217;m writing, three CLI commands are being used: </em><code>clawdbot</code><em>, </em><code>moltbot</code><em> and </em><code>openclaw</code><em>. Just pick the one that works for you.</em></p><p>After that initial message, it will ask you to use an API key from Anthropic, OpenAI, and many more. I like to use <a href="https://openrouter.ai/">OpenRouter</a> because it comes with multiple LLMs available and very cheap options.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dImk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4119ab-0c00-4dd1-8441-666f331f07f9_900x347.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dImk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4119ab-0c00-4dd1-8441-666f331f07f9_900x347.png 424w, https://substackcdn.com/image/fetch/$s_!dImk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4119ab-0c00-4dd1-8441-666f331f07f9_900x347.png 848w, https://substackcdn.com/image/fetch/$s_!dImk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4119ab-0c00-4dd1-8441-666f331f07f9_900x347.png 1272w, https://substackcdn.com/image/fetch/$s_!dImk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4119ab-0c00-4dd1-8441-666f331f07f9_900x347.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dImk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4119ab-0c00-4dd1-8441-666f331f07f9_900x347.png" width="900" height="347" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f4119ab-0c00-4dd1-8441-666f331f07f9_900x347.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:347,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!dImk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4119ab-0c00-4dd1-8441-666f331f07f9_900x347.png 424w, https://substackcdn.com/image/fetch/$s_!dImk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4119ab-0c00-4dd1-8441-666f331f07f9_900x347.png 848w, https://substackcdn.com/image/fetch/$s_!dImk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4119ab-0c00-4dd1-8441-666f331f07f9_900x347.png 1272w, https://substackcdn.com/image/fetch/$s_!dImk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f4119ab-0c00-4dd1-8441-666f331f07f9_900x347.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">OpenRouter <a href="https://openrouter.ai/">website</a></figcaption></figure></div><p>The model I use is: <code>deepseek/deepseek-r1&#8211;0528:free</code>. While it says <em>free</em>, it is not entirely accurate, but it is significantly cheaper compared to others.</p><p>If you want to change the model later, you can run this in your terminal:</p><pre><code>openclaw models set openrouter/x-ai/grok-4.1-fast</code></pre><p>Now, the next step in the installation is to select a communication channel. By default, you can speak with the assistant by running this command:</p><pre><code>openclaw dashboard</code></pre><p>But it&#8217;s way better to use a chat application. You have all the options available on the image 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_!_VLA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffca0234-05c1-4787-b340-c0a92f307523_443x565.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_VLA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffca0234-05c1-4787-b340-c0a92f307523_443x565.png 424w, https://substackcdn.com/image/fetch/$s_!_VLA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffca0234-05c1-4787-b340-c0a92f307523_443x565.png 848w, https://substackcdn.com/image/fetch/$s_!_VLA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffca0234-05c1-4787-b340-c0a92f307523_443x565.png 1272w, https://substackcdn.com/image/fetch/$s_!_VLA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffca0234-05c1-4787-b340-c0a92f307523_443x565.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_VLA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffca0234-05c1-4787-b340-c0a92f307523_443x565.png" width="443" height="565" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ffca0234-05c1-4787-b340-c0a92f307523_443x565.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:565,&quot;width&quot;:443,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!_VLA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffca0234-05c1-4787-b340-c0a92f307523_443x565.png 424w, https://substackcdn.com/image/fetch/$s_!_VLA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffca0234-05c1-4787-b340-c0a92f307523_443x565.png 848w, https://substackcdn.com/image/fetch/$s_!_VLA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffca0234-05c1-4787-b340-c0a92f307523_443x565.png 1272w, https://substackcdn.com/image/fetch/$s_!_VLA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffca0234-05c1-4787-b340-c0a92f307523_443x565.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Channels to communicate with OpenClaw</figcaption></figure></div><p>If you pick WhatsApp, all you need to do is scan a QR code, but I prefer using Telegram, so here are the steps:</p><ol><li><p>Open the <strong>BotFather</strong> on your Telegram app (just search for it).</p></li><li><p>Write <code>/newbot</code> in BotFather&#8217;s chat.</p></li><li><p>Name your bot.</p></li><li><p>Copy the API token into your terminal.</p></li></ol><p>You&#8217;ll then receive a message from your bot to configure it:</p><pre><code>openclaw pairing approve telegram &lt;your_pairing_code&gt;</code></pre><p>The next step in the process is to install skills, but they are not mandatory.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!U4p4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0a93dbd-0d10-428c-8134-457de559a542_632x677.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U4p4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0a93dbd-0d10-428c-8134-457de559a542_632x677.png 424w, https://substackcdn.com/image/fetch/$s_!U4p4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0a93dbd-0d10-428c-8134-457de559a542_632x677.png 848w, https://substackcdn.com/image/fetch/$s_!U4p4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0a93dbd-0d10-428c-8134-457de559a542_632x677.png 1272w, https://substackcdn.com/image/fetch/$s_!U4p4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0a93dbd-0d10-428c-8134-457de559a542_632x677.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U4p4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0a93dbd-0d10-428c-8134-457de559a542_632x677.png" width="632" height="677" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f0a93dbd-0d10-428c-8134-457de559a542_632x677.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:677,&quot;width&quot;:632,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!U4p4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0a93dbd-0d10-428c-8134-457de559a542_632x677.png 424w, https://substackcdn.com/image/fetch/$s_!U4p4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0a93dbd-0d10-428c-8134-457de559a542_632x677.png 848w, https://substackcdn.com/image/fetch/$s_!U4p4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0a93dbd-0d10-428c-8134-457de559a542_632x677.png 1272w, https://substackcdn.com/image/fetch/$s_!U4p4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0a93dbd-0d10-428c-8134-457de559a542_632x677.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">OpenClaw skills list</figcaption></figure></div><p>Skills are extensions that teach the agent, through instructions, how to perform specific tasks. In this step, I&#8217;ve installed the <code>mcporter</code> skill to connect to MCP servers, but feel free to choose whichever skill you prefer.</p><p>In the case you&#8217;ve jumped or exited the configuration steps by mistake, you can install skills using the <code>clawdhub</code> CLI:</p><pre><code>npm i -g clawdhub</code></pre><p>This gives you access to <a href="https://www.clawhub.ai/">ClawdHub</a>, a public skill registry. You can search for skills directly on the portal or use the CLI, which has a search option, making it easier to look for skills using the command line. For instance:</p><pre><code>clawdhub search &#8220;google sheets&#8221;</code></pre><p>The result:</p><pre><code>google-sheets v1.0.0  Google Sheets  (0.593)
smartsheet v1.0.0  Smartsheet  (0.536)
excel-online v1.0.0  Excel Online  (0.440)
gog v1.0.0  Gog  (0.380)
xlsx-manipulation v1.0.0  Xlsx Manipulation  (0.373)
google-drive v1.0.0  Google Drive  (0.372)</code></pre><p>The output shows all the skills that can be installed related to the input search. For Google Sheets, we would run:</p><pre><code>clawdhub install google-sheets</code></pre><p>During the configuration step, after installing the skills, you&#8217;ll be asked to provide additional API keys and enable hooks. From the available hook options, I selected only <code>session-memory</code>, which saves the session context to your agent workspace whenever you issue <code>/new</code> in the chat. This allows the agent to remember information from previous sessions.</p><p>You can see all the available hooks with this command:</p><pre><code>openclaw hooks list</code></pre><p>To enable <code>session-memory</code>:</p><pre><code>openclaw hooks enable session-memory</code></pre><p>With this final step, the basic configuration is done, and you can start chatting with your agent.</p><p>If you want to run the onboarding again, you can run this:</p><pre><code>openclaw onboard</code></pre><p>Now you should be good to start chatting!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zqDJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1f85d3-ed02-4036-8642-cd6b54d0590a_576x1280.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zqDJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1f85d3-ed02-4036-8642-cd6b54d0590a_576x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zqDJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1f85d3-ed02-4036-8642-cd6b54d0590a_576x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zqDJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1f85d3-ed02-4036-8642-cd6b54d0590a_576x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zqDJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1f85d3-ed02-4036-8642-cd6b54d0590a_576x1280.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zqDJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1f85d3-ed02-4036-8642-cd6b54d0590a_576x1280.jpeg" width="576" height="1280" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/af1f85d3-ed02-4036-8642-cd6b54d0590a_576x1280.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1280,&quot;width&quot;:576,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!zqDJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1f85d3-ed02-4036-8642-cd6b54d0590a_576x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zqDJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1f85d3-ed02-4036-8642-cd6b54d0590a_576x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zqDJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1f85d3-ed02-4036-8642-cd6b54d0590a_576x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zqDJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1f85d3-ed02-4036-8642-cd6b54d0590a_576x1280.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Set up my agent&#8217;s personality</figcaption></figure></div><p>The first conversation you&#8217;ll have with it will modify its personality and the way it engages with you. By updating the following files:</p><ul><li><p><strong>USER.md:</strong> Information about you, name, timezone, and all the extra information you want to provide.</p></li><li><p><strong>IDENTITY.md:</strong> Your agent&#8217;s name and summary.</p></li><li><p><strong>SOUL.md:</strong> Your agent&#8217;s deep personality &amp; rules (how it thinks/behaves).</p></li></ul><p>In the next chapter, we are going to look at some simple use cases that do not compromise your security and are useful for your daily life.</p><div><hr></div><h3>3 Tips to Make Your Life Easier with OpenClaw</h3><p>Before I start sharing some use cases of the AI agent, you can simply ask it what it can do.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hyR1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbee65f4-25e9-4ffc-9f4e-4978e10e7f01_576x1280.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hyR1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbee65f4-25e9-4ffc-9f4e-4978e10e7f01_576x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hyR1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbee65f4-25e9-4ffc-9f4e-4978e10e7f01_576x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hyR1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbee65f4-25e9-4ffc-9f4e-4978e10e7f01_576x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hyR1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbee65f4-25e9-4ffc-9f4e-4978e10e7f01_576x1280.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hyR1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbee65f4-25e9-4ffc-9f4e-4978e10e7f01_576x1280.jpeg" width="576" height="1280" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fbee65f4-25e9-4ffc-9f4e-4978e10e7f01_576x1280.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1280,&quot;width&quot;:576,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!hyR1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbee65f4-25e9-4ffc-9f4e-4978e10e7f01_576x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hyR1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbee65f4-25e9-4ffc-9f4e-4978e10e7f01_576x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hyR1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbee65f4-25e9-4ffc-9f4e-4978e10e7f01_576x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hyR1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbee65f4-25e9-4ffc-9f4e-4978e10e7f01_576x1280.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Chat with OpenClaw on Telegram</figcaption></figure></div><p>There are many examples of applications on YouTube and in articles. But if you already have an idea, you can chat with the agent about it and develop it together. The possibilities are endless.</p><p>Let&#8217;s now look at three simple use cases.</p><h4>Connect to Apify through MCP and get instant data</h4><p>Using a Model Context Protocol (MCP) server is, by far, the best and most secure way to have access to integrations. That&#8217;s because you can filter what you can and cannot do before making an API request.</p><p><a href="https://www.apify.com?fpr=ulosg">Apify</a> makes this process very simple on its <a href="https://mcp.apify.com/?fpr=ulosg">server configuration page</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_!R3HU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd02133-f17c-4de5-98e9-905411609787_900x473.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!R3HU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd02133-f17c-4de5-98e9-905411609787_900x473.png 424w, https://substackcdn.com/image/fetch/$s_!R3HU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd02133-f17c-4de5-98e9-905411609787_900x473.png 848w, https://substackcdn.com/image/fetch/$s_!R3HU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd02133-f17c-4de5-98e9-905411609787_900x473.png 1272w, https://substackcdn.com/image/fetch/$s_!R3HU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd02133-f17c-4de5-98e9-905411609787_900x473.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!R3HU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd02133-f17c-4de5-98e9-905411609787_900x473.png" width="900" height="473" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9dd02133-f17c-4de5-98e9-905411609787_900x473.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:473,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!R3HU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd02133-f17c-4de5-98e9-905411609787_900x473.png 424w, https://substackcdn.com/image/fetch/$s_!R3HU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd02133-f17c-4de5-98e9-905411609787_900x473.png 848w, https://substackcdn.com/image/fetch/$s_!R3HU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd02133-f17c-4de5-98e9-905411609787_900x473.png 1272w, https://substackcdn.com/image/fetch/$s_!R3HU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd02133-f17c-4de5-98e9-905411609787_900x473.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Apify MCS server configuration <a href="https://mcp.apify.com/?fpr=ulosg">page</a></figcaption></figure></div><p>You can control which Apify actors your client will have access to, along with other parameters. In case of an attack, this prevents the hacker from being able to use your API to do too much harm.</p><p>Still, you need to provide the API key to your agent, along with the MCP URL, which in my case looks like this:</p><pre><code></code></pre><p>https://mcp.apify.com/?tools=docs,get-dataset,dadhalfdev/techcrunch-scraper-per-event,dadhalfdev/imovirtual-scraper-per-event</p><p>I&#8217;ve selected the <a href="https://apify.com/dadhalfdev/techcrunch-scraper-per-event?fpr=ulosg">TechCrunch</a> scraper to extract tech articles. And the <a href="https://www.apify.com/dadhalfdev/imovirtual-scraper-per-event?fpr=ulosg">Imovirtual</a> scraper to fetch property listings in Portugal.</p><p>For TechCrunch, I told the agent to do this:</p><pre><code>Use this Apify actor:

dadhalfdev/techcrunch-scraper-per-event

Scrape up to 10 articles.

With the category &#8220;AI&#8221;

And summarize them to me here on Telegram.</code></pre><p>The output:</p><pre><code>1. Last 24h for +1 pass @50% off TechCrunch Disrupt 2026 (Jan 30)
Final chance to save $680 on Oct event w/ 250+ leaders (Barra, Khosla, Nadella).
Link (https://techcrunch.com/2026/01/30/last-24-hours-to-grab-your-1-pass-at-50-off-to-techcrunch-disrupt-2026/)
2. Tim Cook vague on Apple AI monetization (Jan 29)
Q4 revenue $143.8B up 16%; analyst presses on AI ROI&#8212;Cook: &#8220;creates great value.&#8221;
Link (https://techcrunch.com/2026/01/29/guys-i-dont-think-tim-cook-knows-how-to-monetize-ai/)
3. Musk: SpaceX/Tesla/xAI merger talks (Jan 29)
Early-stage; could IPO SpaceX or consolidate (xAI owns X). SpaceX valued $800B.
Link (https://techcrunch.com/2026/01/29/elon-musk-spacex-tesla-xai-merger-talks-ipo-reuters/)
4. Amazon eyes $50B OpenAI investment (Jan 29)
Amid $100B round valuing OpenAI @ $830B; despite Anthropic ties (AWS $8B invested).
Link (https://techcrunch.com/2026/01/29/amazon-is-reportedly-in-talks-to-invest-50-billion-in-openai/)</code></pre><p>Make sure you use the correct inputs. For example, in the example above, I forgot to set the <code>max_posts</code> input, so the scraper kept running even after the first 10 articles were scraped and sent to my Telegram chat. If you don&#8217;t use all of the actor&#8217;s inputs, you may end up paying more than necessary.</p><p>This is a simple example of how you can access the latest news without opening social media or jumping between multiple websites. It provides instant access to information, anytime and anywhere.</p><div><hr></div><h4>Connect to Notion and manage tasks</h4><p>For <a href="https://notion.so/">Notion</a>, we are not going to use an MCP because it&#8217;s simpler with the API token, and it has an extra layer of security that Apify doesn&#8217;t. You can select the page where your client will have access, preventing a potential attacker from accessing other pages.</p><p>First, you need to create a new integration in Notion.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aYGq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36bfc58-0170-405b-8e43-767065a6ba7b_900x517.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aYGq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36bfc58-0170-405b-8e43-767065a6ba7b_900x517.png 424w, https://substackcdn.com/image/fetch/$s_!aYGq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36bfc58-0170-405b-8e43-767065a6ba7b_900x517.png 848w, https://substackcdn.com/image/fetch/$s_!aYGq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36bfc58-0170-405b-8e43-767065a6ba7b_900x517.png 1272w, https://substackcdn.com/image/fetch/$s_!aYGq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36bfc58-0170-405b-8e43-767065a6ba7b_900x517.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aYGq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36bfc58-0170-405b-8e43-767065a6ba7b_900x517.png" width="900" height="517" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a36bfc58-0170-405b-8e43-767065a6ba7b_900x517.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:517,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!aYGq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36bfc58-0170-405b-8e43-767065a6ba7b_900x517.png 424w, https://substackcdn.com/image/fetch/$s_!aYGq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36bfc58-0170-405b-8e43-767065a6ba7b_900x517.png 848w, https://substackcdn.com/image/fetch/$s_!aYGq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36bfc58-0170-405b-8e43-767065a6ba7b_900x517.png 1272w, https://substackcdn.com/image/fetch/$s_!aYGq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa36bfc58-0170-405b-8e43-767065a6ba7b_900x517.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Create an integration on <a href="https://notion.so/">Notion</a></figcaption></figure></div><p>I named mine Dad Half Bot, and I set it up to only read content with no access to user information.</p><p>I sent the token to the agent:</p><pre><code>I want you to connect to my Notion using this API:

ntn_346...</code></pre><p>Then I moved to my <strong>Task List</strong> page and added the new integration (Dad Half Bot). Note that it won&#8217;t be able to access other pages without your permission.</p><p>I told it to access my ongoing tasks, and this is what I got:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z4jM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F263f9f1c-a8b2-4d32-bbfa-0ad66778cb8f_576x681.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z4jM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F263f9f1c-a8b2-4d32-bbfa-0ad66778cb8f_576x681.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Z4jM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F263f9f1c-a8b2-4d32-bbfa-0ad66778cb8f_576x681.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Z4jM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F263f9f1c-a8b2-4d32-bbfa-0ad66778cb8f_576x681.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Z4jM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F263f9f1c-a8b2-4d32-bbfa-0ad66778cb8f_576x681.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z4jM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F263f9f1c-a8b2-4d32-bbfa-0ad66778cb8f_576x681.jpeg" width="576" height="681" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/263f9f1c-a8b2-4d32-bbfa-0ad66778cb8f_576x681.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:681,&quot;width&quot;:576,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!Z4jM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F263f9f1c-a8b2-4d32-bbfa-0ad66778cb8f_576x681.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Z4jM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F263f9f1c-a8b2-4d32-bbfa-0ad66778cb8f_576x681.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Z4jM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F263f9f1c-a8b2-4d32-bbfa-0ad66778cb8f_576x681.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Z4jM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F263f9f1c-a8b2-4d32-bbfa-0ad66778cb8f_576x681.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">OpenClaw fetching ongoing tasks on <a href="https://notion.so/">Notion</a></figcaption></figure></div><p>This is a simple example, but the agent can be granted access to additional pages with different structure formats (databases, tasks, tables, text, etc). With write access enabled, tasks can be created and managed directly from Telegram, and you can stop using the Notion app on your phone if you want.</p><div><hr></div><h4>Reminders and notifications</h4><p>Another straightforward use case is setting up reminders. This may seem obvious, but it&#8217;s a real need. How many of you miss email notifications? I do. But I never miss them on WhatsApp or Telegram when notifications are enabled, of course.</p><p>You can also create personalized reminders, and the bot will remember them indefinitely. Even though this is a simple implementation, there&#8217;s one important thing you need to know.</p><p>OpenClaw schedules prompts, so if you try this:</p><pre><code>Say &#8220;I love you &#10084;&#65039;&#8221; daily at 7 am.</code></pre><p>The bot will most likely reply:</p><pre><code>&#8220;Oh, thanks, I love to &#10084;&#65039;!&#8221; daily at 7 am.</code></pre><p>You need to do this instead:</p><pre><code>Respond with ONLY this: &#8220;I love you &#10084;&#65039;&#8221; daily at 7 am.</code></pre><p>The example above exists because I gave my girlfriend access to the bot, and now she receives a loving message every morning.</p><p>But the key idea is to think about how the bot should respond to your prompt, rather than what you would say yourself.</p><p>I&#8217;ve been using it for birthdays (better than Google Calendar), meetings, and for registering simple ideas that come to mind while I&#8217;m in the park with my daughter.</p><p><em><strong>Need help with automation, AI, or data science? Let&#8217;s talk.</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/jaULmLguQX8KbikZ6&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://calendar.app.google/jaULmLguQX8KbikZ6"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3>Conclusion</h3><p>In this piece, we&#8217;ve covered some of OpenClaw&#8217;s strongest features and explained why it can be a dangerous tool if not used correctly. It can be sensitive to prompt injection and may store APIs, tokens, and passwords in plain text files, which can be easily transferred to the wrong locations.</p><p>In short, the more tasks it handles, the less predictable it can become, and surprises may arise.</p><p>We&#8217;ve also covered the essential steps and commands to get started with OpenClaw without compromising safety, along with three straightforward use cases that can make everyday life easier.</p><p>This is a new tool, and the internet will soon be filled with more creative ideas. Hopefully, after reading this piece, you&#8217;ll be able to decide which of them are worth trying.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"><strong>Curious about what I&#8217;m building? &#128064;</strong></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[How to Create a Marketing Mix Model with Google’s Meridian]]></title><description><![CDATA[Learn the steps to train marketing data, and get insightful information with Meridian.]]></description><link>https://blog.dadhalfdev.com/p/how-to-create-a-marketing-mix-model</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/how-to-create-a-marketing-mix-model</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Mon, 26 Jan 2026 14:31:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!I9h0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9163369-70b4-4b23-8024-69ccf79ec478_900x563.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!I9h0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9163369-70b4-4b23-8024-69ccf79ec478_900x563.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!I9h0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9163369-70b4-4b23-8024-69ccf79ec478_900x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!I9h0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9163369-70b4-4b23-8024-69ccf79ec478_900x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!I9h0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9163369-70b4-4b23-8024-69ccf79ec478_900x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!I9h0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9163369-70b4-4b23-8024-69ccf79ec478_900x563.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!I9h0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9163369-70b4-4b23-8024-69ccf79ec478_900x563.jpeg" width="900" height="563" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f9163369-70b4-4b23-8024-69ccf79ec478_900x563.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:563,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!I9h0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9163369-70b4-4b23-8024-69ccf79ec478_900x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!I9h0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9163369-70b4-4b23-8024-69ccf79ec478_900x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!I9h0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9163369-70b4-4b23-8024-69ccf79ec478_900x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!I9h0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9163369-70b4-4b23-8024-69ccf79ec478_900x563.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Image by Author</figcaption></figure></div><p>Some time ago, Google announced its plans to remove third-party cookies from Google Chrome, due to Google&#8217;s Privacy Sandbox initiative to minimize users&#8217; exposure to surveillance advertising and reduce cross-site tracking.</p><p>The reactions to this rumor were, and still are, extremely polarised. On one hand, users who prioritize their privacy were happy with this decision. On the other hand, marketers saw it as a threat to the way they do business.</p><p>As of today, this measure hasn&#8217;t been fully implemented, with only a small percentage being affected. However, many browsers, such as Brave and Firefox, already block third-party cookies by default, and even Chrome is moving into a user-choice approach, making the overall cookie environment not a solid source of user information.</p><p>With user tracking becoming less effective, marketers cannot confidently determine which channels are driving ROAS (Return On Ad Spend).</p><p>This is where the <strong>Marketing Mix Modeling (MMM) </strong>plays a key role.</p><p>The MMMs analyse aggregated data (spending, impressions, reach, sales) across multiple channels, and they use time-series data to estimate how these activities influence the sales (organic and non-organic)</p><p>There are a few MMM frameworks worth exploring, such as <strong><a href="https://facebookexperimental.github.io/Robyn/">Meta&#8217;s Robyn</a></strong>, <strong><a href="https://www.pymc-marketing.io/en/stable/">PyMC Marketing</a></strong>, and <strong><a href="https://developers.google.com/meridian">Meridian</a></strong>, but in this article, we are going to focus on the latter, not only because it&#8217;s extremely user-friendly and open-source, but also because it clearly accounts for the combination between paid and organic channels.</p><p>We will start by understanding how Marketing Mix Modeling works, and then we&#8217;ll dive into the steps to train a model and use it to gather insights with Meridian&#8217;s built-in functions and dynamic charts.</p><div><hr></div><h3><strong>How Marketing Mix Modeling works</strong></h3><p>Marketing Mix Modeling, as the name suggests, is an analytical approach that uses a &#8220;mix&#8221; of marketing inputs, such as spend, impressions, clicks, reach, promotions, and more, to estimate their impact on sales and revenue through Machine Learning (ML) algorithms.</p><p>The statistical models behind MMMs are typically multivariate regressions or Bayesian models. They rely on historical time-series data across all marketing channels, along with seasonality and trends.</p><p>Google&#8217;s Meridian framework follows a Bayesian approach, combining prior knowledge with observed data to estimate media effects while quantifying uncertainty.</p><p>The Bayesian regression model used by Meridian is based on Bayes` Theorem, which is represented by the following equation:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tnqn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febc6d952-ebd2-458a-9686-746944b9da3a_734x296.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tnqn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febc6d952-ebd2-458a-9686-746944b9da3a_734x296.png 424w, https://substackcdn.com/image/fetch/$s_!tnqn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febc6d952-ebd2-458a-9686-746944b9da3a_734x296.png 848w, https://substackcdn.com/image/fetch/$s_!tnqn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febc6d952-ebd2-458a-9686-746944b9da3a_734x296.png 1272w, https://substackcdn.com/image/fetch/$s_!tnqn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febc6d952-ebd2-458a-9686-746944b9da3a_734x296.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tnqn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febc6d952-ebd2-458a-9686-746944b9da3a_734x296.png" width="734" height="296" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ebc6d952-ebd2-458a-9686-746944b9da3a_734x296.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:296,&quot;width&quot;:734,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!tnqn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febc6d952-ebd2-458a-9686-746944b9da3a_734x296.png 424w, https://substackcdn.com/image/fetch/$s_!tnqn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febc6d952-ebd2-458a-9686-746944b9da3a_734x296.png 848w, https://substackcdn.com/image/fetch/$s_!tnqn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febc6d952-ebd2-458a-9686-746944b9da3a_734x296.png 1272w, https://substackcdn.com/image/fetch/$s_!tnqn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febc6d952-ebd2-458a-9686-746944b9da3a_734x296.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">General Bayes` Theorem</figcaption></figure></div><p>Where:</p><ul><li><p><strong>P(A|B) (Posterior):</strong> The probability of <strong>A</strong> happening given that <strong>B</strong> is true.</p></li><li><p><strong>P(B|A) (Likelihood):</strong> The probability of seeing evidence <strong>B</strong> if <strong>A</strong> is true.</p></li><li><p><strong>P(A) (Prior):</strong> Your initial belief about <strong>A</strong> before seeing the evidence.</p></li><li><p><strong>P(B) (Evidence):</strong> The <strong>total probability</strong> of the evidence occurring under all possible scenarios.</p></li></ul><p>So, how would you think of the Bayes Theorem applied to Marketing Mix Modeling?</p><p>Instead of a single observation, as the formula suggests, the theorem is used to estimate channel effects across time-series data. For instance, we may start with a prior belief about the expected contribution of a channel like Google Ads, informed by historical performance or domain knowledge.</p><p>The likelihood then incorporates observed data while accounting for factors such as seasonality, overlapping channels, and organic demand. By combining the prior with the likelihood, the model infers a posterior distribution over the channel&#8217;s contribution.</p><p>The theorem would look more like this:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!s7IO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ab1b36-7ff8-4f4c-848d-576480f1e9b4_623x131.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!s7IO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ab1b36-7ff8-4f4c-848d-576480f1e9b4_623x131.png 424w, https://substackcdn.com/image/fetch/$s_!s7IO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ab1b36-7ff8-4f4c-848d-576480f1e9b4_623x131.png 848w, https://substackcdn.com/image/fetch/$s_!s7IO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ab1b36-7ff8-4f4c-848d-576480f1e9b4_623x131.png 1272w, https://substackcdn.com/image/fetch/$s_!s7IO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ab1b36-7ff8-4f4c-848d-576480f1e9b4_623x131.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!s7IO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ab1b36-7ff8-4f4c-848d-576480f1e9b4_623x131.png" width="623" height="131" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/55ab1b36-7ff8-4f4c-848d-576480f1e9b4_623x131.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:131,&quot;width&quot;:623,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!s7IO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ab1b36-7ff8-4f4c-848d-576480f1e9b4_623x131.png 424w, https://substackcdn.com/image/fetch/$s_!s7IO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ab1b36-7ff8-4f4c-848d-576480f1e9b4_623x131.png 848w, https://substackcdn.com/image/fetch/$s_!s7IO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ab1b36-7ff8-4f4c-848d-576480f1e9b4_623x131.png 1272w, https://substackcdn.com/image/fetch/$s_!s7IO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ab1b36-7ff8-4f4c-848d-576480f1e9b4_623x131.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Bayes` Theorem in MMM</figcaption></figure></div><p>The denominator (evidence) here represents the probability of seeing your actual sales data under every possible combination of channel effects, seasonality, and organic trends.</p><h4>Why choose Meridian over other MMM frameworks</h4><p>Now that we&#8217;re more familiar with Bayes&#8217; Theorem, we can define our <em>prior expectations</em> about the types of questions Meridian is designed to answer. In practice, these typically include:</p><ul><li><p>How did each marketing channel contribute to revenue or another KPI?</p></li><li><p>What was the return on ad spend (ROAS)?</p></li><li><p>How should I allocate my marketing budget going forward to maximize impact?</p></li><li><p>Where do diminishing returns begin for each marketing channel?</p></li></ul><p>With Meridian, we will be able to answer all of these questions and more. These are some of the key features of this framework:</p><ul><li><p><strong>Works with local, regional, and national data: </strong>Analyzes marketing performance at a regional or city level, not just nationally.</p></li><li><p><strong>Prior knowledge about channel performance: </strong>You can include what you already know about your marketing, such as results from past experiments.</p></li><li><p><strong>Accounts for diminishing returns and delayed effects: </strong>Saturation and lagged effects for paid and organic media are modeled using parametric transformation functions.</p></li><li><p><strong>Supports reach and frequency data: </strong>Beyond impressions, Meridian can utilize reach and frequency to gain a deeper understanding of how exposure impacts performance.</p></li><li><p><strong>Optimizes marketing budgets: </strong>You can determine the optimal budget allocation across channels based on your total.</p></li><li><p><strong>Runs &#8220;what-if&#8221; scenarios: </strong>You can simulate different marketing strategies, such as reallocating spend, and estimate how ROI would change under those scenarios.</p></li><li><p><strong>Evaluates model quality: </strong>You can assess how well the model fits historical data and how it performs on unseen data.</p></li><li><p><strong>Includes non-media and organic factors: </strong>You can optionally include factors such as pricing changes or promotions.</p></li></ul><p>In the next chapter, we are going to see how to train a model using a dataframe with both organic and paid channels.</p><div><hr></div><h3>How to train the Meridian MMM</h3><p>Before training the data, the first question that arises is to decide which time granularity makes more sense to use: daily, weekly, or monthly.</p><p>Training an MMM with daily data would not only take a huge amount of time, especially considering several years, but could also lead to overfitting, and a monthly or quarterly granularity would remove a lot of information regarding seasonality and trends, leading to underfitting.</p><p>Therefore, a weekly granularity would be the best approach, but it also depends on the number of features in your dataset and the number of data points you have. According to several <a href="https://getrecast.com/data/">articles</a>, there&#8217;s a rule of thumb in Marketing Mix Modeling: you should have 10 data points (rows) per feature. So, using weekly granularity would be recommended if you&#8217;re using, for instance, 2 years of data (around 104 weeks) and 10 features in your dataset.</p><p>In this piece, we are going to work with 3 years of information, so I grouped the data at a weekly level, but I&#8217;ve also added information about the month and the quarter because it helps to separate true marketing effects from seasonality and trends.</p><p>We are now going to train the dataset above, which includes media spend, non-spend, and organic channels.</p><h4>Install and set up Meridian</h4><p>The easiest and fastest way to train the data is by using a <a href="https://colab.research.google.com/">Google Colab</a> notebook with a remote GPU. For that, you need to open a notebook and in the top corner, change the runtime type to <strong>T4 GPU.</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_!doBm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79733241-d4b3-4e65-af4d-86b47ad0f788_900x426.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!doBm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79733241-d4b3-4e65-af4d-86b47ad0f788_900x426.png 424w, https://substackcdn.com/image/fetch/$s_!doBm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79733241-d4b3-4e65-af4d-86b47ad0f788_900x426.png 848w, https://substackcdn.com/image/fetch/$s_!doBm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79733241-d4b3-4e65-af4d-86b47ad0f788_900x426.png 1272w, https://substackcdn.com/image/fetch/$s_!doBm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79733241-d4b3-4e65-af4d-86b47ad0f788_900x426.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!doBm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79733241-d4b3-4e65-af4d-86b47ad0f788_900x426.png" width="900" height="426" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/79733241-d4b3-4e65-af4d-86b47ad0f788_900x426.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:426,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!doBm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79733241-d4b3-4e65-af4d-86b47ad0f788_900x426.png 424w, https://substackcdn.com/image/fetch/$s_!doBm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79733241-d4b3-4e65-af4d-86b47ad0f788_900x426.png 848w, https://substackcdn.com/image/fetch/$s_!doBm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79733241-d4b3-4e65-af4d-86b47ad0f788_900x426.png 1272w, https://substackcdn.com/image/fetch/$s_!doBm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79733241-d4b3-4e65-af4d-86b47ad0f788_900x426.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Change runtime type to T4 GPU</figcaption></figure></div><p>Now, in the first cell of your notebook, you can connect to Google Drive to directly store and fetch data from there.</p><pre><code>from google.colab import drive
drive.mount(&#8217;/content/drive&#8217;)</code></pre><p>To install Meridian, you can run this <code>pip</code> command:</p><pre><code>!pip install --upgrade google-meridian[colab,and-cuda]</code></pre><p>Once installed, we can start by structuring the features of the dataset like this:</p><pre><code>MEDIA = [
    &#8220;instagram_impressions&#8221;,
    &#8220;x_impressions&#8221;,
    &#8220;google_clicks&#8221;,
    &#8220;tik_tok_impressions&#8221;,
    &#8220;facebook_impressions&#8221;]

MEDIA_SPEND = [
    &#8216;instagram_spend&#8217;,
    &#8216;x_spend&#8217;,
    &#8216;google_spend&#8217;,
    &#8216;tik_tok_spend&#8217;,
    &#8216;facebook_spend&#8217;]
ORGANIC_COLS = [
    &#8216;direct_sessions&#8217;,
    &#8216;organic_impressions&#8217;,
    ]
CONTROL_COLS = [&#8217;week&#8217;, &#8216;month&#8217;, &#8216;quarter&#8217;,  &#8216;year&#8217;]
mapping_media_spend = {
    &#8216;instagram_spend&#8217;: &#8216;Instagram&#8217;,
    &#8216;x_spend&#8217;: &#8216;X&#8217;,
    &#8216;google_spend&#8217;: &#8216;Google&#8217;,
    &#8216;tik_tok_spend&#8217;: &#8216;Tik Tok&#8217;,
    &#8216;facebook_spend&#8217;: &#8216;Facebook&#8217;
}
mapping_media = {
    &#8220;instagram_impressions&#8221;: &#8220;Instagram&#8221;,
    &#8220;x_impressions&#8221;: &#8220;X&#8221;,
    &#8220;google_clicks&#8221;: &#8220;Google&#8221;,
    &#8220;tik_tok_impressions&#8221;: &#8220;Tik Tok&#8221;,
    &#8220;facebook_impressions&#8221;: &#8220;Facebook&#8221;
}</code></pre><p>The <code>MEDIA</code> list contains the user activity, like impressions and clicks. The <code>MEDIA_SPEND</code> list contains the same channels but focuses on spending. Both <code>MEDIA_SPEND</code> and <code>MEDIA</code> are linked through <code>mapping_media_spend</code> and <code>mapping_media</code>, so make sure to have column values for both dictionaries. The <code>ORGANIC_COLS</code> list contains the features that do not require spending. The <code>CONTROL_COLS</code> are all columns related to time.</p><p>We can use the above lists and dictionaries to create a mapping object for the model:</p><pre><code>from meridian.data import load

coord_to_columns = load.CoordToColumns(
    time=&#8217;week&#8217;,
    controls=CONTROL_COLS,
    kpi=&#8217;revenue&#8217;,
    media=MEDIA,
    media_spend=MEDIA_SPEND,
    organic_media=ORGANIC_COLS
)</code></pre><p>The KPI is what you&#8217;re trying to predict (the target), which in our case is the revenue.</p><h4>Create the priors</h4><p>Now comes the trickiest part of the Marketing Mix Modeling steps, which is creating the<strong> priors</strong>. As we have seen before, the priors, just like the posteriori, are distributions, and they represent the information you provide to the model before it &#8220;sees&#8221; the data.</p><p>A prior can come from multiple sources, including results from past experiments, industry benchmarks, previous MMM results, and your team&#8217;s subject matter expertise. In this tutorial, we don&#8217;t have previous information about the data, so we are going to use the default priors provided by Meridian.</p><p>You can read more about the priors (beliefs) <a href="https://developers.google.com/meridian/docs/advanced-modeling/intro-priors">here</a>.</p><p>To calculate the default priors, we are going to use the <code>PriorDistribution</code> object from the Meridian library. In addition, we will use the <code>tensorflow_probability</code> package to create distributions.</p><pre><code>pip install tensorflow-probability</code></pre><p>We won&#8217;t do any modifications on the default input values, but I&#8217;m still going to display them and add comments so you can understand them better:</p><pre><code>import tensorflow_probability as tfp
from meridian.model import spec, prior_distribution

prior = prior_distribution.PriorDistribution(
    # LogNormal is used because ROI must be positive.
    # These are Meridian&#8217;s recommended defaults when no prior knowledge exists.
    roi_m=tfp.distributions.LogNormal(
        loc=0.2,    # log-mean
        scale=0.9   # log-std (fairly wide -&gt; weakly informative)
    ),
    roi_rf=tfp.distributions.LogNormal(
        loc=0.2,
        scale=0.9
    ),
    # Organic media uses contribution priors.
    # Beta(1, 99) implies a small expected contribution per channel,
    contribution_om=tfp.distributions.Beta(
        concentration1=1.0,
        concentration0=99.0
    ),
    contribution_orf=tfp.distributions.Beta(
        concentration1=1.0,
        concentration0=99.0
    ),
)</code></pre><p>The default values are the most flexible when we don&#8217;t have any clue about the data, but they can be adjusted accordingly. The model specification will look like this:</p><pre><code>from meridian.model import spec

model_spec = spec.ModelSpec(
    # Paid media is modeled using ROI priors
    media_prior_type=&#8221;roi&#8221;,

    # Organic media is modeled using contribution priors
    organic_media_prior_type=&#8221;contribution&#8221;,

    # Attach the prior configuration
    prior=prior,
)</code></pre><h4>Load and train</h4><p>Now we can create the <code>loader</code> object that takes the coordinates and the mappings previously created for all paid and organic channels:</p><pre><code>from meridian.data import load

loader = load.DataFrameDataLoader(
    df=df,
    kpi_type=&#8217;revenue&#8217;,
    coord_to_columns=coord_to_columns,
    media_to_channel=mapping_media ,
    media_spend_to_channel=mapping_media_spend
)
data = loader.load()</code></pre><p>With the <code>loader</code> and the <code>model_spec</code>, we&#8217;re ready to instantiate the model:</p><pre><code>from meridian.model import model

mmm = model.Meridian(input_data=data, model_spec=model_spec)</code></pre><p>Since Meridian is based on a Bayesian model, to train it, we need to sample from the posterior distribution using Markov <a href="https://www.statlect.com/fundamentals-of-statistics/Markov-Chain-Monte-Carlo">Chain Monte Carlo (MCMC)</a>.</p><pre><code># Initialize and run the model
mmm.sample_prior(500)

# Sample the posterior)
# This is the step that &#8220;learns&#8221; from your data
mmm.sample_posterior(
    n_chains=4,    # Number of parallel sampling chains (recommend 4-7)
    n_adapt=500,   # Adaptation steps to tune the sampler
    n_burnin=500,  # &#8220;Warm-up&#8221; samples to throw away
    n_keep=1000,   # Actual samples to keep for your results
    seed=101       # For reproducibility
)</code></pre><p>After running the above cell (may take a bit), make sure you save your mode as a <code>pkl</code> file, so you don&#8217;t need to run it again:</p><pre><code>model.save_mmm(mmm, &#8220;/content/drive/MyDrive/mmm_model.pkl&#8221;)</code></pre><div><hr></div><h3>Get insights from the Meridian model</h3><p>That&#8217;s, you&#8217;ve waited a few minutes, and now it&#8217;s time to see some results!</p><p>The first thing we can do, if you saved the model, is to load in another empty notebook:</p><pre><code>mmm = model.load_mmm(&#8221;/content/drive/MyDrive/mmm_model.pkl&#8221;)</code></pre><p>Let&#8217;s see how well our model fits the data:</p><pre><code>from meridian.analysis import visualizer

model_diagnostics = visualizer.ModelDiagnostics(mmm)
model_diagnostics.predictive_accuracy_table()</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_!fbpI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d01bc82-bb67-4a16-8ee9-a49f9ee7f5c1_900x353.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fbpI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d01bc82-bb67-4a16-8ee9-a49f9ee7f5c1_900x353.png 424w, https://substackcdn.com/image/fetch/$s_!fbpI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d01bc82-bb67-4a16-8ee9-a49f9ee7f5c1_900x353.png 848w, https://substackcdn.com/image/fetch/$s_!fbpI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d01bc82-bb67-4a16-8ee9-a49f9ee7f5c1_900x353.png 1272w, https://substackcdn.com/image/fetch/$s_!fbpI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d01bc82-bb67-4a16-8ee9-a49f9ee7f5c1_900x353.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fbpI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d01bc82-bb67-4a16-8ee9-a49f9ee7f5c1_900x353.png" width="900" height="353" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4d01bc82-bb67-4a16-8ee9-a49f9ee7f5c1_900x353.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:353,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!fbpI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d01bc82-bb67-4a16-8ee9-a49f9ee7f5c1_900x353.png 424w, https://substackcdn.com/image/fetch/$s_!fbpI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d01bc82-bb67-4a16-8ee9-a49f9ee7f5c1_900x353.png 848w, https://substackcdn.com/image/fetch/$s_!fbpI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d01bc82-bb67-4a16-8ee9-a49f9ee7f5c1_900x353.png 1272w, https://substackcdn.com/image/fetch/$s_!fbpI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4d01bc82-bb67-4a16-8ee9-a49f9ee7f5c1_900x353.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Model metrics</figcaption></figure></div><p>In our case, the R-squared is 0.8. The higher this value, the better the model fitting. However, values that are too high can also indicate overfitting.</p><p>When it comes to charts, there are several options. The first chart we can look at is the total spend versus the contribution:</p><pre><code>media_summary = visualizer.MediaSummary(mmm)
media_summary.plot_spend_vs_contribution()</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_!YJjb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b9a617-0fd3-4af8-8c32-91e5c87e466f_400x445.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YJjb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b9a617-0fd3-4af8-8c32-91e5c87e466f_400x445.png 424w, https://substackcdn.com/image/fetch/$s_!YJjb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b9a617-0fd3-4af8-8c32-91e5c87e466f_400x445.png 848w, https://substackcdn.com/image/fetch/$s_!YJjb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b9a617-0fd3-4af8-8c32-91e5c87e466f_400x445.png 1272w, https://substackcdn.com/image/fetch/$s_!YJjb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b9a617-0fd3-4af8-8c32-91e5c87e466f_400x445.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YJjb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b9a617-0fd3-4af8-8c32-91e5c87e466f_400x445.png" width="400" height="445" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/98b9a617-0fd3-4af8-8c32-91e5c87e466f_400x445.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:445,&quot;width&quot;:400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!YJjb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b9a617-0fd3-4af8-8c32-91e5c87e466f_400x445.png 424w, https://substackcdn.com/image/fetch/$s_!YJjb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b9a617-0fd3-4af8-8c32-91e5c87e466f_400x445.png 848w, https://substackcdn.com/image/fetch/$s_!YJjb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b9a617-0fd3-4af8-8c32-91e5c87e466f_400x445.png 1272w, https://substackcdn.com/image/fetch/$s_!YJjb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b9a617-0fd3-4af8-8c32-91e5c87e466f_400x445.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Return on Ad Spend (ROAS) bar chart</figcaption></figure></div><p>The above chart only takes into account the paid marketing channels. Among them, Instagram shows the highest ROI or ROAS, but it was also the channel with the highest spend. On the other hand, X didn&#8217;t require as much money invested to also generate a high ROI. The remaining channels show relatively positive ROI, suggesting potential to scale.</p><p>Now, to get the contribution, let&#8217;s use a waterfall chart.</p><pre><code>media_summary.plot_contribution_waterfall_chart()</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_!UaCe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811c7a79-333c-4b6b-b032-0feb95c94671_745x432.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UaCe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811c7a79-333c-4b6b-b032-0feb95c94671_745x432.png 424w, https://substackcdn.com/image/fetch/$s_!UaCe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811c7a79-333c-4b6b-b032-0feb95c94671_745x432.png 848w, https://substackcdn.com/image/fetch/$s_!UaCe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811c7a79-333c-4b6b-b032-0feb95c94671_745x432.png 1272w, https://substackcdn.com/image/fetch/$s_!UaCe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811c7a79-333c-4b6b-b032-0feb95c94671_745x432.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UaCe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811c7a79-333c-4b6b-b032-0feb95c94671_745x432.png" width="745" height="432" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/811c7a79-333c-4b6b-b032-0feb95c94671_745x432.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:432,&quot;width&quot;:745,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!UaCe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811c7a79-333c-4b6b-b032-0feb95c94671_745x432.png 424w, https://substackcdn.com/image/fetch/$s_!UaCe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811c7a79-333c-4b6b-b032-0feb95c94671_745x432.png 848w, https://substackcdn.com/image/fetch/$s_!UaCe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811c7a79-333c-4b6b-b032-0feb95c94671_745x432.png 1272w, https://substackcdn.com/image/fetch/$s_!UaCe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F811c7a79-333c-4b6b-b032-0feb95c94671_745x432.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Channels contribution</figcaption></figure></div><p>This chart illustrates how total revenue is distributed across both organic and paid marketing channels. In this chart, the baseline is driving the most, meaning that 58.2% of the revenue is not driven by the channels, but by seasonality and other sources. Instagram is the dominant media contributor, accounting for 26.7% of total revenue, followed by X with 10.3%. The organic channels have very little impact on this data sample.</p><p><em><strong>Need help with automation, AI, or data science? Let&#8217;s talk.</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/jaULmLguQX8KbikZ6&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://calendar.app.google/jaULmLguQX8KbikZ6"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3>Conclusion</h3><p>We could continue generating additional charts, such as adstock decay or diminishing returns. Meridian offers multiple visualizations, but the main goal here was to demonstrate how to create and fine-tune the model, while showcasing a few examples of what an MMM can deliver.</p><p>While Meridian includes several built-in charts, you can also extract the dataframes that power these plots and use them to build your own custom charts and dashboards.</p><p>Meridian is a very powerful open-source model that, as you&#8217;ve seen, significantly simplifies the Marketing Mix Modeling process, without requiring deep knowledge of complex mathematics or statistical functions.</p><p>If you are a marketer or data scientist who wants to avoid dependence on cookies, using Meridian, or any other MMM framework, is the way to go.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"><strong>Curious about what I&#8217;m building? &#128064;</strong></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[How to Automate Avatar Videos with Kling AI API and Python]]></title><description><![CDATA[Learn how to script a complete end-to-end automation workflow that generates and uploads AI avatars to social media.]]></description><link>https://blog.dadhalfdev.com/p/how-to-automate-avatar-videos-with</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/how-to-automate-avatar-videos-with</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Tue, 30 Dec 2025 21:33:01 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/622c3517-1776-423b-ac2a-e01d4381a6ca_1200x750.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You&#8217;ve probably already noticed that Artificial Intelligence (AI) videos are taking the lead on social media. According to a Statista <a href="https://www.statista.com/topics/12686/social-media-and-artificial-intelligence/#topicOverview">report</a>, generative AI now ranks as the top consumer trend across social platforms.</p><p>This growing popularity has even pushed major players like Meta and OpenAI to launch dedicated apps for creating and sharing AI-generated videos, such as Sora and Meta AI.</p><p>Most users currently consume AI videos primarily for entertainment rather than for news or reliable information. In fact, the same report shows that users are generally less likely to trust content on social media when it is AI-generated.</p><p>Nonetheless, the trust in AI content may shift with the introduction of avatars, regardless of whether they are realistic or not. If the creator can validate that the information shared by the avatar is indeed correct, people will follow and support the page, even if it is not a real person talking.</p><p>In this article, I&#8217;ll guide you through two methods for creating avatar videos using <a href="https://pro.klingai.com/h5-app/invitation?code=7BHHNU23DAAX">Kling AI</a>. The first method uses Kling&#8217;s Motion Control, which replicates the movements of a real person and applies them to a character or image you provide. The second method combines text, an image, a prompt, and audio to generate an avatar video.</p><p>We&#8217;ll start by generating videos directly from the platform&#8217;s console, then move on to building a workflow that automatically generates and publishes them to social media using the <a href="https://pro.klingai.com/h5-app/invitation?code=7BHHNU23DAAX">Kling AI</a> API and Python.</p><div><hr></div><h3>Create your first avatar video</h3><p>You can create a free account on <a href="https://pro.klingai.com/h5-app/invitation?code=7BHHNU23DAAX">Kling AI</a>, but video generation on the platform comes with a cost. New users receive a limited number of credits after registering, which are usually only enough to generate images or very short video clips.</p><p>Kling offers two main pricing options: a monthly subscription or the ability to purchase credits separately. API access is priced differently and will be discussed in a later section.</p><p>I bought a few credits some months ago, but if you&#8217;re only starting, the Standard plan has more perks than simply acquiring credits. That&#8217;s because buying credits won&#8217;t remove the watermark in your videos, and $5 only gets you 330 credits, while with the Standard plan, you will get up to 660 per month.</p><p>&#9888;&#65039; <em><strong>NOTE: </strong>If you&#8217;re planning on using the API instead, skip the above pricing options. Otherwise, you&#8217;ll be paying for using the platform and also for the API.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QI8n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f45cb6-5828-4919-9d4b-82709693165b_1100x597.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QI8n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f45cb6-5828-4919-9d4b-82709693165b_1100x597.png 424w, https://substackcdn.com/image/fetch/$s_!QI8n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f45cb6-5828-4919-9d4b-82709693165b_1100x597.png 848w, https://substackcdn.com/image/fetch/$s_!QI8n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f45cb6-5828-4919-9d4b-82709693165b_1100x597.png 1272w, https://substackcdn.com/image/fetch/$s_!QI8n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f45cb6-5828-4919-9d4b-82709693165b_1100x597.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QI8n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f45cb6-5828-4919-9d4b-82709693165b_1100x597.png" width="1100" height="597" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/17f45cb6-5828-4919-9d4b-82709693165b_1100x597.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:597,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!QI8n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f45cb6-5828-4919-9d4b-82709693165b_1100x597.png 424w, https://substackcdn.com/image/fetch/$s_!QI8n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f45cb6-5828-4919-9d4b-82709693165b_1100x597.png 848w, https://substackcdn.com/image/fetch/$s_!QI8n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f45cb6-5828-4919-9d4b-82709693165b_1100x597.png 1272w, https://substackcdn.com/image/fetch/$s_!QI8n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17f45cb6-5828-4919-9d4b-82709693165b_1100x597.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://pro.klingai.com/h5-app/invitation?code=7BHHNU23DAAX">Kling AI platform</a> pricing plans</figcaption></figure></div><p>Before picking a pricing plan, you can see if you have enough credits to make your first experiment with the <strong>Motion Control </strong>model under the <strong>AI Video Generator</strong> tab.</p><p>This option lets you upload a reference video along with an image, which <a href="https://pro.klingai.com/h5-app/invitation?code=7BHHNU23DAAX">Kling AI</a> uses to replicate the video&#8217;s movements and expressions. The number of credits required depends on the length of the reference video. Make sure you start with a short clip.</p><p>In addition, you must provide a prompt that supplies contextual and behavioral guidance for the output. You can make your avatar more extroverted and smiley or more serious, depending on how you structured your prompt.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nP58!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760aa97-00b1-4d32-a699-526a43408de4_1100x604.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nP58!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760aa97-00b1-4d32-a699-526a43408de4_1100x604.png 424w, https://substackcdn.com/image/fetch/$s_!nP58!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760aa97-00b1-4d32-a699-526a43408de4_1100x604.png 848w, https://substackcdn.com/image/fetch/$s_!nP58!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760aa97-00b1-4d32-a699-526a43408de4_1100x604.png 1272w, https://substackcdn.com/image/fetch/$s_!nP58!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760aa97-00b1-4d32-a699-526a43408de4_1100x604.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nP58!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760aa97-00b1-4d32-a699-526a43408de4_1100x604.png" width="1100" height="604" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8760aa97-00b1-4d32-a699-526a43408de4_1100x604.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:604,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!nP58!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760aa97-00b1-4d32-a699-526a43408de4_1100x604.png 424w, https://substackcdn.com/image/fetch/$s_!nP58!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760aa97-00b1-4d32-a699-526a43408de4_1100x604.png 848w, https://substackcdn.com/image/fetch/$s_!nP58!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760aa97-00b1-4d32-a699-526a43408de4_1100x604.png 1272w, https://substackcdn.com/image/fetch/$s_!nP58!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760aa97-00b1-4d32-a699-526a43408de4_1100x604.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Create an avatar with Motion Control on <a href="https://pro.klingai.com/h5-app/invitation?code=7BHHNU23DAAX">Kling AI</a></figcaption></figure></div><p>Here&#8217;s an example with an image I created using Nano Banana Pro on Gemini:</p><div id="vimeo-1150418807" class="vimeo-wrap" data-attrs="{&quot;videoId&quot;:&quot;1150418807&quot;,&quot;videoKey&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="VimeoToDOM"><div class="vimeo-inner"><iframe src="https://player.vimeo.com/video/1150418807?autoplay=0" frameborder="0" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" loading="lazy"></iframe></div></div><p>The <strong>Motion Control </strong>requires you to record yourself or have a video reference. The other approach is to create an avatar that, instead of taking a reference video, takes a text, an audio, an image, and a prompt. On <a href="https://pro.klingai.com/h5-app/invitation?code=7BHHNU23DAAX">Kling AI</a>, you can do this by selecting <strong>Video</strong> and then <strong>Avatar.</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_!NZmo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859a2367-17e3-4de1-9b05-f142514acb8e_1100x602.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NZmo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859a2367-17e3-4de1-9b05-f142514acb8e_1100x602.png 424w, https://substackcdn.com/image/fetch/$s_!NZmo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859a2367-17e3-4de1-9b05-f142514acb8e_1100x602.png 848w, https://substackcdn.com/image/fetch/$s_!NZmo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859a2367-17e3-4de1-9b05-f142514acb8e_1100x602.png 1272w, https://substackcdn.com/image/fetch/$s_!NZmo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859a2367-17e3-4de1-9b05-f142514acb8e_1100x602.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NZmo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859a2367-17e3-4de1-9b05-f142514acb8e_1100x602.png" width="1100" height="602" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/859a2367-17e3-4de1-9b05-f142514acb8e_1100x602.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:602,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!NZmo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859a2367-17e3-4de1-9b05-f142514acb8e_1100x602.png 424w, https://substackcdn.com/image/fetch/$s_!NZmo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859a2367-17e3-4de1-9b05-f142514acb8e_1100x602.png 848w, https://substackcdn.com/image/fetch/$s_!NZmo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859a2367-17e3-4de1-9b05-f142514acb8e_1100x602.png 1272w, https://substackcdn.com/image/fetch/$s_!NZmo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F859a2367-17e3-4de1-9b05-f142514acb8e_1100x602.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Avatar 2.0 on Kling AI console</figcaption></figure></div><p>On the console, you&#8217;ll find several avatar examples ready to be used, but that&#8217;s not as fun as creating your own!</p><p>The steps are similar to <strong>Motion Control</strong>, but you need to add the speech (text) and an audio. The longer the speech, the more credits will be consumed. Instead of the text, you can also upload an audio file.</p><p>In the next section, we will use the <strong>Avatar 2.0 </strong>to automatically create informative videos based on summaries from articles. For that, we will need the <a href="https://app.klingai.com/global/dev/document-api/quickStart/userManual">Kling AI API</a> and the Python programming language.</p><div><hr></div><h3>Create an authentication token for the Kling AI API</h3><p>You can use the same Kling account to access the <a href="https://klingai.com/global/dev">API console</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_!cbsM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc821d25e-d59a-4210-8833-9071f839d438_1100x582.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cbsM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc821d25e-d59a-4210-8833-9071f839d438_1100x582.png 424w, https://substackcdn.com/image/fetch/$s_!cbsM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc821d25e-d59a-4210-8833-9071f839d438_1100x582.png 848w, https://substackcdn.com/image/fetch/$s_!cbsM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc821d25e-d59a-4210-8833-9071f839d438_1100x582.png 1272w, https://substackcdn.com/image/fetch/$s_!cbsM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc821d25e-d59a-4210-8833-9071f839d438_1100x582.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cbsM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc821d25e-d59a-4210-8833-9071f839d438_1100x582.png" width="1100" height="582" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c821d25e-d59a-4210-8833-9071f839d438_1100x582.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:582,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!cbsM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc821d25e-d59a-4210-8833-9071f839d438_1100x582.png 424w, https://substackcdn.com/image/fetch/$s_!cbsM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc821d25e-d59a-4210-8833-9071f839d438_1100x582.png 848w, https://substackcdn.com/image/fetch/$s_!cbsM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc821d25e-d59a-4210-8833-9071f839d438_1100x582.png 1272w, https://substackcdn.com/image/fetch/$s_!cbsM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc821d25e-d59a-4210-8833-9071f839d438_1100x582.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Kling AI <a href="https://klingai.com/global/dev">API platform</a></figcaption></figure></div><p>The pricing plans for the API usage are different than the ones previously discussed. In our case, we&#8217;re going to use the pricing that is visible under the <strong>Functional Models, </strong>which includes the <strong>Avatar</strong>, <strong>Lyp-Sync,</strong> and other products.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NFWj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86be78b-694c-4c4b-b69c-7a76efb91633_1100x623.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NFWj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86be78b-694c-4c4b-b69c-7a76efb91633_1100x623.png 424w, https://substackcdn.com/image/fetch/$s_!NFWj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86be78b-694c-4c4b-b69c-7a76efb91633_1100x623.png 848w, https://substackcdn.com/image/fetch/$s_!NFWj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86be78b-694c-4c4b-b69c-7a76efb91633_1100x623.png 1272w, https://substackcdn.com/image/fetch/$s_!NFWj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86be78b-694c-4c4b-b69c-7a76efb91633_1100x623.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NFWj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86be78b-694c-4c4b-b69c-7a76efb91633_1100x623.png" width="1100" height="623" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e86be78b-694c-4c4b-b69c-7a76efb91633_1100x623.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:623,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!NFWj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86be78b-694c-4c4b-b69c-7a76efb91633_1100x623.png 424w, https://substackcdn.com/image/fetch/$s_!NFWj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86be78b-694c-4c4b-b69c-7a76efb91633_1100x623.png 848w, https://substackcdn.com/image/fetch/$s_!NFWj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86be78b-694c-4c4b-b69c-7a76efb91633_1100x623.png 1272w, https://substackcdn.com/image/fetch/$s_!NFWj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86be78b-694c-4c4b-b69c-7a76efb91633_1100x623.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Functional models product prices</figcaption></figure></div><p>These are the available pricing packages:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4tAy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85200ee-6042-4ee9-899f-4db6ee87ed84_1100x631.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4tAy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85200ee-6042-4ee9-899f-4db6ee87ed84_1100x631.png 424w, https://substackcdn.com/image/fetch/$s_!4tAy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85200ee-6042-4ee9-899f-4db6ee87ed84_1100x631.png 848w, https://substackcdn.com/image/fetch/$s_!4tAy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85200ee-6042-4ee9-899f-4db6ee87ed84_1100x631.png 1272w, https://substackcdn.com/image/fetch/$s_!4tAy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85200ee-6042-4ee9-899f-4db6ee87ed84_1100x631.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4tAy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85200ee-6042-4ee9-899f-4db6ee87ed84_1100x631.png" width="1100" height="631" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e85200ee-6042-4ee9-899f-4db6ee87ed84_1100x631.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:631,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!4tAy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85200ee-6042-4ee9-899f-4db6ee87ed84_1100x631.png 424w, https://substackcdn.com/image/fetch/$s_!4tAy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85200ee-6042-4ee9-899f-4db6ee87ed84_1100x631.png 848w, https://substackcdn.com/image/fetch/$s_!4tAy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85200ee-6042-4ee9-899f-4db6ee87ed84_1100x631.png 1272w, https://substackcdn.com/image/fetch/$s_!4tAy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe85200ee-6042-4ee9-899f-4db6ee87ed84_1100x631.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://klingai.com/global/dev/pricing">Resource packages</a> for Kling AI API</figcaption></figure></div><p>Once you&#8217;ve picked your preferred package, you can create an API key, which has an <strong>Access Key </strong>and a <strong>Secret Key.</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_!oTz-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9276b002-510b-4e4b-92e7-34ffedc7a141_1100x319.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oTz-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9276b002-510b-4e4b-92e7-34ffedc7a141_1100x319.png 424w, https://substackcdn.com/image/fetch/$s_!oTz-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9276b002-510b-4e4b-92e7-34ffedc7a141_1100x319.png 848w, https://substackcdn.com/image/fetch/$s_!oTz-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9276b002-510b-4e4b-92e7-34ffedc7a141_1100x319.png 1272w, https://substackcdn.com/image/fetch/$s_!oTz-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9276b002-510b-4e4b-92e7-34ffedc7a141_1100x319.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oTz-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9276b002-510b-4e4b-92e7-34ffedc7a141_1100x319.png" width="1100" height="319" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9276b002-510b-4e4b-92e7-34ffedc7a141_1100x319.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:319,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!oTz-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9276b002-510b-4e4b-92e7-34ffedc7a141_1100x319.png 424w, https://substackcdn.com/image/fetch/$s_!oTz-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9276b002-510b-4e4b-92e7-34ffedc7a141_1100x319.png 848w, https://substackcdn.com/image/fetch/$s_!oTz-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9276b002-510b-4e4b-92e7-34ffedc7a141_1100x319.png 1272w, https://substackcdn.com/image/fetch/$s_!oTz-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9276b002-510b-4e4b-92e7-34ffedc7a141_1100x319.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Create an API key for the Kling AI API</figcaption></figure></div><p>Now, you still won&#8217;t be able to make an API request with the two, you must do a JWT verification. Here&#8217;s the Python script:</p><pre><code>import time
import jwt

access_key = &#8220;AP4...&#8221; # fill access key
secret_key = &#8220;adJme...&#8221; # fill secret key

def encode_jwt_token(ak, sk):
    headers = {
        &#8220;alg&#8221;: &#8220;HS256&#8221;,
        &#8220;typ&#8221;: &#8220;JWT&#8221;
    }
    payload = {
        &#8220;iss&#8221;: access_key,
        &#8220;exp&#8221;: int(time.time()) + 1800, # The valid time, in this example, represents the current time+1800s(30min)
        &#8220;nbf&#8221;: int(time.time()) - 5 # The time when it starts to take effect, in this example, represents the current time minus 5s
    }
    token = jwt.encode(payload, secret_key, headers=headers)
    return token

authorization = encode_jwt_token(access_key, secret_key)
print(authorization) # Printing the generated the authentication token</code></pre><p>You can tweak the script to increase the expiration time. The output is a Bearer token that will be used for the API requests.</p><p>You can learn more about this and the following steps by reading the official API documentation <a href="https://app.klingai.com/global/dev/document-api/quickStart/userManual">here</a>.</p><div><hr></div><h3>Create the audio and the avatar with the Kling AI API</h3><p>Unlike the platform interface, where an avatar video can be created in just a few steps, using the API requires a multi-step workflow. You must first generate an authentication token (as explained earlier), then create the audio file, generate the video, and finally retrieve the video URL.</p><p>Let&#8217;s start by creating the audio file. In this case, we will choose a Voice ID from the <a href="https://docs.qingque.cn/s/home/eZQDvafJ4vXQkP8T9ZPvmye8S?identityId=2E1MlYrrPk4">spreadsheet</a> provided by Kling AI.</p><pre><code>import requests

AUDIO_URL = &#8220;https://api-singapore.klingai.com/v1/audio/tts&#8221;
API_TOKEN = &#8220;eyJhbGciOiJIUzI1Ni...&#8221;


headers = {
    &#8220;Authorization&#8221;: f&#8221;Bearer {API_TOKEN}&#8221;,
    &#8220;Content-Type&#8221;: &#8220;application/json&#8221;
}
payload = {
    &#8220;text&#8221;: (
        &#8220;Forget small steps&#8212;Ethereum is preparing for a massive leap. &#8220;
        &#8220;By 2026, the network is set to start scaling exponentially &#8220;
        &#8220;thanks to Zero-Knowledge (ZK) technology. Think of it as a total &#8220;
        &#8220;brain transplant for the blockchain, &#8220;
        &#8220;similar in scale to &#8216;The Merge&#8217;.&#8221;
        &#8220;Instead of every validator re-doing every single transaction, &#8220;
        &#8220;they&#8217;ll soon just verify tiny ZK-proofs. &#8220;
        &#8220;This shift could eventually skyrocket Ethereum from 30 &#8220;
        &#8220;transactions per second to a staggering 10,000. &#8220;
        &#8220;The best part? It&#8217;s so efficient you could theoretically &#8220;
        &#8220;run a node on a smartphone. While it&#8217;s a multi-year journey, &#8220;
        &#8220;2026 is when the real speed revolution begins.&#8221;),
    &#8220;voice_id&#8221;: &#8220;chat_0407_5-1&#8221;,
    &#8220;voice_language&#8221;: &#8220;en&#8221;,
    &#8220;voice_speed&#8221;: 1.2,

}

response = requests.post(AUDIO_URL, headers=headers, json=payload)
print(response.json())</code></pre><p>The code snippet above takes a text from a Cointelegraph article as input, along with the <code>voice_id</code>, the <code>voice_language</code> and the <code>voice_speed</code>. The output is the URL for the voice file and the audio id. The response looks like this:</p><pre><code>{&#8217;code&#8217;: 0, &#8216;message&#8217;: &#8216;SUCCEED&#8217;, &#8216;request_id&#8217;: &#8216;f14a385d-20b8-45a8-8469-b00d2aaded65&#8217;, &#8216;data&#8217;: {&#8217;task_id&#8217;: &#8216;835047569842642979&#8217;, &#8216;task_status&#8217;: &#8216;succeed&#8217;, &#8216;task_result&#8217;: {&#8217;audios&#8217;: [{&#8217;id&#8217;: &#8216;835047569859411990&#8217;, &#8216;url&#8217;: &#8216;https://v16-kling-fdl.klingai.com/bs2/klingai-kling-input-stunt-sgp/muse/834731746867421228/AUDIO/20251231/d147f6fa9948f358602fa42cd956bb21-f9dc5b57-6d5a-4e0b-8f37-fe06572484b0?cacheKey=ChtzZWN1cml0eS5rbGluZy5tZXRhX2VuY3J5cHQSsAFGHCN_CgjsePaPU4pF4kLs3wTWpJBrE6KgbqzxUmj753zYHmfUr372mu1-CGXxj0PJ0GTW-XLYGUjUYGHx2uENIrR53Ud_K8H3JnHMj-1YFkqx8dEVNnvpTVqylkCUqCEujdgRNETYMqctNaJdWzg3ymVJGWPQ-Ur5QKyoFPpmWzP9If7YAeN3pRXlpTYjIZNM68E_kZeGIzUAMBv2Ml60ebpaIkk9yuBeMvh8DLZBbxoSOFvh80_9xnI_XufDmu_AA0PdIiA1c1FjVWNODooKSYUEUJ6KO8OkJ3eiwBnzMN53F6ne9igFMAE&amp;x-kcdn-pid=112781&amp;ksSecret=7ba1734ea6d1d4e041b846623705b975&amp;ksTime=697ba710&#8217;, &#8216;duration&#8217;: &#8216;39.384&#8217;}]}}}</code></pre><p>Now we&#8217;re going to use the audio <code>id</code> and an image to generate the video.</p><p>This is the avatar image I used in my video:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JOSX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9339d6-9a10-4b03-9037-2211a06f25ef_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JOSX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9339d6-9a10-4b03-9037-2211a06f25ef_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JOSX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9339d6-9a10-4b03-9037-2211a06f25ef_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JOSX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9339d6-9a10-4b03-9037-2211a06f25ef_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JOSX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9339d6-9a10-4b03-9037-2211a06f25ef_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JOSX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9339d6-9a10-4b03-9037-2211a06f25ef_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a9339d6-9a10-4b03-9037-2211a06f25ef_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;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!JOSX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9339d6-9a10-4b03-9037-2211a06f25ef_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JOSX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9339d6-9a10-4b03-9037-2211a06f25ef_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JOSX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9339d6-9a10-4b03-9037-2211a06f25ef_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JOSX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a9339d6-9a10-4b03-9037-2211a06f25ef_1024x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Avatar image edited with Nano Banana Pro</figcaption></figure></div><p>Here&#8217;s the script to generate the video:</p><pre><code>import requests
import base64

with open(&#8221;character_female.png&#8221;, &#8220;rb&#8221;) as image_file:
    image_data = image_file.read()
    img_base64 = base64.b64encode(image_data).decode(&#8221;utf-8&#8221;)

headers = {
    &#8220;Authorization&#8221;: f&#8221;Bearer {API_TOKEN}&#8221;,
    &#8220;Content-Type&#8221;: &#8220;application/json&#8221;
}

payload = {
    &#8220;image&#8221;: img_base64,
    &#8220;audio_id&#8221;: 835047569859411990,
    &#8220;mode&#8221;: &#8220;std&#8221;,
    &#8220;prompt&#8221;: (
        &#8220;Create a realistic talking avatar with a natural smile and focused&#8221;
        &#8220;, confident expression, speaking directly to the camera.&#8221;
        &#8220;\n\nCamera &amp; Background: Keep the camera fixed and do not move or &#8220;
        &#8220;alter the background in any way.\n\n&#8221;&#8220;Body Movement:\n&#8221;
        &#8220;Add subtle, natural upper-body movements (slight torso &#8220;
        &#8220;shifts, gentle head tilts, minimal shoulder motion) to avoid a &#8220;
        &#8220;static or robotic appearance.\n\n&#8221;
        &#8220;Performance style: Calm, engaging, and professional&#8212;natural speech &#8220;
        &#8220;rhythm, smooth facial animations, and realistic eye and &#8220;
        &#8220;mouth movements.\n\n&#8221;
        &#8220;Overall quality: Photorealistic lighting, stable framing, &#8220;
        &#8220;and lifelike motion without exaggeration.&#8221;)
}

response = requests.post(
    &#8220;https://api-singapore.klingai.com/v1/videos/avatar/image2video&#8221;,
    headers=headers,
    json=payload)


print(response.json())</code></pre><p>After running this script, the video may take some time to become available, depending on the audio length. Be sure to add a delay before proceeding to the fetch step. This snippet produces the following output:</p><pre><code>{&#8217;code&#8217;: 0, &#8216;message&#8217;: &#8216;SUCCEED&#8217;, &#8216;request_id&#8217;: &#8216;d6b40d68-6866-4b31-849e-a301036d0b14&#8217;, &#8216;data&#8217;: {&#8217;task_id&#8217;: &#8216;835047984131473475&#8217;, &#8216;task_status&#8217;: &#8216;submitted&#8217;, &#8216;created_at&#8217;: 1767119472638, &#8216;updated_at&#8217;: 1767119472638}}</code></pre><p>In the next and final step, we&#8217;re going to use the <code>request_id</code> and <code>task_id</code> to obtain the video URL. Here&#8217;s how:</p><pre><code>request_id = &#8220;d6b40d68-6866-4b31-849e-a301036d0b14&#8221;
task_id = &#8216;835047984131473475&#8217;

url = f&#8221;https://api-singapore.klingai.com/v1/videos/avatar/image2video/{request_id}&#8221;


headers = {
    &#8220;Authorization&#8221;: f&#8221;Bearer {API_TOKEN}&#8221;,
    &#8220;Content-Type&#8221;: &#8220;application/json&#8221;
}

payload = {
    &#8220;task_id&#8221;: task_id,
}

response = requests.get(
    url,
    headers=headers,
    json=payload)


print(response.json())</code></pre><p>The response has the video URL from where you can download the video:</p><pre><code>{&#8217;code&#8217;: 0, &#8216;message&#8217;: &#8216;SUCCEED&#8217;, &#8216;request_id&#8217;: &#8216;151d0403-a017-42af-89af-668d0c2ff53a&#8217;, &#8216;data&#8217;: {&#8217;task_id&#8217;: &#8216;835047984131473475&#8217;, &#8216;task_status&#8217;: &#8216;succeed&#8217;, &#8216;task_info&#8217;: {}, &#8216;task_result&#8217;: {&#8217;videos&#8217;: [{&#8217;id&#8217;: &#8216;835047984186015791&#8217;, &#8216;url&#8217;: &#8216;https://v16-kling-fdl.klingai.com/bs2/upload-ylab-stunt-sgp/muse/834731746867421228/VIDEO/20251231/7bc028554e69b8b6c9527496bdfc00e6-901b7d5a-40c3-4f54-b4da-d499cfe599d7.mp4?cacheKey=ChtzZWN1cml0eS5rbGluZy5tZXRhX2VuY3J5cHQSsAH1weioZR4lXm4IjZ4hSNdgLYXSg-qYje0OYPNG_RCV-L7ISZHkFYzkwOvZ-Q2YpAt514WqvbwsB7Y648-4JFYOg0pQV_9rn2AL6UgS2MPLQDcnjSwhk4URxBFL9kKceOwExCp7a2LwoJ7MSjYgJn1HOi661_f17mkhyCzCGmGQcjsrM7x8-7IUb6iLMJ95L8jrGaln6YfxLxwRLHwHOzK2MrP334DYiQaJW7p_KrmcDhoSv3Uc89R3_xETrF65D8P8-8MOIiD_d69m8PnwyzUGrpf3N1pm6gCX1XJxFgrwpIp9kHIlCigFMAE&amp;x-kcdn-pid=112781&amp;ksSecret=29b1f4a65600c88cac188b609446c9bc&amp;ksTime=697baad9&#8217;, &#8216;duration&#8217;: &#8216;39.466&#8217;}]}, &#8216;task_status_msg&#8217;: &#8216;&#8217;, &#8216;created_at&#8217;: 1767119472638, &#8216;updated_at&#8217;: 1767120346646}}</code></pre><p>Here&#8217;s the final output:</p><div id="vimeo-1150452758" class="vimeo-wrap" data-attrs="{&quot;videoId&quot;:&quot;1150452758&quot;,&quot;videoKey&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="VimeoToDOM"><div class="vimeo-inner"><iframe src="https://player.vimeo.com/video/1150452758?autoplay=0" frameborder="0" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" loading="lazy"></iframe></div></div><p>This video alone consumed around 16% of the total points available (I&#8217;m using the cheapest API pricing plan). This means that with $9.79, I can generate up to six videos, if they all have the same length.</p><div><hr></div><h3>Automate posts on social media</h3><p>If you want to automate social media posts on platforms like X, Bluesky, and Instagram, you can use either cron jobs on your local machine or a remote VPS.</p><p>I prefer running automation and web scraping on a <a href="https://www.anrdoezrs.net/click-101540368-17083170">Contabo VPS</a>, using my local machine only for testing. This keeps my main workstation free and avoids unnecessary RAM and resource usage.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8xYS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cb6acba-7c83-435f-8faf-951ccc13848c_963x562.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8xYS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cb6acba-7c83-435f-8faf-951ccc13848c_963x562.png 424w, https://substackcdn.com/image/fetch/$s_!8xYS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cb6acba-7c83-435f-8faf-951ccc13848c_963x562.png 848w, https://substackcdn.com/image/fetch/$s_!8xYS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cb6acba-7c83-435f-8faf-951ccc13848c_963x562.png 1272w, https://substackcdn.com/image/fetch/$s_!8xYS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cb6acba-7c83-435f-8faf-951ccc13848c_963x562.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8xYS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cb6acba-7c83-435f-8faf-951ccc13848c_963x562.png" width="963" height="562" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3cb6acba-7c83-435f-8faf-951ccc13848c_963x562.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:562,&quot;width&quot;:963,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!8xYS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cb6acba-7c83-435f-8faf-951ccc13848c_963x562.png 424w, https://substackcdn.com/image/fetch/$s_!8xYS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cb6acba-7c83-435f-8faf-951ccc13848c_963x562.png 848w, https://substackcdn.com/image/fetch/$s_!8xYS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cb6acba-7c83-435f-8faf-951ccc13848c_963x562.png 1272w, https://substackcdn.com/image/fetch/$s_!8xYS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cb6acba-7c83-435f-8faf-951ccc13848c_963x562.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Contabo&#8217;s VPS <a href="https://www.anrdoezrs.net/click-101540368-17083170">main page</a></figcaption></figure></div><p>I&#8217;m currently using the <a href="https://www.anrdoezrs.net/click-101540368-17083170">Cloud VPS 30</a> for only &#8364;11.2/month, which has 24 GB RAM (more than my laptop), 8 vCPU Cores, and 400 GB SSD. This plan is more than enough for most automation tasks, but feel free to have a look at the other VPS and VDS options available.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MBsX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1c5197-3804-4b9d-9706-ea9af63ab012_1100x533.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MBsX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1c5197-3804-4b9d-9706-ea9af63ab012_1100x533.png 424w, https://substackcdn.com/image/fetch/$s_!MBsX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1c5197-3804-4b9d-9706-ea9af63ab012_1100x533.png 848w, https://substackcdn.com/image/fetch/$s_!MBsX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1c5197-3804-4b9d-9706-ea9af63ab012_1100x533.png 1272w, https://substackcdn.com/image/fetch/$s_!MBsX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1c5197-3804-4b9d-9706-ea9af63ab012_1100x533.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MBsX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1c5197-3804-4b9d-9706-ea9af63ab012_1100x533.png" width="1100" height="533" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba1c5197-3804-4b9d-9706-ea9af63ab012_1100x533.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:533,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!MBsX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1c5197-3804-4b9d-9706-ea9af63ab012_1100x533.png 424w, https://substackcdn.com/image/fetch/$s_!MBsX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1c5197-3804-4b9d-9706-ea9af63ab012_1100x533.png 848w, https://substackcdn.com/image/fetch/$s_!MBsX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1c5197-3804-4b9d-9706-ea9af63ab012_1100x533.png 1272w, https://substackcdn.com/image/fetch/$s_!MBsX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1c5197-3804-4b9d-9706-ea9af63ab012_1100x533.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://www.anrdoezrs.net/click-101540368-17083170">Contabo&#8217;s VPS</a> pricing</figcaption></figure></div><p>When it comes to social media posting, I&#8217;ve previously written two articles. One for X (former Twitter) and another for BlueSky.</p><h4><strong>Create a bot to publish on X</strong></h4><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;bfe0c5cc-bff6-4509-9098-6f0140c2c997&quot;,&quot;caption&quot;:&quot;If you&#8217;re here, it&#8217;s because you&#8217;ve been struggling to find the right X API documentation to post on X (formerly Twitter) seamlessly with Python. Don&#8217;t worry, you&#8217;re not alone. I found myself in the same situation, and after some time jumping from source to source, I figured out a way to do it, and it&#8217;s way easier than I thought!&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Learn How to Build a Bot on X Step-by-Step With This Tutorial&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:109411725,&quot;name&quot;:&quot;Marco Rodrigues&quot;,&quot;bio&quot;:&quot;I'm a Dad Half Dev. &#128118;&#128104;&#8205;&#128187; 50% Parenting | 50% Python, Data Science, AI, and Web3.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4ad2c32-67d4-4e94-a560-8e0c03187db6_1024x1024.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-09-16T23:38:25.351Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0fe5c68c-5592-4810-804b-6f9a963a6006_1456x1048.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.dadhalfdev.com/p/x-api-v2-documentation-is-a-complete&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:173805443,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:0,&quot;comment_count&quot;:0,&quot;publication_id&quot;:4975150,&quot;publication_name&quot;:&quot;Dad Half Dev&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!dhT5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F556acfc7-8205-4ca2-96d1-82c09d81262e_1280x1280.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><h4>Create a bot to publish on BlueSky</h4><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;b7bd4b82-5510-4546-8806-4e500ccd2865&quot;,&quot;caption&quot;:&quot;BlueSky is a social media platform created in 2019 by the founder of Twitter &#8212; Jack Dorsey. Well known for embracing decentralization, free speech, and open-source software, Jack wanted to build a social media application that covered all these. Therefore, while he was CEO of Twitter, he started building BlueSky. The platform was officially launched in &#8230;&quot;,&quot;cta&quot;:&quot;Read full story&quot;,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Easy Steps to Automate Your Posts on BlueSky with Python&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:109411725,&quot;name&quot;:&quot;Marco Rodrigues&quot;,&quot;bio&quot;:&quot;I'm a Dad Half Dev. &#128118;&#128104;&#8205;&#128187; 50% Parenting | 50% Python, Data Science, AI, and Web3.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4ad2c32-67d4-4e94-a560-8e0c03187db6_1024x1024.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-05-10T21:06:10.150Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62745995-636a-43bc-bb68-70ac34d60a35_1456x1048.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://blog.dadhalfdev.com/p/easy-steps-to-automate-your-posts&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:163294460,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:4975150,&quot;publication_name&quot;:&quot;Dad Half Dev&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/$s_!dhT5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F556acfc7-8205-4ca2-96d1-82c09d81262e_1280x1280.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>If you want to build an avatar like mine that talks about crypto, tech, and world news, you&#8217;ll need a web scraper to extract fresh daily content. This content can then be summarized and used as the audio script for your avatar.</p><p>If you&#8217;re not familiar with summarizing content using LLMs and Python, take a look at the <a href="https://blog.dadhalfdev.com/p/x-api-v2-documentation-is-a-complete?r=1t52ml&amp;utm_campaign=post&amp;utm_medium=web">article above</a> on building bots for X.</p><p>As for the web scraper, if you&#8217;re short on ideas, you can use one of mine:</p><ul><li><p><strong><a href="https://apify.com/dadhalfdev/aljazeera-scraper-per-event?fpr=ulosg">Aljazeera Scraper</a></strong>: Extract articles from Aljazeera, providing essential insights into current events and regional tensions.</p></li><li><p><strong><a href="https://apify.com/dadhalfdev/techcrunch-scraper-per-event?fpr=ulosg">TechCrunch Scraper</a>: </strong>Get the latest tech and AI news from TechCrunch.</p></li><li><p><strong><a href="https://apify.com/dadhalfdev/cointelegraph-scraper-per-event?fpr=ulosg">Cointelegraph Scraper</a>: </strong>Extract data from Cointelegraph, a leading platform for cryptocurrency and blockchain-related news.</p></li></ul><p>You can find many other scrapers available on <a href="https://apify.com/store?fpr=ulosg">Apify</a>.</p><p><em><strong>Need help with automation, AI, or data science? Let&#8217;s talk.</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/jaULmLguQX8KbikZ6&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://calendar.app.google/jaULmLguQX8KbikZ6"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3>Conclusion</h3><p>The costs associated with creating a single avatar video can quickly add up. For example, with less than $10, I would only be able to publish six videos in total.</p><p>That said, this expense is relatively small when compared to the time and effort required to produce a traditional social media video. Recording myself talking about the latest crypto news would involve multiple takes, video editing, and careful audio adjustments.</p><p>All of these manual steps are far more costly than a couple of dollars per video.</p><p>An avatar that consistently generates content can instead be used to drive traffic to your website, support affiliate marketing, or power other growth strategies.</p><p>As we&#8217;ve seen at the beginning of this article, users are consuming more AI-generated videos than ever. The real challenge is creating an engaging, value-driven avatar. One that can generate passive income while you sleep.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Curious about what I&#8217;m building? &#128064;</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>csfwgwg</p>]]></content:encoded></item><item><title><![CDATA[5 Tips to Turn You Into a Pro Web Scraper With Playwright]]></title><description><![CDATA[AI tools and vibe coding make web scraping easier than ever, but without these strategies, most sites will still block you.]]></description><link>https://blog.dadhalfdev.com/p/5-tips-to-turn-you-into-a-pro-web</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/5-tips-to-turn-you-into-a-pro-web</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Wed, 01 Oct 2025 17:10:53 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/157c0b41-34ef-4406-a12d-787b4bbd9104_1200x750.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Web scraping seems to have taken the lead in internet traffic. Following the <a href="https://www.imperva.com/blog/2025-imperva-bad-bot-report-how-ai-is-supercharging-the-bot-threat/">2025 Imperva Bad Bot Report</a>, 51% of global web traffic is now automated, surpassing humans.</p><p>A key element in this is Artificial Intelligence (AI), which requires vast amounts of data for model training and therefore relies on massive crawlers running nonstop. At the same time, AI has also made web scraping more accessible, allowing non-developers to collect data through <em>vibe coding</em> and seamless APIs.</p><p>According to a <a href="https://www.marketresearchfuture.com/reports/web-scraper-software-market-10347">report</a> by Market Research Future, the web scraper software market was valued <strong>$1.01 billion in 2024</strong>. In 2025, the <a href="https://www.mordorintelligence.com/industry-reports/web-scraping-market#:~:text=The%20Web%20Scraping%20Market%20size,2030">Mordor Intelligence report</a> shows that the same market is now valued at <strong>$1.03 billion</strong>, a steady <strong>1.98%</strong> increase in just one year. The same report projects that the web scraping market will reach <strong>$2 billion by 2030</strong>, nearly <strong>98%</strong> growth in just six years.</p><p>While web scraping is more accessible with the integration of AI, many websites have also shielded themselves against massive bot requests. Making the job difficult for many APIs and web scrapers powered by <em>vibe coding</em> scripts.</p><p>In this piece, I&#8217;m sharing with you 5 tips that Large Language Models (LLMs) don&#8217;t tell you to build a robust web scraper that can outperform 90% of the websites with only one tool: <a href="https://playwright.dev/python/">Playwright</a>.</p><div><hr></div><h1>First steps with Playwright</h1><p>At the time I&#8217;m writing, I have <a href="https://apify.com/dadhalfdev">over 20 Apify actors</a> running, all built using Playwright.</p><p>Before, I used to web scrape with <a href="https://www.selenium.dev/documentation/">Selenium</a>, <a href="https://www.crummy.com/software/BeautifulSoup/bs4/doc/">Beautiful Soup</a>, and <a href="https://www.scrapy.org/">Scrapy,</a> but I&#8217;ve realized that I can have successful bots only using Playwright, so why complicate things?</p><p><a href="https://playwright.dev/python/">Playwright</a> is a headless browser considered to be faster than its competitors and with better support for modern websites. Documentation is easy to follow and supports multiple languages.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i-2z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde405281-06f3-4e6c-9ac0-91658af7633b_1100x566.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i-2z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde405281-06f3-4e6c-9ac0-91658af7633b_1100x566.png 424w, https://substackcdn.com/image/fetch/$s_!i-2z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde405281-06f3-4e6c-9ac0-91658af7633b_1100x566.png 848w, https://substackcdn.com/image/fetch/$s_!i-2z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde405281-06f3-4e6c-9ac0-91658af7633b_1100x566.png 1272w, https://substackcdn.com/image/fetch/$s_!i-2z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde405281-06f3-4e6c-9ac0-91658af7633b_1100x566.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i-2z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde405281-06f3-4e6c-9ac0-91658af7633b_1100x566.png" width="1100" height="566" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de405281-06f3-4e6c-9ac0-91658af7633b_1100x566.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:566,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!i-2z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde405281-06f3-4e6c-9ac0-91658af7633b_1100x566.png 424w, https://substackcdn.com/image/fetch/$s_!i-2z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde405281-06f3-4e6c-9ac0-91658af7633b_1100x566.png 848w, https://substackcdn.com/image/fetch/$s_!i-2z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde405281-06f3-4e6c-9ac0-91658af7633b_1100x566.png 1272w, https://substackcdn.com/image/fetch/$s_!i-2z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde405281-06f3-4e6c-9ac0-91658af7633b_1100x566.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Playwright for Python <a href="https://playwright.dev/python/">website</a></figcaption></figure></div><p>To install <a href="https://playwright.dev/python/">Playwright</a>, you need the following <code>pip</code> command:</p><pre><code>pip install playwright</code></pre><p>To install the supported browsers, use this command in your terminal:</p><pre><code>playwright install</code></pre><p>Now, the basic component of Playwright is often called <code>page</code> and it is instantiated this way:</p><pre><code>from playwright.async_api import async_playwright


async with async_playwright() as pw:

    # creates an instance of the Chromium browser and launches it
    browser = await pw.chromium.launch(headless=False)

    # creates a new browser page (tab) within the browser instance
    page = await browser.new_page()</code></pre><p>I will not cover all of Playwright&#8217;s functions in this piece, but I will highlight the ones I use in most of my crawlers and have proven to be indispensable:</p><pre><code># Go to page and wait to render full content: images, APIs and more
await page.goto(&#8221;some_url&#8221;, wait_until=&#8221;networkidle&#8221;)

# Go to page and wait only for DOM structure (initial HTML). Much faster.
await page.goto(&#8221;some_url&#8221;, wait_until=&#8221;domcontentloaded&#8221;)

# Create some timing between actions
await page.wait_for_timeout(3000)

# Get text content only
await page.locator(&#8221;a&#8221;).text_content()

# Get an attribute
await page.locator(&#8221;a&#8221;).get_attribute(&#8221;href&#8221;)

# Get all elements with the same class
elements = await page.locator(&#8221;a.font-big&#8221;).all()

# Click the first element
await page.locator(&#8221;a.font-big&#8221;).first.click()

# Click the last element
await page.locator(&#8221;a.font-big&#8221;).last.click()

# Click element by index
await page.locator(&#8221;a.font-big&#8221;).nth(3).click()</code></pre><p>In addition to these examples, it is also useful to use <code>page.get_by_role()</code>, <code>page.get_by_title()</code>, <code>page.get_by_label()</code>, and so on, whenever you can. This is usually more straightforward than using the <code>page.locator()</code>.</p><p>For more about Playwright&#8217;s functions, visit the well-structured <a href="https://playwright.dev/python/docs/intro">official documentation</a>.</p><p>Now we will have a look at the 5 tips to improve your web scraping skills while integrating Playwright. They aim at answering the following questions:</p><ol><li><p>How to increase the stealth performance?</p></li><li><p>How to intercept the website&#8217;s HTTP response?</p></li><li><p>How to handle infinite scroll websites?</p></li><li><p>How to target HTML elements accurately?</p></li><li><p>How to make proper proxy rotation?</p></li></ol><p>Let&#8217;s get started!</p><div><hr></div><h3>1 - How to increase the stealth performance?</h3><p>If you&#8217;re familiar with Playwright, you&#8217;ve probably heard of <code>playwright_stealth</code>.</p><p>While it can work for some websites, it is definitely an outdated solution to improve your stealth performance.</p><p>The alternative: <strong><a href="https://camoufox.com/python/">Camoufox</a>.</strong></p><p>This open-source anti-detect browser can be integrated with the Playwright API. It works by providing Camoufox with detailed device characteristics, including the operating system, device information, navigator properties, headers, screen size, and more.</p><p>To install Camoufox, use this <code>pip</code> command:</p><pre><code>pip install -U camoufox</code></pre><p>Your playwright&#8217;s <code>page</code> object can be instantiated in the following way:</p><pre><code>from camoufox import AsyncCamoufox

async with AsyncCamoufox(
    os=&#8221;macos&#8221;,
    humanize=True,  # Enable humanized cursor movement
    headless=False,  # Keep visible for debugging
    window=(1280, 720),  # Set window size
) as browser:

  page = await browser.new_page()</code></pre><p>Using this browser won&#8217;t solve all your issues. You may still get blocked by websites protected by Datadome, but it is significantly better than using Playwright only.</p><p>You can also add proxies, tweak the parameters, and add <a href="https://camoufox.com/python/browserforge/">BrowserForge</a> to see if the stealth is improved.</p><div><hr></div><h3>2 - How to intercept the website&#8217;s HTTP response?</h3><p>Many developers who engage in web scraping tend to strictly extract and parse the HTML content. While this solution works, it may not be the fastest way to crawl data, and you may miss important metadata and features.</p><p>Many modern websites don&#8217;t load all their data in the initial HTML. Instead, they fetch data dynamically from APIs (such as JSON and GraphQL) after the page loads.</p><p>Therefore, before tackling the HTML content, check if the website has an API response. This can be triggered by simply loading the page, clicking on buttons, or scrolling the page.</p><p>Let&#8217;s take the <a href="https://hackernoon.com/">Hackernoon</a> website as an example.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iVtx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e6a540a-aa6f-4c45-b71b-3a690691744b_1100x551.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iVtx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e6a540a-aa6f-4c45-b71b-3a690691744b_1100x551.png 424w, https://substackcdn.com/image/fetch/$s_!iVtx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e6a540a-aa6f-4c45-b71b-3a690691744b_1100x551.png 848w, https://substackcdn.com/image/fetch/$s_!iVtx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e6a540a-aa6f-4c45-b71b-3a690691744b_1100x551.png 1272w, https://substackcdn.com/image/fetch/$s_!iVtx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e6a540a-aa6f-4c45-b71b-3a690691744b_1100x551.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iVtx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e6a540a-aa6f-4c45-b71b-3a690691744b_1100x551.png" width="1100" height="551" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4e6a540a-aa6f-4c45-b71b-3a690691744b_1100x551.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:551,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!iVtx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e6a540a-aa6f-4c45-b71b-3a690691744b_1100x551.png 424w, https://substackcdn.com/image/fetch/$s_!iVtx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e6a540a-aa6f-4c45-b71b-3a690691744b_1100x551.png 848w, https://substackcdn.com/image/fetch/$s_!iVtx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e6a540a-aa6f-4c45-b71b-3a690691744b_1100x551.png 1272w, https://substackcdn.com/image/fetch/$s_!iVtx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e6a540a-aa6f-4c45-b71b-3a690691744b_1100x551.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Network response on the Hackernoon <a href="https://hackernoon.com/">website</a></figcaption></figure></div><p>In this case, there&#8217;s a JSON API response for each article that contains a lot of useful information about it, including the title, the slug, the ID, the author&#8217;s name, the image, and even the article&#8217;s body.</p><p>To extract the information from the JSON, you need to place this code before the event is triggered:</p><pre><code># Create set to track processed article IDs
processed_ids = set()

# Get response and set up response listener
response_received = asyncio.Event()
page.on(
    &#8220;response&#8221;,
    lambda response: check_json(
        response, response_received, processed_ids))</code></pre><p>Now you can create a function to save the content in JSON format or CSV:</p><pre><code>async def check_json(response, response_received, processed_ids):
    &#8220;&#8221;&#8220; Get data from HackerNoon JSON response &#8220;&#8221;&#8220;

    url_response = (&#8221;https://hackernoon.com/_next/data/&#8221;)

    if url_response in response.url:
        try:
            items = await response.json()
            article_data = items[&#8217;pageProps&#8217;][&#8217;data&#8217;]
        except Exception as e:
            return

        if article_data:
            response_received.set()

            # Extract article features based on example.json structure
            try:
                article_id = article_data.get(&#8217;id&#8217;)
                
                # Check for duplicates using article ID
                if article_id in processed_ids:
                    return
                
                # Add to processed IDs set
                processed_ids.add(article_id)
                
                profile = article_data.get(&#8217;profile&#8217;, {})
                
                # Extract stats data
                stats = article_data.get(&#8217;stats&#8217;, {})
                
                post_data = {
                    &#8216;id&#8217;: article_id,
                    &#8216;title&#8217;: article_data.get(&#8217;title&#8217;),
                    &#8216;slug&#8217;: article_data.get(&#8217;slug&#8217;),
                    &#8216;link&#8217;: &#8220;https://hackernoon.com/&#8221; + \
                        article_data.get(&#8217;slug&#8217;),
                    &#8216;excerpt&#8217;: article_data.get(&#8217;excerpt&#8217;),
                    &#8216;tldr&#8217;: article_data.get(&#8217;tldr&#8217;),
                    &#8216;articleBody&#8217;: article_data.get(&#8217;articleBody&#8217;),
                    &#8216;createdAt&#8217;: article_data.get(&#8217;createdAt&#8217;),
                    &#8216;mainImage&#8217;: article_data.get(&#8217;mainImage&#8217;),
                    &#8216;mainImageHeight&#8217;: article_data.get(&#8217;mainImageHeight&#8217;),
                    &#8216;mainImageWidth&#8217;: article_data.get(&#8217;mainImageWidth&#8217;),
                    &#8216;socialPreviewImage&#8217;: article_data.get(
                        &#8216;socialPreviewImage&#8217;),
                    &#8216;parentCategory&#8217;: article_data.get(&#8217;parentCategory&#8217;),
                    &#8216;tags&#8217;: article_data.get(&#8217;tags&#8217;, []),
                    &#8216;commentsCount&#8217;: article_data.get(&#8217;commentsCount&#8217;),
                    &#8216;pageViews&#8217;: stats.get(&#8217;pageviews&#8217;),
                    &#8216;arweave&#8217;: article_data.get(&#8217;arweave&#8217;),
                    &#8216;author_name&#8217;: profile.get(&#8217;displayName&#8217;),
                    &#8216;author_handle&#8217;: profile.get(&#8217;handle&#8217;),
                    &#8216;author_avatar&#8217;: profile.get(&#8217;avatar&#8217;),
                    &#8216;author_bio&#8217;: profile.get(&#8217;bio&#8217;),
                    &#8216;author_isBrand&#8217;: profile.get(&#8217;isBrand&#8217;),
                    &#8216;author_isTrusted&#8217;: profile.get(&#8217;isTrusted&#8217;)
                }

                # Save &#8220;post_data &#8220;data to JSON or CSV
                    
            except Exception as e:
                print(&#8221;Error extracting article data: %s&#8221;, str(e))   </code></pre><p>Where do you see the URL response? You can find it in <em>Headers</em> under <em>Network</em> by inspecting the website&#8217;s page.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JChd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F099a9588-a4dd-4441-ab5d-c6c5cf72441a_1100x551.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JChd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F099a9588-a4dd-4441-ab5d-c6c5cf72441a_1100x551.png 424w, https://substackcdn.com/image/fetch/$s_!JChd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F099a9588-a4dd-4441-ab5d-c6c5cf72441a_1100x551.png 848w, https://substackcdn.com/image/fetch/$s_!JChd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F099a9588-a4dd-4441-ab5d-c6c5cf72441a_1100x551.png 1272w, https://substackcdn.com/image/fetch/$s_!JChd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F099a9588-a4dd-4441-ab5d-c6c5cf72441a_1100x551.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JChd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F099a9588-a4dd-4441-ab5d-c6c5cf72441a_1100x551.png" width="1100" height="551" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/099a9588-a4dd-4441-ab5d-c6c5cf72441a_1100x551.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:551,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!JChd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F099a9588-a4dd-4441-ab5d-c6c5cf72441a_1100x551.png 424w, https://substackcdn.com/image/fetch/$s_!JChd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F099a9588-a4dd-4441-ab5d-c6c5cf72441a_1100x551.png 848w, https://substackcdn.com/image/fetch/$s_!JChd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F099a9588-a4dd-4441-ab5d-c6c5cf72441a_1100x551.png 1272w, https://substackcdn.com/image/fetch/$s_!JChd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F099a9588-a4dd-4441-ab5d-c6c5cf72441a_1100x551.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Find the URL response on the Hackernoon <a href="https://hackernoon.com/">website</a></figcaption></figure></div><p>The <em>Response</em> tab under <em>Network</em> displays the JSON structure with all the fields you can scrape.</p><p>Now you know, next time, check this before engaging in intense HTML parsing, and note that the APIs can be triggered in different ways. Make sure to try buttons, filters, pagination, and scrolling.</p><p>This is how I built my Hackernoon Apify actor. You can try it yourself <a href="https://apify.com/dadhalfdev/hackernoon-scraper?fpr=ulosg">here</a>.</p><div><hr></div><h3>3 - How to handle infinite scroll websites?</h3><p>Many modern websites use infinite scroll to improve loading speed and improve the user experience. But they are definitely not loved by web scrapers.</p><p>Dealing with infinite scrolling can be challenging because websites tend to use different strategies to load their content. Scrolls can be located on different sides of the page. Some pages might not load content if you don&#8217;t move to the exact place on the page, others might require clicking to load more content, and so on.</p><p>The simplest way to scroll a page with Playwright is by using the wheel function:</p><pre><code>n_scrolls = 10
for i in range(n_scrolls):
      await page.mouse.wheel(0, 15000)
      print(&#8217;scrolling&#8217;)
      await page.wait_for_timeout(3000)
      await page.mouse.wheel(0, -1500)
      print(&#8217;move up&#8217;)
      await page.wait_for_timeout(3000)</code></pre><p>The reason why I&#8217;m using a loop in the example above is that most pages with infinite scroll take some time to load the hidden content. Therefore, it may not work if you just scroll to the bottom of the page. With the loop, you can ensure the new data is loaded in each iteration.</p><p>While this strategy works, sometimes you can&#8217;t trigger the loading this way. The best approach is to move the cursor to the nearest element that triggers it. In the case of a news website, most likely the last visible element is an article/card, so that&#8217;s a good reference to scroll down to.</p><p>Let&#8217;s see how to implement it.</p><pre><code># scroll to the item
location = page.locator(&#8221;article&#8221;).last
await location.scroll_into_view_if_needed()</code></pre><p>With the two code snippets above, you should be able to handle most of the infinite scroll websites. Note that the more you scroll, the harder it gets to load, and your scraper can get very slow.</p><div><hr></div><h3>4 - How to target HTML elements accurately?</h3><p>Sometimes using the <code>page.locator()</code> can be a real frustration. You try several classes, attributes, and text, and still the script prompts an error.</p><p>For those cases, my first approach is to target the main classes. Meaning that if you have an element with a lot of classes, start by tackling it with only one or two classes. This will make Playwright prompt an error similar to this:</p><pre><code>      playwright._impl._errors.Error: Locator.text_content: Error: strict mode violation: locator(&#8221;div.container-Qnseki&#8221;).first.locator(&#8221;a.pencraft.pc-reset&#8221;) resolved to 2 elements:
          1) &lt;a data-testid=&#8221;post-preview-title&#8221; href=&#8221;https://newsletter.theaiedge.io/p/adalflow-a-pytorch-like-framework&#8221; class=&#8221;pencraft pc-reset color-pub-primary-text-NyXPlw font-pub-headings-FE5byy clamp-y7pNm8 clamp-3-lxFDfR reset-IxiVJZ&#8221;&gt;AdalFlow: A PyTorch-Like Framework to Auto-Optimi&#8230;&lt;/a&gt; aka get_by_role(&#8221;link&#8221;, name=&#8221;AdalFlow: A PyTorch-Like&#8221;)
          2) &lt;a href=&#8221;https://newsletter.theaiedge.io/p/adalflow-a-pytorch-like-framework&#8221; class=&#8221;pencraft pc-reset color-primary-zABazT line-height-20-t4M0El font-text-qe4AeH size-15-Psle70 clamp-y7pNm8 clamp-2-kM02pu reset-IxiVJZ&#8221;&gt;AI Agent frameworks are becoming just as importan&#8230;&lt;/a&gt; aka get_by_role(&#8221;link&#8221;, name=&#8221;AI Agent frameworks are&#8221;)</code></pre><p>Since it doesn&#8217;t know which element you are referring to, it will kindly present you with multiple options.</p><p>From those options, you can use the recommended Playwright function to grab it, or use <code>nth()</code> with the right index.</p><p>If your selector still doesn&#8217;t work, switching to XPath inside the <code>page.locator()</code> function can often deliver more accurate results.</p><p>This is because XPath allows you to navigate the structure of the DOM directly.</p><p>Let&#8217;s take a look at this example.</p><p>Suppose you&#8217;re trying to target a button with a dynamic class name that changes on every page load. A CSS selector like this might fail:</p><pre><code>button = page.locator(&#8221;.dynamic-button-class&#8221;)</code></pre><p>Instead, you can use an XPath expression that targets the element by its text content or position:</p><pre><code>button = page.locator(&#8221;//button[contains(text(), &#8216;Submit&#8217;)]&#8221;)</code></pre><p>There are also Playwright built-in functions that mimic XPath:</p><pre><code>button = page.locator(&#8221;button&#8221;).filter(has_text=&#8221;Submit&#8221;)</code></pre><p>You can either decide to learn the XPath expression language or explore more Playwright&#8217;s documentation. But avoid very long XPath expressions to optimize code readability.</p><div><hr></div><h3>5 - How to make proper proxy rotation?</h3><p>Some of you are familiar with proxies and proxy rotation, but the real challenge arises when choosing the right proxy for your needs.</p><p>If anonymity and avoiding raising flags are your top priorities, residential proxies are the best option. However, if you are web scraping a website that doesn&#8217;t have strong blocking measures, you may want to prioritize speed, and datacenter proxies are a better solution.</p><p>I rely on proxy rotation when scraping more challenging websites, and IPRoyal&#8217;s trustworthy <a href="https://iproyal.com/v1/?r=526327">residential proxies</a> have consistently met my needs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DHDh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98ba83ed-5a05-416d-9df3-e4deeb177b33_1100x469.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DHDh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98ba83ed-5a05-416d-9df3-e4deeb177b33_1100x469.png 424w, https://substackcdn.com/image/fetch/$s_!DHDh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98ba83ed-5a05-416d-9df3-e4deeb177b33_1100x469.png 848w, https://substackcdn.com/image/fetch/$s_!DHDh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98ba83ed-5a05-416d-9df3-e4deeb177b33_1100x469.png 1272w, https://substackcdn.com/image/fetch/$s_!DHDh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98ba83ed-5a05-416d-9df3-e4deeb177b33_1100x469.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DHDh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98ba83ed-5a05-416d-9df3-e4deeb177b33_1100x469.png" width="1100" height="469" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/98ba83ed-5a05-416d-9df3-e4deeb177b33_1100x469.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:469,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!DHDh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98ba83ed-5a05-416d-9df3-e4deeb177b33_1100x469.png 424w, https://substackcdn.com/image/fetch/$s_!DHDh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98ba83ed-5a05-416d-9df3-e4deeb177b33_1100x469.png 848w, https://substackcdn.com/image/fetch/$s_!DHDh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98ba83ed-5a05-416d-9df3-e4deeb177b33_1100x469.png 1272w, https://substackcdn.com/image/fetch/$s_!DHDh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98ba83ed-5a05-416d-9df3-e4deeb177b33_1100x469.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">IPRoyal main <a href="https://iproyal.com/v1/?r=526327">page</a></figcaption></figure></div><p><a href="https://iproyal.com/v1/?r=526327">IPRoyal</a> proxies are also one of the cheapest in the market, with an excellent score on review platforms such as <a href="https://www.g2.com/products/iproyal/reviews">G2</a> and <a href="https://www.trustpilot.com/review/iproyal.com">Trustpilot</a>. You can create an account in a few seconds, without requiring too much personal information, and you can even pay with cryptocurrencies, if you don&#8217;t want to have your credit card attached to it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SYDX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeaa6505-2c91-4d1e-aa9e-51abcb9371f3_1100x532.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SYDX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeaa6505-2c91-4d1e-aa9e-51abcb9371f3_1100x532.png 424w, https://substackcdn.com/image/fetch/$s_!SYDX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeaa6505-2c91-4d1e-aa9e-51abcb9371f3_1100x532.png 848w, https://substackcdn.com/image/fetch/$s_!SYDX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeaa6505-2c91-4d1e-aa9e-51abcb9371f3_1100x532.png 1272w, https://substackcdn.com/image/fetch/$s_!SYDX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeaa6505-2c91-4d1e-aa9e-51abcb9371f3_1100x532.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SYDX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeaa6505-2c91-4d1e-aa9e-51abcb9371f3_1100x532.png" width="1100" height="532" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/beaa6505-2c91-4d1e-aa9e-51abcb9371f3_1100x532.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:532,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!SYDX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeaa6505-2c91-4d1e-aa9e-51abcb9371f3_1100x532.png 424w, https://substackcdn.com/image/fetch/$s_!SYDX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeaa6505-2c91-4d1e-aa9e-51abcb9371f3_1100x532.png 848w, https://substackcdn.com/image/fetch/$s_!SYDX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeaa6505-2c91-4d1e-aa9e-51abcb9371f3_1100x532.png 1272w, https://substackcdn.com/image/fetch/$s_!SYDX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbeaa6505-2c91-4d1e-aa9e-51abcb9371f3_1100x532.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://iproyal.com/v1/?r=526327">IPRoyal</a> dashboard</figcaption></figure></div><p>Once logged in, you have access to a user-friendly dashboard where you can select the best proxy option for your needs. If you don&#8217;t know what works best, you can answer a short survey to help you out.</p><p>If you decide to use residential proxies like me, you&#8217;ll see a page with your username, password, hostname, port, and several filters that allow you to customize your proxy&#8217;s location.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!znY4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6333e17a-f2ea-451c-b080-2060579ede7a_1100x554.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!znY4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6333e17a-f2ea-451c-b080-2060579ede7a_1100x554.jpeg 424w, https://substackcdn.com/image/fetch/$s_!znY4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6333e17a-f2ea-451c-b080-2060579ede7a_1100x554.jpeg 848w, https://substackcdn.com/image/fetch/$s_!znY4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6333e17a-f2ea-451c-b080-2060579ede7a_1100x554.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!znY4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6333e17a-f2ea-451c-b080-2060579ede7a_1100x554.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!znY4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6333e17a-f2ea-451c-b080-2060579ede7a_1100x554.jpeg" width="1100" height="554" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6333e17a-f2ea-451c-b080-2060579ede7a_1100x554.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:554,&quot;width&quot;:1100,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!znY4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6333e17a-f2ea-451c-b080-2060579ede7a_1100x554.jpeg 424w, https://substackcdn.com/image/fetch/$s_!znY4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6333e17a-f2ea-451c-b080-2060579ede7a_1100x554.jpeg 848w, https://substackcdn.com/image/fetch/$s_!znY4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6333e17a-f2ea-451c-b080-2060579ede7a_1100x554.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!znY4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6333e17a-f2ea-451c-b080-2060579ede7a_1100x554.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Residential proxy parameters on <a href="https://iproyal.com/v1/?r=526327">IPRoyal</a> dashboard</figcaption></figure></div><p>To implement proxy rotation, I select up to 7 different countries and cities, and I add them to a Python list in my script. It looks like this with Camoufox:</p><pre><code>proxy_list = [
    None,  # No proxy first
    &#8220;&lt;key&gt;_country-fr_city-toulouse&#8221;,
    &#8220;&lt;key&gt;_country-es_city-valencia&#8221;,
    &#8220;&lt;key&gt;_country-pt_city-lisbon&#8221;,
    &#8220;&lt;key&gt;_country-es_city-madrid&#8221;,
    &#8220;&lt;key&gt;_country-es_city-huelva&#8221;,
    &#8220;&lt;key&gt;_country-es_city-sevilla&#8221;,
]

for proxy_element in proxy_list:
    # Configure browser settings based on whether using proxy or not
    browser_config = {
        &#8220;os&#8221;: &#8220;windows&#8221;,
        &#8220;humanize&#8221;: False,  # Enable humanized cursor movement
        &#8220;headless&#8221;: False,  # Keep visible for debugging
        &#8220;window&#8221;: (1280, 720),  # Set window size
    }
    
    # Add proxy configuration if proxy_element is not None
    if proxy_element is not None:
        browser_config.update({
            &#8220;geoip&#8221;: True,
            &#8220;proxy&#8221;: {
                &#8220;server&#8221;: &#8220;geo.iproyal.com:11201&#8221;,
                &#8220;username&#8221;: &#8220;&lt;my_username&gt;&#8221;,
                &#8220;password&#8221;: proxy_element
            },
        })
    
    async with AsyncCamoufox(**browser_config) as browser:
      # If page is accessed continue the script, if not try another proxy 

      </code></pre><p>While proxy rotation is beneficial to bypass anti-bot measures, it slows down your web scraper&#8217;s speed. Therefore, if speed is a top requirement, you can rent a Virtual Private Server (VPS), so you can run your script with multiple instances and at the same time, one for each proxy.</p><p>I use Contabo&#8217;s <a href="https://www.anrdoezrs.net/click-101540368-17083170">Cloud VPS 30</a> for only &#8364;12.5/month, which has 24 GB RAM (more than my laptop), 8 vCPU Cores, and 400 GB SSD. This plan is more than enough for most automation tasks, but feel free to have a look at the other VPS options available.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HSk5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d516395-d28c-4d8d-9f8e-9847fff9cf25_963x444.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HSk5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d516395-d28c-4d8d-9f8e-9847fff9cf25_963x444.png 424w, https://substackcdn.com/image/fetch/$s_!HSk5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d516395-d28c-4d8d-9f8e-9847fff9cf25_963x444.png 848w, https://substackcdn.com/image/fetch/$s_!HSk5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d516395-d28c-4d8d-9f8e-9847fff9cf25_963x444.png 1272w, https://substackcdn.com/image/fetch/$s_!HSk5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d516395-d28c-4d8d-9f8e-9847fff9cf25_963x444.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HSk5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d516395-d28c-4d8d-9f8e-9847fff9cf25_963x444.png" width="963" height="444" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d516395-d28c-4d8d-9f8e-9847fff9cf25_963x444.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:444,&quot;width&quot;:963,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!HSk5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d516395-d28c-4d8d-9f8e-9847fff9cf25_963x444.png 424w, https://substackcdn.com/image/fetch/$s_!HSk5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d516395-d28c-4d8d-9f8e-9847fff9cf25_963x444.png 848w, https://substackcdn.com/image/fetch/$s_!HSk5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d516395-d28c-4d8d-9f8e-9847fff9cf25_963x444.png 1272w, https://substackcdn.com/image/fetch/$s_!HSk5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d516395-d28c-4d8d-9f8e-9847fff9cf25_963x444.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://www.anrdoezrs.net/click-101540368-17083170">Contabo&#8217;s VPS</a> pricing</figcaption></figure></div><p>With my <a href="https://www.anrdoezrs.net/click-101540368-17083170">Contabo VPS</a>, I can run concurrent web scrapers and schedule them using cron jobs at different times. This approach helps prevent my IP from being flagged while also conserving RAM for my primary tasks.</p><p><em><strong>Need help with automation, AI, or data science? Let&#8217;s talk.</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/jaULmLguQX8KbikZ6&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://calendar.app.google/jaULmLguQX8KbikZ6"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3>Conclusion</h3><p>In this piece, we&#8217;ve covered the importance of Playwright headless browser for web scraping, and how it serves most of the web scraping tasks. Showing that you don&#8217;t need to learn multiple web scraping frameworks to build successful and performant crawlers.</p><p>Then we highlighted 5 different tips that <em>vibe coding</em> tools don&#8217;t tell you, but they make all the difference to turn you from a beginner to an advanced web scraping developer.</p><p>First, we discussed how to increase stealth and avoid being blocked by integrating Camoufox with Playwright.</p><p>Next, we looked at how intercepting HTTP responses before parsing HTML can save valuable time and help you capture hidden or critical data that might otherwise be missed.</p><p>We then examined how to handle infinite scroll pages efficiently using Playwright&#8217;s built-in functions, followed by strategies for optimizing data extraction with XPath or Playwright&#8217;s native selector capabilities.</p><p>Finally, we explored the differences between datacenter and residential proxies, highlighted the best options to start with, and explained how to integrate them effortlessly with Camoufox.</p><p>As demand for web scraping continues to grow, you can start applying these tips to land freelance projects on platforms like Upwork, build and monetize Apify actors for passive income, or simply create efficient crawlers for your own projects.</p><p>Perhaps this article will contribute to increasing even more the percentage of bots in internet traffic &#129302;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Curious about what I&#8217;m building? &#128064;</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[Learn How to Build a Bot on X Step-by-Step With This Tutorial]]></title><description><![CDATA[Instead of using the X API V2 documentation,  make a bot on steroids with these&#160;steps.]]></description><link>https://blog.dadhalfdev.com/p/x-api-v2-documentation-is-a-complete</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/x-api-v2-documentation-is-a-complete</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Tue, 16 Sep 2025 23:38:25 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7ca31ce8-8a1b-4774-b571-6978fd07c3d1_1200x750.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you&#8217;re here, it&#8217;s because you&#8217;ve been struggling to find the right X API documentation to post on X (formerly Twitter) seamlessly with Python. Don&#8217;t worry, you&#8217;re not alone. I found myself in the same situation, and after some time jumping from source to source, I figured out a way to do it, and it&#8217;s way easier than I thought!</p><p>Previously, I built a bot to automate posts on Bluesky, which is completely free and open-source. While the API is well-documented, it&#8217;s slightly harder than the X one.</p><p>In this piece, I share a step-by-step tutorial on automating posts on X. You&#8217;ll learn how I built a bot that publishes five parenting-related posts per day, using articles scraped from <a href="https://www.todaysparent.com/">Today&#8217;s Parent</a>, and AI images generated using Nano Banana.</p><p>Let&#8217;s get started!</p><div><hr></div><h3>Create a bot account on X</h3><p>To get started, you&#8217;ll need two X accounts: your main account and a separate one for the bot. I&#8217;ll assume you&#8217;re already familiar with creating an account on X. The process is identical for the bot, with just one small difference.</p><p>The configuration is simple, just open your bot account, head to <em>Settings</em>, then <em>Account Information</em>, and choose <em>Automation</em>. From there, pick your managing account, usually your main one.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KKAx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee9718d2-cae4-4103-9315-fe9de17431ba_900x516.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KKAx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee9718d2-cae4-4103-9315-fe9de17431ba_900x516.png 424w, https://substackcdn.com/image/fetch/$s_!KKAx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee9718d2-cae4-4103-9315-fe9de17431ba_900x516.png 848w, https://substackcdn.com/image/fetch/$s_!KKAx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee9718d2-cae4-4103-9315-fe9de17431ba_900x516.png 1272w, https://substackcdn.com/image/fetch/$s_!KKAx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee9718d2-cae4-4103-9315-fe9de17431ba_900x516.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KKAx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee9718d2-cae4-4103-9315-fe9de17431ba_900x516.png" width="900" height="516" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee9718d2-cae4-4103-9315-fe9de17431ba_900x516.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:516,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!KKAx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee9718d2-cae4-4103-9315-fe9de17431ba_900x516.png 424w, https://substackcdn.com/image/fetch/$s_!KKAx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee9718d2-cae4-4103-9315-fe9de17431ba_900x516.png 848w, https://substackcdn.com/image/fetch/$s_!KKAx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee9718d2-cae4-4103-9315-fe9de17431ba_900x516.png 1272w, https://substackcdn.com/image/fetch/$s_!KKAx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee9718d2-cae4-4103-9315-fe9de17431ba_900x516.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Set up a bot account on X</figcaption></figure></div><p>Once done, you should be able to see something like <em>&#8220;Automated by @dadhalfdev&#8221;</em> in your <a href="https://x.com/bothalfdad">bot&#8217;s profile page</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_!tXiy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1ba92ab-f500-4a31-828b-03b8d1efd092_900x841.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tXiy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1ba92ab-f500-4a31-828b-03b8d1efd092_900x841.png 424w, https://substackcdn.com/image/fetch/$s_!tXiy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1ba92ab-f500-4a31-828b-03b8d1efd092_900x841.png 848w, https://substackcdn.com/image/fetch/$s_!tXiy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1ba92ab-f500-4a31-828b-03b8d1efd092_900x841.png 1272w, https://substackcdn.com/image/fetch/$s_!tXiy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1ba92ab-f500-4a31-828b-03b8d1efd092_900x841.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tXiy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1ba92ab-f500-4a31-828b-03b8d1efd092_900x841.png" width="900" height="841" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f1ba92ab-f500-4a31-828b-03b8d1efd092_900x841.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:841,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!tXiy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1ba92ab-f500-4a31-828b-03b8d1efd092_900x841.png 424w, https://substackcdn.com/image/fetch/$s_!tXiy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1ba92ab-f500-4a31-828b-03b8d1efd092_900x841.png 848w, https://substackcdn.com/image/fetch/$s_!tXiy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1ba92ab-f500-4a31-828b-03b8d1efd092_900x841.png 1272w, https://substackcdn.com/image/fetch/$s_!tXiy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1ba92ab-f500-4a31-828b-03b8d1efd092_900x841.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Bot&#8217;s profile page on <a href="https://x.com/bothalfdad">X</a></figcaption></figure></div><p>And that&#8217;s all to create your bot. Now, we need to give it the right permissions to post.</p><p>Go to the X <a href="https://developer.x.com/en/portal/dashboard">Developer Portal page</a> of your bot&#8217;s account. There you&#8217;ll find the settings to configure your project.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!t4Js!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a001924-f518-4169-aa63-e6e2a6dd4987_900x453.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!t4Js!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a001924-f518-4169-aa63-e6e2a6dd4987_900x453.jpeg 424w, https://substackcdn.com/image/fetch/$s_!t4Js!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a001924-f518-4169-aa63-e6e2a6dd4987_900x453.jpeg 848w, https://substackcdn.com/image/fetch/$s_!t4Js!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a001924-f518-4169-aa63-e6e2a6dd4987_900x453.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!t4Js!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a001924-f518-4169-aa63-e6e2a6dd4987_900x453.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!t4Js!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a001924-f518-4169-aa63-e6e2a6dd4987_900x453.jpeg" width="900" height="453" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6a001924-f518-4169-aa63-e6e2a6dd4987_900x453.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:453,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!t4Js!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a001924-f518-4169-aa63-e6e2a6dd4987_900x453.jpeg 424w, https://substackcdn.com/image/fetch/$s_!t4Js!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a001924-f518-4169-aa63-e6e2a6dd4987_900x453.jpeg 848w, https://substackcdn.com/image/fetch/$s_!t4Js!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a001924-f518-4169-aa63-e6e2a6dd4987_900x453.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!t4Js!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a001924-f518-4169-aa63-e6e2a6dd4987_900x453.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Main dashboard on X Developer Portal</figcaption></figure></div><p>On the settings tab, click on <em>Edit </em>to give your bot the permissions to publish.</p><p><em><strong>&#9888;&#65039; Note: </strong>Make sure you edit your project before using the keys, otherwise, you&#8217;ll need to regenerate them.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i0TS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabeecbe0-173f-4104-a007-c48460e28014_900x453.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i0TS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabeecbe0-173f-4104-a007-c48460e28014_900x453.jpeg 424w, https://substackcdn.com/image/fetch/$s_!i0TS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabeecbe0-173f-4104-a007-c48460e28014_900x453.jpeg 848w, https://substackcdn.com/image/fetch/$s_!i0TS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabeecbe0-173f-4104-a007-c48460e28014_900x453.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!i0TS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabeecbe0-173f-4104-a007-c48460e28014_900x453.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i0TS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabeecbe0-173f-4104-a007-c48460e28014_900x453.jpeg" width="900" height="453" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/abeecbe0-173f-4104-a007-c48460e28014_900x453.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:453,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!i0TS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabeecbe0-173f-4104-a007-c48460e28014_900x453.jpeg 424w, https://substackcdn.com/image/fetch/$s_!i0TS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabeecbe0-173f-4104-a007-c48460e28014_900x453.jpeg 848w, https://substackcdn.com/image/fetch/$s_!i0TS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabeecbe0-173f-4104-a007-c48460e28014_900x453.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!i0TS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabeecbe0-173f-4104-a007-c48460e28014_900x453.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Project settings on X Developer Portal</figcaption></figure></div><p>Once clicked, you&#8217;ll see the <em>User authentication settings </em>page. Here, in order to post, you need to check the radio button: <em>Read and write and Direct message.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AgHS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256c69d2-0106-455a-8f02-d0ae14dfe615_900x864.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AgHS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256c69d2-0106-455a-8f02-d0ae14dfe615_900x864.png 424w, https://substackcdn.com/image/fetch/$s_!AgHS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256c69d2-0106-455a-8f02-d0ae14dfe615_900x864.png 848w, https://substackcdn.com/image/fetch/$s_!AgHS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256c69d2-0106-455a-8f02-d0ae14dfe615_900x864.png 1272w, https://substackcdn.com/image/fetch/$s_!AgHS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256c69d2-0106-455a-8f02-d0ae14dfe615_900x864.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AgHS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256c69d2-0106-455a-8f02-d0ae14dfe615_900x864.png" width="900" height="864" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/256c69d2-0106-455a-8f02-d0ae14dfe615_900x864.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:864,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!AgHS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256c69d2-0106-455a-8f02-d0ae14dfe615_900x864.png 424w, https://substackcdn.com/image/fetch/$s_!AgHS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256c69d2-0106-455a-8f02-d0ae14dfe615_900x864.png 848w, https://substackcdn.com/image/fetch/$s_!AgHS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256c69d2-0106-455a-8f02-d0ae14dfe615_900x864.png 1272w, https://substackcdn.com/image/fetch/$s_!AgHS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F256c69d2-0106-455a-8f02-d0ae14dfe615_900x864.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">User authentication settings on Developer Portal</figcaption></figure></div><p>For the type of app, choose the one that includes <em>bot. </em>For the app info, you can use <em>localhost.com</em> for both the <em>Callback URI </em>and <em>Website URL </em>in this tutorial.</p><p>Back on the <em>Settings</em> page, you&#8217;ll see the <em>Keys and tokens</em> page. There, you will need to generate or regenerate and save them for the API call. To post, you&#8217;ll need the following keys and tokens:</p><ul><li><p><strong>Bearer Token: </strong>For request authentication.</p></li><li><p><strong>API Key (Consumer Key): </strong>Username that represents your App when making API requests.</p></li><li><p><strong>API Secret (Consumer Secret): </strong>Password that represents your App when making API requests.</p></li><li><p><strong>Access Token:</strong> Token for OAuth 1.0.a API requests.</p></li><li><p><strong>Access Token Secret: </strong>Secret for OAuth 1.0.a API requests.</p></li></ul><p>In this section, we&#8217;ve covered how to create an X bot and give it the right permissions. We&#8217;re now going to see how to use the credentials above with <a href="https://www.tweepy.org/">Tweepy</a>, to seamlessly post on X.</p><div><hr></div><h3>Post on X with Python</h3><p>If you visit the X API V2 <a href="https://developer.x.com/en/docs/tutorials/tweeting-media-v2">official documentation</a>. You&#8217;ll find a setup that can be hard for those who only want to post or retrieve information. The approach used in that documentation uses the <a href="https://flask.palletsprojects.com/en/stable/">Flask</a> framework, but in this tutorial, we&#8217;re going to use <a href="https://www.tweepy.org/">Tweepy</a>, which makes everything way easier.</p><p>First, you need to install Tweepy with this <em>pip</em> command:</p><pre><code>pip install tweepy</code></pre><p>And here&#8217;s the script to make a simple post on X:</p><pre><code>import os
import tweepy
import dotenv
dotenv.load_dotenv()

### AUTHENTICATION ###

# Take these from the Developer Portal
ACCESS_KEY = os.getenv("ACCESS_KEY")
ACCESS_SECRET = os.getenv("ACCESS_SECRET")
CONSUMER_KEY = os.getenv("CONSUMER_KEY")
CONSUMER_SECRET = os.getenv("CONSUMER_SECRET")
BEARER_TOKEN = os.getenv("BEARER_TOKEN")

# Authenticate to X
auth = tweepy.OAuthHandler(
    CONSUMER_KEY, CONSUMER_SECRET, ACCESS_KEY, ACCESS_SECRET)

api = tweepy.API(auth)
try:
    api.verify_credentials()
    print("Authentication OK")
except tweepy.TweepyException as e:
    print(f"Error during authentication: {e}")

### POST IF AUTHENTICATION IS OK ###

client = tweepy.Client(
    consumer_key=CONSUMER_KEY,
    consumer_secret=CONSUMER_SECRET,
    access_token=ACCESS_KEY,
    access_token_secret=ACCESS_SECRET,
)

post = "Hey I'm the Bot Half Dad! Happy to share the latest news about parenting and family life."

response = client.create_tweet(text=post)
print(f"Tweet posted successfully: {post}")
print(f"Tweet posted! ID: {response.data['id']}")</code></pre><p>If you want to add an image or a video to your post, you need these extra lines:</p><pre><code>img = api.media_upload("your_img.png")
response = client.create_tweet(text=post, media_ids=[img.media_id])</code></pre><p>With the code snippets above, you&#8217;re ready to start posting from your machine, and you can do it up to 500 times per month with the free tier.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bAW1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c5dbd82-a269-4786-a2f8-e509e65b3c74_900x686.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bAW1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c5dbd82-a269-4786-a2f8-e509e65b3c74_900x686.png 424w, https://substackcdn.com/image/fetch/$s_!bAW1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c5dbd82-a269-4786-a2f8-e509e65b3c74_900x686.png 848w, https://substackcdn.com/image/fetch/$s_!bAW1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c5dbd82-a269-4786-a2f8-e509e65b3c74_900x686.png 1272w, https://substackcdn.com/image/fetch/$s_!bAW1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c5dbd82-a269-4786-a2f8-e509e65b3c74_900x686.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bAW1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c5dbd82-a269-4786-a2f8-e509e65b3c74_900x686.png" width="900" height="686" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c5dbd82-a269-4786-a2f8-e509e65b3c74_900x686.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:686,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!bAW1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c5dbd82-a269-4786-a2f8-e509e65b3c74_900x686.png 424w, https://substackcdn.com/image/fetch/$s_!bAW1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c5dbd82-a269-4786-a2f8-e509e65b3c74_900x686.png 848w, https://substackcdn.com/image/fetch/$s_!bAW1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c5dbd82-a269-4786-a2f8-e509e65b3c74_900x686.png 1272w, https://substackcdn.com/image/fetch/$s_!bAW1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c5dbd82-a269-4786-a2f8-e509e65b3c74_900x686.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">X API pricing plans</figcaption></figure></div><p>Now that you have the pillars to build your bot, a few key questions arise:</p><ol><li><p>What should you post?</p></li><li><p>How do you automate the posts?</p></li><li><p>How do you create engaging content if you&#8217;re not the one writing it?</p></li><li><p>How do you grab attention with the right images or videos?</p></li></ol><p>I will start by tackling the first three questions above. Then, for the fourth, I&#8217;ll show you how to use the Gemini API to make some super cool AI images with Nano Banana.</p><div><hr></div><h3>Extract the data, summarize, and automate the posts</h3><p>Before creating a bot, it&#8217;s important to clarify your goals. Do you want to generate income? Drive traffic to your website? Share tech insights? Post political content? Or simply do it for fun?</p><p>For instance, I know that my parenting news bot will be difficult to drive engagement on a social network like X. But if you&#8217;re into politics, tech, or cryptocurrencies, you might get a lot of attention and therefore redirect traffic to your personal website or blog.</p><p>My <a href="https://x.com/bothalfdad">X bot</a> uses a web scraper that runs daily to extract the newest blog posts about parenting from the <a href="https://www.todaysparent.com/">Today&#8217;s Parent</a> website. You can find the web scraper on <a href="https://apify.com/dadhalfdev/today-s-parent-scraper?fpr=ulosg">Apify</a>:</p><p>But I also have scrapers for <strong>tech</strong> and <strong>AI news</strong>:</p><ul><li><p><a href="https://apify.com/dadhalfdev/techcrunch-scraper?fpr=ulosg">TechCrunch Scraper</a></p></li><li><p><a href="https://apify.com/dadhalfdev/hackernoon-scraper?fpr=ulosg">Hackernoon Scraper</a></p></li></ul><p>For <strong>cryptocurrencies</strong>, <strong>blockchain,</strong> and <strong>web3</strong>:</p><ul><li><p><a href="https://apify.com/dadhalfdev/cointelegraph-scraper-crypto-news?fpr=ulosg">Cointelegraph Scraper</a></p></li><li><p><a href="https://apify.com/dadhalfdev/decrypt-scraper-crypto-news?fpr=ulosg">Decrypt Scraper</a></p></li></ul><p>These are just some examples of data crawlers you can use for your bot, but you can find many more on the <a href="https://apify.com/store?fpr=ulosg">Apify store</a>.</p><p>Once you have the data your bot will use, you have several options. In my case, I use an LLM to summarize a randomly selected article from my dataset and then post the summary along with the article&#8217;s link.</p><p>The LLM I use to create the post previews is DeepSeek V3, which you can use for free with <a href="https://openrouter.ai/">OpenRouter</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_!2dCB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5837ae29-2dd0-4077-9929-bcff266ca0b6_900x463.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2dCB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5837ae29-2dd0-4077-9929-bcff266ca0b6_900x463.png 424w, https://substackcdn.com/image/fetch/$s_!2dCB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5837ae29-2dd0-4077-9929-bcff266ca0b6_900x463.png 848w, https://substackcdn.com/image/fetch/$s_!2dCB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5837ae29-2dd0-4077-9929-bcff266ca0b6_900x463.png 1272w, https://substackcdn.com/image/fetch/$s_!2dCB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5837ae29-2dd0-4077-9929-bcff266ca0b6_900x463.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2dCB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5837ae29-2dd0-4077-9929-bcff266ca0b6_900x463.png" width="900" height="463" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5837ae29-2dd0-4077-9929-bcff266ca0b6_900x463.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:463,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!2dCB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5837ae29-2dd0-4077-9929-bcff266ca0b6_900x463.png 424w, https://substackcdn.com/image/fetch/$s_!2dCB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5837ae29-2dd0-4077-9929-bcff266ca0b6_900x463.png 848w, https://substackcdn.com/image/fetch/$s_!2dCB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5837ae29-2dd0-4077-9929-bcff266ca0b6_900x463.png 1272w, https://substackcdn.com/image/fetch/$s_!2dCB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5837ae29-2dd0-4077-9929-bcff266ca0b6_900x463.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">DeepSeek V3 model on <a href="https://openrouter.ai/">OpenRouter</a></figcaption></figure></div><p>Let me show you how to use any LLM with the OpenAI API to summarize your data or perform other tasks.</p><p>First, you need to install the OpenAI Python library:</p><pre><code>pip install openai</code></pre><p>And here&#8217;s the full Python script:</p><pre><code>from openai import OpenAI
import pandas as pd

def create_text_for_post(row_index):
    """ Create a text for post based on daily sample row index """

    # Read the daily sample csv file
    df = pd.read_csv('daily_sample.csv')

    # Get first row author X
    author_twitter = df.iloc[row_index]['author_twitter']

    # Check if author_twitter is not NaN and is a string
    if pd.notna(author_twitter) and isinstance(author_twitter, str):
        logger.info(f"Original author_twitter: {author_twitter}")
        if ".com/" in author_twitter:
            author_twitter = "@" + author_twitter.split(".com/")[1]
            logger.info(f"Processed author_twitter: {author_twitter}")
    else:
        logger.info("author_twitter is NaN or not a string, setting to None")
        author_twitter = None

    # Get first row link
    link = df.iloc[row_index]['link']

    # Get first row title
    title = df.iloc[row_index]['title']

    # Get first row content
    content = df.iloc[row_index]['content']

    # Get first row category
    category = df.iloc[row_index]['category']

    # Get first row author display name
    author_display_name = df.iloc[row_index]['author_display_name']

    # Create and format the prompt
    template = PromptTemplate(
        input_variables=[
            "content",
            "link",
            "category",
            "title",
            "author_twitter",
            "author_display_name"],
        template=PROMPT_TEMPLATE_POST,
    )

    prompt = template.format(
        content=content,
        link=link,
        title=title,
        author_twitter=author_twitter,
        author_display_name=author_display_name,
        category=category,
    )

    client = OpenAI(
        base_url="https://openrouter.ai/api/v1",
        api_key="&lt;your_openrouter_key",
        )

    completion = client.chat.completions.create(
        model="deepseek/deepseek-chat-v3.1:free",
        messages=[
            {
            "role": "user",
            "content": prompt
            }
        ]
    )

    response_text = completion.choices[0].message.content
    logger.info(f"Response text: {response_text}")
    return response_text</code></pre><p>Don&#8217;t bother too much about understanding the first lines of the Python function. That&#8217;s basically my way of tackling the dataset I&#8217;ve scraped.</p><p>From the dataset&#8217;s row, I get the features that are important for the LLM&#8217;s prompt template. They are: the <em>link</em>, the <em>title</em>, the <em>category</em>, the <em>content</em>, the <em>author&#8217;s name</em>, and the <em>author&#8217;s X/twitter nickname</em>.</p><p>Here&#8217;s the prompt I use to create the text for my post, based on the inputs:</p><pre><code>PROMPT_TEMPLATE_POST = """
    You are a specialist in parenting news about {category}. You're also 
    a X-posting expert and influencer. You're tasked with writing a tweet 
    about the following:

    ARTICLE TITLE: {title}
    ARTICLE AUTHOR NAME: {author_display_name}
    ARTICLE AUTHOR X/TWITTER: {author_twitter}
    ARTICLE CONTENT: {content}

    INSTRUCTIONS:
    1. Analyze the provided {content} and {title} and summarize the article 
    in a post with a max length of 280 characters. Note that this is the max 
    length and you need to leave some space for the {link} 
    and {author_twitter} or {author_display_name}. 
    So make sure that the total lenght has the summary, 
    the {link} and the {author_twitter} or {author_display_name}. Keep short 
    sentences and separate them with an empty line in between.
    2. If {author_twitter} is an empty string ("") or None value, 
    use {author_display_name} instead to mention the author of the article. 
    But always prioritize {author_twitter} first.
    3. Structure the post with emojis, but don't use a lot of them, and they
    should match the {content} or {title}.
    4. Sound like a human and mostly a parent.
    You're providing parenting information and sometimes dads and moms are 
    exhausted so they need a breeze of fresh air, and some humor whenever 
    the {content} or {title} allows it.
    5. You can start by mentioning {author_twitter} or {author_display_name},
    something like "@CourtneyLeiva recently wrote", but you can also start 
    with the summary of the content and finalize with something 
    like " - by @CourtneyLeiva".
    6. The {link} is always after the summary of the {content} and the 
    {author_twitter} or {author_display_name}. And leave a an empty line 
    before the {link}.
    """</code></pre><p>The output generated with this function is sent to the previous script I&#8217;ve shared with Tweepy to publish on X.</p><p>This is how the output looks on the app:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!m-ZB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da0ea08-cce3-442f-a74f-af5708decbfb_817x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!m-ZB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da0ea08-cce3-442f-a74f-af5708decbfb_817x941.png 424w, https://substackcdn.com/image/fetch/$s_!m-ZB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da0ea08-cce3-442f-a74f-af5708decbfb_817x941.png 848w, https://substackcdn.com/image/fetch/$s_!m-ZB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da0ea08-cce3-442f-a74f-af5708decbfb_817x941.png 1272w, https://substackcdn.com/image/fetch/$s_!m-ZB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da0ea08-cce3-442f-a74f-af5708decbfb_817x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!m-ZB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da0ea08-cce3-442f-a74f-af5708decbfb_817x941.png" width="817" height="941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0da0ea08-cce3-442f-a74f-af5708decbfb_817x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:941,&quot;width&quot;:817,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!m-ZB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da0ea08-cce3-442f-a74f-af5708decbfb_817x941.png 424w, https://substackcdn.com/image/fetch/$s_!m-ZB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da0ea08-cce3-442f-a74f-af5708decbfb_817x941.png 848w, https://substackcdn.com/image/fetch/$s_!m-ZB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da0ea08-cce3-442f-a74f-af5708decbfb_817x941.png 1272w, https://substackcdn.com/image/fetch/$s_!m-ZB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0da0ea08-cce3-442f-a74f-af5708decbfb_817x941.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">X bot post with the article&#8217;s preview</figcaption></figure></div><p>What about the image in this post? We&#8217;ll get there in the next bonus section.</p><p>If there were no image, the post would display the link&#8217;s image preview below the summary.</p><p>Tagging authors with their X nicknames can also be a smart way to catch their attention and boost engagement with your bot.</p><p>Before explaining to you how I created the cute image, you need to know how to automate the posts. Most likely, you don&#8217;t want to run it from your local machine and leave it turned on day and night.</p><p>That&#8217;s why I run the scripts on my <a href="https://www.anrdoezrs.net/click-101540368-17083170">Contabo VPS</a> by configuring a cron job that triggers daily at a specified time.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BGDW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaacd3db-3698-44d0-9765-d8d0efd7fdbe_900x525.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BGDW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaacd3db-3698-44d0-9765-d8d0efd7fdbe_900x525.png 424w, https://substackcdn.com/image/fetch/$s_!BGDW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaacd3db-3698-44d0-9765-d8d0efd7fdbe_900x525.png 848w, https://substackcdn.com/image/fetch/$s_!BGDW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaacd3db-3698-44d0-9765-d8d0efd7fdbe_900x525.png 1272w, https://substackcdn.com/image/fetch/$s_!BGDW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaacd3db-3698-44d0-9765-d8d0efd7fdbe_900x525.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BGDW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaacd3db-3698-44d0-9765-d8d0efd7fdbe_900x525.png" width="900" height="525" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aaacd3db-3698-44d0-9765-d8d0efd7fdbe_900x525.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:525,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!BGDW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaacd3db-3698-44d0-9765-d8d0efd7fdbe_900x525.png 424w, https://substackcdn.com/image/fetch/$s_!BGDW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaacd3db-3698-44d0-9765-d8d0efd7fdbe_900x525.png 848w, https://substackcdn.com/image/fetch/$s_!BGDW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaacd3db-3698-44d0-9765-d8d0efd7fdbe_900x525.png 1272w, https://substackcdn.com/image/fetch/$s_!BGDW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faaacd3db-3698-44d0-9765-d8d0efd7fdbe_900x525.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Contabo&#8217;s VPS <a href="https://www.anrdoezrs.net/click-101540368-17083170">main page</a></figcaption></figure></div><p>I&#8217;m currently using the <a href="https://www.anrdoezrs.net/click-101540368-17083170">Cloud VPS 30</a> for only &#8364;12.5/month, which has 24 GB RAM (more than my laptop), 8 vCPU Cores, and 400 GB SSD. This plan is more than enough for most automation tasks, but feel free to have a look at the other VPS and VDS options available.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6lbr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0563d0c-ee7a-464e-9a7a-b5df83630213_900x415.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6lbr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0563d0c-ee7a-464e-9a7a-b5df83630213_900x415.png 424w, https://substackcdn.com/image/fetch/$s_!6lbr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0563d0c-ee7a-464e-9a7a-b5df83630213_900x415.png 848w, https://substackcdn.com/image/fetch/$s_!6lbr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0563d0c-ee7a-464e-9a7a-b5df83630213_900x415.png 1272w, https://substackcdn.com/image/fetch/$s_!6lbr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0563d0c-ee7a-464e-9a7a-b5df83630213_900x415.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6lbr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0563d0c-ee7a-464e-9a7a-b5df83630213_900x415.png" width="900" height="415" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0563d0c-ee7a-464e-9a7a-b5df83630213_900x415.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:415,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!6lbr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0563d0c-ee7a-464e-9a7a-b5df83630213_900x415.png 424w, https://substackcdn.com/image/fetch/$s_!6lbr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0563d0c-ee7a-464e-9a7a-b5df83630213_900x415.png 848w, https://substackcdn.com/image/fetch/$s_!6lbr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0563d0c-ee7a-464e-9a7a-b5df83630213_900x415.png 1272w, https://substackcdn.com/image/fetch/$s_!6lbr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0563d0c-ee7a-464e-9a7a-b5df83630213_900x415.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://www.anrdoezrs.net/click-101540368-17083170">Contabo&#8217;s VPS</a> pricing</figcaption></figure></div><p>These are the cron jobs I run on my Contabo VPS to extract and publish:</p><pre><code># PUBLISH ON X
00 02 * * * cd ~/projects/bothalfdad &amp;&amp; /usr/bin/python3 main.py 0
00 05 * * * cd ~/projects/bothalfdad &amp;&amp; /usr/bin/python3 main.py 1
00 11 * * * cd ~/projects/bothalfdad &amp;&amp; /usr/bin/python3 main.py 2
00 15 * * * cd ~/projects/bothalfdad &amp;&amp; /usr/bin/python3 main.py 3
00 20 * * * cd ~/projects/bothalfdad &amp;&amp; /usr/bin/python3 main.py 4

# RUN TODAYS PARENT SCRAPER
30 00 * * * cd ~/projects/todays_parent_scraper &amp;&amp; /usr/bin/python3 src/__main__.py "Pregnancy"
35 00 * * * cd ~/projects/todays_parent_scraper &amp;&amp; /usr/bin/python3 src/__main__.py "Kids"
45 00 * * * cd ~/projects/todays_parent_scraper &amp;&amp; /usr/bin/python3 src/__main__.py "Baby"
55 00 * * * cd ~/projects/todays_parent_scraper &amp;&amp; /usr/bin/python3 src/__main__.py "Family"
05 01 * * * cd ~/projects/todays_parent_scraper &amp;&amp; /usr/bin/python3 src/__main__.py "Shopping"</code></pre><p>I&#8217;ve decided to post 5 times per day, which is around 150 times per month, still far from the maximum of 500 posts/month with the free tier.</p><p>With all the information you have up to this point, you should be able to create your first bot on X. But what will differentiate your bot from the others?</p><div><hr></div><h3>Bonus: Create Nano Banana images for X posts with the Gemini API</h3><p>In this section, I&#8217;ll show how to embed AI-generated Nano Banana images using the Gemini API.</p><p>First, you need to access <a href="https://aistudio.google.com/prompts/new_chat">Google Studio </a>with your Google account.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Rxtv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb55ebff-b601-44f7-99d6-74814ca7c32f_900x570.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Rxtv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb55ebff-b601-44f7-99d6-74814ca7c32f_900x570.png 424w, https://substackcdn.com/image/fetch/$s_!Rxtv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb55ebff-b601-44f7-99d6-74814ca7c32f_900x570.png 848w, https://substackcdn.com/image/fetch/$s_!Rxtv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb55ebff-b601-44f7-99d6-74814ca7c32f_900x570.png 1272w, https://substackcdn.com/image/fetch/$s_!Rxtv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb55ebff-b601-44f7-99d6-74814ca7c32f_900x570.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Rxtv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb55ebff-b601-44f7-99d6-74814ca7c32f_900x570.png" width="900" height="570" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb55ebff-b601-44f7-99d6-74814ca7c32f_900x570.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:570,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!Rxtv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb55ebff-b601-44f7-99d6-74814ca7c32f_900x570.png 424w, https://substackcdn.com/image/fetch/$s_!Rxtv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb55ebff-b601-44f7-99d6-74814ca7c32f_900x570.png 848w, https://substackcdn.com/image/fetch/$s_!Rxtv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb55ebff-b601-44f7-99d6-74814ca7c32f_900x570.png 1272w, https://substackcdn.com/image/fetch/$s_!Rxtv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb55ebff-b601-44f7-99d6-74814ca7c32f_900x570.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In the left corner of Google Studio, you can see the option <em>Get API key</em>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hSkU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f8cf2c0-5576-4bc0-bc52-6f9f65662c5b_900x569.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hSkU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f8cf2c0-5576-4bc0-bc52-6f9f65662c5b_900x569.png 424w, https://substackcdn.com/image/fetch/$s_!hSkU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f8cf2c0-5576-4bc0-bc52-6f9f65662c5b_900x569.png 848w, https://substackcdn.com/image/fetch/$s_!hSkU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f8cf2c0-5576-4bc0-bc52-6f9f65662c5b_900x569.png 1272w, https://substackcdn.com/image/fetch/$s_!hSkU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f8cf2c0-5576-4bc0-bc52-6f9f65662c5b_900x569.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hSkU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f8cf2c0-5576-4bc0-bc52-6f9f65662c5b_900x569.png" width="900" height="569" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f8cf2c0-5576-4bc0-bc52-6f9f65662c5b_900x569.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:569,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!hSkU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f8cf2c0-5576-4bc0-bc52-6f9f65662c5b_900x569.png 424w, https://substackcdn.com/image/fetch/$s_!hSkU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f8cf2c0-5576-4bc0-bc52-6f9f65662c5b_900x569.png 848w, https://substackcdn.com/image/fetch/$s_!hSkU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f8cf2c0-5576-4bc0-bc52-6f9f65662c5b_900x569.png 1272w, https://substackcdn.com/image/fetch/$s_!hSkU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f8cf2c0-5576-4bc0-bc52-6f9f65662c5b_900x569.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You&#8217;ll need to select a project with a billing plan, as using the API incurs a cost.</p><p>If you don&#8217;t have a project, you can follow the steps to create one on Google Cloud Platform using <a href="https://www.geeksforgeeks.org/devops/how-to-create-a-gcp-project/">this</a> insightful piece.</p><p>Also, you need to install the following Python packages:</p><pre><code>pip install langchain-core google-genai</code></pre><p>Here&#8217;s the function to create an image:</p><pre><code>from langchain_core.prompts import PromptTemplate
import pandas as pd
from google import genai
from PIL import Image
from io import BytesIO

def create_image_for_post(row_index):
    """ Create an image for post based on daily sample row index """

    # Read the daily sample csv file
    df = pd.read_csv('daily_sample.csv')

    # Get first row title
    title = df.iloc[row_index]['title']

    # Get first row content
    content = df.iloc[row_index]['content']

    # Create and format the prompt
    template = PromptTemplate(
        input_variables=["content", "title"],
        template=PROMPT_TEMPLATE_IMAGE,
    )

    client = genai.Client(api_key="&lt;google_studio_key&gt;")

    response = client.models.generate_content(
        model="gemini-2.5-flash-image-preview",
        contents=[template.format(content=content, title=title)],
    )

    for part in response.candidates[0].content.parts:
        if part.text is not None:
            print(f"Response text: {part.text}")
        elif part.inline_data is not None:
            image = Image.open(BytesIO(part.inline_data.data))
            image.save("generated_image.png")    </code></pre><p>Just like I did to create the post text, here I do something very similar using the same row index from my dataset.</p><p>In this case, I just use the article&#8217;s <em>content</em> and <em>title</em> for the prompt template:</p><pre><code>PROMPT_TEMPLATE_IMAGE = """
Create an illustration in a bold comic book style, 
inspired by the {title} and {content} of the article. 

Requirements:
1. Use only the exact colors: #bae9f9, #ffeeaa, and #252525. 
   - #bae9f9 and #ffeeaa for backgrounds and highlights. 
   - #252525 for outlines and shading. 
2. Keep the composition clear and dynamic, like a comic panel. 
3. Allow at most 2&#8211;4 words of comic-style text 
(e.g., "Wow!", "Tip!", or a short caption). Avoid full sentences. 
4. Make the style playful and engaging for parents.
"""</code></pre><p>This function is placed before publishing, so I can store the image first and then embed it in the post using Tweepy as initially demonstrated in this piece.</p><p>The pricing for the Gemini 2.5 Flash Image Preview model is the following:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rH0P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab8b8880-4c69-4c62-bed8-1454bb27020a_900x525.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rH0P!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab8b8880-4c69-4c62-bed8-1454bb27020a_900x525.png 424w, https://substackcdn.com/image/fetch/$s_!rH0P!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab8b8880-4c69-4c62-bed8-1454bb27020a_900x525.png 848w, https://substackcdn.com/image/fetch/$s_!rH0P!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab8b8880-4c69-4c62-bed8-1454bb27020a_900x525.png 1272w, https://substackcdn.com/image/fetch/$s_!rH0P!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab8b8880-4c69-4c62-bed8-1454bb27020a_900x525.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rH0P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab8b8880-4c69-4c62-bed8-1454bb27020a_900x525.png" width="900" height="525" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab8b8880-4c69-4c62-bed8-1454bb27020a_900x525.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:525,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!rH0P!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab8b8880-4c69-4c62-bed8-1454bb27020a_900x525.png 424w, https://substackcdn.com/image/fetch/$s_!rH0P!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab8b8880-4c69-4c62-bed8-1454bb27020a_900x525.png 848w, https://substackcdn.com/image/fetch/$s_!rH0P!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab8b8880-4c69-4c62-bed8-1454bb27020a_900x525.png 1272w, https://substackcdn.com/image/fetch/$s_!rH0P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab8b8880-4c69-4c62-bed8-1454bb27020a_900x525.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Gemini 2.5 Flash Image Preview pricing</figcaption></figure></div><p>With a total of 25 images, I&#8217;ve spent $1.33, so it can easily become expensive if you&#8217;re planning on posting a lot of images per day.</p><p>Nonetheless, the results are impressive:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wvDe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69930da7-d3bb-4bd6-83c5-2ebb084d7843_733x871.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wvDe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69930da7-d3bb-4bd6-83c5-2ebb084d7843_733x871.png 424w, https://substackcdn.com/image/fetch/$s_!wvDe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69930da7-d3bb-4bd6-83c5-2ebb084d7843_733x871.png 848w, https://substackcdn.com/image/fetch/$s_!wvDe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69930da7-d3bb-4bd6-83c5-2ebb084d7843_733x871.png 1272w, https://substackcdn.com/image/fetch/$s_!wvDe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69930da7-d3bb-4bd6-83c5-2ebb084d7843_733x871.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wvDe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69930da7-d3bb-4bd6-83c5-2ebb084d7843_733x871.png" width="733" height="871" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69930da7-d3bb-4bd6-83c5-2ebb084d7843_733x871.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:871,&quot;width&quot;:733,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!wvDe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69930da7-d3bb-4bd6-83c5-2ebb084d7843_733x871.png 424w, https://substackcdn.com/image/fetch/$s_!wvDe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69930da7-d3bb-4bd6-83c5-2ebb084d7843_733x871.png 848w, https://substackcdn.com/image/fetch/$s_!wvDe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69930da7-d3bb-4bd6-83c5-2ebb084d7843_733x871.png 1272w, https://substackcdn.com/image/fetch/$s_!wvDe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69930da7-d3bb-4bd6-83c5-2ebb084d7843_733x871.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">X bot post with Nano Banana AI image</figcaption></figure></div><p><em><strong>Need help with automation, AI, or data science? Let&#8217;s talk.</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/jaULmLguQX8KbikZ6&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://calendar.app.google/jaULmLguQX8KbikZ6"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3>Conclusion</h3><p>Creating a bot on X is simple, but making it stand out in a social media environment where multiple bots are running constantly is the hard part.</p><p>Fortunately, AI gives us more degrees of freedom to be creative and deliver information in the most engaging ways possible. Either it is through text, images, or video animations.</p><p>Tagging people or adding keywords that are trending on the platform is a good way to get followers, and once you get enough engagement, you can start thinking of strategies to generate income through it.</p><p>For instance, in my case, I can embed affiliate links of Montessori toys or promote family activities and baby products. In addition, I can also use it to get traffic to my personal parenting blog (I don&#8217;t have one by the way).</p><p>The options are endless, and now you have the starter kit to build yours!</p><p>If you&#8217;ve made a bot yourself, whether by following this tutorial or using other resources, feel free to drop it in the comments section. I&#8217;d love to see what you came up with!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Curious about what I&#8217;m building? &#128064;</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[I Made a Video with Veo3 And Nano Banana From Old Pieces of Artwork]]></title><description><![CDATA[Follow these steps to make your first video with Veo3 and Nano Banana.]]></description><link>https://blog.dadhalfdev.com/p/i-made-a-video-with-veo3-and-nano</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/i-made-a-video-with-veo3-and-nano</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Mon, 08 Sep 2025 11:47:49 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5721dff9-ef4b-4a35-9fd9-aba27ae2ae69_1200x750.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let me start by telling you a short story about my old days selling artwork at Lisbon&#8217;s flea market, aka <em>Feira da Ladra.</em></p><p>I was a student of Engineering in Nanotechnology and Microelectronics, struggling to pay bills, going out, and traveling.</p><p>I used to live five minutes walking from Lisbon&#8217;s flea market, so I knew there was some potential to generate income there.</p><p>Maths and physics were consuming all my energy, so I needed something to disconnect. I found art as a relief, and I never thought I could monetize my work until I started to get very positive feedback from people.</p><p>So I tried, one Saturday morning, I packed my art pieces, which I called <em>Drawnics. </em>Took an old blue towel to put on the floor, and that was pretty much my stand.</p><p>To my surprise, people started buying these <em>Drawnics, </em>mostly tourists, so every week I was making more and more to sell at the flea market.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4NxS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb5fac3-019c-46bb-99c0-264d80cfc907_1185x2048.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4NxS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb5fac3-019c-46bb-99c0-264d80cfc907_1185x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4NxS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb5fac3-019c-46bb-99c0-264d80cfc907_1185x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4NxS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb5fac3-019c-46bb-99c0-264d80cfc907_1185x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4NxS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb5fac3-019c-46bb-99c0-264d80cfc907_1185x2048.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4NxS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb5fac3-019c-46bb-99c0-264d80cfc907_1185x2048.jpeg" width="1185" height="2048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcb5fac3-019c-46bb-99c0-264d80cfc907_1185x2048.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2048,&quot;width&quot;:1185,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!4NxS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb5fac3-019c-46bb-99c0-264d80cfc907_1185x2048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4NxS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb5fac3-019c-46bb-99c0-264d80cfc907_1185x2048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4NxS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb5fac3-019c-46bb-99c0-264d80cfc907_1185x2048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4NxS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcb5fac3-019c-46bb-99c0-264d80cfc907_1185x2048.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Image of a Drawnic</figcaption></figure></div><p>I built these characters from old Electronic Circuit Boards (PCBs) and old book covers. It was a way to upcycle electronic waste, and people loved the idea.</p><p>I made <em>Drawnics</em> until my graduation, then I started working, and I switched my creativity to other things.</p><p>I don&#8217;t remember the exact date I said goodbye to my old friends. But recently, with the editing power of Google&#8217;s Nano Banana and Veo3, the first thing that came to my mind was turning my <em>Drawnics</em> into animated characters.</p><p>And that&#8217;s what this article is about. I will guide you through all the steps I took to create my first video animation with Veo3, while mentioning the struggles and the mistakes I made, so you don&#8217;t have to.</p><div><hr></div><h3>Use Nano Banana for free with Google Gemini 2.5</h3><p>If you search for <em>Nano Banana</em> on Google, in the first SERP results, you will find websites like <em>nanobanana.ai</em>, which provides a paid version of the model. My honest tip: don&#8217;t use it! You can get it for free, and many platforms are trying to scam users.</p><p>Simply go to <a href="https://gemini.google.com/app">Gemini</a> and pick the tool <em>Create images.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gZ0V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a01c5d-346a-4dde-9bbb-a9964e7eb461_1422x1002.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gZ0V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a01c5d-346a-4dde-9bbb-a9964e7eb461_1422x1002.png 424w, https://substackcdn.com/image/fetch/$s_!gZ0V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a01c5d-346a-4dde-9bbb-a9964e7eb461_1422x1002.png 848w, https://substackcdn.com/image/fetch/$s_!gZ0V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a01c5d-346a-4dde-9bbb-a9964e7eb461_1422x1002.png 1272w, https://substackcdn.com/image/fetch/$s_!gZ0V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a01c5d-346a-4dde-9bbb-a9964e7eb461_1422x1002.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gZ0V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a01c5d-346a-4dde-9bbb-a9964e7eb461_1422x1002.png" width="1422" height="1002" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/85a01c5d-346a-4dde-9bbb-a9964e7eb461_1422x1002.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1002,&quot;width&quot;:1422,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!gZ0V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a01c5d-346a-4dde-9bbb-a9964e7eb461_1422x1002.png 424w, https://substackcdn.com/image/fetch/$s_!gZ0V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a01c5d-346a-4dde-9bbb-a9964e7eb461_1422x1002.png 848w, https://substackcdn.com/image/fetch/$s_!gZ0V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a01c5d-346a-4dde-9bbb-a9964e7eb461_1422x1002.png 1272w, https://substackcdn.com/image/fetch/$s_!gZ0V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a01c5d-346a-4dde-9bbb-a9964e7eb461_1422x1002.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Gemini 2.5 with Nano Banana</figcaption></figure></div><p>You can either create an image from scratch or upload one or multiple images and ask Gemini to edit them according to your prompt.</p><p>You can edit the images in a very natural way, and Gemini can more or less generate your idea, but if you want to go professional, I found a post on LinkedIn with several prompt templates you can try, like this one:</p><blockquote><p>1. Photorealistic Scenes</p><p>For realistic images, think like a photographer. Mentioning camera angles, lens types, lighting, and fine details will guide the model toward a photorealistic result.</p><p><strong>Template:</strong> A photorealistic [shot type] of [subject], [action or expression], set in [environment]. The scene is illuminated by [lighting description], creating a [mood] atmosphere. Captured with a [camera/lens details], emphasizing [key textures and details]. The image should be in a [aspect ratio] format.</p><p><strong>Example Prompt:</strong> A photorealistic close-up portrait of an elderly Japanese ceramicist with deep, sun-etched wrinkles and a warm, knowing smile. He is carefully inspecting a freshly glazed tea bowl. The setting is his rustic, sun-drenched workshop. The scene is illuminated by soft, golden hour light streaming through a window, highlighting the fine texture of the clay. Captured with an 85mm portrait lens, resulting in a soft, blurred background (bokeh).</p></blockquote><p>Here&#8217;s the <a href="https://www.linkedin.com/posts/how-to-ai-guide_nano-banana-official-prompting-guide-activity-7369683320844062725-vDcw/">link</a> for the LinkedIn post.</p><p>My story started with a blue <em>Drawnic</em>, dressed in orange. Here&#8217;s the protagonist:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SDyZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01e7a997-dabb-4aa2-a88f-e34243d1d589_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SDyZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01e7a997-dabb-4aa2-a88f-e34243d1d589_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SDyZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01e7a997-dabb-4aa2-a88f-e34243d1d589_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SDyZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01e7a997-dabb-4aa2-a88f-e34243d1d589_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SDyZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01e7a997-dabb-4aa2-a88f-e34243d1d589_1600x1200.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SDyZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01e7a997-dabb-4aa2-a88f-e34243d1d589_1600x1200.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01e7a997-dabb-4aa2-a88f-e34243d1d589_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!SDyZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01e7a997-dabb-4aa2-a88f-e34243d1d589_1600x1200.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SDyZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01e7a997-dabb-4aa2-a88f-e34243d1d589_1600x1200.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SDyZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01e7a997-dabb-4aa2-a88f-e34243d1d589_1600x1200.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SDyZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01e7a997-dabb-4aa2-a88f-e34243d1d589_1600x1200.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Image of Drawnic&#8202;&#8212;&#8202;The story&#8217;s protagonist</figcaption></figure></div><p>This is the prompt I used to turn it into a movie star:</p><blockquote><p>Turn this guy into a real-life character. Make sure to preserve all the details. The environment should take place in a post-apocalyptic world. But make the surroundings with light a smooth colors, without too much noise, the focus is on the character.</p></blockquote><p>The output:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-iCc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772adb16-1d3b-437a-ab1c-30b8cb703be8_1184x864.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-iCc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772adb16-1d3b-437a-ab1c-30b8cb703be8_1184x864.png 424w, https://substackcdn.com/image/fetch/$s_!-iCc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772adb16-1d3b-437a-ab1c-30b8cb703be8_1184x864.png 848w, https://substackcdn.com/image/fetch/$s_!-iCc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772adb16-1d3b-437a-ab1c-30b8cb703be8_1184x864.png 1272w, https://substackcdn.com/image/fetch/$s_!-iCc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772adb16-1d3b-437a-ab1c-30b8cb703be8_1184x864.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-iCc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772adb16-1d3b-437a-ab1c-30b8cb703be8_1184x864.png" width="1184" height="864" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/772adb16-1d3b-437a-ab1c-30b8cb703be8_1184x864.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:864,&quot;width&quot;:1184,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!-iCc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772adb16-1d3b-437a-ab1c-30b8cb703be8_1184x864.png 424w, https://substackcdn.com/image/fetch/$s_!-iCc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772adb16-1d3b-437a-ab1c-30b8cb703be8_1184x864.png 848w, https://substackcdn.com/image/fetch/$s_!-iCc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772adb16-1d3b-437a-ab1c-30b8cb703be8_1184x864.png 1272w, https://substackcdn.com/image/fetch/$s_!-iCc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772adb16-1d3b-437a-ab1c-30b8cb703be8_1184x864.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Drawnic turned into an animated character with Nano Banana</figcaption></figure></div><p>As I started editing, I found some annoying issues that were hard to fix:</p><ol><li><p>Pixar style</p></li><li><p>Aspect ratio</p></li><li><p>Hallucinations</p></li></ol><p>Let me explain one by one in detail.</p><h4><strong>The Pixar style</strong></h4><p>By default, the model tends to create Pixar-style characters. I was trying to preserve the details of my drawings, but I couldn't get them in 3D. It makes sense in a way that the model was trained with many Pixar images, but struggles to create depth from pictures where it has no previous information.</p><h4>The aspect ratio</h4><p>When adding more than one image, Gemini may pick the aspect ratio of one of them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kV4M!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ceb75f0-e42a-4894-babb-132b5137729a_1255x1002.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kV4M!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ceb75f0-e42a-4894-babb-132b5137729a_1255x1002.png 424w, https://substackcdn.com/image/fetch/$s_!kV4M!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ceb75f0-e42a-4894-babb-132b5137729a_1255x1002.png 848w, https://substackcdn.com/image/fetch/$s_!kV4M!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ceb75f0-e42a-4894-babb-132b5137729a_1255x1002.png 1272w, https://substackcdn.com/image/fetch/$s_!kV4M!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ceb75f0-e42a-4894-babb-132b5137729a_1255x1002.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kV4M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ceb75f0-e42a-4894-babb-132b5137729a_1255x1002.png" width="1255" height="1002" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7ceb75f0-e42a-4894-babb-132b5137729a_1255x1002.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1002,&quot;width&quot;:1255,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!kV4M!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ceb75f0-e42a-4894-babb-132b5137729a_1255x1002.png 424w, https://substackcdn.com/image/fetch/$s_!kV4M!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ceb75f0-e42a-4894-babb-132b5137729a_1255x1002.png 848w, https://substackcdn.com/image/fetch/$s_!kV4M!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ceb75f0-e42a-4894-babb-132b5137729a_1255x1002.png 1272w, https://substackcdn.com/image/fetch/$s_!kV4M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ceb75f0-e42a-4894-babb-132b5137729a_1255x1002.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Edit multiple images on Google Gemini 2.5</figcaption></figure></div><p>A simple prompt like <em>change to 16:9 aspect ratio</em> does not work on Gemini. The workaround was to add an image with the right aspect ratio and tell the model to use it in the previous image.</p><p>I highly recommend that you use <strong>16:9</strong>, as it will make your life easier at the moment of creating the videos with <a href="https://labs.google/flow/about">Flow</a> from Google Labs. We will see this with more detail later in the article.</p><h4>Hallucination</h4><p>Again, when more images were added, I started labelling them. Something like character <em>A</em>, <em>B</em>, <em>C,</em> and so on. This worked until a certain point, then Gemini began generating characters from scratch or mixing the labels. The workaround was to avoid using the same chatbot instance for more than three or four requests.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jlCr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61b7ccc8-93d3-4463-a64e-3bec3def9074_1291x1002.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jlCr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61b7ccc8-93d3-4463-a64e-3bec3def9074_1291x1002.png 424w, https://substackcdn.com/image/fetch/$s_!jlCr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61b7ccc8-93d3-4463-a64e-3bec3def9074_1291x1002.png 848w, https://substackcdn.com/image/fetch/$s_!jlCr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61b7ccc8-93d3-4463-a64e-3bec3def9074_1291x1002.png 1272w, https://substackcdn.com/image/fetch/$s_!jlCr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61b7ccc8-93d3-4463-a64e-3bec3def9074_1291x1002.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jlCr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61b7ccc8-93d3-4463-a64e-3bec3def9074_1291x1002.png" width="1291" height="1002" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61b7ccc8-93d3-4463-a64e-3bec3def9074_1291x1002.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1002,&quot;width&quot;:1291,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!jlCr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61b7ccc8-93d3-4463-a64e-3bec3def9074_1291x1002.png 424w, https://substackcdn.com/image/fetch/$s_!jlCr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61b7ccc8-93d3-4463-a64e-3bec3def9074_1291x1002.png 848w, https://substackcdn.com/image/fetch/$s_!jlCr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61b7ccc8-93d3-4463-a64e-3bec3def9074_1291x1002.png 1272w, https://substackcdn.com/image/fetch/$s_!jlCr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61b7ccc8-93d3-4463-a64e-3bec3def9074_1291x1002.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Hallucitaion on Google Gemini 2.5</figcaption></figure></div><p>In addition to the issues mentioned, sometimes Gemini fails to output an image, and you need to retry.</p><p>The more familiar you are with filmmaking vocabulary, the easier it becomes to generate the right takes. Regardless of the trials and the time I spent, in the end, I successfully created a collection of around 7 images to start making my video animation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-HVd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F967904ba-e8b4-4df0-bce7-bd54970c4a3e_1103x675.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-HVd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F967904ba-e8b4-4df0-bce7-bd54970c4a3e_1103x675.png 424w, https://substackcdn.com/image/fetch/$s_!-HVd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F967904ba-e8b4-4df0-bce7-bd54970c4a3e_1103x675.png 848w, https://substackcdn.com/image/fetch/$s_!-HVd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F967904ba-e8b4-4df0-bce7-bd54970c4a3e_1103x675.png 1272w, https://substackcdn.com/image/fetch/$s_!-HVd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F967904ba-e8b4-4df0-bce7-bd54970c4a3e_1103x675.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-HVd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F967904ba-e8b4-4df0-bce7-bd54970c4a3e_1103x675.png" width="1103" height="675" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/967904ba-e8b4-4df0-bce7-bd54970c4a3e_1103x675.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:675,&quot;width&quot;:1103,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!-HVd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F967904ba-e8b4-4df0-bce7-bd54970c4a3e_1103x675.png 424w, https://substackcdn.com/image/fetch/$s_!-HVd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F967904ba-e8b4-4df0-bce7-bd54970c4a3e_1103x675.png 848w, https://substackcdn.com/image/fetch/$s_!-HVd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F967904ba-e8b4-4df0-bce7-bd54970c4a3e_1103x675.png 1272w, https://substackcdn.com/image/fetch/$s_!-HVd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F967904ba-e8b4-4df0-bce7-bd54970c4a3e_1103x675.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Folder with several images generated with Google Gemini 2.5</figcaption></figure></div><p>All images generated with Gemini 2.5 have watermarks, but you can easily remove them with platforms like <a href="https://www.watermarkremover.io/">this</a>.</p><div><hr></div><h3>Use Veo3 for free with Google Gemini 2.5 Pro</h3><p>Similar to Nano Banana, you may find scam websites in SERP results for Veo3. Such as <em>Veo3.ai</em>, now changing the name to <em>SonoVid.ai. </em>They are using the right model, but they charge more than simply using Gemini.</p><p>There are two main options to generate videos with Veo3. You can either do it using the Gemini chatbot or using <a href="https://labs.google/flow/about">Flow</a>. The latter is better for storytelling and generating new videos from frames.</p><p>Before starting, you need to have a Google account and choose the Google AI Pro plan, which is free of charge for the first month. After the trial period, the price is &#8364;21,99/month.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c3vb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78a30174-d100-4295-a071-ebd4234bde82_1600x799.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c3vb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78a30174-d100-4295-a071-ebd4234bde82_1600x799.png 424w, https://substackcdn.com/image/fetch/$s_!c3vb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78a30174-d100-4295-a071-ebd4234bde82_1600x799.png 848w, https://substackcdn.com/image/fetch/$s_!c3vb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78a30174-d100-4295-a071-ebd4234bde82_1600x799.png 1272w, https://substackcdn.com/image/fetch/$s_!c3vb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78a30174-d100-4295-a071-ebd4234bde82_1600x799.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c3vb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78a30174-d100-4295-a071-ebd4234bde82_1600x799.png" width="1456" height="727" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/78a30174-d100-4295-a071-ebd4234bde82_1600x799.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:727,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!c3vb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78a30174-d100-4295-a071-ebd4234bde82_1600x799.png 424w, https://substackcdn.com/image/fetch/$s_!c3vb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78a30174-d100-4295-a071-ebd4234bde82_1600x799.png 848w, https://substackcdn.com/image/fetch/$s_!c3vb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78a30174-d100-4295-a071-ebd4234bde82_1600x799.png 1272w, https://substackcdn.com/image/fetch/$s_!c3vb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F78a30174-d100-4295-a071-ebd4234bde82_1600x799.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Google Gemini pricing plans</figcaption></figure></div><p>The Pro plan gives you 1,000 credits, and each fast generation costs 20 credits, allowing for 50 generations per month. Generations prioritizing quality instead of speed cost 100 credits, leading to only 10 generations per month. In the following example, I&#8217;ve only used fast generations.</p><p>I will now start showing you the process of making my first video animation on <a href="https://labs.google/flow/about">Flow</a>.</p><p>In Flow&#8217;s creator page, you can either select the option <em>Text to Video</em> or <em>Frames to Video. </em>In my case, I already had the images without a watermark ready to be animated, so I only used the <em>Frames to Video </em>option.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_oCQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F167d4d1d-d8e4-4a81-aaf1-6bf38d2f3ff7_1600x920.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_oCQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F167d4d1d-d8e4-4a81-aaf1-6bf38d2f3ff7_1600x920.png 424w, https://substackcdn.com/image/fetch/$s_!_oCQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F167d4d1d-d8e4-4a81-aaf1-6bf38d2f3ff7_1600x920.png 848w, https://substackcdn.com/image/fetch/$s_!_oCQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F167d4d1d-d8e4-4a81-aaf1-6bf38d2f3ff7_1600x920.png 1272w, https://substackcdn.com/image/fetch/$s_!_oCQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F167d4d1d-d8e4-4a81-aaf1-6bf38d2f3ff7_1600x920.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_oCQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F167d4d1d-d8e4-4a81-aaf1-6bf38d2f3ff7_1600x920.png" width="1456" height="837" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/167d4d1d-d8e4-4a81-aaf1-6bf38d2f3ff7_1600x920.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:837,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!_oCQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F167d4d1d-d8e4-4a81-aaf1-6bf38d2f3ff7_1600x920.png 424w, https://substackcdn.com/image/fetch/$s_!_oCQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F167d4d1d-d8e4-4a81-aaf1-6bf38d2f3ff7_1600x920.png 848w, https://substackcdn.com/image/fetch/$s_!_oCQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F167d4d1d-d8e4-4a81-aaf1-6bf38d2f3ff7_1600x920.png 1272w, https://substackcdn.com/image/fetch/$s_!_oCQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F167d4d1d-d8e4-4a81-aaf1-6bf38d2f3ff7_1600x920.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Frames to video on <a href="https://labs.google/flow/about">Flow</a></figcaption></figure></div><p>Make sure you select the <em>Veo3&#8202;&#8212;&#8202;Fast</em> option and set the number of outputs to one, to avoid using too many credits.</p><p>Veo3 does not allow adding the start and ending frames, only one frame per video generation, so you really need to prepare the images in a way that does not compromise your video sequence. If you want to add a starting and ending frame, you need to specify Veo 2 instead, and it does not generate audio.</p><p>Once again, the more you know about filmmaking vocabulary, the better the results will be. I&#8217;m not really familiar with these terms, so I often use ChatGPT to help me out with the scenes.</p><p>Here&#8217;s the prompt for the first scene of my video:</p><blockquote><p>The character advances toward the lens, each step deliberate. The camera retreats in a smooth, slow tracking move, keeping the character centered as if drawn toward us. The faint crunch of footsteps underfoot blends with a soft breeze, the ambient wind brushing against the silence, heightening the intimacy of the moment.</p></blockquote><p>And here&#8217;s the scene:</p><div id="vimeo-1116716267" class="vimeo-wrap" data-attrs="{&quot;videoId&quot;:&quot;1116716267&quot;,&quot;videoKey&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="VimeoToDOM"><div class="vimeo-inner"><iframe src="https://player.vimeo.com/video/1116716267?autoplay=0" frameborder="0" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" loading="lazy"></iframe></div></div><p>You can see that Veo3 does a great job preserving the surroundings and the overall details of the image.</p><p>Unlike the Gemini watermark on the images, which is easy to remove, for the videos, I did not find a straightforward way of doing it. You would need to pay for Gemini&#8217;s ultra plan.</p><p>Continuing on the Flow creator&#8217;s page, you have the option to add the video to the scene builder, at the top left of your video generation: <em>Add to scene.</em></p><p>After creating several shots, I moved to the scene builder to do some minor editing and optimize the transitions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1doT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10009c64-2c00-4d49-ade6-fe0bdabc5648_1600x920.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1doT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10009c64-2c00-4d49-ade6-fe0bdabc5648_1600x920.png 424w, https://substackcdn.com/image/fetch/$s_!1doT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10009c64-2c00-4d49-ade6-fe0bdabc5648_1600x920.png 848w, https://substackcdn.com/image/fetch/$s_!1doT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10009c64-2c00-4d49-ade6-fe0bdabc5648_1600x920.png 1272w, https://substackcdn.com/image/fetch/$s_!1doT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10009c64-2c00-4d49-ade6-fe0bdabc5648_1600x920.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1doT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10009c64-2c00-4d49-ade6-fe0bdabc5648_1600x920.png" width="1456" height="837" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/10009c64-2c00-4d49-ade6-fe0bdabc5648_1600x920.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:837,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!1doT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10009c64-2c00-4d49-ade6-fe0bdabc5648_1600x920.png 424w, https://substackcdn.com/image/fetch/$s_!1doT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10009c64-2c00-4d49-ade6-fe0bdabc5648_1600x920.png 848w, https://substackcdn.com/image/fetch/$s_!1doT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10009c64-2c00-4d49-ade6-fe0bdabc5648_1600x920.png 1272w, https://substackcdn.com/image/fetch/$s_!1doT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10009c64-2c00-4d49-ade6-fe0bdabc5648_1600x920.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Scene builder on <a href="https://labs.google/flow/about">Flow</a></figcaption></figure></div><p>One of the best features of Flow is that it allows you to save a frame from a specific scene. This feature is great for transitions! Because you can create a new video from that frame, allowing you to extend the scene for more than 8 seconds. However, the audio can still be tricky to optimize.</p><p>When you create a new frame in Flow, you don&#8217;t need to worry about watermarks, because you&#8217;re already in Gemini 2.5 pro. Also, you shouldn&#8217;t face aspect ratio issues.</p><p>Though all my takes, I tried to keep the same post-apocalyptic feel, and a constant sound of wind in the background. Having the audio and the lip sync options on Veo3 is indeed great! But it also adds extra complexity to building a proper animation, where the characters must maintain the same voices and the audio does not differentiate too much from scene to scene.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6VWA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12c8ce6e-9c88-46a9-a7ce-1027d0604941_1600x920.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6VWA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12c8ce6e-9c88-46a9-a7ce-1027d0604941_1600x920.png 424w, https://substackcdn.com/image/fetch/$s_!6VWA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12c8ce6e-9c88-46a9-a7ce-1027d0604941_1600x920.png 848w, https://substackcdn.com/image/fetch/$s_!6VWA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12c8ce6e-9c88-46a9-a7ce-1027d0604941_1600x920.png 1272w, https://substackcdn.com/image/fetch/$s_!6VWA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12c8ce6e-9c88-46a9-a7ce-1027d0604941_1600x920.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6VWA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12c8ce6e-9c88-46a9-a7ce-1027d0604941_1600x920.png" width="1456" height="837" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/12c8ce6e-9c88-46a9-a7ce-1027d0604941_1600x920.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:837,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!6VWA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12c8ce6e-9c88-46a9-a7ce-1027d0604941_1600x920.png 424w, https://substackcdn.com/image/fetch/$s_!6VWA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12c8ce6e-9c88-46a9-a7ce-1027d0604941_1600x920.png 848w, https://substackcdn.com/image/fetch/$s_!6VWA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12c8ce6e-9c88-46a9-a7ce-1027d0604941_1600x920.png 1272w, https://substackcdn.com/image/fetch/$s_!6VWA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12c8ce6e-9c88-46a9-a7ce-1027d0604941_1600x920.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Scene builder on <a href="https://labs.google/flow/about">Flow</a></figcaption></figure></div><p>Flow has limited editing capabilities. You can only trim parts of the scene. But if you&#8217;re happy with the output, you can download the full sequence.</p><p>In my case, I&#8217;ve decided to download videos one by one instead and use an external video editor.</p><p>Microsoft&#8217;s <a href="https://clipchamp.com/en/">Climpchamp</a> is a free tool that allows you to add transitions, text, and more. But if you want to go professional, I highly recommend <a href="https://invideo.sjv.io/c/6522358/883681/12258">Invideo </a>online video editor.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!odVp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000d628d-2d9e-4b1f-83d5-efe57f24d3cb_1600x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!odVp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000d628d-2d9e-4b1f-83d5-efe57f24d3cb_1600x800.png 424w, https://substackcdn.com/image/fetch/$s_!odVp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000d628d-2d9e-4b1f-83d5-efe57f24d3cb_1600x800.png 848w, https://substackcdn.com/image/fetch/$s_!odVp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000d628d-2d9e-4b1f-83d5-efe57f24d3cb_1600x800.png 1272w, https://substackcdn.com/image/fetch/$s_!odVp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000d628d-2d9e-4b1f-83d5-efe57f24d3cb_1600x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!odVp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000d628d-2d9e-4b1f-83d5-efe57f24d3cb_1600x800.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/000d628d-2d9e-4b1f-83d5-efe57f24d3cb_1600x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!odVp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000d628d-2d9e-4b1f-83d5-efe57f24d3cb_1600x800.png 424w, https://substackcdn.com/image/fetch/$s_!odVp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000d628d-2d9e-4b1f-83d5-efe57f24d3cb_1600x800.png 848w, https://substackcdn.com/image/fetch/$s_!odVp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000d628d-2d9e-4b1f-83d5-efe57f24d3cb_1600x800.png 1272w, https://substackcdn.com/image/fetch/$s_!odVp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F000d628d-2d9e-4b1f-83d5-efe57f24d3cb_1600x800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://invideo.sjv.io/c/6522358/883681/12258">Invideo</a> video editor website</figcaption></figure></div><p>Making a 1-minute video took me a few hours, but I had no previous experience in building animation videos. In total, I spent exactly 400 credits to make it. Here is the final work:</p><div id="vimeo-1116603465" class="vimeo-wrap" data-attrs="{&quot;videoId&quot;:&quot;1116603465&quot;,&quot;videoKey&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="VimeoToDOM"><div class="vimeo-inner"><iframe src="https://player.vimeo.com/video/1116603465?autoplay=0" frameborder="0" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" loading="lazy"></iframe></div></div><p><em><strong>Need help with automation, AI, or data science? Let&#8217;s talk.</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/jaULmLguQX8KbikZ6&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://calendar.app.google/jaULmLguQX8KbikZ6"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3>Conclusion</h3><p>The process of building a 1-minute animation video was long and costly. With only a few generations, I&#8217;ve already used almost half of the monthly credits.</p><p>If you decide to take the Gemini Pro version only because of Veo3, you need to realise that you won&#8217;t be able to make more than 3 short videos per month.</p><p>Therefore, I think this plan might be worth it to make simple 8-second animations, but not for filmmaking. Besides, you face the challenge of the watermark, which can be easily fixed with single videos, but not with a full animation.</p><p>Nonetheless, I&#8217;m really happy with the output. There&#8217;s a sense of nostalgia in seeing my old pieces of artwork come alive in the digital world. Characters that were once static, living only in my imagination or in the hands of those who bought them at the flea market, can now reach a wider audience, even if they&#8217;ve taken on a Pixar-like look.</p><p>Veo3 and Nano Banana make a powerful combo: Veo3 brings strong image-editing capabilities that breathe life into idle objects, while Nano Banana excels at preserving image details and generating natural motion and audio.</p><p>With that being said, maybe a <em>Drawnics&#8202;&#8212;&#8202;Part 2 </em>coming soon?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Curious about what I&#8217;m building? &#128064;</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[You Need These Tips Before Building Your First Chatbot on Botpress]]></title><description><![CDATA[Don't waste time on Botpress's Discord channel and FAQ, instead, follow this tutorial to build your first chatbot seamlessly.]]></description><link>https://blog.dadhalfdev.com/p/you-need-these-tips-before-building</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/you-need-these-tips-before-building</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Mon, 18 Aug 2025 15:31:17 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5cfde896-1ddf-448e-9b3f-b3eac5066c41_1200x750.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://try.botpress.com/jtbhn8bkb4pe">Botpress</a> is not new. The company has been around for at least two years at the time of writing, but much has changed in how workflows are built.</p><p>If you follow tutorials on YouTube, most of them are outdated, with components that are no longer used and a workflow editor that does not resemble the current one.</p><p>That&#8217;s ok, you can still learn from these videos, at least until you run into certain logical limitations. At that point, a tool designed to be intuitive and beginner-friendly can quickly turn into a real nightmare.</p><p>In this tutorial, I&#8217;ll show you how to build a chatbot that learns from two different Knowledge Bases (KBs). I&#8217;ll also point out the issues that cost me several hours of troubleshooting on Botpress&#8217;s <a href="https://discord.com/invite/botpress">Discord channel</a>.</p><p>Let&#8217;s make Botpress a breeze to use!</p><div><hr></div><h3>1. Create a new agent (aka assistant)</h3><p>In this example, we are going to use a PDF file about ETH (Ethereum&#8217;s currency) and a table with NFT collections as Knowledge Bases. The idea is to create a preview of what could be a powerful crypto and web3 agent, while showcasing key strategies to start building your first workflow.</p><p>Let&#8217;s start by creating an account on Botpress.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-NmP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed33b04-0e34-469e-96cc-3241345f74be_1718x961.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-NmP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed33b04-0e34-469e-96cc-3241345f74be_1718x961.png 424w, https://substackcdn.com/image/fetch/$s_!-NmP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed33b04-0e34-469e-96cc-3241345f74be_1718x961.png 848w, https://substackcdn.com/image/fetch/$s_!-NmP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed33b04-0e34-469e-96cc-3241345f74be_1718x961.png 1272w, https://substackcdn.com/image/fetch/$s_!-NmP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed33b04-0e34-469e-96cc-3241345f74be_1718x961.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-NmP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed33b04-0e34-469e-96cc-3241345f74be_1718x961.png" width="1456" height="814" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9ed33b04-0e34-469e-96cc-3241345f74be_1718x961.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:814,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!-NmP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed33b04-0e34-469e-96cc-3241345f74be_1718x961.png 424w, https://substackcdn.com/image/fetch/$s_!-NmP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed33b04-0e34-469e-96cc-3241345f74be_1718x961.png 848w, https://substackcdn.com/image/fetch/$s_!-NmP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed33b04-0e34-469e-96cc-3241345f74be_1718x961.png 1272w, https://substackcdn.com/image/fetch/$s_!-NmP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9ed33b04-0e34-469e-96cc-3241345f74be_1718x961.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Configure your Agent on Botpress</figcaption></figure></div><p>As soon as you create an account, it will guide you to configure an agent tailored for your needs. If you choose <em>Customer Support</em>, <em>Brand Assistant,</em> or <em>Product Recommendation</em>, a workflow will be generated, allowing you to skip some steps.</p><p>However, if you want to have full control over your workflow, I recommend using the <em>Other</em> option.</p><p>Following the <em>Other</em> option, you will be asked to add data to your Knowledge Base if you want to. You can add websites, files (.pdf, .doc, .html, and more), or simple text.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LK0Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ae0d2d-3d01-41c7-9a27-47f674386be6_1732x993.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LK0Z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ae0d2d-3d01-41c7-9a27-47f674386be6_1732x993.png 424w, https://substackcdn.com/image/fetch/$s_!LK0Z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ae0d2d-3d01-41c7-9a27-47f674386be6_1732x993.png 848w, https://substackcdn.com/image/fetch/$s_!LK0Z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ae0d2d-3d01-41c7-9a27-47f674386be6_1732x993.png 1272w, https://substackcdn.com/image/fetch/$s_!LK0Z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ae0d2d-3d01-41c7-9a27-47f674386be6_1732x993.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LK0Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ae0d2d-3d01-41c7-9a27-47f674386be6_1732x993.png" width="1456" height="835" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00ae0d2d-3d01-41c7-9a27-47f674386be6_1732x993.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:835,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!LK0Z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ae0d2d-3d01-41c7-9a27-47f674386be6_1732x993.png 424w, https://substackcdn.com/image/fetch/$s_!LK0Z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ae0d2d-3d01-41c7-9a27-47f674386be6_1732x993.png 848w, https://substackcdn.com/image/fetch/$s_!LK0Z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ae0d2d-3d01-41c7-9a27-47f674386be6_1732x993.png 1272w, https://substackcdn.com/image/fetch/$s_!LK0Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ae0d2d-3d01-41c7-9a27-47f674386be6_1732x993.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Add Knowledge Base to your Agent on Botpress</figcaption></figure></div><p>You don&#8217;t need to worry about chunking, indexing, or data preprocessing like you would when coding. The platform handles all of that for you. In this tutorial, we are going to add the files later in the studio page.</p><p>In the case you have already selected your KBs and an agent type like <em>Customer Support, </em>you would have at this point a chatbot ready to share or embed in your website (with limitations).</p><p>In our case, we have a pretty dumb workflow, so let&#8217;s start working on it by clicking <em>Advanced!</em></p><div><hr></div><h3>2. Add Knowledge Bases (KBs) and Tables</h3><p>In this tutorial, we are going to make the LLM (Large Language Model) query data from tables and a PDF file.</p><p>On the left side, you&#8217;ll find an icon for tables. Click on it and create a new table.</p><p>If you already have a CSV file and don&#8217;t want to manually input all the fields into the table, you can use the import option.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g1dD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82f41b2-cb20-4ede-bb96-faa89c813fef_1760x921.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g1dD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82f41b2-cb20-4ede-bb96-faa89c813fef_1760x921.png 424w, https://substackcdn.com/image/fetch/$s_!g1dD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82f41b2-cb20-4ede-bb96-faa89c813fef_1760x921.png 848w, https://substackcdn.com/image/fetch/$s_!g1dD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82f41b2-cb20-4ede-bb96-faa89c813fef_1760x921.png 1272w, https://substackcdn.com/image/fetch/$s_!g1dD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82f41b2-cb20-4ede-bb96-faa89c813fef_1760x921.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g1dD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82f41b2-cb20-4ede-bb96-faa89c813fef_1760x921.png" width="1456" height="762" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c82f41b2-cb20-4ede-bb96-faa89c813fef_1760x921.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:762,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!g1dD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82f41b2-cb20-4ede-bb96-faa89c813fef_1760x921.png 424w, https://substackcdn.com/image/fetch/$s_!g1dD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82f41b2-cb20-4ede-bb96-faa89c813fef_1760x921.png 848w, https://substackcdn.com/image/fetch/$s_!g1dD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82f41b2-cb20-4ede-bb96-faa89c813fef_1760x921.png 1272w, https://substackcdn.com/image/fetch/$s_!g1dD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc82f41b2-cb20-4ede-bb96-faa89c813fef_1760x921.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Create a table on Botpress</figcaption></figure></div><p>Here, I&#8217;m going to add a CSV file that was generated using my <a href="https://apify.com/dadhalfdev/magic-eden-nft-collections-scraper">Magin Eden web scraper</a>. It scrapes the latest information about NFT collections across multiple blockchains and Layer 2 chains.</p><p>Here&#8217;s a preview of the data I&#8217;m adding to the Botpress table:</p><p>Once the table is filled, we can move to the KB section. The icon is also on the left side of the studio page.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!U-rp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb0b1a22-f744-4696-beb8-4829dfa1cbeb_1760x822.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U-rp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb0b1a22-f744-4696-beb8-4829dfa1cbeb_1760x822.png 424w, https://substackcdn.com/image/fetch/$s_!U-rp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb0b1a22-f744-4696-beb8-4829dfa1cbeb_1760x822.png 848w, https://substackcdn.com/image/fetch/$s_!U-rp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb0b1a22-f744-4696-beb8-4829dfa1cbeb_1760x822.png 1272w, https://substackcdn.com/image/fetch/$s_!U-rp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb0b1a22-f744-4696-beb8-4829dfa1cbeb_1760x822.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U-rp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb0b1a22-f744-4696-beb8-4829dfa1cbeb_1760x822.png" width="1456" height="680" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb0b1a22-f744-4696-beb8-4829dfa1cbeb_1760x822.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!U-rp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb0b1a22-f744-4696-beb8-4829dfa1cbeb_1760x822.png 424w, https://substackcdn.com/image/fetch/$s_!U-rp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb0b1a22-f744-4696-beb8-4829dfa1cbeb_1760x822.png 848w, https://substackcdn.com/image/fetch/$s_!U-rp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb0b1a22-f744-4696-beb8-4829dfa1cbeb_1760x822.png 1272w, https://substackcdn.com/image/fetch/$s_!U-rp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb0b1a22-f744-4696-beb8-4829dfa1cbeb_1760x822.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Add tables to Knowledge Base on Botpress</figcaption></figure></div><p>There is a default KB, which you can rename to something that illustrates your table data. Now, click on the tables icon and choose your table. Mine is called<em> NFTCollectionTable.</em></p><p>Now, let&#8217;s create a second KB called <em>ETH Info. </em>I&#8217;m going to add a simple PDF file that compares the ETH (Ethereum&#8217;s blockchain asset) to oil. You can find this file <a href="https://ethdigitaloil.com/">here</a>, perhaps you can even add the link to the KB instead of uploading the document.</p><div><hr></div><h3>3. Build a ready-to-go workflow that works for you</h3><p>Now comes the amusing part. Building the flow of the chatbot!</p><p>On <a href="https://try.botpress.com/jtbhn8bkb4pe">Botpress</a>, the workflows are built using <em>Nodes</em> and <em>Cards. </em>You can see the <em>Nodes</em> as containers that are made of several <em>Cards. </em>The latter are mostly actions and transitions. We will take a look at several card examples in this guide.</p><p>You can find the <em>workflows</em> icon on the left side of the studio page. The default example can be messy, and for a good follow-up to this tutorial, I recommend you remove all the nodes by simply clicking on them and pressing <em>Delete.</em></p><p>One thing that I realised when building my first Botpress agent is that when you launch the chatbot, it will always wait for the user's input to start a conversation.</p><p>In most cases, that&#8217;s fine, but what if you want the chatbot to introduce itself and give a short preview of what it is capable of?</p><h4>How does the bot start talking before you do?</h4><p>After spending some time on YouTube and Botpress&#8217;s Discord channel, I found the solution to this issue. The only thing you need to do is start the workflow from a trigger event called <em>Conversation Started</em>, instead of the default<em> Start </em>node.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cpGm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39afb5d4-0acd-49fc-8259-0844d28a80ec_1760x822.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cpGm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39afb5d4-0acd-49fc-8259-0844d28a80ec_1760x822.png 424w, https://substackcdn.com/image/fetch/$s_!cpGm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39afb5d4-0acd-49fc-8259-0844d28a80ec_1760x822.png 848w, https://substackcdn.com/image/fetch/$s_!cpGm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39afb5d4-0acd-49fc-8259-0844d28a80ec_1760x822.png 1272w, https://substackcdn.com/image/fetch/$s_!cpGm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39afb5d4-0acd-49fc-8259-0844d28a80ec_1760x822.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cpGm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39afb5d4-0acd-49fc-8259-0844d28a80ec_1760x822.png" width="1456" height="680" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/39afb5d4-0acd-49fc-8259-0844d28a80ec_1760x822.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!cpGm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39afb5d4-0acd-49fc-8259-0844d28a80ec_1760x822.png 424w, https://substackcdn.com/image/fetch/$s_!cpGm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39afb5d4-0acd-49fc-8259-0844d28a80ec_1760x822.png 848w, https://substackcdn.com/image/fetch/$s_!cpGm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39afb5d4-0acd-49fc-8259-0844d28a80ec_1760x822.png 1272w, https://substackcdn.com/image/fetch/$s_!cpGm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39afb5d4-0acd-49fc-8259-0844d28a80ec_1760x822.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Add a trigger node on Botpress</figcaption></figure></div><p>While this solution works, there&#8217;s still a small delay when you open the chatbot before triggering the intro message.</p><h4>Add an introduction text and a multiple-choice node</h4><p>Since we want our chatbot to start the conversation before the user&#8217;s input. It would be nice to make a short and funny introduction to break the ice.</p><p>Right-click on your mouse to create a node, then insert the card <em>Text. </em>Write something like:</p><blockquote><p>&#8220;Hey, I&#8217;m the crypto bro, who knows more than all crypto bros combined!&#8221;</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rOZR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a1ebfb3-e5f0-46d8-88b3-2de16a83a6a1_1760x822.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rOZR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a1ebfb3-e5f0-46d8-88b3-2de16a83a6a1_1760x822.png 424w, https://substackcdn.com/image/fetch/$s_!rOZR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a1ebfb3-e5f0-46d8-88b3-2de16a83a6a1_1760x822.png 848w, https://substackcdn.com/image/fetch/$s_!rOZR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a1ebfb3-e5f0-46d8-88b3-2de16a83a6a1_1760x822.png 1272w, https://substackcdn.com/image/fetch/$s_!rOZR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a1ebfb3-e5f0-46d8-88b3-2de16a83a6a1_1760x822.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rOZR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a1ebfb3-e5f0-46d8-88b3-2de16a83a6a1_1760x822.png" width="1456" height="680" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3a1ebfb3-e5f0-46d8-88b3-2de16a83a6a1_1760x822.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!rOZR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a1ebfb3-e5f0-46d8-88b3-2de16a83a6a1_1760x822.png 424w, https://substackcdn.com/image/fetch/$s_!rOZR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a1ebfb3-e5f0-46d8-88b3-2de16a83a6a1_1760x822.png 848w, https://substackcdn.com/image/fetch/$s_!rOZR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a1ebfb3-e5f0-46d8-88b3-2de16a83a6a1_1760x822.png 1272w, https://substackcdn.com/image/fetch/$s_!rOZR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a1ebfb3-e5f0-46d8-88b3-2de16a83a6a1_1760x822.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Add a text card on Botpress</figcaption></figure></div><p>Up to now, there&#8217;s no interaction between the user and the agent. Let&#8217;s add a <em>Multiple Choice</em> card in the same node, just below the <em>Text</em> card.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!O_LP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a26672-2c3e-4331-8934-1ee59a239527_1760x822.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!O_LP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a26672-2c3e-4331-8934-1ee59a239527_1760x822.png 424w, https://substackcdn.com/image/fetch/$s_!O_LP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a26672-2c3e-4331-8934-1ee59a239527_1760x822.png 848w, https://substackcdn.com/image/fetch/$s_!O_LP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a26672-2c3e-4331-8934-1ee59a239527_1760x822.png 1272w, https://substackcdn.com/image/fetch/$s_!O_LP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a26672-2c3e-4331-8934-1ee59a239527_1760x822.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!O_LP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a26672-2c3e-4331-8934-1ee59a239527_1760x822.png" width="1456" height="680" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02a26672-2c3e-4331-8934-1ee59a239527_1760x822.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!O_LP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a26672-2c3e-4331-8934-1ee59a239527_1760x822.png 424w, https://substackcdn.com/image/fetch/$s_!O_LP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a26672-2c3e-4331-8934-1ee59a239527_1760x822.png 848w, https://substackcdn.com/image/fetch/$s_!O_LP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a26672-2c3e-4331-8934-1ee59a239527_1760x822.png 1272w, https://substackcdn.com/image/fetch/$s_!O_LP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02a26672-2c3e-4331-8934-1ee59a239527_1760x822.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Add a multiple choice card on Botpress</figcaption></figure></div><p>This card is also easy to configure, all you need is to make a question and present several options.</p><p>In our example, I want to create two paths (two choices), one that is related to NFT collections and another for the Ethereum PDF information.</p><p>If you click on publish, in the right corner of the studio page, you&#8217;ll get a shareable link, where you can see what you&#8217;ve done so far. Otherwise, you can also test it internally by clicking <em>Test your bot </em>on the emulator window.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!za4R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a731b0-4e78-463c-a498-dfbc671885ef_1760x916.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!za4R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a731b0-4e78-463c-a498-dfbc671885ef_1760x916.png 424w, https://substackcdn.com/image/fetch/$s_!za4R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a731b0-4e78-463c-a498-dfbc671885ef_1760x916.png 848w, https://substackcdn.com/image/fetch/$s_!za4R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a731b0-4e78-463c-a498-dfbc671885ef_1760x916.png 1272w, https://substackcdn.com/image/fetch/$s_!za4R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a731b0-4e78-463c-a498-dfbc671885ef_1760x916.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!za4R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a731b0-4e78-463c-a498-dfbc671885ef_1760x916.png" width="1456" height="758" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c8a731b0-4e78-463c-a498-dfbc671885ef_1760x916.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:758,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!za4R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a731b0-4e78-463c-a498-dfbc671885ef_1760x916.png 424w, https://substackcdn.com/image/fetch/$s_!za4R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a731b0-4e78-463c-a498-dfbc671885ef_1760x916.png 848w, https://substackcdn.com/image/fetch/$s_!za4R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a731b0-4e78-463c-a498-dfbc671885ef_1760x916.png 1272w, https://substackcdn.com/image/fetch/$s_!za4R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8a731b0-4e78-463c-a498-dfbc671885ef_1760x916.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Preview of the Botpress chatbot</figcaption></figure></div><h4>Add autonomous nodes and exit them</h4><p>Good, now we have everything settled to put the LLMs to work for us with the <em>Autonomous Nodes. </em>Simply press the right-click on your mouse and select <em>Autonomous Node. </em>Let&#8217;s start with the NFT collections.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fTM2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe42844e-6739-47ba-887f-110879bb98b3_1760x916.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fTM2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe42844e-6739-47ba-887f-110879bb98b3_1760x916.png 424w, https://substackcdn.com/image/fetch/$s_!fTM2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe42844e-6739-47ba-887f-110879bb98b3_1760x916.png 848w, https://substackcdn.com/image/fetch/$s_!fTM2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe42844e-6739-47ba-887f-110879bb98b3_1760x916.png 1272w, https://substackcdn.com/image/fetch/$s_!fTM2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe42844e-6739-47ba-887f-110879bb98b3_1760x916.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fTM2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe42844e-6739-47ba-887f-110879bb98b3_1760x916.png" width="1456" height="758" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/be42844e-6739-47ba-887f-110879bb98b3_1760x916.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:758,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!fTM2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe42844e-6739-47ba-887f-110879bb98b3_1760x916.png 424w, https://substackcdn.com/image/fetch/$s_!fTM2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe42844e-6739-47ba-887f-110879bb98b3_1760x916.png 848w, https://substackcdn.com/image/fetch/$s_!fTM2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe42844e-6739-47ba-887f-110879bb98b3_1760x916.png 1272w, https://substackcdn.com/image/fetch/$s_!fTM2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe42844e-6739-47ba-887f-110879bb98b3_1760x916.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Add an Autonomous Node on Botpress</figcaption></figure></div><p>In the image above, you can see I&#8217;ve added the <em>Autonomous Node </em>with two other cards:</p><ol><li><p><strong>Search Knowledge Base:</strong> This ensures that the LLM queries all Knowledge Bases or just a specific one. In this case, I&#8217;ve set it up to only learn from the NFT collections one.</p></li><li><p><strong>Transition (&#8220;Ending&#8221;): </strong>This <em>Transition </em>card allows for exiting the autonomous node based on some conditions written in the prompt.</p></li></ol><p>This is how the prompt looks:</p><blockquote><p>You are an expert in NFT collections, with access to detailed data from the &#8220;NFT Collections&#8221; knowledge base. Your goal is to guide the user toward choosing the NFT collection that best fits their needs.</p><p>1. Start by greeting the user warmly and establishing trust. <br>2. Ask targeted questions to understand their preferences and goals before showing any collections:<br>&#8202;&#8212;&#8202;What is your budget range?<br>&#8202;&#8212;&#8202;Do you prefer a specific blockchain (e.g., Solana, Ethereum, Polygon)?<br>&#8202;&#8212;&#8202;Looking for a scpecific volume or volume change (%)?</p><p>3. Use their answers to filter the knowledge base and present a short, tailored list of 3&#8211;5 NFT collections with:<br>&#8202;&#8212;&#8202;Collection name<br>&#8202;&#8212;&#8202;Blockchain<br>&#8212;Key parameters from Knowledge Base</p><p>4. If the user says something like:<br>&#8202;&#8212;&#8202;&#8220;I want to see more collections&#8221;<br>&#8202;&#8212;&#8202;&#8220;Where can I get more data?&#8221;<br>&#8202;&#8212;&#8202;&#8220;Show me more options&#8221;<br>or expresses any desire for additional info,<br>respond with:<br>**&#8221;You can explore even more NFT collections here: <a href="https://apify.com/dadhalfdev/magic-eden-nft-collections-scraper?fpr=ulosg">https://apify.com/dadhalfdev/magic-eden-nft-collections-scraper?fpr=ulosg</a>"**</p><p>5. If the user seems satisfied or the conversation is coming to a natural close, transition to the &#8220;Ending&#8221; card below.</p><p>Make sure your tone is friendly, knowledgeable, and approachable. Avoid jargon unless the user is clearly an experienced NFT trader.</p></blockquote><p><strong>&#9888;&#65039; Important Note</strong></p><p>Point number 5 is super important! It&#8217;s a fix for an issue that I saw many people struggling with (myself included), which is exiting the <em>Autonomous Node. M</em>ost likely, you don&#8217;t want to speak with the assistant indefinitely, you want to be able to exit when the conversation ends or a specific keyword is mentioned.</p><p>The way I saw to solve this is by mentioning the <em>Transition </em>card name in the prompt itself.</p><p>According to the prompt, the chatbot should be able to provide the right NFT collections based on the user's inputs.</p><p>When launched, it indeed does that, and even better, it takes the images from the tables and puts the best matches in a horizontal carousel view &#129321;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kwUa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718235a1-b6e7-4f86-9c9b-76d4dc9722d4_893x958.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kwUa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718235a1-b6e7-4f86-9c9b-76d4dc9722d4_893x958.png 424w, https://substackcdn.com/image/fetch/$s_!kwUa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718235a1-b6e7-4f86-9c9b-76d4dc9722d4_893x958.png 848w, https://substackcdn.com/image/fetch/$s_!kwUa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718235a1-b6e7-4f86-9c9b-76d4dc9722d4_893x958.png 1272w, https://substackcdn.com/image/fetch/$s_!kwUa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718235a1-b6e7-4f86-9c9b-76d4dc9722d4_893x958.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kwUa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718235a1-b6e7-4f86-9c9b-76d4dc9722d4_893x958.png" width="893" height="958" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/718235a1-b6e7-4f86-9c9b-76d4dc9722d4_893x958.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:958,&quot;width&quot;:893,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!kwUa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718235a1-b6e7-4f86-9c9b-76d4dc9722d4_893x958.png 424w, https://substackcdn.com/image/fetch/$s_!kwUa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718235a1-b6e7-4f86-9c9b-76d4dc9722d4_893x958.png 848w, https://substackcdn.com/image/fetch/$s_!kwUa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718235a1-b6e7-4f86-9c9b-76d4dc9722d4_893x958.png 1272w, https://substackcdn.com/image/fetch/$s_!kwUa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718235a1-b6e7-4f86-9c9b-76d4dc9722d4_893x958.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Preview of the Botpress chatbot showing a carousel view of NFT collections</figcaption></figure></div><p>Now we need a second<em> Autonomous Node </em>for the <em>I&#8217;m an ETH maximalist</em> option.</p><p>In this case, we want to use the KB based on the PDF file we&#8217;ve previously uploaded and also create a prompt tailored for this option. In addition, I want to add an affiliate link in the prompt in case the user wants to buy ETH.</p><p>Below is how the ETH branch looks in the chatbot after adding the <em>Autonomous Node.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eipw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91218cca-f51b-4fe1-8684-41d4c3aa20a5_873x962.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eipw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91218cca-f51b-4fe1-8684-41d4c3aa20a5_873x962.png 424w, https://substackcdn.com/image/fetch/$s_!eipw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91218cca-f51b-4fe1-8684-41d4c3aa20a5_873x962.png 848w, https://substackcdn.com/image/fetch/$s_!eipw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91218cca-f51b-4fe1-8684-41d4c3aa20a5_873x962.png 1272w, https://substackcdn.com/image/fetch/$s_!eipw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91218cca-f51b-4fe1-8684-41d4c3aa20a5_873x962.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eipw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91218cca-f51b-4fe1-8684-41d4c3aa20a5_873x962.png" width="873" height="962" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91218cca-f51b-4fe1-8684-41d4c3aa20a5_873x962.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:962,&quot;width&quot;:873,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!eipw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91218cca-f51b-4fe1-8684-41d4c3aa20a5_873x962.png 424w, https://substackcdn.com/image/fetch/$s_!eipw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91218cca-f51b-4fe1-8684-41d4c3aa20a5_873x962.png 848w, https://substackcdn.com/image/fetch/$s_!eipw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91218cca-f51b-4fe1-8684-41d4c3aa20a5_873x962.png 1272w, https://substackcdn.com/image/fetch/$s_!eipw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91218cca-f51b-4fe1-8684-41d4c3aa20a5_873x962.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Preview of the Botpress chatbot showing the affiliate link to buy ETH</figcaption></figure></div><p>We can see that it is indeed querying the right KB, and as intended, showing the affiliate link!</p><h4><em><strong>Do you need help with automation, web scraping, AI, data, or anything that my laptop can deliver? Feel free to reach me on Upwork! &#128104;&#8205;&#128187;</strong></em></h4><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.upwork.com/freelancers/~01185447baa36a1b77&quot;,&quot;text&quot;:&quot;Let's build together!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.upwork.com/freelancers/~01185447baa36a1b77"><span>Let's build together!</span></a></p><p>The final workflow looks like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jq2t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b9d0c31-6f3d-438d-a449-568744aa62f3_1760x923.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jq2t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b9d0c31-6f3d-438d-a449-568744aa62f3_1760x923.png 424w, https://substackcdn.com/image/fetch/$s_!jq2t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b9d0c31-6f3d-438d-a449-568744aa62f3_1760x923.png 848w, https://substackcdn.com/image/fetch/$s_!jq2t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b9d0c31-6f3d-438d-a449-568744aa62f3_1760x923.png 1272w, https://substackcdn.com/image/fetch/$s_!jq2t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b9d0c31-6f3d-438d-a449-568744aa62f3_1760x923.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jq2t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b9d0c31-6f3d-438d-a449-568744aa62f3_1760x923.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5b9d0c31-6f3d-438d-a449-568744aa62f3_1760x923.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!jq2t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b9d0c31-6f3d-438d-a449-568744aa62f3_1760x923.png 424w, https://substackcdn.com/image/fetch/$s_!jq2t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b9d0c31-6f3d-438d-a449-568744aa62f3_1760x923.png 848w, https://substackcdn.com/image/fetch/$s_!jq2t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b9d0c31-6f3d-438d-a449-568744aa62f3_1760x923.png 1272w, https://substackcdn.com/image/fetch/$s_!jq2t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b9d0c31-6f3d-438d-a449-568744aa62f3_1760x923.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Final workflow on Botpress</figcaption></figure></div><p><em><strong>Need help with automation, AI, or data science? Let&#8217;s talk.</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/jaULmLguQX8KbikZ6&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://calendar.app.google/jaULmLguQX8KbikZ6"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3>Conclusion</h3><p>The final workflow is quite simple, it only contains 4 nodes. But the goal was to guide you through the full process of creating an agent, while highlighting the solutions for two common issues:</p><ol><li><p><em>&#8220;How does the chatbot start the conversation before the user&#8217;s input&#8221;</em>.</p></li><li><p><em>&#8220;How to exit the Autonomous Node&#8221;</em>.</p></li></ol><p>In the example provided, I used the <em>Conversation Started</em> trigger instead of the <em>Start </em>node at the beginning of the workflow to address the first issue. And I call the Transition <em>Ending</em> in the prompts, in order to exit the nodes.</p><p>More transitions could be added, for instance, if the user wants to search the web about a certain NFT collection, we could exit the node on that intent and connect another node with a <em>Web Search</em> card.</p><p>Besides, I also wanted to show you how easy it is to do affiliate marketing. If you have a Knowledge Base about electronic or cosmetic products, you can contact providers and add affiliate links while the user engages in a conversation with your chatbot.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Curious about what I&#8217;m building? &#128064;</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[Build the Coolest Plotly Dashboards with the Dash Mantine Components Library]]></title><description><![CDATA[Power your Python dashboards using React Mantine components and give them a production-ready look.]]></description><link>https://blog.dadhalfdev.com/p/build-the-coolest-plotly-dashboards</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/build-the-coolest-plotly-dashboards</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Fri, 04 Jul 2025 19:13:36 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2145ec6e-7f8b-423a-a045-a036b140a7cc_1200x750.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><p>While Python is one of the top programming languages for data analysis and data visualization, there are still few libraries and frameworks capable of delivering production-ready dashboards.</p><p>Libraries like <a href="https://seaborn.pydata.org/">Seaborn</a>, <a href="https://matplotlib.org/">Matplotlib</a>, and <a href="https://bokeh.org/">Bokeh</a>, are great for exploratory data analysis, building reports, and even Graphical User Interfaces (GUIs), but they don&#8217;t natively support HTML, CSS, and JavaScript. Therefore, they are not suitable for web applications.</p><p>Solutions such as <a href="https://www.gradio.app/">Gradio</a> and <a href="https://taipy.io/">Taipy</a> were built to facilitate Data Scientists and Machine Learning (ML) engineers building Proof of Concepts, Demos, and simple interfaces, where the main focus is to test a product, rather than making it ready for production.</p><p>Let&#8217;s now have a look at the top framework to build insightful and appealing dashboards and its limitations.</p><div><hr></div><h1>The best framework for data visualization</h1><p>The top framework to build advanced dashboards, with an extensive list of components and flexibility of customization, is <a href="https://dash.plotly.com/">Dash Plotly</a>.</p><p>This framework is fully open-source and it&#8217;s available for both Python and JavaScript, which makes it widely used, with many examples available on GitHub and forums. This vast publicly available data made Large Language Models proficient in building Plotly dashboards, which eases dashboard creation through vibe coding.</p><p>Standard Dash Plotly components are built with React, and they <a href="https://dash.plotly.com/build-your-own-components">can be customized</a> in order to look more appealing and suitable for your needs. There&#8217;s even a React <a href="https://dash.plotly.com/react-for-python-developers">tutorial</a> for Python developers, so you can start building without requiring learning React from scratch.</p><h3>The fast approach</h3><p>But let&#8217;s say you don&#8217;t want to spend countless hours customizing your components. In that case, you can use open-source libraries such as <a href="https://www.dash-bootstrap-components.com/">Dash Bootstrap Components</a> and many more, which you can find <a href="https://github.com/ucg8j/awesome-dash#component-libraries">here</a>.</p><p>Among the several examples on the list above, there&#8217;s one that will make your dashboards absolutely beautiful!</p><p>That&#8217;s <strong><a href="https://www.dash-mantine-components.com/">Dash Mantime Components</a></strong>, with over 90 components from the <a href="https://mantine.dev/">React Mantine library</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_!_eAn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c5a9156-4c22-45e4-9daa-d250782256a9_1080x435.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_eAn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c5a9156-4c22-45e4-9daa-d250782256a9_1080x435.png 424w, https://substackcdn.com/image/fetch/$s_!_eAn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c5a9156-4c22-45e4-9daa-d250782256a9_1080x435.png 848w, https://substackcdn.com/image/fetch/$s_!_eAn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c5a9156-4c22-45e4-9daa-d250782256a9_1080x435.png 1272w, https://substackcdn.com/image/fetch/$s_!_eAn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c5a9156-4c22-45e4-9daa-d250782256a9_1080x435.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_eAn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c5a9156-4c22-45e4-9daa-d250782256a9_1080x435.png" width="1080" height="435" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c5a9156-4c22-45e4-9daa-d250782256a9_1080x435.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:435,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!_eAn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c5a9156-4c22-45e4-9daa-d250782256a9_1080x435.png 424w, https://substackcdn.com/image/fetch/$s_!_eAn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c5a9156-4c22-45e4-9daa-d250782256a9_1080x435.png 848w, https://substackcdn.com/image/fetch/$s_!_eAn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c5a9156-4c22-45e4-9daa-d250782256a9_1080x435.png 1272w, https://substackcdn.com/image/fetch/$s_!_eAn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c5a9156-4c22-45e4-9daa-d250782256a9_1080x435.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">DMC components <a href="https://www.dash-mantine-components.com/">website</a></figcaption></figure></div><p>Compared to other Dash Plotly libraries, DMC offers a modern look, with easy customization, requiring less HTML and CSS knowledge.</p><div><hr></div><h3>First steps with Dash Mantine library</h3><p>One good practice for building dashboards in Python is to first create a Flask server. This gives you more flexibility in case you want to add pages that are not built using Dash or add extra parameters to the server.</p><p>Let&#8217;s also install Dash and DMC.</p><pre><code>pip install flask dash dash-mantine-components</code></pre><p>Once installed, we can start building a simple dashboard. Let&#8217;s create a login page:</p><pre><code>from dash import Dash, _dash_renderer
from dash import dcc, html
import dash_mantine_components as dmc
from flask import Flask

# Flask server
server = Flask(__name__)
server.secret_key = 'parenting'

# Set the react version for DMC components
_dash_renderer._set_react_version("18.2.0")

# Stylesheets
external_stylesheets = [
    dmc.styles.ALL,
    dmc.styles.CHARTS
]

# Set up a single Dash app with multiple pages
app = Dash(
    name='parenting_dashboard',
    server=server,
    title='Parenting Dashboard',
    external_stylesheets=external_stylesheets,
    assets_folder='assets')

# Define the layout for the different pages
app.layout = dmc.MantineProvider([
    dmc.LoadingOverlay(
        id="loading-overlay-login",
        visible=True,
        loaderProps={
            "color": "#f08b56",
            "size": "md"
        },
        style={
            "background": "white",
            "opacity": 1,
        }
    ),
    dcc.Location(id='url', refresh=False),
    dcc.Store(id='store', storage_type='session'),
    dcc.Store(id='current-page', storage_type='session'),
    html.Div(
        dmc.Stack([
            dmc.TextInput(
                id="username",
                label="Username",
                size="lg",
                miw=300,
                placeholder="Enter your username",
                required=True,
            ),
            dmc.PasswordInput(
                id="password",
                label="Password",
                size="lg",
                miw=300,
                placeholder="Enter your password",
                required=True,
            ),
            dmc.Button(
                "Login",
                id="login-button",
                size="lg",
                miw=300,
                color="#f08b56"
            ),
            dmc.Alert(
                "Invalid credentials",
                title="Error",
                hide=True,
                id="alert-login",
                color="red",
                withCloseButton=True,
            ),
        ],
            justify="center",
            align="center",
            style={
                "width": "100%",
        },
            className="main-container-login"
        ),
        id="main-container",
    ),
])

if __name__ == '__main__':
    # Run the server
    server.run(host='0.0.0.0', port=8080, debug=True)</code></pre><p>Overall, this <code>main.py</code> code snippet does the following:</p><ol><li><p>Creates a Flask server.</p></li><li><p>Sets the React version to 18.2.0 using <code>_dash_renderer</code>.</p></li><li><p>Adds DMC styles. You should be able to get all styles with <code>dmc.styles.ALL</code>, but if not, you can add them individually like <code>dmc.styles.Charts</code>.</p></li><li><p>Instantiates the dash application using <code>Dash</code>, where a name and a title are given, along with the Flask server, the stylesheets, and the assets folder that contains the CSS files.</p></li><li><p>Wraps the login page inside the <code>dmc.MantineProvider</code> object, which is key to rendering the DMC library components.</p></li><li><p>Finally, launches the Flask server on port 8080.</p></li></ol><p>This first page looks like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xelI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d94e35-9222-43fe-bf48-3188a3fb5571_864x380.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xelI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d94e35-9222-43fe-bf48-3188a3fb5571_864x380.png 424w, https://substackcdn.com/image/fetch/$s_!xelI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d94e35-9222-43fe-bf48-3188a3fb5571_864x380.png 848w, https://substackcdn.com/image/fetch/$s_!xelI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d94e35-9222-43fe-bf48-3188a3fb5571_864x380.png 1272w, https://substackcdn.com/image/fetch/$s_!xelI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d94e35-9222-43fe-bf48-3188a3fb5571_864x380.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xelI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d94e35-9222-43fe-bf48-3188a3fb5571_864x380.png" width="864" height="380" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a0d94e35-9222-43fe-bf48-3188a3fb5571_864x380.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:380,&quot;width&quot;:864,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!xelI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d94e35-9222-43fe-bf48-3188a3fb5571_864x380.png 424w, https://substackcdn.com/image/fetch/$s_!xelI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d94e35-9222-43fe-bf48-3188a3fb5571_864x380.png 848w, https://substackcdn.com/image/fetch/$s_!xelI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d94e35-9222-43fe-bf48-3188a3fb5571_864x380.png 1272w, https://substackcdn.com/image/fetch/$s_!xelI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0d94e35-9222-43fe-bf48-3188a3fb5571_864x380.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Login example with DMC</figcaption></figure></div><div><hr></div><h1>Callbacks and other DMC components</h1><p>The previous login page requires a username and a password. Otherwise, it prompts an alert message.</p><p>Let&#8217;s take a look at the callback function that handles the authentication.</p><pre><code>from dash.dependencies import Output, Input, State, ALL
from dash import no_update, clientside_callback
from app.components import Login
from app.settings import ParentingSettings


class Callbacks:
    """
    Class to handle main callbacks for the app.
    """

    @staticmethod
    def callback_login(app):
        """
        Callback function to handle the login.
        """
        @app.callback(
            Output('store', 'data'),
            Output('alert-login', 'hide'),
            Output('login-button', 'n_clicks'),
            Input('login-button', 'n_clicks'),
            State('username', 'value'),
            State('password', 'value'),
        )
        def login(n_clicks, username, password):
            if n_clicks is None:
                return no_update, True, 0
            if n_clicks &gt; 0:
                if username == 'toddler' and password == 'parent123':
                    return 'toddler', True, 0
                elif username == 'preschooler' and password == 'parent456':
                    return 'preschooler', True, 0
                else:
                    return no_update, False, 0</code></pre><p>By using the <code>ids</code> previously defined in the layout, we can create inputs and outputs. The callback function above takes the username, the password, and the button as inputs. The <code>State</code> is a type of <code>Input</code>, that uses its values but does not require an action. This avoids triggering the callback if the user fills in the <code>dmc.TextInput </code>or the <code>dmc.PasswordInput</code>.</p><p>The outputs of this callback are simply the <code>hidden</code> value for the alert component and <code>store</code> value. The latter will be saved in the session of the browser, and based on it, you can generate different layouts. This is important when handling different clients.</p><pre><code>@staticmethod
def callback_store(app):
    """
    Callback function to handle the store value.
    """
    @app.callback(
        Output('main-container', 'children'),
        Output('loading-overlay-login', 'visible', allow_duplicate=True),
        Input('store', 'data'),
        prevent_initial_call=True,
    )
    def parenting_category(category):
        if category == 'toddler':
            main_container = Store.gen_navbar(category)
            return main_container, False
        if category == 'preschooler':
            main_container = Store.gen_navbar(category)
            return main_container, False
        else:
            return Login.gen_login_form(), False</code></pre><p>Once logged in, the session value triggers the callback function above, and a layout is generated accordingly.</p><p><em><strong>&#9888;&#65039;Note: </strong>Each new callback function should be added to the </em><code>main.py</code><em> function to be triggered.</em></p><h3>Build a navbar with DMC</h3><p>After the authentication, a new layout is shown inside the <code>dmc.MantineProvider</code>. Let&#8217;s have a look at a common piece on a dashboard, a navbar with selectors to control the charts.</p><pre><code>import dash_mantine_components as dmc
from dash_iconify import DashIconify

def gen_navbar(category):
    """
    Generate the navbar based on the parenting category.

    Args:
        category (str): The parenting category to
        generate the navbar for (eg. "toddler", "preschooler")

    Returns:
        html.Div: The navbar for the parenting category.
    """

    max_date = datetime.now()
    min_date = datetime(2024, 1, 1)

    settings = ParentingSettings(category)

    return \
        html.Div([
            html.Div([
                dmc.Stack([
                    dmc.DatePickerInput(
                        id="start-date-input",
                        value=max_date - timedelta(days=30),
                        label="Start Date",
                        className="nav-item",
                        required=True,
                        minDate=min_date,
                    ),
                    dmc.DatePickerInput(
                        id="end-date-input",
                        value=max_date,
                        label="End Date",
                        className="nav-item",
                        required=True,
                        maxDate=max_date,
                    ),
                    dmc.Select(
                        id="activity-selector",
                        leftSection=DashIconify(
                            icon="mdi:baby-face"),
                        data=settings.properties_selector,
                        label="Select Activity Type",
                        searchable=True,
                        value=settings.properties_selector[0]['value'],
                        className="nav-item"
                    ),
                    dmc.Select(
                        id="pages-dropdown",
                        leftSection=DashIconify(
                            icon="material-symbols:bar-chart"),
                        searchable=True,
                        label="Dashboard Page",
                        comboboxProps={
                            "transitionProps": {
                                "transition": "pop", "duration": 200}},
                        data=settings.pages_selector,
                        value='dialogs',
                        className="nav-item",
                    ),
                    dmc.RadioGroup(
                        children=dmc.Group(
                            [dmc.Radio(l, value=k, color=c, id=d) for
                             k, l, c, d
                             in settings.timeframes_radio_options],
                            my=10),
                        id="radiogroup-timeframes",
                        value="week",
                        label="Select a Timeframe",
                        size="sm",
                        mb=10,
                        className="nav-item"
                    ),
                    dmc.Space(h=20),
                    html.Div([
                        dmc.Button(
                            "Sign Out",
                            id="log-out-button",
                            color="#f08b56",
                            leftSection=DashIconify(
                                icon="material-symbols:logout"),
                            size="xs",
                            n_clicks=0,
                        )
                    ], className="nav-item", style={"margin": "auto"}),
                ])
            ], className="navbar-col"),
            html.Div(id="page-content")],
            id="main-container",
            style={
                "display": "flex",
                "minHeight": "100vh",
                "width": "100%",
        }
        )</code></pre><p>The layout above is controlled by the <code>store</code> value (category), which in our example can either be <code>toddler</code> or <code>preschooler</code>. This category is then used to create specific components and logic for the dashboard.</p><p>Now back to the DMC elements, the <code>dmc.Stack</code> component is useful to align the items vertically, while the <code>dmc.Group</code> is used for horizontal alignment.</p><p>These are the controlling widgets being used in the navbar:</p><ul><li><p><code>dmc.DatePickerInput()</code> used for picking dates. You can control the minimum and maximum dates.</p></li><li><p><code>dmc.Select()</code>, a dropdown element. Takes the data input as a dictionary.</p></li><li><p><code>dmc.RadioGroup()</code>, a group of radio buttons. You can customize them individually with <code>dmc.Radio()</code>.</p></li><li><p><code>dmc.Button()</code>, a simple button.</p></li></ul><p>This is how the navbar looks like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wIso!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7264bd9b-186b-4fad-bb48-447aafb623dc_277x823.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wIso!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7264bd9b-186b-4fad-bb48-447aafb623dc_277x823.png 424w, https://substackcdn.com/image/fetch/$s_!wIso!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7264bd9b-186b-4fad-bb48-447aafb623dc_277x823.png 848w, https://substackcdn.com/image/fetch/$s_!wIso!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7264bd9b-186b-4fad-bb48-447aafb623dc_277x823.png 1272w, https://substackcdn.com/image/fetch/$s_!wIso!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7264bd9b-186b-4fad-bb48-447aafb623dc_277x823.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wIso!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7264bd9b-186b-4fad-bb48-447aafb623dc_277x823.png" width="277" height="823" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7264bd9b-186b-4fad-bb48-447aafb623dc_277x823.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:823,&quot;width&quot;:277,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!wIso!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7264bd9b-186b-4fad-bb48-447aafb623dc_277x823.png 424w, https://substackcdn.com/image/fetch/$s_!wIso!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7264bd9b-186b-4fad-bb48-447aafb623dc_277x823.png 848w, https://substackcdn.com/image/fetch/$s_!wIso!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7264bd9b-186b-4fad-bb48-447aafb623dc_277x823.png 1272w, https://substackcdn.com/image/fetch/$s_!wIso!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7264bd9b-186b-4fad-bb48-447aafb623dc_277x823.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Navbar example with DMC</figcaption></figure></div><p>Did you see the cool icons? That&#8217;s possible with the <code>DashIconify</code> object. You can install this library with <code>pip</code>:</p><pre><code>pip install dash-iconify</code></pre><p>Once installed, you can integrate the <code>DashIconify</code> into your control widgets and select icons from a library with thousands of options. Find them <a href="https://icon-sets.iconify.design/">here</a>.</p><h3>Pagination with DMC</h3><p>We can now have a look at the callback function that powers the pagination of the dashboard using the following data for the page selector:</p><pre><code>[
  {"label": "Daily Activities", "value": "daily"},
  {"label": "Sleep Patterns", "value": "sleep"},
  {"label": "Meal Tracking", "value": "meal"},
  {"label": "Development Milestones", "value": "development"},
  {"label": "Health Issues", "value": "health"},
  {"label": "Behavior Notes", "value": "behavior"},
 ]</code></pre><p>In brief, we aim to render a page on the left side of the navbar, based on the selected value. This page layout will be displayed in the id <code>page-content </code>and it can show charts, tables, and overall data insights.</p><p>Let&#8217;s have a quick look at the callback logic:</p><pre><code>  @staticmethod
  def callback_page_layout(app):
      """
      Callback function to open the layout according to the dashboard input.
      """
      @app.callback(
          Output('page-content', 'children'),
          Output('url', 'pathname'),
          Input('store', 'data'),
          Input('pages-dropdown', 'value'),
      )
      def display_page(category: str, page: str):

          if page == 'daily':
              return gen_daily_layout(category), '/'
          elif page == 'sleep':
              return gen_sleep_layout(category), '/sleep',
          elif page == 'meal':
              return gen_meal_layout(category), '/meal'
          elif page == 'development':
              return gen_development_layout(category), '/development',
          elif page == 'health':
              return gen_health_layout(category), '/health',
          elif page == 'behavior':
              return gen_behavior_layout(category), '/behavior',</code></pre><p>The function above takes a page dropdown value as input, as well as the stored value category, and outputs a layout on <code>page-content</code> while redirecting to the target URL pathname.</p><p>This logic creates something like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XVXh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a6594e-625f-4957-bc15-6fe2b2b7221e_1080x590.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XVXh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a6594e-625f-4957-bc15-6fe2b2b7221e_1080x590.png 424w, https://substackcdn.com/image/fetch/$s_!XVXh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a6594e-625f-4957-bc15-6fe2b2b7221e_1080x590.png 848w, https://substackcdn.com/image/fetch/$s_!XVXh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a6594e-625f-4957-bc15-6fe2b2b7221e_1080x590.png 1272w, https://substackcdn.com/image/fetch/$s_!XVXh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a6594e-625f-4957-bc15-6fe2b2b7221e_1080x590.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XVXh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a6594e-625f-4957-bc15-6fe2b2b7221e_1080x590.png" width="1080" height="590" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/85a6594e-625f-4957-bc15-6fe2b2b7221e_1080x590.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:590,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!XVXh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a6594e-625f-4957-bc15-6fe2b2b7221e_1080x590.png 424w, https://substackcdn.com/image/fetch/$s_!XVXh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a6594e-625f-4957-bc15-6fe2b2b7221e_1080x590.png 848w, https://substackcdn.com/image/fetch/$s_!XVXh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a6594e-625f-4957-bc15-6fe2b2b7221e_1080x590.png 1272w, https://substackcdn.com/image/fetch/$s_!XVXh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85a6594e-625f-4957-bc15-6fe2b2b7221e_1080x590.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Dashboard with navbar and bar chart using DMC components</figcaption></figure></div><p>The idea is that the navbar is fixed, and only the <code>Div</code> element on the left (<code>page-content</code>), changes every time the user switches pages.</p><h3>Create charts with DMC</h3><p>Cool, so we finally start to see the dashboard flourishing! Let&#8217;s have a look at some DMC charts and how they differ from the standard Dash Plotly ones.</p><p>The bar chart we saw above was built using the following function:</p><pre><code>from dash import html, dcc
import dash_mantine_components as dmc
from app.settings import ParentingSettings
from dash_iconify import DashIconify
from app.components import General
from datetime import datetime, timedelta 


@staticmethod
 def gen_daily_layout(category):
      """
      Generate the layout for the daily activities page.
      """

      settings = ParentingSettings(category)

      return html.Div([
          dmc.Title(
              "Daily Activities Tracking",
              className="dashboard-page-title",
              order=1
          ),
          dmc.Space(h=40),
          dmc.Stack([
              General.gen_loading("loading-overlay-daily"),
              dmc.Group([
                  General.gen_paper_box(
                      "Average Activities", "avg-daily-text"),
                  General.gen_paper_box(
                      "Total Activities", "total-daily-text"),
              ], gap=50),
              dmc.Space(h=20),
              dmc.Paper([
                  dmc.BarChart(
                      id="bar-chart-daily",
                      withLegend=True,
                      maw=1000,
                      h=400,
                      data=[],
                      withTooltip=True,
                      dataKey="weekYear",
                      type="stacked",
                      xAxisLabel="Weeks",
                      yAxisLabel="Activities",
                      yAxisProps={
                              "domain": [0, "dataMax"],
                              "allowDataOverflow": True,
                      },
                      style={"width": "100%"},
                      series=settings.properties_default_series
                  ),
                  General.gen_download_button("download-button-daily",
                                              margin_left='auto'),
                  dcc.Download(id="download-data-daily"),
              ],
                  style={"width": "100%"},
                  maw=1000, radius="sm", p="lg", shadow="sm"),
          ], align="center"),
      ], className="dashboard-page-content")</code></pre><p>In the script above, the object that creates the bar chart is <code>dmc.BarChart</code> and takes a few inputs to generate a modern-looking dynamic plot.</p><p>Standard libraries require a lot of customization to prettify the charts. Otherwise, they look like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YMh3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f964b-f3d7-4027-aacb-37b63499ffee_1080x575.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YMh3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f964b-f3d7-4027-aacb-37b63499ffee_1080x575.png 424w, https://substackcdn.com/image/fetch/$s_!YMh3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f964b-f3d7-4027-aacb-37b63499ffee_1080x575.png 848w, https://substackcdn.com/image/fetch/$s_!YMh3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f964b-f3d7-4027-aacb-37b63499ffee_1080x575.png 1272w, https://substackcdn.com/image/fetch/$s_!YMh3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f964b-f3d7-4027-aacb-37b63499ffee_1080x575.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YMh3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f964b-f3d7-4027-aacb-37b63499ffee_1080x575.png" width="1080" height="575" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/415f964b-f3d7-4027-aacb-37b63499ffee_1080x575.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:575,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!YMh3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f964b-f3d7-4027-aacb-37b63499ffee_1080x575.png 424w, https://substackcdn.com/image/fetch/$s_!YMh3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f964b-f3d7-4027-aacb-37b63499ffee_1080x575.png 848w, https://substackcdn.com/image/fetch/$s_!YMh3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f964b-f3d7-4027-aacb-37b63499ffee_1080x575.png 1272w, https://substackcdn.com/image/fetch/$s_!YMh3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f964b-f3d7-4027-aacb-37b63499ffee_1080x575.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Standard bar chart taken from Plotly <a href="https://plotly.com/python/bar-charts/">website</a></figcaption></figure></div><p>Not amazing, right? This is the DMC version with almost no customization:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2TwP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6550fb-e0e2-436f-bccf-1cb0db1433cf_1080x462.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2TwP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6550fb-e0e2-436f-bccf-1cb0db1433cf_1080x462.png 424w, https://substackcdn.com/image/fetch/$s_!2TwP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6550fb-e0e2-436f-bccf-1cb0db1433cf_1080x462.png 848w, https://substackcdn.com/image/fetch/$s_!2TwP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6550fb-e0e2-436f-bccf-1cb0db1433cf_1080x462.png 1272w, https://substackcdn.com/image/fetch/$s_!2TwP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6550fb-e0e2-436f-bccf-1cb0db1433cf_1080x462.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2TwP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6550fb-e0e2-436f-bccf-1cb0db1433cf_1080x462.png" width="1080" height="462" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e6550fb-e0e2-436f-bccf-1cb0db1433cf_1080x462.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:462,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!2TwP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6550fb-e0e2-436f-bccf-1cb0db1433cf_1080x462.png 424w, https://substackcdn.com/image/fetch/$s_!2TwP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6550fb-e0e2-436f-bccf-1cb0db1433cf_1080x462.png 848w, https://substackcdn.com/image/fetch/$s_!2TwP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6550fb-e0e2-436f-bccf-1cb0db1433cf_1080x462.png 1272w, https://substackcdn.com/image/fetch/$s_!2TwP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e6550fb-e0e2-436f-bccf-1cb0db1433cf_1080x462.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Bar chart example with DMC</figcaption></figure></div><p>More examples:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yUOK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a80da78-7d83-47b2-b583-aa4d43196901_1080x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yUOK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a80da78-7d83-47b2-b583-aa4d43196901_1080x608.png 424w, https://substackcdn.com/image/fetch/$s_!yUOK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a80da78-7d83-47b2-b583-aa4d43196901_1080x608.png 848w, https://substackcdn.com/image/fetch/$s_!yUOK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a80da78-7d83-47b2-b583-aa4d43196901_1080x608.png 1272w, https://substackcdn.com/image/fetch/$s_!yUOK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a80da78-7d83-47b2-b583-aa4d43196901_1080x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yUOK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a80da78-7d83-47b2-b583-aa4d43196901_1080x608.png" width="1080" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a80da78-7d83-47b2-b583-aa4d43196901_1080x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:608,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!yUOK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a80da78-7d83-47b2-b583-aa4d43196901_1080x608.png 424w, https://substackcdn.com/image/fetch/$s_!yUOK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a80da78-7d83-47b2-b583-aa4d43196901_1080x608.png 848w, https://substackcdn.com/image/fetch/$s_!yUOK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a80da78-7d83-47b2-b583-aa4d43196901_1080x608.png 1272w, https://substackcdn.com/image/fetch/$s_!yUOK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a80da78-7d83-47b2-b583-aa4d43196901_1080x608.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Inverted bar chart and pie chart examples with DMC</figcaption></figure></div><p>These are just some examples. We could go on and explore even further! You can try to build other types of charts and play with callback functions by following the <a href="https://www.dash-mantine-components.com/">DMC documentation</a>.</p><p><em><strong>Need help with automation, AI, or data science? Let&#8217;s talk.</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/jaULmLguQX8KbikZ6&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://calendar.app.google/jaULmLguQX8KbikZ6"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3>Conclusion</h3><p>While the <a href="https://www.dash-mantine-components.com/">Dash Mantine Components</a> library offers great-looking charts and widgets compared to standard Plotly libraries, it still has some limitations.</p><p>For instance, if you want to create a funnel chart, you won&#8217;t find an object in DMC for it. You would need to stick with <a href="https://plotly.com/python/plotly-express/">Plotly Express</a> or <a href="https://plotly.com/python/graph-objects/">Graph Objects</a>.</p><p>This can be a problem, mostly if all your elements are DMC and suddenly some of them have a different, less modern look.</p><p>Nonetheless, the DMC repository is still active on <a href="https://github.com/snehilvj/dash-mantine-components">GitHub</a>, last commit 4 days ago at the time I&#8217;m writing, meaning that more components may be added soon.</p><p>Another important point of this library compared to using traditional Plotly components is that it is not great for vibe coders. I&#8217;m a <a href="https://cursor.com/">Cursor</a> user, and I found it hard to create DMC elements using the composer.</p><p>Therefore, take your time, read the documentation, and start building production-ready dashboards with Python.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Curious about what I&#8217;m building? &#128064;</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[Make $100+ Monthly With Apify Actors]]></title><description><![CDATA[Learn how to monetize your Python web scraping scripts by deploying them on Apify]]></description><link>https://blog.dadhalfdev.com/p/make-100-monthly-with-apify-actors</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/make-100-monthly-with-apify-actors</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Sat, 10 May 2025 21:57:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7bab2dba-c0bc-45e3-ac36-5b6f91033c6c_1200x750.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you have web scraping scripts sitting idle in your GitHub repository or a folder on your computer, you might be missing out on the chance to earn passive income from them.</p><p>With <a href="https://apify.com/">Apify</a>, you can run and upload web scraping scripts, which are called <em>actors. </em>You can build them with either JavaScript or Python programming language, and Apify provides rich<a href="https://docs.apify.com/sdk/python/docs/overview/introduction"> documentation</a> in both languages.</p><p><strong>But why should you use Apify instead of building your API platform and integrating your web scraping scripts?</strong></p><ol><li><p><strong>Well-known platform: </strong>With this marketplace, you can reach a wide audience due to its position in the market. Therefore, you don&#8217;t need to spend much energy and money promoting your platform. If you have a fast script, which comes with fair prices and there&#8217;s not enough competition, you may be able to monetize it sooner than you thought.</p></li><li><p><strong>No need for infrastructure:</strong> If you want to create your web scraping platform, that comes with costs. You may need to host your script on a VPS and pay a monthly fee, as well as buy a domain for your API endpoint. Not to mention the costs associated with building a website and database. Apify handles the hosting, scaling, and execution of the scripts, saving costs and effort.</p></li><li><p><strong>Two different types of monetization</strong>: You can monetize your actor either with a monthly subscription or a fixed amount for 1,000 requests. The process is extremely simple, all you need is to do is provide your details and associate your PayPal account to start getting paid.</p></li><li><p><strong>Ensure reliability: </strong>Apify has some quality standards that need to be respected, such as your actor shouldn&#8217;t take more than 5 minutes to give results. It also provides logs, error reporting, and a robust infrastructure to debug and optimize your script to make it the leading option in the market.</p></li><li><p><strong>Focus on Development</strong>: Due to the robust deployment infrastructure, you don&#8217;t need to worry about DevOps and other engineering domains that are required when building your platform. This is great for developers who can solely focus on making a high-quality web scraping actor.</p></li></ol><p>The examples mentioned above are just a few. Apify offers additional benefits, such as reliable customer support and insights into your script&#8217;s issues and performance. </p><p>While it offers all these perks, diving into the full SDK documentation or trying to grasp the Apify workflow can consume valuable time. That&#8217;s why I&#8217;ve decided to write this article and provide a straightforward tutorial to help you seamlessly migrate your web scraping script to an Apify actor and begin monetizing your work.</p><h1><strong>How to create an Apify actor</strong></h1><p>Before deploying an Apify actor, the first step is to have a functional web scraping script. In this guide, I&#8217;ll walk you through the key components of my Polymarket web scraping code, which have been adapted to work with the Apify SDK.</p><p>There are two main Apify packages for Python, so make sure not to mix both. They are:</p><ul><li><p><strong><a href="https://docs.apify.com/api/client/python/docs">Apify Python Client</a></strong>: The official library for accessing the Apify API, offering features such as automatic retries and convenient utility functions. All requests, responses, and errors are handled in JSON format with UTF-8 encoding. Requires Python 3.8 or higher.</p></li><li><p><strong><a href="https://docs.apify.com/sdk/python/docs/overview/introduction">Apify SDK for Python</a></strong>: The library used for building actors on the Apify platform.</p></li></ul><p>To install the Apify SDK for Python via pip:</p><pre><code>pip install apify</code></pre><p>You also need to install the Apify CLI to interact and push your code to the cloud.</p><pre><code>npm install -g apify-cli</code></pre><p>Once the CLI is installed, you must create an account on the Apify website.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dhf9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e173fef-c2c2-4e2e-b820-0637c64e717a_945x414.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dhf9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e173fef-c2c2-4e2e-b820-0637c64e717a_945x414.png 424w, https://substackcdn.com/image/fetch/$s_!dhf9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e173fef-c2c2-4e2e-b820-0637c64e717a_945x414.png 848w, https://substackcdn.com/image/fetch/$s_!dhf9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e173fef-c2c2-4e2e-b820-0637c64e717a_945x414.png 1272w, https://substackcdn.com/image/fetch/$s_!dhf9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e173fef-c2c2-4e2e-b820-0637c64e717a_945x414.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dhf9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e173fef-c2c2-4e2e-b820-0637c64e717a_945x414.png" width="945" height="414" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e173fef-c2c2-4e2e-b820-0637c64e717a_945x414.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:414,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!dhf9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e173fef-c2c2-4e2e-b820-0637c64e717a_945x414.png 424w, https://substackcdn.com/image/fetch/$s_!dhf9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e173fef-c2c2-4e2e-b820-0637c64e717a_945x414.png 848w, https://substackcdn.com/image/fetch/$s_!dhf9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e173fef-c2c2-4e2e-b820-0637c64e717a_945x414.png 1272w, https://substackcdn.com/image/fetch/$s_!dhf9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e173fef-c2c2-4e2e-b820-0637c64e717a_945x414.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://apify.com/">Apify</a> website main page</figcaption></figure></div><p>Now you can use the CLI to log in from your local machine:</p><pre><code>apify login</code></pre><p>This will ask you to authenticate through a token, which you can find in your profile settings or by directly connecting to the console in your browser.</p><p>At this point, we can already initialize the repository, even if it does not yet contain the web scraping logic.</p><pre><code>apify init</code></pre><p>This will create the <code>storage</code> and <code>.actor</code> folders, along with a <code>.gitignore</code> file.</p><p>Let&#8217;s begin creating our actor by using a default web scraping script as the base. We&#8217;ll distinguish between the <strong>Actor Script</strong> and the <strong>Default Script</strong> in the following steps.</p><p>To make the process easier, let&#8217;s create the logic in two main files inside a <code>src</code> folder, which are the <code>main.py</code> and the <code>__main__.py</code>. Overall, the tree of the <strong>Actor Script </strong>repository should have the following shape:</p><pre><code>&#9500;&#9472;&#9472; .actor
&#9474;   &#9500;&#9472;&#9472; actor.json
&#9474;   &#9500;&#9472;&#9472; Dockerfile
&#9474;   &#9500;&#9472;&#9472; input_schema.json
&#9500;&#9472;&#9472; src
&#9474;   &#9500;&#9472;&#9472; __main__.py
&#9474;   &#9500;&#9472;&#9472; main.py
&#9500;&#9472;&#9472; storage
&#9500;&#9472;&#9472; README.md
&#9500;&#9472;&#9472; requirements.txt</code></pre><h2><strong>Step 1 &#8212; Create a __main__.py script</strong></h2><p>In the <strong>Default Script</strong> of the Polymarket web scraper, I have the following code for the <code>__main__.py</code> inside the <code>src</code> folder.</p><pre><code>""" This script launches the Polymarket Scraper"""
# pylint: disable=E0402
import time
import asyncio
import logging
from rich.logging import RichHandler
from main import main

SEARCH_TYPE = "New"
NUM_MARKETS = 40


if __name__ == "__main__":
    # Logging configurations
    logging.basicConfig(
        filename="logs/output.log",
        filemode='w',  # This ensures the file is overwritten each time
        format='%(asctime)s | %(levelname)s: %(message)s',
        level=logging.DEBUG)
    logger = logging.getLogger()

    # Create a RichHandler for nice formatting
    rich_handler = RichHandler()
    logger.addHandler(rich_handler)

    asyncio.run(main(logger, SEARCH_TYPE, NUM_MARKETS))</code></pre><p>So you can see that in this file I created a logger object and I run the main scraping function asynchronously, which takes the logger, a search type, and the number of markets to scrape as inputs.</p><p>The <strong>Actor Script</strong> will be as simple as this:</p><pre><code>import asyncio
import time
import logging
from apify.log import ActorLogFormatter
from src.main import main, Actor

handler = logging.StreamHandler()
handler.setFormatter(ActorLogFormatter())

apify_logger = logging.getLogger('apify')
apify_logger.setLevel(logging.DEBUG)
apify_logger.addHandler(handler)

asyncio.run(main())</code></pre><p>The logger is defined using the Apify instance instead, and no inputs are used in the main function because they will be defined inside it, as we are going to see in the next step.</p><h2><strong>Step 2 &#8212; Create a main.py script</strong></h2><p>As we have seen previously, the main function takes three inputs, and looks like this for the <strong>Default Script:</strong></p><pre><code>""" This script contains the function to scrape Polymarket """
# pylint: disable=W0718
# pylint: disable=W0621
import json
from playwright.async_api import async_playwright

async def main(logger, search_input, num_markets):
    """ Main function to scrape Polymarket """
    async with async_playwright() as pw:

        # Creates an instance of the Chromium browser and launches it
        browser = await pw.chromium.launch(headless=False)

        # Creates a new browser page (tab) within the browser instance
        page = await browser.new_page(locale='en-US')
        logger.info("Open Polymarket")
        if search_input == "Top":
            await page.goto("https://polymarket.com/markets/all")
            await page.wait_for_timeout(4000)
        if search_input == "New":
            await page.goto(
                "https://polymarket.com/markets/all?_s=start_date%3Adesc")
            await page.wait_for_timeout(4000)


        # Collect results in the loop
        for i in range(round(num_markets / 20)):

            # Iteration number
            logger.info("Iteration Number: %s", i)

            # Get response
            page.on(
                "response", lambda response: check_json(response, logger))

            # Scroll down
            await page.locator(
                ".c-dhzjXW.c-dhzjXW-idNOCmT-css"
            ).last.scroll_into_view_if_needed(timeout=5000)

            await page.wait_for_timeout(2000)

        # All markets
        all_markets = []

        # Read and process each row
        with open('temp.json', 'r', encoding='utf-8') as json_file:
            for line in json_file:

                # Parse each line as a JSON array
                row = json.loads(line.strip())

                # Process each dictionary in the row
                for dictionary in row:
                    all_markets.append(dictionary)

        # Get the sample for the output
        markets_sample = all_markets[:num_markets]

        if markets_sample:
            logger.info("Scraping Succeeded!")
            with open("result.json", 'w', encoding="utf-8") as f:
                json.dump(markets_sample, f, indent=4)

        await page.close()</code></pre><p>At the end of the script, we see that the scraped information is saved in the <code>result.json</code> file, with the <strong>Actor Script </strong>this will be different, instead the results will be stored in the Apify database and available to explore and export in the console.</p><p>Let&#8217;s see how the script changes for the actor:</p><pre><code>""" This script contains the functions to scrape polymarket """
# pylint: disable=W0718
# pylint: disable=W0621
import json
from apify import Actor
from playwright.async_api import async_playwright

async def main():
    """ Main function to scrape Polymarket """
    async with Actor:
        # Read the Actor input
        actor_input = await Actor.get_input() or {}
        search_input = actor_input.get("search_input")
        num_markets = actor_input.get("number_of_markets")

        async with async_playwright() as pw:

            # Creates an instance of the Chromium browser and launches it
            browser = await pw.chromium.launch(
                headless=False)

            # Creates a new browser page (tab) within the browser instance
            page = await browser.new_page(locale='en-US')
            Actor.log.info("Open Polymarket")
            if search_input == "Top":
                await page.goto("https://polymarket.com/markets/all")
                await page.wait_for_timeout(4000)
            if search_input == "New":
                await page.goto(
                    "https://polymarket.com/markets/all?_s=start_date%3Adesc")
                await page.wait_for_timeout(4000)

            # Clean JSON file
            with open("temp.json", "w", encoding="utf-8") as file:
                pass  # This leaves the file completely empty

            # Collect results in the loop
            for i in range(round((num_markets/2) / 20)):

                # Iteration number
                Actor.log.info("Iteration Number: %s", i)

                # Get response
                page.on(
                    "response", check_json)

                try:
                    # Scroll down
                    await page.locator(
                        ".c-dhzjXW.c-dhzjXW-idNOCmT-css"
                    ).last.scroll_into_view_if_needed(timeout=10000)

                except Exception as error:
                    Actor.log.error(str(error))
                    await page.wait_for_timeout(2000)
                    continue

            await page.wait_for_timeout(2000)

            await page.close()

            # All markets
            all_markets = []

            # Read and process each row
            with open('temp.json', 'r', encoding='utf-8') as json_file:
                for line in json_file:

                    # Parse each line as a JSON array
                    row = json.loads(line.strip())

                    # Process each dictionary in the row
                    for dictionary in row:
                        all_markets.append(dictionary)

            # Drop duplicates
            all_markets = [
                dict(t) for t in
                {tuple(sorted(d.items())) for d in all_markets}]

            # Get the sample for the output
            markets_sample = all_markets[:num_markets]
            Actor.log.info("Total Scraped: %s", len(all_markets))
            Actor.log.info("Sample Length: %s", len(markets_sample))

            Actor.log.info("Scraping Succeeded!")
            await Actor.push_data(markets_sample)</code></pre><p>Not so much has changed, but the first thing we notice is that the inputs are defined within the function using the <code>actor_input</code> object. You might be wondering where the strings <code>search_input</code> and <code>number_of_markets</code> were defined. And they actually come from the <code>input_schema.json</code> that we are going to take a look next.</p><p>Another change is that all <code>logger</code> objects are replaced by the <code>Actor.log</code>. Finally, as I mentioned, the data is not stored as JSON but pushed instead using the <code>Actor.push_data()</code> function.</p><h2><strong>Step 3&#8212; Create an input_schema.json</strong></h2><p>When you publish your actor, a proper input schema is needed so the user can have the option to manually insert the right inputs for scraping. The <code>input_shema.json</code> is a file that allows you to customize the entries, and the full documentation can be seen here:</p><p>For the Polymarket actor, all I need is a dropdown menu to select the search input and a field to enter the number of markets. Therefore, my structure looks like this:</p><pre><code>{
    "title":"Polymarket Scraper",
    "schemaVersion": 1,
    "type": "object",
    "properties": {
      "search_input": {
        "title": "Search Input (Top or New)",
        "type": "string",
        "editor": "select",
        "default": "Top",
        "enum": ["Top", "New"],
        "enumTitles": ["Top", "New"],
        "description": "Search Polymarket for 'Top' or 'New' markets."
      },
      "number_of_markets": {
        "type": "integer",
        "title": "Number of Markets",
        "description": "The number of markets (posts) to be scraped.",
        "default": 100,
        "minimum": 100,
        "maximum": 1500
      }
    },
    "required": ["search_input", "number_of_markets"]
  }</code></pre><h2><strong>Step 4 &#8212; Create a Dockerfile</strong></h2><p>Since we are using Python, we need a Docker image with a Python version and install some dependencies. For that, you can use this default Dockerfile, which you can also find in the <a href="https://github.com/apify/actor-templates/tree/master/templates/python-playwright/.actor">templates repository</a>:</p><pre><code># First, specify the base Docker image.
# You can see the Docker images from Apify at https://hub.docker.com/r/apify/.
# You can also use any other image from Docker Hub.
FROM apify/actor-python-playwright:3.11

# Second, copy just requirements.txt into the Actor image,
# since it should be the only file that affects the dependency install in the next step,
# in order to speed up the build
COPY requirements.txt ./

# Install the packages specified in requirements.txt,
# Print the installed Python version, pip version
# and all installed packages with their versions for debugging
RUN echo "Python version:" \
 &amp;&amp; python --version \
 &amp;&amp; echo "Pip version:" \
 &amp;&amp; pip --version \
 &amp;&amp; echo "Installing dependencies:" \
 &amp;&amp; pip install -r requirements.txt \
 &amp;&amp; echo "All installed Python packages:" \
 &amp;&amp; pip freeze

 # Install Playwright and its dependencies
RUN playwright install-deps &amp;&amp; \
    playwright install

# Next, copy the remaining files and directories with the source code.
# Since we do this after installing the dependencies, quick build will be really fast
# for most source file changes.
COPY . ./

# Use compileall to ensure the runnability of the Actor Python code.
RUN python3 -m compileall -q .

# Specify how to launch the source code of your Actor.
# By default, the "python3 -m src" command is run
CMD ["python3", "-m", "src"]</code></pre><p>The final step is to customize the <code>actor.json</code>. Let&#8217;s see what you can do!</p><h2><strong>Step 5&#8212; Customize the actor.json and deploy the actor</strong></h2><p>Previously, when we did <code>apify init</code> an <code>actor.json</code> file was created, with a default title, version, and so on, but now we need to specify the right project&#8217;s title, the path for the Dockerfile, and the path to the input schema. In addition, you may want to have a structured output for the user, and that is also configured in this file. For that, you need to label and give a format to all the output variables. Let&#8217;s see an example of <code>actor.json</code>:</p><pre><code>{
    "actorSpecification": 1,
    "name": "polymarket-scraper",
    "version": "0.1",
    "buildTag": "latest",
    "input": "./input_schema.json",
    "dockerfile": "./Dockerfile",
    "storages": {
        "dataset": {
            "actorSpecification": 1,
            "views": {
                "overview": {
                    "title": "Overview",
                    "transformation": {
                        "fields": [
                            "market_question",
                            "market_creation_date",
                            "market_end_date",
                            "market_link",
                            "market_description",
                            "market_chance",
                            "market_liquidity",
                            "market_volume",
                            "market_volume_24h",
                            "market_one_day_price_change",
                            "market_yes_price",
                            "market_no_price",
                            "market_spread",
                            "market_closed",
                            "market_rewards_amount",
                            "market_rewards_daily_rate",
                            "market_num_comments"
                        ]
                    },
                    "display": {
                        "component": "table",
                        "properties": {
                            "market_question": {
                                "label": "Market Question",
                                "format": "text"
                            },
                            "market_creation_date": {
                                "label": "Market Creation Date",
                                "format": "date"
                            },                            
                            "market_end_date": {
                                "label": "Market End Date",
                                "format": "date"
                            },  
                            "market_link": {
                                "label": "Market Link",
                                "format": "link"
                            },
                            "market_description": {
                                "label": "Market Description",
                                "format": "text"
                            },
                            "market_chance": {
                                "label": "Market Chance",
                                "format": "text"
                            },
                            "market_liquidity": {
                                "label": "Market Liquidity",
                                "format": "number"
                            },
                            "market_volume": {
                                "label": "Market Volume",
                                "format": "number"
                            },
                            "market_volume_24h": {
                                "label": "Market Volume 24h",
                                "format": "number"
                            },
                            "market_one_day_price_change": {
                                "label": "Market One Day Price Change",
                                "format": "number"
                            },
                            "market_yes_price": {
                                "label": "Market Yes Price",
                                "format": "number"
                            },
                            "market_no_price": {
                                "label": "Market No Price",
                                "format": "number"
                            },                            
                            "market_spread": {
                                "label": "Market Spread",
                                "format": "number"
                            },
                            "market_closed": {
                                "label": "Market Closed",
                                "format": "text"
                            },
                            "market_rewards_amount": {
                                "label": "Market Rewards Amount",
                                "format": "number"
                            },
                            "market_rewards_daily_rate": {
                                "label": "Market Rewards Daily Rate",
                                "format": "number"
                            },
                            "market_num_comments": {
                                "label": "Market Number of Comments",
                                "format": "number"
                            }
                        }
                    }
                }
            }
        }
    }
}</code></pre><p>This is the final step to build your actor, and you can test it locally with the following CLI command:</p><pre><code>apify run --purge --input '{"search_input": "Top", "number_of_markets": 100}'</code></pre><p>Your output will be stored in the <code>storage</code> folder previously created. If everything works smoothly, you can finally deploy to the Apify cloud instance:</p><pre><code>apify push</code></pre><p>Sometimes you may see some errors in the console that you didn't get locally. It may be related to your input schema, thus make sure the file is properly configured with this command:</p><pre><code> apify validate-schema </code></pre><h1><strong>Publish and test the actor on Apify</strong></h1><p>Now, everything should be properly configured in the repository. But in order to publish your actor, you must add display information and a monetization plan like 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_!fk18!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f182126-9b16-4b4c-9df9-b6dd15aeaf1e_945x545.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fk18!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f182126-9b16-4b4c-9df9-b6dd15aeaf1e_945x545.png 424w, https://substackcdn.com/image/fetch/$s_!fk18!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f182126-9b16-4b4c-9df9-b6dd15aeaf1e_945x545.png 848w, https://substackcdn.com/image/fetch/$s_!fk18!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f182126-9b16-4b4c-9df9-b6dd15aeaf1e_945x545.png 1272w, https://substackcdn.com/image/fetch/$s_!fk18!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f182126-9b16-4b4c-9df9-b6dd15aeaf1e_945x545.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fk18!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f182126-9b16-4b4c-9df9-b6dd15aeaf1e_945x545.png" width="945" height="545" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f182126-9b16-4b4c-9df9-b6dd15aeaf1e_945x545.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:545,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!fk18!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f182126-9b16-4b4c-9df9-b6dd15aeaf1e_945x545.png 424w, https://substackcdn.com/image/fetch/$s_!fk18!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f182126-9b16-4b4c-9df9-b6dd15aeaf1e_945x545.png 848w, https://substackcdn.com/image/fetch/$s_!fk18!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f182126-9b16-4b4c-9df9-b6dd15aeaf1e_945x545.png 1272w, https://substackcdn.com/image/fetch/$s_!fk18!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f182126-9b16-4b4c-9df9-b6dd15aeaf1e_945x545.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://apify.com/">Apify</a> publication steps</figcaption></figure></div><p>Once your actor strength is excellent, you can test it for free in the Apify console.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OSlX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2d7b3-4c65-4f97-94b8-3e3282e2114c_945x567.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OSlX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2d7b3-4c65-4f97-94b8-3e3282e2114c_945x567.png 424w, https://substackcdn.com/image/fetch/$s_!OSlX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2d7b3-4c65-4f97-94b8-3e3282e2114c_945x567.png 848w, https://substackcdn.com/image/fetch/$s_!OSlX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2d7b3-4c65-4f97-94b8-3e3282e2114c_945x567.png 1272w, https://substackcdn.com/image/fetch/$s_!OSlX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2d7b3-4c65-4f97-94b8-3e3282e2114c_945x567.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OSlX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2d7b3-4c65-4f97-94b8-3e3282e2114c_945x567.png" width="945" height="567" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/90e2d7b3-4c65-4f97-94b8-3e3282e2114c_945x567.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:567,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!OSlX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2d7b3-4c65-4f97-94b8-3e3282e2114c_945x567.png 424w, https://substackcdn.com/image/fetch/$s_!OSlX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2d7b3-4c65-4f97-94b8-3e3282e2114c_945x567.png 848w, https://substackcdn.com/image/fetch/$s_!OSlX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2d7b3-4c65-4f97-94b8-3e3282e2114c_945x567.png 1272w, https://substackcdn.com/image/fetch/$s_!OSlX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90e2d7b3-4c65-4f97-94b8-3e3282e2114c_945x567.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://apify.com/">Apify</a> actor manual input</figcaption></figure></div><p>With the output structure I&#8217;ve defined in the <code>actor.json</code> file, I get the following table:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NT2f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d1077-afe0-477e-8e6e-d0c636e874ea_945x560.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NT2f!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d1077-afe0-477e-8e6e-d0c636e874ea_945x560.png 424w, https://substackcdn.com/image/fetch/$s_!NT2f!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d1077-afe0-477e-8e6e-d0c636e874ea_945x560.png 848w, https://substackcdn.com/image/fetch/$s_!NT2f!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d1077-afe0-477e-8e6e-d0c636e874ea_945x560.png 1272w, https://substackcdn.com/image/fetch/$s_!NT2f!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d1077-afe0-477e-8e6e-d0c636e874ea_945x560.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NT2f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d1077-afe0-477e-8e6e-d0c636e874ea_945x560.png" width="945" height="560" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef4d1077-afe0-477e-8e6e-d0c636e874ea_945x560.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:560,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!NT2f!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d1077-afe0-477e-8e6e-d0c636e874ea_945x560.png 424w, https://substackcdn.com/image/fetch/$s_!NT2f!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d1077-afe0-477e-8e6e-d0c636e874ea_945x560.png 848w, https://substackcdn.com/image/fetch/$s_!NT2f!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d1077-afe0-477e-8e6e-d0c636e874ea_945x560.png 1272w, https://substackcdn.com/image/fetch/$s_!NT2f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4d1077-afe0-477e-8e6e-d0c636e874ea_945x560.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://apify.com/">Apify</a> output example</figcaption></figure></div><p>The actor will pass through some quality checks, and if any significant issues are found, you&#8217;ll receive a notification indicating that the actor is under maintenance and requires updates. Otherwise, you&#8217;re all set, and your web scraping script is ready to be monetized and made available to users worldwide!</p><p><em><strong>Need help with automation, AI, or data science? Let&#8217;s talk.</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/jaULmLguQX8KbikZ6&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://calendar.app.google/jaULmLguQX8KbikZ6"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3>Conclusion</h3><p>After following this tutorial, you realise that creating an Apify actor isn&#8217;t too complicated. You can preserve most of your default web scraping script, with only some parts that need to be replaced by the SDK. </p><p>Nonetheless, it is worth paying special attention to the <code>actor.json</code> structure and the <code>input_schematic.json</code> so that your deployment doesn&#8217;t cause any issues. Also, make sure that your <code>README.md</code> file clearly explains your web scraping inputs and outputs.</p><p>With that being said, there&#8217;s no need to leave your scripts gathering mold, you can just deploy them on Apify, and maybe someone, somewhere, will make good use of them.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Do you want to read more about what comes out of my laptop? &#128064;</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[Easy Steps to Automate Your Posts on BlueSky with Python]]></title><description><![CDATA[Use the BlueSky Python SDK and some creativity to automate posts on BlueSky for free.]]></description><link>https://blog.dadhalfdev.com/p/easy-steps-to-automate-your-posts</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/easy-steps-to-automate-your-posts</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Sat, 10 May 2025 21:06:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/111edbc5-86db-405e-a6c7-0d3ffdd7ade2_1200x750.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://bsky.app/profile/macrodrigues.bsky.social">BlueSky</a> is a social media platform created in 2019 by the founder of Twitter &#8212; Jack Dorsey. Well known for embracing decentralization, free speech, and open-source software, Jack wanted to build a social media application that covered all these. Therefore, while he was CEO of Twitter, he started building BlueSky. The platform was officially launched in February 2024, one year and a few months after Twitter&#8217;s acquisition by Elon Musk.</p><p>The blue logo and the application&#8217;s interface make BlueSky a twin brother of Twitter (currently <a href="https://x.com/marcoacavaco">X</a>), with slight changes. Users who are familiar with X can easily jump in and start using it without spending time understanding how it works.</p><p>The platform has been experiencing significant growth since the U.S. elections in 2024, which is probably due to Elon Musk actively supporting the republican party. Some on the other side of the coin have decided to abandon the ship or look for alternatives.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0b0X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b1afef-e434-459c-9ac4-9ce61aee9efa_945x718.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0b0X!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b1afef-e434-459c-9ac4-9ce61aee9efa_945x718.png 424w, https://substackcdn.com/image/fetch/$s_!0b0X!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b1afef-e434-459c-9ac4-9ce61aee9efa_945x718.png 848w, https://substackcdn.com/image/fetch/$s_!0b0X!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b1afef-e434-459c-9ac4-9ce61aee9efa_945x718.png 1272w, https://substackcdn.com/image/fetch/$s_!0b0X!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b1afef-e434-459c-9ac4-9ce61aee9efa_945x718.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0b0X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b1afef-e434-459c-9ac4-9ce61aee9efa_945x718.png" width="945" height="718" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76b1afef-e434-459c-9ac4-9ce61aee9efa_945x718.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:718,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!0b0X!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b1afef-e434-459c-9ac4-9ce61aee9efa_945x718.png 424w, https://substackcdn.com/image/fetch/$s_!0b0X!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b1afef-e434-459c-9ac4-9ce61aee9efa_945x718.png 848w, https://substackcdn.com/image/fetch/$s_!0b0X!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b1afef-e434-459c-9ac4-9ce61aee9efa_945x718.png 1272w, https://substackcdn.com/image/fetch/$s_!0b0X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76b1afef-e434-459c-9ac4-9ce61aee9efa_945x718.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Bluesky registered users over time &#8212; image <a href="https://backlinko.com/bluesky-statistics">source</a></figcaption></figure></div><p>As of January 2025, BlueSky reported having over <strong><a href="https://backlinko.com/bluesky-statistics">27 million</a> </strong>registered users, with <strong><a href="https://backlinko.com/bluesky-statistics">55.7%</a> </strong>being U.S. citizens.</p><p>Aside from people moving due to politics, BlueSky comes with features and tools that are certainly important to take a look at:</p><ul><li><p><strong>Custom feeds: </strong>In BlueSky, users can create<strong> </strong>custom feeds to a have more personalized experience and choose what they want to see. This also minimizes the algorithm's effort trying to predict your preferred topics.</p></li><li><p><strong>More control: </strong>Users have more control over what they can see, mute certain words or tags, and hide unpleasant comments in their posts. These and other features that offer more power to the user are a big plus when compared to X.</p></li><li><p><strong>Decentralization: </strong>The platform is built<strong> </strong>on the Authenticated Transfer (AT) Protocol, which enables users to host their data on servers of their choice, facilitating the creation of clients, bots, and integrations.</p></li><li><p><strong>Free of Advertisements: </strong>On BlueSky, you don&#8217;t need to be bombarded with ads every time.</p></li><li><p><strong>Free and simple API: </strong>As a developer, this one is my favorite. Unlike X, which requires users to pay for their API access and you need to wait for validation, BlueSky makes the process outstandingly easy. You only need your login username and password to connect to the <a href="https://docs.bsky.app/docs/get-started">API</a>, currently available in Python and TypeScript.</p></li></ul><p>I didn&#8217;t know much about BlueSky until recently, but I was contacted through <a href="https://www.upwork.com/freelancers/~01185447baa36a1b77">Upwork</a> by someone who wanted to create a bot on this platform to show daily updates about the egg prices in the United States.</p><p>I immediately accepted the job proposal and started working with the Python SDK to make automated posts with a <a href="https://seaborn.pydata.org/">seaborn</a> chart showing the egg prices over time.</p><p>Before heading to the BlueSky API, the workflow starts with some web scraping. Let&#8217;s see what I&#8217;ve done to get updated information, and what tools I&#8217;ve used.</p><h1><strong>Scrape the daily egg price from reliable sources</strong></h1><p>Obtaining the data for this project can take several distinct paths. Some may be more time-consuming than others, but could provide more accuracy. For instance, we could scrape content from several supermarkets and grocery shops across all states of the U.S. and then obtain the mean value.</p><p>I took a simpler path, not because I did not like the first idea, but because the main goal was to deliver an actionable bot and not be too picky with the data accuracy.</p><p><a href="https://tradingeconomics.com/commodity/eggs-us">Trading Economics</a> is a well-known website for observing trends in commodities and stocks. The company provides an API and Python SDK, which allows you to get historical data across different markets and is worth paying for more advanced use cases. In this project, I only needed the daily price, which I could grab from the main page.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cijC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f27bb7f-304a-4bca-bbc2-a12cd34dfdb9_945x471.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cijC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f27bb7f-304a-4bca-bbc2-a12cd34dfdb9_945x471.png 424w, https://substackcdn.com/image/fetch/$s_!cijC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f27bb7f-304a-4bca-bbc2-a12cd34dfdb9_945x471.png 848w, https://substackcdn.com/image/fetch/$s_!cijC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f27bb7f-304a-4bca-bbc2-a12cd34dfdb9_945x471.png 1272w, https://substackcdn.com/image/fetch/$s_!cijC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f27bb7f-304a-4bca-bbc2-a12cd34dfdb9_945x471.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cijC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f27bb7f-304a-4bca-bbc2-a12cd34dfdb9_945x471.png" width="945" height="471" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6f27bb7f-304a-4bca-bbc2-a12cd34dfdb9_945x471.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:471,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!cijC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f27bb7f-304a-4bca-bbc2-a12cd34dfdb9_945x471.png 424w, https://substackcdn.com/image/fetch/$s_!cijC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f27bb7f-304a-4bca-bbc2-a12cd34dfdb9_945x471.png 848w, https://substackcdn.com/image/fetch/$s_!cijC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f27bb7f-304a-4bca-bbc2-a12cd34dfdb9_945x471.png 1272w, https://substackcdn.com/image/fetch/$s_!cijC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f27bb7f-304a-4bca-bbc2-a12cd34dfdb9_945x471.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Trading Economics Eggs US chart &#8212; image <a href="https://tradingeconomics.com/commodity/eggs-us">source</a></figcaption></figure></div><p>Do you see the price in blue over the chart? That&#8217;s the exact value I needed to scrape, and for that, I used <a href="https://playwright.dev/python/">Playwright</a> headless browser with its built-in HTML parser capabilities.</p><p>First, we need to download the package using the following command line:</p><pre><code>pip install playwright</code></pre><p>Next, we need to install the browser using this command:</p><pre><code>playwright install</code></pre><p>It usually asks for some dependencies to be installed as well:</p><pre><code>playwright install-deps</code></pre><p>Now let&#8217;s see the Python script used to get the price value:</p><pre><code>import json
from playwright.async_api import async_playwright
from datetime import datetime
import pytz

# Add list of user agents
USER_AGENTS = [
    ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
     "(KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"),
    ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 "
     "(KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"),]

async def run_scraper():

    # Get current US date
    us_tz = pytz.timezone('America/New_York')
    current_date = datetime.now(us_tz).strftime('%Y-%m-%d')
    
    async with async_playwright() as pw:
        browser = await pw.chromium.launch(
            headless=True,  # Run headless in production
            args=['--no-sandbox', '--disable-setuid-sandbox']
        )

        # Creates a new browser page with random user agent
        context = await browser.new_context(
            user_agent=USER_AGENTS[0],
            viewport={'width': 1920, 'height': 1080},
            locale='en-US'
        )
        page = await context.new_page()
        await page.goto("https://tradingeconomics.com/commodity/eggs-us")
        egg_price = await page.locator(
            '.iChart-bodylabels-ohlc').first.inner_text()
        egg_price = f"${egg_price.split(' ')[-1].strip()}"
        
        # Push data to JSON file
        data_entry = {
            "date": current_date,
            "egg_price": egg_price
        }
        
        try:
            with open('data.json', 'r', encoding='utf-8') as f:
                data = json.load(f)
        except FileNotFoundError:
            data = []
        
        data.append(data_entry)

        with open('data.json', 'w', encoding='utf-8') as f:
            json.dump(data, f, indent=4)
        
        await browser.close()</code></pre><p>The reason why I often use <code>USER_AGENTS</code> is because they help avoid <a href="https://www.cloudflare.com/">Cloudfare</a> detections and other types of anti-bot blocking solutions.</p><p>Inside the <code>run_scraper()</code> function, the most important is the way I grabbed the value using the Playwright's <code>page</code> instance. First, I had to find the HTML class representing the daily price value.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bFT4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b06d7b3-6056-41da-9ecd-824e18ea293f_945x427.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bFT4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b06d7b3-6056-41da-9ecd-824e18ea293f_945x427.png 424w, https://substackcdn.com/image/fetch/$s_!bFT4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b06d7b3-6056-41da-9ecd-824e18ea293f_945x427.png 848w, https://substackcdn.com/image/fetch/$s_!bFT4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b06d7b3-6056-41da-9ecd-824e18ea293f_945x427.png 1272w, https://substackcdn.com/image/fetch/$s_!bFT4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b06d7b3-6056-41da-9ecd-824e18ea293f_945x427.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bFT4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b06d7b3-6056-41da-9ecd-824e18ea293f_945x427.png" width="945" height="427" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6b06d7b3-6056-41da-9ecd-824e18ea293f_945x427.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:427,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!bFT4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b06d7b3-6056-41da-9ecd-824e18ea293f_945x427.png 424w, https://substackcdn.com/image/fetch/$s_!bFT4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b06d7b3-6056-41da-9ecd-824e18ea293f_945x427.png 848w, https://substackcdn.com/image/fetch/$s_!bFT4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b06d7b3-6056-41da-9ecd-824e18ea293f_945x427.png 1272w, https://substackcdn.com/image/fetch/$s_!bFT4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b06d7b3-6056-41da-9ecd-824e18ea293f_945x427.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Trading Economics HTML inspection &#8212; image <a href="https://tradingeconomics.com/commodity/eggs-us">source</a></figcaption></figure></div><p>As you can see in the image above the class I needed is <code>iChart-bodylabels-ohlc</code> , therefore, I used the <code>.locator()</code> function to get that element and the <code>.inner_text()</code> function to get the text inside it. Finally, I cleaned the output to obtain the price value only.</p><p>Another key step in the script is the United States timezone retrieval. For that, I used the package <code>pytz</code> which you can also install via <code>pip</code>. This, paired with the <code>datetime</code> library provides the exact day and time in the New York timezone. The rest of the code shows how the price and the date are saved into a JSON file every time the code runs.</p><p>The scraping function is accessed from the main script that contains the BlueSky API handling. Let&#8217;s see how it was built in the next chapter.</p><h1><strong>Create the chart and main Python script</strong></h1><p>The BlueSky post is made of three main parts &#8212; the post text, an image/chart, and the hashtags. When the main script is triggered, the output looks like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5O5u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3b58c8-1290-435e-b80b-7c45eac0ae62_625x874.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5O5u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3b58c8-1290-435e-b80b-7c45eac0ae62_625x874.png 424w, https://substackcdn.com/image/fetch/$s_!5O5u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3b58c8-1290-435e-b80b-7c45eac0ae62_625x874.png 848w, https://substackcdn.com/image/fetch/$s_!5O5u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3b58c8-1290-435e-b80b-7c45eac0ae62_625x874.png 1272w, https://substackcdn.com/image/fetch/$s_!5O5u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3b58c8-1290-435e-b80b-7c45eac0ae62_625x874.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5O5u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3b58c8-1290-435e-b80b-7c45eac0ae62_625x874.png" width="625" height="874" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f3b58c8-1290-435e-b80b-7c45eac0ae62_625x874.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:874,&quot;width&quot;:625,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!5O5u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3b58c8-1290-435e-b80b-7c45eac0ae62_625x874.png 424w, https://substackcdn.com/image/fetch/$s_!5O5u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3b58c8-1290-435e-b80b-7c45eac0ae62_625x874.png 848w, https://substackcdn.com/image/fetch/$s_!5O5u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3b58c8-1290-435e-b80b-7c45eac0ae62_625x874.png 1272w, https://substackcdn.com/image/fetch/$s_!5O5u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f3b58c8-1290-435e-b80b-7c45eac0ae62_625x874.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">BlueSky post example &#8212; image <a href="https://bsky.app/profile/priceofeggsusa.bsky.social">source</a></figcaption></figure></div><p>The sequence of the script is the following:</p><ol><li><p>A logging function is created and launched to track and monitor the bot&#8217;s activity.</p></li><li><p>A login function, <code>try_login()</code>, is called with a certain number of retries because the API doesn&#8217;t always work in the first run.</p></li><li><p>The <code>run_scraper()</code> function is triggered to scrape the daily value and add it to the JSON file.</p></li><li><p>A chart is created and saved as PNG, using <a href="https://seaborn.pydata.org/">seaborn</a> and <a href="https://pypi.org/project/matplotlib/">matplotlib</a> libraries.</p></li><li><p>Dates and price values are preprocessed with several conditions that will return variables to use in the post text.</p></li><li><p>Byte positions are created for the hashtags.</p></li><li><p>Finally, the function <code>try_post()</code> is triggered, and the post is submitted to BlueSky.</p></li></ol><p>Before having a better grasp of the above steps, we first need to install the BlueSky Python SDK:</p><pre><code>pip install atproto</code></pre><p>The functions that use the BlueSky API are <code>try_login()</code> and <code>try_post()</code>, and they will help us understand the remaining steps.</p><pre><code>import os
from atproto import Client
from dotenv import load_dotenv

def try_login(max_retries=3, delay=60):
    """Try to login with retries"""
    logger.info("Starting login process...")
    for attempt in range(max_retries):
        try:
            client = Client()
            client.login(os.getenv('username'), os.getenv('password'))
            logger.info(f"Successfully logged in on attempt {attempt + 1}")
            return client
        except Exception as e:
            if attempt &lt; max_retries - 1:
                logger.warning(f"Login attempt {attempt + 1} failed: {str(e)}")
                logger.info(f"Retrying in {delay} seconds...")
                time.sleep(delay)
            else:
                logger.error(f"Failed to login after {max_retries} attempts: {str(e)}")
                raise Exception(f"Failed to login after {max_retries} attempts: {str(e)}")

def try_post(client, image_data, text, facets, max_retries=3, delay=60):
    """Try to post with retries"""
    logger.info("Starting post attempt...")
    for attempt in range(max_retries):
        try:
            post = client.send_image(
                text=text,
                facets=facets,
                image=image_data,
                image_alt="US Egg Prices",
                langs=['en']
            )
            logger.info(f"Successfully posted on attempt {attempt + 1}")
            return post
        except Exception as e:
            if attempt &lt; max_retries - 1:
                logger.warning(f"Post attempt {attempt + 1} failed: {str(e)}")
                logger.info(f"Retrying in {delay} seconds...")
                time.sleep(delay)
            else:
                logger.error(f"Failed to post after {max_retries} attempts: {str(e)}")
                raise Exception(f"Failed to post after {max_retries} attempts: {str(e)}")</code></pre><p>We see above that the <code>try_login()</code> function, not only makes the API connection with our BlueSky credentials, it also returns the client object, which is used to access other functions like <code>.send_post()</code> or <code>.send_image() </code>in this case.</p><p>The <code>try_post()</code> function, takes the image previously saved, the client object, text, and faucets &#8212; highlight hashtags in the post &#8212; as inputs, and submits the posts on BlueSky.</p><p>At this point, adding the image as input requires you to read it as a binary file:</p><pre><code># Read the image data from the file
with open('egg_prices_chart.png', 'rb') as f:
    image_data = f.read()</code></pre><p>The complexity of the text input depends on the amount of information you wish to include. As for the <code>faucets</code>, which is probably the most confusing term, is a list of dictionaries that specify the positions of mentions, hashtags, and links in the text. Otherwise, they are submitted as pure strings. This list can be created in the following way:</p><pre><code># Find all hashtags and their positions
hashtags = ["#eggs", "#priceofeggs", "#H5N1", "#economics", "#usa"]
facets = []

# Calculate byte positions for each hashtag
for hashtag in hashtags:
    start_pos = post_text.find(hashtag)
    if start_pos != -1:
        facets.append({
            "index": {
                "byteStart": start_pos,
                "byteEnd": start_pos + len(hashtag)
            },
            "features": [{
                "$type": "app.bsky.richtext.facet#tag",
                "tag": hashtag[1:]  # Remove the # symbol
            }]
        })</code></pre><p>Knowing these steps and functions should be enough to start posting on BlueSky from your machine, but you can perform many more actions. Just explore their insightful <a href="https://docs.bsky.app/docs/get-started">API documentation</a>.</p><p>Let&#8217;s not forget one final and important note. If the goal is to create a bot it must be automated to run on a set schedule &#8212; hourly, daily, weekly, or as needed. There are multiple ways to achieve this, such as using <a href="https://replit.com/">Replit</a>, an online IDE and deployment platform, to schedule execution. In my case, I run it on my <a href="https://contabo.com/">Contabo VPS</a> by configuring a cron job that triggers daily at a specified time.</p><p><em><strong>Need help with automation, AI, or data science? Let&#8217;s talk.</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/jaULmLguQX8KbikZ6&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://calendar.app.google/jaULmLguQX8KbikZ6"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3>Conclusion</h3><p>As the number of users keep growing on BlueSky and other social media platforms are already saturated, perhaps creating an account and starting using their API could be a clever way to get engagement fast and build a strong community.</p><p>For example, if you own a website about medical devices, developing a bot to share blog posts and daily updates could drive more traffic and generate valuable leads. </p><p>You can also create AI agents that post and respond intelligently based on semantic context. The possibilities are limitless, especially in this era of RAG systems and AI agents.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Do you want to read more about what comes out of my laptop? &#128064;</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[How to Build a RAG for Cryptocurrency News]]></title><description><![CDATA[Learn the steps to make a chatbot powered by AI with Python completly for free with Chromadb, Langchain and LLMs.]]></description><link>https://blog.dadhalfdev.com/p/how-to-build-a-rag-for-cryptocurrency</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/how-to-build-a-rag-for-cryptocurrency</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Sat, 10 May 2025 20:00:38 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c67d118b-d1ef-4cf2-b034-4545d4b6592b_1200x750.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em><strong>The crypto space is constantly evolving, with market trends shifting rapidly in response to geopolitical events, protocol updates, social media buzz, significant cryptocurrency movements, and influential figures, among other factors.</strong></em></p><p>As a result, crypto articles can become outdated quickly. What&#8217;s relevant one week may not be the next. Therefore, writers must continuously monitor trends and produce fresh content at a rate that is hard to see in other technological fields.</p><div class="poll-embed" data-attrs="{&quot;id&quot;:315754}" data-component-name="PollToDOM"></div><p>This constant stream of cryptocurrency, blockchain, and web3 news serves as a valuable resource for those looking to inform their investment strategies, develop apps around trending topics, analyze market sentiment, or simply stay up-to-date on the latest ecosystem advancements.</p><p>We can get the latest news with <a href="https://apify.com/macrodrigues">web scrapers</a>, but what about fetching the information that we&#8217;re looking for without spending time reading through several articles or making extensive Google searches?</p><p>To address this challenge, I created a <strong>Retrieval-Augmented Generation (RAG)</strong> system specifically designed for crypto news. This system enables users to query topics related to cryptocurrencies, blockchain, and web3, and receive the most up-to-date information on those subjects.</p><p>For example, if you ask ChatGPT to explain Decentralized Finance (DeFi), it can provide a detailed and comprehensive answer. However, if you ask about the latest Ethereum price predictions, the chat interface may need to search the web, and its response will likely be limited.</p><p>In this piece, I will guide you through the steps I took to build <a href="https://cryptorag.replit.app/">CryptoRAG</a>, a chatbot tailored to get the latest information about cryptocurrencies, blockchain and web3.</p><p>We&#8217;ll start by exploring the fundamentals of RAG systems and the specific architecture I implemented. Next, we&#8217;ll cover how to upload the data to the Chroma database by creating Langchain documents. In addition, we&#8217;ll look at the query function, the prompt template, and two different ways of using Llama3.3 in the pipeline. Finally, we&#8217;ll bring everything together by creating a user interface to enable question-answering capabilities.</p><h1><strong>Hands-on with my CryptoRAG architecture</strong></h1><p>Large Language Models (LLMs) are trained on huge volumes of publicly available data on the internet, and use countless parameters to originate outputs that can answer your questions, create original content, or simply communicate with you. However, just like human beings, these models don&#8217;t have all the information in the world, and certainly not the latest one.</p><p>Retrieval-Augmented Generation (RAG) fixes this by integrating external data from a specific domain, document, or other sources with a Large Language Model (LLM). This hybrid approach enables the model to produce outputs that are tailored to a particular field or industry.</p><p>The RAG process is split into 3 main modules</p><ol><li><p><strong>Retrieval Module</strong>: This module fetches and ranks relevant data within a vector database based on a given input. During this process, the input query is analyzed, and the system searches through indexed data to retrieve information that aligns with the query, prioritizing relevance.</p></li><li><p><strong>Augmentation Module</strong>: This second module plays a crucial role in enhancing the performance of the RAG system. Its function is to take the top-ranked data retrieved from the Retrieval Module and seamlessly integrate it into the prompt that feeds the Large Language Model (LLM). By adding the relevant external data to the prompt, the Augmentation Module provides the LLM with additional context and information, enabling more accurate, informative, and relevant responses.</p></li><li><p><strong>Generation Module</strong>: This module generates a response by combining its language capabilities with newly retrieved external data, which is incorporated in the prompt template for the LLM. The result is a response based on the external data but cleaned and explained like the LLM would do for it&#8217;s default trained data. Depending on the prompt template, the output can show sources and other metadata features.</p></li></ol><p>Based on the above steps, my CryptoRAG architecture ended up like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oc7N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5571ebeb-69c1-4287-93a2-3e073eec75cf_852x343.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oc7N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5571ebeb-69c1-4287-93a2-3e073eec75cf_852x343.png 424w, https://substackcdn.com/image/fetch/$s_!oc7N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5571ebeb-69c1-4287-93a2-3e073eec75cf_852x343.png 848w, https://substackcdn.com/image/fetch/$s_!oc7N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5571ebeb-69c1-4287-93a2-3e073eec75cf_852x343.png 1272w, https://substackcdn.com/image/fetch/$s_!oc7N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5571ebeb-69c1-4287-93a2-3e073eec75cf_852x343.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oc7N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5571ebeb-69c1-4287-93a2-3e073eec75cf_852x343.png" width="852" height="343" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5571ebeb-69c1-4287-93a2-3e073eec75cf_852x343.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:343,&quot;width&quot;:852,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!oc7N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5571ebeb-69c1-4287-93a2-3e073eec75cf_852x343.png 424w, https://substackcdn.com/image/fetch/$s_!oc7N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5571ebeb-69c1-4287-93a2-3e073eec75cf_852x343.png 848w, https://substackcdn.com/image/fetch/$s_!oc7N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5571ebeb-69c1-4287-93a2-3e073eec75cf_852x343.png 1272w, https://substackcdn.com/image/fetch/$s_!oc7N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5571ebeb-69c1-4287-93a2-3e073eec75cf_852x343.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">CryptoRAG architecture &#8212; image by author</figcaption></figure></div><p>Outside the RAG modules, there&#8217;s the Web Scraping script I run daily to get the latest cryptocurrency news using my <a href="https://apify.com/macrodrigues/cointelegraph-scraper-crypto-news">Cointelegraph Scraper on Apify</a>.</p><p>Since I don&#8217;t need a big storage solution, a simple Google Sheet serves to retain the crypto news data temporarily.</p><p>Then I used a script to extract the data from the Google Sheet and start the encoding process, where I used Langchain to split the data into chunks and add metadata. These chunks are then vectorized using a well-known embedding model from <a href="https://huggingface.co/">Hugging Face</a>: <code>sentence-transformers/all-MiniLM-L6-v2</code>. At this point, we are already in the Retrieval Module.</p><p>Once the chunks are vectorized, they are stored in the <a href="https://www.trychroma.com/">Chroma</a> vector database. I chose Chroma because it is a completely open-source solution with no associated costs, making it an accessible and budget-friendly option.</p><p>When an input is provided to the RAG system, it is also encoded using the same embedding model, and the most relevant chunks of information are fetched from the Chroma database using similarity search. In other words, it compares vectors of information, and the closest numbers match the information that is most related to the input.</p><p>Now we enter the Augmentation Module, where the most similar documents are used to create a prompt template to feed into the LLM model (Llama 3.3). Later, we&#8217;ll explore how to design an effective prompt and use the model, whether for free or via paid APIs.</p><p>Once the prompt template is applied to the LLM, it generates a response to the initial query, completing the Q&amp;A process. The input and outputs are connected through a simple chat interface with some suggestions for those starting to use the app.</p><h1><strong>Access the data and create documents with Langchain</strong></h1><p>As mentioned previously, the scraper uploads the data to a Google Sheet. To access it, some configurations in the Google Cloud Platform must be done beforehand, such as creating a service account and generating credentials. You can learn more about it <a href="https://python.plainenglish.io/upload-a-dataset-to-google-sheets-with-python-d2d08c1c1b48">here</a>.</p><p>Once done, we can use <code>gspread</code> Python library to access the Google Sheet and extract the information as a Pandas dataframe.</p><pre><code>import pandas as pd
import gspread
from google.oauth2.service_account import Credentials

class GoogleAccess:
    """ Class containing the Google interaction functions """

    @staticmethod
    def google_authentication(credentials) -&gt; object:
        """ This function gives authentication to the Google Account.

        Scopes defines the permissions to Google Sheets and Google Drive.
        Than, using gspread, it authorizes the authentication and
        opens the worksheet to work with.

        """
        # Authenticate with Google Sheets using the JSON key file
        scope = ['https://www.googleapis.com/auth/spreadsheets',
                'https://www.googleapis.com/auth/drive']

        creds = Credentials.from_service_account_file(
            credentials, scopes=scope)

        client = gspread.authorize(creds)

        return client

    @staticmethod
    def read_from_sheet(client, sheet_id) -&gt; pd.DataFrame:
        """ This function reads the data from the Google Sheet. """

        # Open the Google Sheet by id
        sheet = client.open_by_key(sheet_id)

        # Access the worksheet name
        ws = sheet.worksheet('main')

        # Create a dataframe
        df = pd.DataFrame(data=ws.get_all_records())
        return df</code></pre><p>The credentials are stored in a JSON file that contains the service account information. To create Langchain documents, we just need to use the credentials file along with the Google Sheet ID as inputs in this function:</p><pre><code>from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.schema import Document

def create_documents(credentials_google, google_sheet_id):
    """ This function splits the articles in chunks 
    from a dataset obtained by reading a google sheet. 
    And creates documents with each chunk.
    """

    # Create client
    client = GoogleAccess.google_authentication(credentials_google)
    df = GoogleAccess.read_from_sheet(client, google_sheet_id)
    df['id'] = df['id'].astype('str')

    # Initialize the text splitter
    splitter = RecursiveCharacterTextSplitter(
        chunk_size=5000,
        chunk_overlap=0)

    # Create a list of LangChain documents
    documents = []

    for _, row in df.iterrows():
        content_chunks = splitter.split_text(row['content'])
        for i, chunk in enumerate(content_chunks):
            documents.append(Document(
                page_content=chunk,
                metadata={
                    "category": row['category'],
                    "link": row['link']
                },
                id=f"{row['id']}{i}"
            ))

    return documents</code></pre><p>For each article (row in the dataframe), I divide it into chunks of 5,000 characters. I opted for larger chunks because smaller ones seemed to negatively impact my RAG&#8217;s performance, resulting in poor-quality information about the articles. I also included the link in the metadata to embed the sources of information directly into the final chatbot interface.</p><h1><strong>Upload the encoded documents to the Chroma vector database</strong></h1><p>The previous functions allowed me to create the Langchain documents, but I still needed to vectorize and upload them to the vector database. This is achieved in the following script:</p><pre><code>import os
from langchain_huggingface.embeddings import HuggingFaceEmbeddings
from src.preprocess import create_documents
from langchain_chroma import Chroma

load_dotenv('keys.env')

def update_chromadb():
    """Update ChromaDB with new documents by deleting existing
      collection and creating a new one."""
    try:
        # Create temporary directory for new database
        temp_dir = "chroma_temp"
        os.makedirs(temp_dir, exist_ok=True)

        # Initialize Hugging Face embeddings
        embedding_model = HuggingFaceEmbeddings(
            model_name="sentence-transformers/all-MiniLM-L6-v2")

        # Create new documents
        documents = create_documents(
            'credentials.json', os.getenv("SHEET_ID"))

        # Create new database in temporary location
        Chroma.from_documents(
            documents=documents,
            collection_name="cointelegraph", 
            embedding=embedding_model,
            persist_directory=temp_dir
        )

        # If successful, replace old database with new one
        if os.path.exists("chroma"):
            shutil.rmtree("chroma")
        shutil.move(temp_dir, "chroma")

        logger.info(
            "Successfully refreshed ChromaDB collection with new documents")
        
        return True
        
    except Exception as e:
        logger.error("Error updating ChromaDB: %s", str(e))
        if os.path.exists(temp_dir):
            shutil.rmtree(temp_dir)
        raise</code></pre><p>The <code>chroma</code> object, integrated with Langchain, is instantiated using the <code>.from_documents()</code> function to upload the previously created documents and simultaneously embed them using the <code>sentence-transformers/all-MiniLM-L6-v2</code> model from <a href="https://huggingface.co/">Hugging Face</a>.</p><p>The data is stored in the <code>cointelegraph</code> collection, which works like a table in SQL databases. During the process, the data is temporarily stored in a folder named <code>chroma_temp</code>. If the documents are successfully updated, they replace the existing data in the main database folder, <code>chroma</code>.</p><p>At the moment of launching the application, the following function is triggered to get the Chroma <code>db</code> object without making any changes in the database:</p><pre><code>def initialize_chatbot():
    """Initialize ChromaDB and embeddings."""
    global db, embedding_model, last_update

    try:
        # Initialize Hugging Face embeddings
        embedding_model = HuggingFaceEmbeddings(
            model_name="sentence-transformers/all-MiniLM-L6-v2")

        # Load existing database
        db = Chroma(
            collection_name="cointelegraph",
            embedding_function=embedding_model,
            persist_directory="chroma"
        )
        
        if not last_update:
            last_update = datetime.now()
            
        logger.info("Successfully loaded ChromaDB collection")
    except Exception as e:
        logger.error("Error initializing ChromaDB: %s", str(e))
        raise</code></pre><p>This <code>db</code> object will be used to query the vector database and obtain a response, which we will see in the next chapter.</p><h1><strong>Query the RAG system and get a detailed output</strong></h1><p>This is the part where we finally use the LLM, and for that, I tried two approaches. The first one is free to use with <a href="https://ollama.com/">Ollama</a>. But if you lack a GPU, chances are that the model will take too much computational time. The second approach is using <a href="https://openrouter.ai/">OpenRouter</a> models and the <a href="https://github.com/openai/openai-python">OpenAI Python library</a>.</p><h2><strong>Use an LLM for free in your RAG system</strong></h2><p>Let&#8217;s start by exploring the free method using Ollama. You first need to install it via curl in your WSL or Linux machine with this command:</p><pre><code>curl -fsSL https://ollama.com/install.sh | sh</code></pre><p>Next, run the following command to start Ollama:</p><pre><code>ollama serve</code></pre><p>Fetch the Ollama model you want to use:</p><pre><code>ollama run llama3.3</code></pre><p>The model <code>Llama3.3</code> is huge! So either you have enough storage (and a GPU) to run it, or I recommend you look for lightweight Ollama model alternatives, such as <code>mistral</code>.</p><p>Now guess what? There&#8217;s also a Langchain python package for Ollama, so let&#8217;s install it:</p><pre><code>pip install langchain-ollama</code></pre><p>With this configuration, our query function would look like this:</p><pre><code>from langchain_core.prompts import PromptTemplate
import os
from langchain_ollama.llms import OllamaLLM


def query_rag(query_text, db, prompt, model_name):
    """
    Query a Retrieval-Augmented Generation (RAG) system using Chroma database,
    and format the response with links and categories.
    """

    # Retrieving the context from the DB using similarity search
    results = db.similarity_search_with_relevance_scores(query_text, k=3)

    # Check if there are any matching results or if
    # the relevance score is too low
    if len(results) == 0 or results[0][1] &lt; 0.2:
        return (
            "No relevant information found. Try to ask something "
            "related to crypto, blockchain and web3.")

    else:
        # Combine context from matching documents
        context_text = "\n\n - -\n\n".join(
            [doc.page_content for doc, _score in results]
        )

        # Extract categories and links from metadata
        categories = ", ".join(
            {doc.metadata.get("category", "Unknown") for doc, _ in results})
        links = ", ".join(
            {doc.metadata.get("link", "N/A") for doc, _ in results})

        # Create and format the prompt
        template = PromptTemplate(
            input_variables=["context", "question", "categories", "links"],
            template=prompt,
        )
        prompt = template.format(
            context=context_text,
            question=query_text,
            categories=categories,
            links=links
        )

        # Use the language model to generate a response
        model = OllamaLLM(
           model=model_name, cache=False, verbose=True, num_ctx=500)
        response_text = model.invoke(prompt)

        # Format and return response including generated text and sources
        formatted_response = f"{response_text}\nSources: {links}"

        return formatted_response</code></pre><p>Note that the <code>model_name</code> input you see in the script above, should be a string with the name of the model you are running in Ollama, for instance <code>llama3.3</code>.</p><h2><strong>Use OpenRouter models with OpenAI</strong></h2><p>If you don&#8217;t have a GPU, like me, the best option is to use a paid service. I prefer <a href="https://openrouter.ai/">OpenRouter</a> because it allows me to purchase credits with crypto and works seamlessly with the <a href="https://github.com/openai/openai-python">OpenAI Python package</a>:</p><pre><code>pip install openai</code></pre><p>Once the package is installed, you need to generate a token in your OpenRouter account and change the query function to this instead:</p><pre><code>from langchain_core.prompts import PromptTemplate
import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv("keys.env")


def query_rag(query_text, db, prompt):
    """
    Query a Retrieval-Augmented Generation (RAG) system using Chroma database,
    and format the response with links and categories.
    """

    # Retrieving the context from the DB using similarity search
    results = db.similarity_search_with_relevance_scores(query_text, k=3)

    # Check if there are any matching results or if
    # the relevance score is too low
    if len(results) == 0 or results[0][1] &lt; 0.2:
        return (
            "No relevant information found. Try to ask something "
            "related to crypto, blockchain and web3.")

    else:
        # Combine context from matching documents
        context_text = "\n\n - -\n\n".join(
            [doc.page_content for doc, _score in results]
        )

        # Extract categories and links from metadata
        categories = ", ".join(
            {doc.metadata.get("category", "Unknown") for doc, _ in results})
        links = ", ".join(
            {doc.metadata.get("link", "N/A") for doc, _ in results})

        # Create and format the prompt
        template = PromptTemplate(
            input_variables=["context", "question", "categories", "links"],
            template=prompt,
        )
        prompt = template.format(
            context=context_text,
            question=query_text,
            categories=categories,
            links=links
        )

        client = OpenAI(
            base_url="https://openrouter.ai/api/v1",
            api_key=os.getenv("API_KEY"),
            )

        completion = client.chat.completions.create(
            model="meta-llama/llama-3.3-70b-instruct",
            messages=[
                {
                "role": "user",
                "content": prompt
                }
            ]
        )

        response_text = completion.choices[0].message.content

        formatted_response = f"{response_text}\nSources: {links}"

        return formatted_response</code></pre><p>This approach produces much faster results, than the free one, but also comes with a cost. For instance, using 2,495 tokens in the prompt, I paid $0.000433.</p><h2><strong>Build the right prompt template</strong></h2><p>As you have seen in the previous scripts, the <code>query_rag()</code> function takes a prompt as input. There are many ways of building it, mine took this direction:</p><pre><code>PROMPT_TEMPLATE_1 = """
    You are an expert assistant. Using the provided context from the 
    database, answer the question in detail. Write your response without 
    referencing articles, documents, or sources explicitly. Never start or 
    mention the following: "In the piece", "In the article" and so on in the 
    response. Provide clear and concise answers that are helpful and
    relevant to the question.

    Context:
    {context}

    Question:
    {question}

    Answer:
    - Detailed response: 
    - Relevant categories: {categories}
    - Links to explore further: {links}
    """</code></pre><p>I had to explicitly state that I didn&#8217;t want the answer to begin by mentioning articles, as that happened a few times. Additionally, I wanted to integrate the context, the question, and the metadata information in the final output.</p><p>To create a template prompt for the model, I had to install <code>langchain_core</code>:</p><pre><code>pip install langchain-core</code></pre><p>Once done, I use the <code>PromptTemplate</code> instance to create the final prompt object that you can see in the previous scripts (both paid and free versions).</p><h1><strong>Build the chat interface with Flask and Cursor IDE</strong></h1><p>I&#8217;ve decided to use Python for the backend because it eases the process of connecting to Langchain, LLM packages and Chroma database. Therefore, I used the Flask framework to run the server.</p><p>In addition, I used the capabilities of <a href="https://www.cursor.com/">Cursor</a> composer to help me build a robust <code>app.py</code> script that runs daily, because I need the latest information to be uploaded to the Chroma database while the application runs.</p><p>The final main function looks like this:</p><pre><code>""""Flask web application for Web3 &amp; Cryptocurrency Expert Chatbot."""
# pylint: disable=W0718
import logging
import sys
import os
from langchain_chroma import Chroma
from langchain_huggingface.embeddings import HuggingFaceEmbeddings
from flask import Flask, request, jsonify, render_template, send_from_directory
from flask_cors import CORS
from src.pipeline import query_rag
from src.prompts import PROMPT_TEMPLATE_1
from flask_apscheduler import APScheduler
from datetime import datetime
from src.db_handler import update_chromadb

class Config:
    SCHEDULER_API_ENABLED = True

scheduler = APScheduler()

# Configure logging with more detailed format
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.StreamHandler(sys.stdout),
        logging.FileHandler('app.log')
    ]
)
logger = logging.getLogger(__name__)

# Initialize Flask app
app = Flask(__name__, static_folder='static', static_url_path='/static')
app.config.from_object(Config())
CORS(app)

# Initialize global variables for database and embedding model
db = None
embedding_model = None
last_update = None

def update_db_task():
    """Background task to update the database"""
    global db, last_update
    try:
        logger.info("Starting scheduled database update...")
        
        # Update the database
        update_chromadb()
        
        # Reinitialize the database connection
        initialize_chatbot()
        
        last_update = datetime.now()
        logger.info("Scheduled database update completed successfully")
    except Exception as e:
        logger.error(f"Error in scheduled database update: {str(e)}")

@app.route('/')
def home():
    """Render the chat interface."""
    try:
        return render_template('index.html')
    except Exception as e:
        logger.error("Error serving home page: %s", str(e))
        return "Internal server error", 500

@app.route('/chat', methods=['POST'])
def chat():
    """Handle chat messages using RAG system."""
    try:
        if db is None or embedding_model is None:
            logger.error("Chatbot components not properly initialized")
            return jsonify({'error': 'Chatbot not initialized properly'}), 503

        data = request.get_json()
        if not data or 'message' not in data:
            logger.warning("Invalid request: missing message")
            return jsonify({'error': 'No message provided'}), 400

        user_message = data['message'].strip()
        logger.info("Processing chat message: %s...", user_message[:50])

        # Use RAG system to generate response
        formatted_response= query_rag(
            user_message, db, PROMPT_TEMPLATE_1)

        logger.info("Successfully generated response")
        return jsonify({
            'response': formatted_response,
        })

    except Exception as e:
        logger.error("Error processing chat message: %s", str(e))
        return jsonify(
            {'error': 'An error occurred while processing your request'}), 500


if __name__ == '__main__':
    try:
        # Clear log files at startup
        clear_log_files()
        
        # Initialize scheduler
        scheduler.init_app(app)
        
        # Schedule database updates every 10 minutes
        scheduler.add_job(
            id='update_db',
            func=update_db_task,
            trigger='interval',
            days=1,
            next_run_time=datetime.now()  # Run once immediately
        )
        
        scheduler.start()

        # Initialize chatbot components
        logger.info("Starting application initialization...")
        initialize_chatbot()        
        
        logger.info(
            "Chatbot initialization and "
            "scheduler setup completed successfully")

        # Start Flask server
        logger.info("Starting Flask server on port 5000...")
        app.run(host='0.0.0.0', port=5000, debug=False, use_reloader=False)
    except Exception as e:
        logger.error("Critical server error: %s", str(e))
        sys.exit(1)</code></pre><p>For the front-end, I mostly relied on Cursor composer to build the interface, and then I adjusted the HTML elements myself. However, it&#8217;s clear that you don&#8217;t need to be a front-end developer to create a ready-to-go application nowadays. Here&#8217;s how the app looks like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!D2GQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe95ec1a-173d-4cda-8b1c-7b79be1fe31b_943x853.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!D2GQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe95ec1a-173d-4cda-8b1c-7b79be1fe31b_943x853.png 424w, https://substackcdn.com/image/fetch/$s_!D2GQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe95ec1a-173d-4cda-8b1c-7b79be1fe31b_943x853.png 848w, https://substackcdn.com/image/fetch/$s_!D2GQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe95ec1a-173d-4cda-8b1c-7b79be1fe31b_943x853.png 1272w, https://substackcdn.com/image/fetch/$s_!D2GQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe95ec1a-173d-4cda-8b1c-7b79be1fe31b_943x853.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!D2GQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe95ec1a-173d-4cda-8b1c-7b79be1fe31b_943x853.png" width="943" height="853" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe95ec1a-173d-4cda-8b1c-7b79be1fe31b_943x853.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:853,&quot;width&quot;:943,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!D2GQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe95ec1a-173d-4cda-8b1c-7b79be1fe31b_943x853.png 424w, https://substackcdn.com/image/fetch/$s_!D2GQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe95ec1a-173d-4cda-8b1c-7b79be1fe31b_943x853.png 848w, https://substackcdn.com/image/fetch/$s_!D2GQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe95ec1a-173d-4cda-8b1c-7b79be1fe31b_943x853.png 1272w, https://substackcdn.com/image/fetch/$s_!D2GQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe95ec1a-173d-4cda-8b1c-7b79be1fe31b_943x853.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Preview of the CryptoRAG application &#8212; image by author</figcaption></figure></div><p>For deployment, I&#8217;m currently using <a href="https://replit.com/">Replit</a>. I simply connected my <a href="https://github.com/macrodrigues">GitHub account</a>, made a few configurations, and clicked the deploy button.</p><p><em><strong>Need help with automation, AI, or data science? Let&#8217;s talk.</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/jaULmLguQX8KbikZ6&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://calendar.app.google/jaULmLguQX8KbikZ6"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3>Conclusion</h3><p>Building a RAG system doesn&#8217;t take much time today with the help of AI and the right tools. With so many frameworks and options available, it can be overwhelming to know where to start. </p><p>That&#8217;s why, even though it&#8217;s not the most user-friendly, I prefer sticking with Langchain. I need to install several libraries during the process, but at least I know they&#8217;re compatible and won&#8217;t break the pipeline. For vector databases, free and open-source solutions like Chroma DB work well, and when it comes to LLMs, just choose the one that fits your needs.</p><p>Concerning programming, there&#8217;s no going back, you either use Copilot, Cursor, or another AI-powered IDE, or your productivity will lag behind both developers and non-developers. It&#8217;s amazing to see how quickly we can build applications now!</p><p>I hope this tutorial helps you get started with your own RAG system and saves you time searching for the right tools. And remember, try <a href="https://cryptorag.replit.app/">CryptoRAG</a> and leave your honest feedback/support if you find the chatbot useful!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Do you want to read more about what comes out of my laptop? &#128064;</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[How to Make AI Illustrated Books with Python]]></title><description><![CDATA[This is how I created illustrated stories of myself, family and friends using generative AI]]></description><link>https://blog.dadhalfdev.com/p/how-to-make-ai-illustrated-books</link><guid isPermaLink="false">https://blog.dadhalfdev.com/p/how-to-make-ai-illustrated-books</guid><dc:creator><![CDATA[Marco Rodrigues]]></dc:creator><pubDate>Sat, 10 May 2025 01:52:02 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7d8a49ef-0c04-4990-b66b-1d516d1b0e9d_1200x750.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Everything started with me playing with the FLUX.1 model on <a href="https://replicate.com/">Replicate</a> and <a href="https://fal.ai/">fal.ai</a>. I spent countless hours making fine-tuned models with images of myself, my girlfriend and even my daughter&#8217;s toys.</p><p>I use the APIs with Python to overlay other LoRa models and produce less realistic results, like the one you see below, which is me <em><strong>riding a giant garlic in a green field with a watercolour painting touch.</strong></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j3Ob!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f5ed1a7-e1e2-4fc4-93c0-ad4f5ced1707_945x945.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j3Ob!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f5ed1a7-e1e2-4fc4-93c0-ad4f5ced1707_945x945.png 424w, https://substackcdn.com/image/fetch/$s_!j3Ob!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f5ed1a7-e1e2-4fc4-93c0-ad4f5ced1707_945x945.png 848w, https://substackcdn.com/image/fetch/$s_!j3Ob!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f5ed1a7-e1e2-4fc4-93c0-ad4f5ced1707_945x945.png 1272w, https://substackcdn.com/image/fetch/$s_!j3Ob!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f5ed1a7-e1e2-4fc4-93c0-ad4f5ced1707_945x945.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j3Ob!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f5ed1a7-e1e2-4fc4-93c0-ad4f5ced1707_945x945.png" width="945" height="945" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6f5ed1a7-e1e2-4fc4-93c0-ad4f5ced1707_945x945.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:945,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Image created with FLUX.1: Me riding a giant garlic in a green field with a watercolour painting touch.&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="Image created with FLUX.1: Me riding a giant garlic in a green field with a watercolour painting touch." title="Image created with FLUX.1: Me riding a giant garlic in a green field with a watercolour painting touch." srcset="https://substackcdn.com/image/fetch/$s_!j3Ob!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f5ed1a7-e1e2-4fc4-93c0-ad4f5ced1707_945x945.png 424w, https://substackcdn.com/image/fetch/$s_!j3Ob!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f5ed1a7-e1e2-4fc4-93c0-ad4f5ced1707_945x945.png 848w, https://substackcdn.com/image/fetch/$s_!j3Ob!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f5ed1a7-e1e2-4fc4-93c0-ad4f5ced1707_945x945.png 1272w, https://substackcdn.com/image/fetch/$s_!j3Ob!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6f5ed1a7-e1e2-4fc4-93c0-ad4f5ced1707_945x945.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Image by Author</figcaption></figure></div><p>At some point, I realised that these images could make a great book for my daughter, so I decided to take around 20 photos of her favourite toy, called Pupilo, and fine-tune a model on Replicate. Next, I generated images of Pupilo on a space exploration mission, and I manually put the images and the story together. Finally, I used <a href="https://kdp.amazon.com/">Amazon KDP</a> to publish the book, and I shipped a sample to my home address. The cover looked like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UqJ0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f108b76-fb02-4803-963e-dbf62ca68ab4_945x461.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UqJ0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f108b76-fb02-4803-963e-dbf62ca68ab4_945x461.png 424w, https://substackcdn.com/image/fetch/$s_!UqJ0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f108b76-fb02-4803-963e-dbf62ca68ab4_945x461.png 848w, https://substackcdn.com/image/fetch/$s_!UqJ0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f108b76-fb02-4803-963e-dbf62ca68ab4_945x461.png 1272w, https://substackcdn.com/image/fetch/$s_!UqJ0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f108b76-fb02-4803-963e-dbf62ca68ab4_945x461.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UqJ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f108b76-fb02-4803-963e-dbf62ca68ab4_945x461.png" width="945" height="461" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3f108b76-fb02-4803-963e-dbf62ca68ab4_945x461.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:461,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A cover book of a toy with the shape of pulp.&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="A cover book of a toy with the shape of pulp." title="A cover book of a toy with the shape of pulp." srcset="https://substackcdn.com/image/fetch/$s_!UqJ0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f108b76-fb02-4803-963e-dbf62ca68ab4_945x461.png 424w, https://substackcdn.com/image/fetch/$s_!UqJ0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f108b76-fb02-4803-963e-dbf62ca68ab4_945x461.png 848w, https://substackcdn.com/image/fetch/$s_!UqJ0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f108b76-fb02-4803-963e-dbf62ca68ab4_945x461.png 1272w, https://substackcdn.com/image/fetch/$s_!UqJ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3f108b76-fb02-4803-963e-dbf62ca68ab4_945x461.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Image by Author</figcaption></figure></div><p>When the book finally arrived home, I was super excited to show it to my daughter. She saw it with her giant eyes and smiled. She crawled towards me and grabbed the book. It wasn&#8217;t long before she decided to put it in her mouth and crumple it completely!</p><p>It&#8217;s ok, it was my fault, I picked the worst quality paper, and the cover was very soft. But I didn&#8217;t give up there, I was ready to make a stronger and better book to pass my daughter&#8217;s quality checks. Not only that, I wanted to make the process completely or at least partially automated.</p><p><strong>For that, I needed to build the following workflow:</strong></p><ol><li><p>Use Replicate to fine-tune a model based on a ZIP file containing 20 good-quality photos.</p></li><li><p>Use LLMs with Python to produce a simple and amusing story based on key inputs. Split the story into 13 paragraphs with an image prompt for each one of them.</p></li><li><p>Use the Replicate API with Python to generate several images for each one of the previously created prompts.</p></li><li><p>Manually select the images that go with each one of the paragraphs.</p></li><li><p>Create a Python script that takes each one of the selected images and the corresponding paragraph and generates a PDF file with the right dimensions for shipping.</p></li><li><p>Finally, ship the book to my address using <a href="https://api.lulu.com/auth/realms/glasstree/protocol/openid-connect/auth?client_id=lulu-website&amp;scope=openid&amp;response_type=code&amp;redirect_uri=https%3A%2F%2Fwww.lulu.com%2Fapi%2Fauth%2Fcallback%2Fkeycloak&amp;state=yinZVOPSdURcY-iElbpYef2UYF0sFo_ADBS6vEIAGd0&amp;code_challenge=pmM9RysTdCorLU7WhQLwp17qujRTuhfv-svBVJhzcnM&amp;code_challenge_method=S256&amp;__cf_chl_rt_tk=KXGEoPnSOhbDkVdo9apPPBUJk1JbT0LOoHS7anGcv7M-1734050329-1.0.1.1-ObaynP_KwdoBPT8pWUjxgixYMPbPe6XwDyHTzOoLxDw">Lulu</a>.</p></li></ol><p>In this piece, I will guide you through the process I&#8217;ve designed to make AI-generated books while showing you how to integrate the Replicate API with Python as well as how to use the <a href="https://huggingface.co/chat/">hugchat</a> API with Lamma 3.3 to generate paragraphs.</p><div class="poll-embed" data-attrs="{&quot;id&quot;:315528}" data-component-name="PollToDOM"></div><p></p><div><hr></div><h1><strong>Fine-tune the FLUX.1 model on Replicate</strong></h1><p>Several platforms, such as <a href="https://fal.ai/">fal.ai</a> and <a href="https://www.mystic.ai/">mystic</a>, offer fine-tuning for FLUX.1 and other AI models. However, I became quite familiar with <a href="https://replicate.com/explore">Replicate</a>, which costs around $1 per model.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0ETZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45942ae-db94-4b3b-88e1-38ab557431d3_945x470.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0ETZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45942ae-db94-4b3b-88e1-38ab557431d3_945x470.png 424w, https://substackcdn.com/image/fetch/$s_!0ETZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45942ae-db94-4b3b-88e1-38ab557431d3_945x470.png 848w, https://substackcdn.com/image/fetch/$s_!0ETZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45942ae-db94-4b3b-88e1-38ab557431d3_945x470.png 1272w, https://substackcdn.com/image/fetch/$s_!0ETZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45942ae-db94-4b3b-88e1-38ab557431d3_945x470.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0ETZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45942ae-db94-4b3b-88e1-38ab557431d3_945x470.png" width="945" height="470" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e45942ae-db94-4b3b-88e1-38ab557431d3_945x470.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:470,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Explore page of Replicate website.&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="Explore page of Replicate website." title="Explore page of Replicate website." srcset="https://substackcdn.com/image/fetch/$s_!0ETZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45942ae-db94-4b3b-88e1-38ab557431d3_945x470.png 424w, https://substackcdn.com/image/fetch/$s_!0ETZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45942ae-db94-4b3b-88e1-38ab557431d3_945x470.png 848w, https://substackcdn.com/image/fetch/$s_!0ETZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45942ae-db94-4b3b-88e1-38ab557431d3_945x470.png 1272w, https://substackcdn.com/image/fetch/$s_!0ETZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45942ae-db94-4b3b-88e1-38ab557431d3_945x470.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://replicate.com/explore">Replicate</a>&#8217;s explore page</figcaption></figure></div><p>The FLUX.1 model can be used for free on <a href="https://huggingface.co/black-forest-labs/FLUX.1-dev">Hugging Face</a>, but for fine-tuning and accessing the professional version of the model, you need to create an account on Replicate and add a billing account.</p><p>Once done, you need to collect between 14 and 20 photos of the person, animal or object you want to train on. The better the quality the better your model will be.</p><p>Once done, you need to collect between 14 and 20 photos of the person, animal or object you want to train on. The better the quality the better your model will be.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rEtU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49203df1-21fb-475c-b6de-801fb82ab520_945x551.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rEtU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49203df1-21fb-475c-b6de-801fb82ab520_945x551.png 424w, https://substackcdn.com/image/fetch/$s_!rEtU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49203df1-21fb-475c-b6de-801fb82ab520_945x551.png 848w, https://substackcdn.com/image/fetch/$s_!rEtU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49203df1-21fb-475c-b6de-801fb82ab520_945x551.png 1272w, https://substackcdn.com/image/fetch/$s_!rEtU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49203df1-21fb-475c-b6de-801fb82ab520_945x551.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rEtU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49203df1-21fb-475c-b6de-801fb82ab520_945x551.png" width="945" height="551" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49203df1-21fb-475c-b6de-801fb82ab520_945x551.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:551,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;18 photos of myself.&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="18 photos of myself." title="18 photos of myself." srcset="https://substackcdn.com/image/fetch/$s_!rEtU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49203df1-21fb-475c-b6de-801fb82ab520_945x551.png 424w, https://substackcdn.com/image/fetch/$s_!rEtU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49203df1-21fb-475c-b6de-801fb82ab520_945x551.png 848w, https://substackcdn.com/image/fetch/$s_!rEtU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49203df1-21fb-475c-b6de-801fb82ab520_945x551.png 1272w, https://substackcdn.com/image/fetch/$s_!rEtU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49203df1-21fb-475c-b6de-801fb82ab520_945x551.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">18 photos of me to fine-tune a model on <a href="https://replicate.com/explore">Replicate</a></figcaption></figure></div><p>Once you have the photos, you need to compress them into a ZIP file and head to the <code>ostris/flux-dev-lora-trainer</code> page on Replicate.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!e4JV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45671ceb-e770-435e-8839-b90f32fdf179_945x489.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!e4JV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45671ceb-e770-435e-8839-b90f32fdf179_945x489.png 424w, https://substackcdn.com/image/fetch/$s_!e4JV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45671ceb-e770-435e-8839-b90f32fdf179_945x489.png 848w, https://substackcdn.com/image/fetch/$s_!e4JV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45671ceb-e770-435e-8839-b90f32fdf179_945x489.png 1272w, https://substackcdn.com/image/fetch/$s_!e4JV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45671ceb-e770-435e-8839-b90f32fdf179_945x489.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!e4JV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45671ceb-e770-435e-8839-b90f32fdf179_945x489.png" width="945" height="489" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45671ceb-e770-435e-8839-b90f32fdf179_945x489.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:489,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;FLUX model fine tuner page on Replicate.&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="FLUX model fine tuner page on Replicate." title="FLUX model fine tuner page on Replicate." srcset="https://substackcdn.com/image/fetch/$s_!e4JV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45671ceb-e770-435e-8839-b90f32fdf179_945x489.png 424w, https://substackcdn.com/image/fetch/$s_!e4JV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45671ceb-e770-435e-8839-b90f32fdf179_945x489.png 848w, https://substackcdn.com/image/fetch/$s_!e4JV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45671ceb-e770-435e-8839-b90f32fdf179_945x489.png 1272w, https://substackcdn.com/image/fetch/$s_!e4JV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45671ceb-e770-435e-8839-b90f32fdf179_945x489.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The <code>ostris/flux-dev-lora-trainer page to fine tune FLUX.1 models</code></figcaption></figure></div><p>Here you&#8217;ll need to choose a trigger word for your model to be called, and be sure to use something random like &#8220;MRCFTMGA&#8221;. For instance, if you&#8217;re called Mario and use the trigger word &#8220;MARIO&#8221;, chances are that you&#8217;ll be generating images of you driving karts and dressed in red, or worse, images of Mario and Luigi instead of you.</p><p>You can leave the default settings in most of the fields, just upload the zip file with all your photos, and run the API. Wait around 10 minutes, and you&#8217;ll have your model ready to start generating images like this</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SWOo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45397f9-6c7f-4929-9804-40188c7ec878_945x945.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SWOo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45397f9-6c7f-4929-9804-40188c7ec878_945x945.png 424w, https://substackcdn.com/image/fetch/$s_!SWOo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45397f9-6c7f-4929-9804-40188c7ec878_945x945.png 848w, https://substackcdn.com/image/fetch/$s_!SWOo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45397f9-6c7f-4929-9804-40188c7ec878_945x945.png 1272w, https://substackcdn.com/image/fetch/$s_!SWOo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45397f9-6c7f-4929-9804-40188c7ec878_945x945.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SWOo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45397f9-6c7f-4929-9804-40188c7ec878_945x945.png" width="945" height="945" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f45397f9-6c7f-4929-9804-40188c7ec878_945x945.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:945,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;An AI generated image of me with colorful clothes&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="An AI generated image of me with colorful clothes" title="An AI generated image of me with colorful clothes" srcset="https://substackcdn.com/image/fetch/$s_!SWOo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45397f9-6c7f-4929-9804-40188c7ec878_945x945.png 424w, https://substackcdn.com/image/fetch/$s_!SWOo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45397f9-6c7f-4929-9804-40188c7ec878_945x945.png 848w, https://substackcdn.com/image/fetch/$s_!SWOo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45397f9-6c7f-4929-9804-40188c7ec878_945x945.png 1272w, https://substackcdn.com/image/fetch/$s_!SWOo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45397f9-6c7f-4929-9804-40188c7ec878_945x945.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Image of me generated using a fine-tuned version of FLUX.1 on Replicate</figcaption></figure></div><p>If you want to use your fine-tuned model with Python, you can click on it and you&#8217;ll see a tab for Python with all the steps to call the API.</p><p>First, you need to install the Replicate package via pip:</p><pre><code>pip install replicate</code></pre><p>Second, you need to export your token:</p><pre><code>export REPLICATE_API_TOKEN=&lt;my_token&gt;</code></pre><p>And finally, run the model using:</p><pre><code>output = replicate.run(
    "macrodrigues/marco_pupilo_model:&lt;some_code&gt;",
    input={
        "model": "dev",
        "go_fast": False,
        "lora_scale": 1,
        "megapixels": "1",
        "num_outputs": 1,
        "aspect_ratio": "1:1",
        "output_format": "webp",
        "guidance_scale": 3,
        "output_quality": 80,
        "prompt_strength": 0.8,
        "extra_lora_scale": 1,
        "num_inference_steps": 28
    }
)
print(output)</code></pre><p>The input settings you see above are the same settings the platform supports, so you can first take a look a them manually and see what you can adjust in the Python dictionary.</p><h1><strong>Use the HuggingChat API to build a story and generate image prompts</strong></h1><p>When it comes to using LLMs, people often think about OpenAI&#8217;s API because it is powerful and easy to implement. However, it comes with a cost. Instead, there are open-source source models that can be used completely for free with the <a href="https://github.com/Soulter/hugging-chat-api">hugchat API</a> built by <a href="https://github.com/Soulter">Soulter</a>.</p><p>This API uses <a href="https://huggingface.co/chat/">HuggingChat</a>, which supports state-of-the-art models, such as <a href="https://www.llama.com/docs/model-cards-and-prompt-formats/llama3_3/">Llama 3.3</a> from Meta and <a href="https://huggingface.co/collections/Qwen/qwen25-66e81a666513e518adb90d9e">Qwen 2.5</a> from Alibaba Cloud.</p><p>To use it, you first need to have an account on <a href="https://huggingface.co/">Hugging Face</a>. Then, you need to select the model you want to use to generate the paragraphs of the story directly in the chat&#8217;s console settings.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hFht!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a49e42-2be3-4d48-b79b-1f0acfc4f2d3_945x598.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hFht!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a49e42-2be3-4d48-b79b-1f0acfc4f2d3_945x598.png 424w, https://substackcdn.com/image/fetch/$s_!hFht!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a49e42-2be3-4d48-b79b-1f0acfc4f2d3_945x598.png 848w, https://substackcdn.com/image/fetch/$s_!hFht!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a49e42-2be3-4d48-b79b-1f0acfc4f2d3_945x598.png 1272w, https://substackcdn.com/image/fetch/$s_!hFht!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a49e42-2be3-4d48-b79b-1f0acfc4f2d3_945x598.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hFht!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a49e42-2be3-4d48-b79b-1f0acfc4f2d3_945x598.png" width="945" height="598" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/81a49e42-2be3-4d48-b79b-1f0acfc4f2d3_945x598.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:598,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Console of HuggingChat showing the option to change the LLM.&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="Console of HuggingChat showing the option to change the LLM." title="Console of HuggingChat showing the option to change the LLM." srcset="https://substackcdn.com/image/fetch/$s_!hFht!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a49e42-2be3-4d48-b79b-1f0acfc4f2d3_945x598.png 424w, https://substackcdn.com/image/fetch/$s_!hFht!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a49e42-2be3-4d48-b79b-1f0acfc4f2d3_945x598.png 848w, https://substackcdn.com/image/fetch/$s_!hFht!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a49e42-2be3-4d48-b79b-1f0acfc4f2d3_945x598.png 1272w, https://substackcdn.com/image/fetch/$s_!hFht!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81a49e42-2be3-4d48-b79b-1f0acfc4f2d3_945x598.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><a href="https://huggingface.co/chat/">HuggingChat</a> console ad</figcaption></figure></div><p>You can find the settings icon next to the model&#8217;s name. A window will then appear with all the available models.</p><p>Once done, we can open the IDE and create a Python function that will generate the story and image prompts:</p><pre><code>import os
from hugchat import hugchat
from hugchat.login import Login

def gen_prompts_n_paragraphs(
        language: str,
        description: str,
        name: str):
    """ This function generate image prompts and a history. """

    # Log in to huggingface and grant authorization to huggingchat
    cookie_path_dir = "./cookies/"
    sign = Login(os.getenv('email'), os.getenv('password'))
    cookies = sign.login(cookie_dir_path=cookie_path_dir, save_cookies=True)

    # Create your ChatBot
    chatbot = hugchat.ChatBot(cookies=cookies.get_dict())

    # Input query
    input_query = (f"Write a 13-paragraph story about the character '{name}'"
                   f", based on this description:\n\n'{description}'"
                   "\n\nThe story must have a clear beginning, middle, and"
                   " end. Each paragraph should be numbered (1 to 13) and "
                   "be 18-55 words long. After each paragraph, provide a "
                   "corresponding numbered image prompt (1 to 13) that "
                   f"starts with 'A photo of {name}' and ends with "
                   "'in the style of TOK.' The image prompts must match the"
                   " content of the corresponding paragraph. Use simple, "
                   f"accessible {language} language for a story that's "
                   f"accessible for all ages and for non-{language} native"
                   " speakers, but always leave the image prompts in English. "
                   f"If you introduce new characters, always mention what the" 
                   " character/object is in the prompt.")

    res = chatbot.chat(input_query)

    # Open the file in write mode and save the text
    with open('prompt_response.txt', "w") as file:
        file.write(str(res))</code></pre><p>The function above is one of the first in the workflow because it produces the core elements of the story. In the next chapter, we are going to see how we use the fine-tuned model with the image prompts.</p><h1><strong>Use Python with the Replicate API to generate images</strong></h1><p>The Replicate API is limited to 4 image outputs for each run. For my project, I wanted to have at least 8 images per paragraph, because the results aren&#8217;t always what we expect, so I wanted to be sure that at least one of the 8 images is decent.</p><p>Therefore, I created a script that generates 4 outputs twice in a Python loop and saves them in specific folders.</p><pre><code>""" This fuction generates the images """
# pylint: disable=W0718
import os
import time
import requests
import replicate


def gen_images(
        img_prompts: list,
        model: str):
    """ This function generates the images with FLUX1. and 
    saves them in a folder. It takes the image prompts as inputs and
    the model. """

    retries = 0
    while retries &lt; 5:
        try:
            break
        except Exception as error:
            print(error)
            retries += 1

    for j, prompt in enumerate(img_prompts):
        group_of_images = []
        for i in range(2):
            images = replicate.run(
                model,
                input={
                    "model": "dev",
                    "prompt": prompt,
                    "extra_lora": "lucataco/flux-watercolor",
                    "lora_scale": 1.2,
                    "num_outputs": 4,
                    "aspect_ratio": "1:1",
                    "output_format": "png",
                    "guidance_scale": 3.5,
                    "output_quality": 100,
                    "extra_lora_scale": 1,
                    "num_inference_steps": 28
                }
            )
            # Add some time to not saturate the API calls
            time.sleep(30)

            # Batch of images
            group_of_images.append(images)

        # Flatten group of images
        images_flat = [
            item for sublist in group_of_images for item in sublist]

        # Create a folder to store the batch of images
        folder_name = f"images/prompt_{j+1}"
        if not os.path.exists(folder_name):
            os.makedirs(folder_name)

        # Download and save each image
        for i, url in enumerate(images_flat):
            response = requests.get(url, timeout = 50000)
            if response.status_code == 200:

                # Define the file name and path
                file_name = f"image_{i + 1}.png"
                file_path = os.path.join(folder_name, file_name)

                # Write the image to the file
                with open(file_path, "wb") as file:
                    file.write(response.content)
                print(f"Downloaded {file_name}")
            else:
                print(f"Failed to download {url}")

        print(f"All images downloaded and saved in images/prompt_{j+1}")</code></pre><p>You can see in the replicate dictionary that I use a second LoRa called <code>lucataco/flux-watercolor</code>, this creates the watercolour painting style in the images because I don&#8217;t want them to look super realistic.</p><p>This step can take up to 20 minutes and costs a few dollars to generate around 104 images. From this total, I select 15, one for each paragraph (13) and 2 for the cover.</p><h1><strong>Use the ReportLab toolkit with Python to create PDF files</strong></h1><p>With the images generated and selected, it&#8217;s time to create the book pages! Definitely, I didn&#8217;t want to manually create them with Canvas, PowerPoint or any other software, because it takes a significant amount of time.</p><p>Therefore, I created a Python script with the ReportLab toolkit to generate the body of the book. First ,I had to install the library:</p><pre><code>pip install reportlab</code></pre><p>Second, I put together a group of functions that correctly create the body, the title, and the dedication of the book:</p><pre><code>import os
from PIL import Image
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase.pdfmetrics import stringWidth
from PyPDF2 import PdfMerger


def gen_book_pages(
        image_path: str,
        index: int,
        text: str):
    """ This function creates a combined pdf file with an image and the text
    in the second page. It takes the image path, an index and a paragraph."""

    logo = 'tools/book/logo_pupilo.png'
    output_image = f"outputs/image_pages/output_image_{index}.pdf"
    output_text = f"outputs/image_pages/output_text_{index}.pdf"
    custom_font = "tools/book/AbhayaLibre-Medium.ttf"

    # Desired size in pixels
    target_width, target_height = 558, 558

    # Resize the original image to 7.75 inches x 7.75 inches (558x558 pixels)
    with Image.open(image_path) as img:
        # Calculate cropping box
        width, height = img.size

        # Calculate aspect ratios
        aspect_ratio_img = width / height
        aspect_ratio_target = target_width / target_height

        # Crop the image to fit the target dimensions
        if aspect_ratio_img &gt; aspect_ratio_target:
            # Image is wider than target, crop sides
            new_width = int(height * aspect_ratio_target)
            left = (width - new_width) // 2
            top = 0
            right = left + new_width
            bottom = height
        else:
            # Image is taller than target, crop top and bottom
            new_height = int(width / aspect_ratio_target)
            left = 0
            top = (height - new_height) // 2
            right = width
            bottom = top + new_height

        resized_img = img.crop((left, top, right, bottom))
        resized_img.save('resized_image.png', format='PNG', dpi=(500, 500))

    # Create a PDF with the resized original image
    c = canvas.Canvas(output_image, pagesize=(558, 558))
    c.drawImage('resized_image.png', 0, 0, width=558, height=558)
    c.save()

    # Register the custom TTF font
    pdfmetrics.registerFont(TTFont('CustomFont', custom_font))

    # Create a separate PDF with centered text and an additional image
    c = canvas.Canvas(output_text, pagesize=(558, 558))

    c.setFillColorRGB(0.15, 0.16, 0.16)  # Custom RGB values (between 0 and 1)    

    # Set margins and draw the text within the specified box
    left_margin = 1 * 72  # 1 inch = 72 pixels
    right_margin = 1 * 72  # 1 inch = 72 pixels
    text_width = 558 - left_margin - right_margin
    font_name = "CustomFont"
    font_size = 26

    # Split the text into lines that fit within the text box width
    words = text.split()
    lines = []
    current_line = ""
    for word in words:
        if stringWidth(
            current_line + " " + word, font_name, font_size) &lt;= text_width:
            current_line += " " + word if current_line else word
        else:
            lines.append(current_line)
            current_line = word
    lines.append(current_line)  # Append the last line

    # Draw the text lines left-aligned within the text box
    y_position = (558 / 2) + (len(lines) * font_size) / 2  # Start from center
    for line in lines:
        c.setFont(font_name, font_size)
        c.drawString(left_margin, y_position, line)
        y_position -= font_size * 1.2

    # Add the logo
    offset_left = 0.1 * 72  # Convert inches to pixels (14.4 pixels)
    offset_bottom = 0.3 * 72  # Convert inches to pixels (21.6 pixels)
    c.drawImage(logo, offset_left, offset_bottom, 90, 90)
    c.save()

    # Combine the two PDFs
    merger = PdfMerger()
    merger.append(output_image)
    merger.append(output_text)
    merger.write(f"outputs/image_pages/output_combined_{index}.pdf")
    merger.close()

    os.remove(output_image)
    os.remove(output_text)</code></pre><p>In the next chapter, we are going to see the final touches and how the books look on paper!</p><h1><strong>Final adjustments and shipping</strong></h1><p>All the PDFs were created respecting the dimensions of the printing platform, which in my case is <a href="https://www.lulu.com/">Lulu</a>. The same applies to the covers, which I decided to do manually because they need another level of detail that only a human can do.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pzw1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18cb6095-2ffa-4bdd-804f-8cca12cea7c8_945x506.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pzw1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18cb6095-2ffa-4bdd-804f-8cca12cea7c8_945x506.png 424w, https://substackcdn.com/image/fetch/$s_!pzw1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18cb6095-2ffa-4bdd-804f-8cca12cea7c8_945x506.png 848w, https://substackcdn.com/image/fetch/$s_!pzw1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18cb6095-2ffa-4bdd-804f-8cca12cea7c8_945x506.png 1272w, https://substackcdn.com/image/fetch/$s_!pzw1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18cb6095-2ffa-4bdd-804f-8cca12cea7c8_945x506.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pzw1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18cb6095-2ffa-4bdd-804f-8cca12cea7c8_945x506.png" width="945" height="506" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/18cb6095-2ffa-4bdd-804f-8cca12cea7c8_945x506.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:506,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Cover of book about muchrooms that was created using FLUX.1.&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="Cover of book about muchrooms that was created using FLUX.1." title="Cover of book about muchrooms that was created using FLUX.1." srcset="https://substackcdn.com/image/fetch/$s_!pzw1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18cb6095-2ffa-4bdd-804f-8cca12cea7c8_945x506.png 424w, https://substackcdn.com/image/fetch/$s_!pzw1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18cb6095-2ffa-4bdd-804f-8cca12cea7c8_945x506.png 848w, https://substackcdn.com/image/fetch/$s_!pzw1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18cb6095-2ffa-4bdd-804f-8cca12cea7c8_945x506.png 1272w, https://substackcdn.com/image/fetch/$s_!pzw1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F18cb6095-2ffa-4bdd-804f-8cca12cea7c8_945x506.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Example of a book cover created by author</figcaption></figure></div><p>Once I have the body and the cover, with the right dimensions, I upload both PDF files to the Lulu website, give my address, and <em>voil&#225;</em>! In the next few days, the book arrives at my door.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zh6z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd578d85f-fb8f-4079-9f3a-815ac358eda9_945x945.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zh6z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd578d85f-fb8f-4079-9f3a-815ac358eda9_945x945.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zh6z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd578d85f-fb8f-4079-9f3a-815ac358eda9_945x945.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zh6z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd578d85f-fb8f-4079-9f3a-815ac358eda9_945x945.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zh6z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd578d85f-fb8f-4079-9f3a-815ac358eda9_945x945.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zh6z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd578d85f-fb8f-4079-9f3a-815ac358eda9_945x945.jpeg" width="945" height="945" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d578d85f-fb8f-4079-9f3a-815ac358eda9_945x945.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:945,&quot;width&quot;:945,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Several images of an AI generated book that was created using FLUX.1 model&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="Several images of an AI generated book that was created using FLUX.1 model" title="Several images of an AI generated book that was created using FLUX.1 model" srcset="https://substackcdn.com/image/fetch/$s_!zh6z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd578d85f-fb8f-4079-9f3a-815ac358eda9_945x945.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zh6z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd578d85f-fb8f-4079-9f3a-815ac358eda9_945x945.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zh6z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd578d85f-fb8f-4079-9f3a-815ac358eda9_945x945.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zh6z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd578d85f-fb8f-4079-9f3a-815ac358eda9_945x945.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photos of AI generated book &#8212; by author</figcaption></figure></div><p>The goal is to craft a personalized book designed specifically for an individual, which makes the printing cost higher compared to producing books for a broader audience. However, these custom books can also be ordered in bulk by schools and institutions wishing to highlight a particular character.</p><p>I named this project "Pupilo Books" because it began with my daughter&#8217;s toy, Pupilo. Currently, I&#8217;m creating these books for family and friends, but I&#8217;ve noticed genuine excitement from others who have expressed interest in having one. To make this accessible, I&#8217;ve set up an <a href="http://pupilobooks@gmail.com/">email</a> where you can reach out to bring your vision to life: <strong>pupilobooks@gmail.com</strong>.</p><p><em><strong>Need help with automation, AI, or data science? Let&#8217;s talk.</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://calendar.app.google/jaULmLguQX8KbikZ6&quot;,&quot;text&quot;:&quot;Book a 20-min consultation&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://calendar.app.google/jaULmLguQX8KbikZ6"><span>Book a 20-min consultation</span></a></p><div><hr></div><h3>Conclusion</h3><p>Currently, the internet is populated with AI-generated books, but many of the examples I&#8217;ve come across lack a personal, humorous touch. There&#8217;s no one better than you to create an emotional or funny story about your mother, it&#8217;s not something a company can replicate. You need to provide the inputs, and that&#8217;s the concept behind Pupilo Books.</p><p>That said, there are still limitations with current APIs. For example, generating images of public figures is challenging, and characters&#8217; appearances, such as clothing, hairstyles, or body types, often change inconsistently throughout the story. This makes it difficult to maintain coherence or introduce a second character with proper context.</p><p>For now, Pupilo Books can produce funny and emotional stories, but they lack precision, so the inputs must follow specific constraints, and users should understand the limitations.</p><p>Even with these challenges, experimenting with AI is incredibly fun and a great creative exercise. It encourages you to explore state-of-the-art models and think outside the box. Given the fierce competition among AI companies, simply exploring and experimenting in your free time can be already very rewarding and prepare you for a future where AI is very much like oxygen.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.dadhalfdev.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Curious about what I&#8217;m building? &#128064;</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item></channel></rss>