<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>JAlcocerT Blog – Blogs</title><link>https://JAlcocerT.github.io/JAlcocerT/blog/</link><description>Recent content in Blogs on JAlcocerT Blog</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 02 Jun 2026 09:20:21 +0100</lastBuildDate><atom:link href="https://JAlcocerT.github.io/JAlcocerT/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Vacations with Python + ADK</title><link>https://JAlcocerT.github.io/JAlcocerT/py-vacations/</link><pubDate>Tue, 02 Jun 2026 09:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/py-vacations/</guid><description>
&lt;p>Already got freedom in time?&lt;/p>
&lt;p>&lt;code>https://aegis-freedom.pages.dev/&lt;/code>&lt;/p>
&lt;p>For simple static pages, Playwright is usually overkill. Prefer fetch, curl, cheerio, BeautifulSoup, or an API if available. Use Playwright when browser behavior matters.&lt;/p>
&lt;p>Be careful with robots.txt, site terms, rate limits, login-protected content, personal data, and aggressive parallel scraping. Scraping with a browser is heavier and easier to
get blocked if you hit a site hard.&lt;/p>
&lt;p>&lt;a href="https://github.com/dawarich-app/atlas" target="_blank" rel="noopener">https://github.com/dawarich-app/atlas&lt;/a>&lt;/p>
&lt;p>Your favorite offline self-hostable maps. City, Country, Planet, you choose.&lt;/p>
&lt;p>&lt;a href="https://atlas.dawarich.app/docs/quickstart" target="_blank" rel="noopener">https://atlas.dawarich.app/docs/quickstart&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /poc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/z-poc-trip-planner-v4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://github.com/JAlcocerT/poc/tree/main/z-poc-trip-planner-v4&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>Which I have statically deployed at: &lt;code>https://17e286bf.trip-planner-9lt.pages.dev/&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>You should probably know the WHY you are going somewhere first.&lt;/p>
&lt;p>This will just reply to the where/how.&lt;/p>
&lt;p>[AI] Vacation Planning - Recommendations, Costs, Weather&lt;/p>
&lt;p>Python App to explore vacAItion destination. LLMs ❤️ Data. While exploring Agents&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Following the TripPlanner, I thought that bringing cost of living data was a good idea.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/trip-planner" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Trip Planner Selfhostable DASH | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Trip-Planner" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Trip-Planner Repo ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>For the cost of living data, we can take online info&amp;hellip;&lt;/p>
&lt;p>Because weather and cost is all that matter, right?&lt;/p>
&lt;blockquote>
&lt;p>This one goes for these people that claim to love Asia, without explainin&amp;rsquo; why :)&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>&lt;a href="https://github.com/firecrawl/fireplexity" target="_blank" rel="noopener">https://github.com/firecrawl/fireplexity&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Open Source Perplexity like AI search engine with real-time citations, streaming responses, and live data powered by Firecrawl&lt;/p>
&lt;/blockquote>
&lt;p>AI search engine with web, news, and images. You will need firecrawl and groq Apis.&lt;/p>
&lt;p>&lt;a href="https://wanderlog.com/" target="_blank" rel="noopener">https://wanderlog.com/&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://selfh.st/apps/?search=trip" target="_blank" rel="noopener">https://selfh.st/apps/?search=trip&lt;/a>&lt;/p>
&lt;p>trip software
&lt;a href="https://jalcocert.github.io/JAlcocerT/tech-for-a-trip/#trip-planner" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/tech-for-a-trip/#trip-planner&lt;/a>
&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/hardware/travel-pakc.jpg" alt="Travel pack" loading="lazy" />&lt;/p>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/geo-maps-and-data/" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/geo-maps-and-data/&lt;/a>&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/umbrel-os/wanderer-gpx.png" alt="Wanderer supports creating routes and GPX" loading="lazy" />&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/blob/main/reitti/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Reitti | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/blob/main/wanderer/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Wanderer | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>&lt;a href="https://github.com/dedicatedcode/reitti" target="_blank" rel="noopener">https://github.com/dedicatedcode/reitti&lt;/a>
immich with reitti&lt;/p>
&lt;p>&lt;a href="https://github.com/MrModest/reisenotiz" target="_blank" rel="noopener">https://github.com/MrModest/reisenotiz&lt;/a>&lt;/p>
&lt;p>vpns: tailscale, wireguard&lt;/p>
&lt;p>&lt;code>https://www.albertina.at/en/&lt;/code>&lt;/p>
&lt;h2>Py Vacations&lt;span class="absolute -mt-20" id="py-vacations">&lt;/span>
&lt;a href="#py-vacations" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>I tried to add &lt;a href="https://jalcocert.github.io/JAlcocerT/using-langchain-with-pandas-df/" target="_blank" rel="noopener">AI capabilities to the trip planner&lt;/a> but it didnt work out well.&lt;/p>
&lt;p>It all started &lt;a href="https://github.com/JAlcocerT/Private/tree/main/Py_Vacations" target="_blank" rel="noopener">here, messed with other small projects&lt;/a>&lt;/p>
&lt;h3>Weather Data&lt;span class="absolute -mt-20" id="weather-data">&lt;/span>
&lt;a href="#weather-data" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://docs.streamlit.io/develop/api-reference/media/st.audio" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">ST Audio Component DOCS ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Docker/tree/main/Dev/Python_apps/Python_Streamlit" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Python Streamlit App Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;h3>Home Data&lt;span class="absolute -mt-20" id="home-data">&lt;/span>
&lt;a href="#home-data" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h4>Airbnb Listing with Smithery and MCP&lt;span class="absolute -mt-20" id="airbnb-listing-with-smithery-and-mcp">&lt;/span>
&lt;a href="#airbnb-listing-with-smithery-and-mcp" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>And no API key!&lt;/p>
&lt;h3>Cost of Living Data&lt;span class="absolute -mt-20" id="cost-of-living-data">&lt;/span>
&lt;a href="#cost-of-living-data" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>You could use playwright, or others like&lt;/p>
&lt;p>But you can get away with bs4 actually.&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>I got to know that something similar exists: &lt;code>https://nomads.com/&lt;/code> from cool solopreneurs.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make cost-warsaw-capitals &lt;span class="nv">COST_ARGS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;--limit 5 --delay-seconds 0.5 --fresh&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> make cost-warsaw-capitals &lt;span class="nv">COST_ARGS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;--delay-seconds 10&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> make time-overlay-data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> make cost-overlay-data&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Other Trip Apps&lt;span class="absolute -mt-20" id="other-trip-apps">&lt;/span>
&lt;a href="#other-trip-apps" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://github.com/itskovacs/trip" target="_blank" rel="noopener">https://github.com/itskovacs/trip&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>🗺️ Minimalist POI Map Tracker and Trip Planner&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/Photo/TRIP.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/trip" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Selfhostable Trip | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;ul>
&lt;li>&lt;a href="https://github.com/leoneljdias/tempo" target="_blank" rel="noopener">https://github.com/leoneljdias/tempo&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;strong>MIT&lt;/strong> | Self-hosted weather API based on ECMWF data, serving colorized WebP maps and GeoJSON contours for easy integration with MapLibre, Leaflet, OpenLayers, and other GIS platforms&lt;/p>
&lt;/blockquote>
&lt;p>lastminute.com&lt;/p>
&lt;p>&lt;em>Where to go. When to go. Can I go?&lt;/em>&lt;/p>
&lt;p>Some time ago, I made a &lt;a href="https://github.com/JAlcocerT/Py_Trip_Planner" target="_blank" rel="noopener">Trip Planner Web App&lt;/a>, based purely on weather patterns as &lt;a href="https://jalcocert.github.io/JAlcocerT/trip-planner-with-weather/" target="_blank" rel="noopener">described here&lt;/a>.&lt;/p>
&lt;p>If you are tired of this:&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/memes/oldnewjob.jpg" alt="Karting Adventure" loading="lazy" />&lt;/p>
&lt;p>Why not taking a break in between?&lt;/p>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">[How to] Spin the Python Trip Planner! 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;ul>
&lt;li>Follow the &lt;a href="https://github.com/JAlcocerT/Py_Trip_Planner/tree/main/Deploy" target="_blank" rel="noopener">repo instructions&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/Py_Trip_Planner &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">cd&lt;/span> ./Py_Trip_Planner&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker build -t trip_planner .&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">DOCKER_BUILDKIT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> docker build --no-cache --progress&lt;span class="o">=&lt;/span>plain -t trip_planner .&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">docker run -d &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --name tripplanner &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -p 8051:8050 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --restart unless-stopped &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> trip_planner &lt;span class="c1">#ghcr.io/jalcocert/py_trip_planner #fossengineer/trip_planner&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Or&amp;hellip;Use the following &lt;strong>docker compose&lt;/strong>:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;p>&amp;lt;a
class=&amp;ldquo;hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900&amp;quot;href=&amp;ldquo;&lt;a href="https://github.com/JAlcocerT/Home-Lab/tree/main/trip-planner%22" target="_blank" rel="noopener">https://github.com/JAlcocerT/Home-Lab/tree/main/trip-planner"&lt;/a> target=&amp;quot;_blank&amp;rdquo; rel=&amp;ldquo;noreferrer&amp;rdquo;&amp;gt;&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Trip Planner | Docker Config 🐋 ↗&lt;/span>&lt;/a>&lt;/p>
&lt;/div>
&lt;/div>
&lt;/details>
&lt;p>But we need something more to decide &lt;strong>where and how to go next&lt;/strong>.&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Related project &lt;a href="https://gitlab.com/fossengineer1/py_vacations" target="_blank" rel="noopener">&lt;strong>Source Code&lt;/strong>&lt;/a> - &lt;strong>PyVacAItions&lt;/strong> 💻
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!--
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
&lt;a href="https://github.com/JAlcocerT/PyVacAItions" target="_blank" rel="noopener">https://github.com/JAlcocerT/PyVacAItions&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
-->
&lt;p>&lt;strong>THE USE CASE&lt;/strong> - Plan a Trip To MRK&lt;/p>
&lt;!--
* Hotel
* Avenue Houmane El Fatouaki, 30 APT N°1, Marrakech, Medina, 40000 Marrakesh, Morocco
* https://maps.app.goo.gl/PuPUZhHAykdFYrVa6
* Marrakesh Menara Airport - RAK
* To see in MRK
* https://en.wikipedia.org/wiki/Saadian_Tombs - 700m from Hotel
* https://en.wikipedia.org/wiki/Bahia_Palace - 600m
* Madrasa Ben Youssef - 1.5KM
* El Badi Palace - 1.6km
* https://el-fenn.com/majorelle-gardens/ - 3km
* City Break
* Ouzoud Waterfalls - 150KM - https://www.viator.com/tours/Marrakech/Ouzoud-Waterfalls-Full-Day-Trip-from-Marrakech/d5408-7674P21
* Essaouira Athlantic Coast - 250km
To get to Essaouira, the coastal city from Marrakech, you have a few options:
1. Bus:
CTM: This is a reliable and affordable option. There's one departure per day, taking about 3 hours.
Supratours: Offers multiple daily departures, also taking around 3 hours.
2. Taxi:
A faster option, taking about 2.5 hours. However, it's more expensive.
3. Rental Car:
Gives you the most flexibility to explore the scenic route and stop at your own pace.
Time Zone:
Morocco is on Western European Time (WET), which is the same as CET.
Currency:
The currency in Morocco is the Moroccan Dirham (MAD). As of November 2023, the exchange rate is approximately 10 Moroccan Dirham to 1 US Dollar. However, exchange rates fluctuate, so it's best to check the current rate before your trip.
-->
&lt;h2>Py-VacAItions&lt;span class="absolute -mt-20" id="py-vacaitions">&lt;/span>
&lt;a href="#py-vacaitions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The project to know &lt;a href="https://gitlab.com/fossengineer1/py_vacations" target="_blank" rel="noopener">where/when to go and &lt;strong>IF&lt;/strong> you can go&lt;/a>&lt;/p>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">PyVacations Project Structure 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;div class="hextra-filetree mt-6 select-none text-sm text-gray-800 dark:text-gray-300 not-prose">
&lt;div class="inline-block rounded-lg border px-4 py-2 dark:border-neutral-800">
&lt;li class="group flex list-none flex-col">
&lt;button class="hextra-filetree-folder inline-flex cursor-pointer items-center py-1 hover:opacity-60">
&lt;span data-state="open" class="data-[state=open]:hidden">&lt;svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"/>&lt;/svg>&lt;/span>
&lt;span data-state="open" class="data-[state=closed]:hidden">&lt;svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/>&lt;/svg>&lt;/span>
&lt;span class="ml-1">content&lt;/span>
&lt;/button>
&lt;ul data-state="open" class="pl-5 data-[state=closed]:hidden">
&lt;li class="flex list-none">
&lt;span class="inline-flex cursor-default items-center py-1">&lt;svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>&lt;/svg>&lt;span class="ml-1">_index.md&lt;/span>
&lt;/span>
&lt;/li>
&lt;li class="group flex list-none flex-col">
&lt;button class="hextra-filetree-folder inline-flex cursor-pointer items-center py-1 hover:opacity-60">
&lt;span data-state="open" class="data-[state=open]:hidden">&lt;svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"/>&lt;/svg>&lt;/span>
&lt;span data-state="open" class="data-[state=closed]:hidden">&lt;svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/>&lt;/svg>&lt;/span>
&lt;span class="ml-1">docs&lt;/span>
&lt;/button>
&lt;ul data-state="open" class="pl-5 data-[state=closed]:hidden">
&lt;li class="flex list-none">
&lt;span class="inline-flex cursor-default items-center py-1">&lt;svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>&lt;/svg>&lt;span class="ml-1">_index.md&lt;/span>
&lt;/span>
&lt;/li>
&lt;pre>&lt;code> &amp;lt;li class=&amp;quot;flex list-none&amp;quot;&amp;gt;
&amp;lt;span class=&amp;quot;inline-flex cursor-default items-center py-1&amp;quot;&amp;gt;&amp;lt;svg width=1em xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;span class=&amp;quot;ml-1&amp;quot;&amp;gt;getting-started.md&amp;lt;/span&amp;gt;
&amp;lt;/span&amp;gt;
&amp;lt;/li&amp;gt;
&lt;/code>&lt;/pre>
&lt;li class="group flex list-none flex-col">
&lt;button class="hextra-filetree-folder inline-flex cursor-pointer items-center py-1 hover:opacity-60">
&lt;span data-state="open" class="data-[state=open]:hidden">&lt;svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"/>&lt;/svg>&lt;/span>
&lt;span data-state="open" class="data-[state=closed]:hidden">&lt;svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/>&lt;/svg>&lt;/span>
&lt;span class="ml-1">guide&lt;/span>
&lt;/button>
&lt;ul data-state="open" class="pl-5 data-[state=closed]:hidden">
&lt;li class="flex list-none">
&lt;span class="inline-flex cursor-default items-center py-1">&lt;svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>&lt;/svg>&lt;span class="ml-1">_index.md&lt;/span>
&lt;/span>
&lt;/li>
&lt;pre>&lt;code> &amp;lt;li class=&amp;quot;flex list-none&amp;quot;&amp;gt;
&amp;lt;span class=&amp;quot;inline-flex cursor-default items-center py-1&amp;quot;&amp;gt;&amp;lt;svg width=1em xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;span class=&amp;quot;ml-1&amp;quot;&amp;gt;organize-files.md&amp;lt;/span&amp;gt;
&amp;lt;/span&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/code>&lt;/pre>
&lt;/li>
&lt;pre>&lt;code>&amp;lt;/ul&amp;gt;
&lt;/code>&lt;/pre>
&lt;/li>
&lt;li class="group flex list-none flex-col">
&lt;button class="hextra-filetree-folder inline-flex cursor-pointer items-center py-1 hover:opacity-60">
&lt;span data-state="open" class="data-[state=open]:hidden">&lt;svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"/>&lt;/svg>&lt;/span>
&lt;span data-state="open" class="data-[state=closed]:hidden">&lt;svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/>&lt;/svg>&lt;/span>
&lt;span class="ml-1">blog&lt;/span>
&lt;/button>
&lt;ul data-state="open" class="pl-5 data-[state=closed]:hidden">
&lt;li class="flex list-none">
&lt;span class="inline-flex cursor-default items-center py-1">&lt;svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>&lt;/svg>&lt;span class="ml-1">_index.md&lt;/span>
&lt;/span>
&lt;/li>
&lt;pre>&lt;code> &amp;lt;li class=&amp;quot;flex list-none&amp;quot;&amp;gt;
&amp;lt;span class=&amp;quot;inline-flex cursor-default items-center py-1&amp;quot;&amp;gt;&amp;lt;svg width=1em xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill=&amp;quot;none&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; stroke-width=&amp;quot;2&amp;quot; stroke=&amp;quot;currentColor&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;path stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; d=&amp;quot;M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;span class=&amp;quot;ml-1&amp;quot;&amp;gt;post-1.md&amp;lt;/span&amp;gt;
&amp;lt;/span&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/code>&lt;/pre>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-0">content
├── _index.md // &amp;lt;- /
├── docs
│ ├── _index.md // &amp;lt;- /docs/
│ ├── getting-started.md // &amp;lt;- /docs/getting-started/
│ └── guide
│ ├── _index.md // &amp;lt;- /docs/guide/
│ └── organize-files.md // &amp;lt;- /docs/guide/organize-files/
└── blog
├── _index.md // &amp;lt;- /blog/
└── post-1.md // &amp;lt;- /blog/post-1/&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/details>
&lt;h3>Numbeo Data&lt;span class="absolute -mt-20" id="numbeo-data">&lt;/span>
&lt;a href="#numbeo-data" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Its all about &lt;strong>Knowledge of Crowds&lt;/strong>, &lt;em>not the tyrannyof the experts&lt;/em>.&lt;/p>
&lt;p>$$
\sum_{i=1}^{n} \text{opinions}_i &amp;gt; n \cdot \text{opinions}
$$&lt;/p>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">First Knowledge Adquisition (with FireCrawl + openAI) 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">python3 firecrawl_test4.py &lt;span class="s2">&amp;#34;https://www.numbeo.com/cost-of-living/in/Warsaw&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;output4&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>**Comparing 2 cities&amp;rsquo; costs with &lt;a href="https://gitlab.com/fossengineer1/py_vacations/-/blob/main/Z_Scrap_firecrawl/Z_FireCrawl_Numbeo_Compare_v6.py?ref_type=heads" target="_blank" rel="noopener">FireCrawl + OpenAI&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">python3 Z_FireCrawl_Numbeo_Compare_v6.py &lt;span class="s2">&amp;#34;https://www.numbeo.com/cost-of-living/in/Warsaw&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;https://www.numbeo.com/cost-of-living/in/Barcelona&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/details>
&lt;h3>Weather Analytics&lt;span class="absolute -mt-20" id="weather-analytics">&lt;/span>
&lt;a href="#weather-analytics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>Code and documentation for the &lt;strong>Pirate Weather API&lt;/strong> - &lt;a href="https://github.com/Pirate-Weather/pirateweather" target="_blank" rel="noopener">https://github.com/Pirate-Weather/pirateweather&lt;/a>&lt;/li>
&lt;/ul>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">Pirate Weather 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;ul>
&lt;li>&lt;a href="https://pirateweather.net/en/latest/API/" target="_blank" rel="noopener">https://pirateweather.net/en/latest/API/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.latlong.net/" target="_blank" rel="noopener">https://www.latlong.net/&lt;/a>&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/details>
&lt;blockquote>
&lt;p>This is a new addition to the ones used at TripPlanner&lt;/p>
&lt;/blockquote>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">Weather Patterns with MeteoStat 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;/div>
&lt;/details>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">Weather Forecasts with OpenMeteo 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;/div>
&lt;/details>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
It enhances the &lt;a href="https://github.com/JAlcocerT/Py_Trip_Planner" target="_blank" rel="noopener">python trip planner - with weather&lt;/a>, described &lt;a href="https://jalcocert.github.io/JAlcocerT/trip-planner-with-weather/" target="_blank" rel="noopener">here&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>Cost of Living Data&lt;span class="absolute -mt-20" id="cost-of-living-data-1">&lt;/span>
&lt;a href="#cost-of-living-data-1" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://www.numbeo.com/common/api.jsp" target="_blank" rel="noopener">https://www.numbeo.com/common/api.jsp&lt;/a> - Max 200,000 queries per month
&lt;ul>
&lt;li>&lt;a href="https://www.numbeo.com/cost-of-living/compare_cities.jsp?country1=Philippines&amp;amp;country2=Poland&amp;amp;city1=Manila&amp;amp;city2=Warsaw&amp;amp;tracking=getDispatchComparison" target="_blank" rel="noopener">https://www.numbeo.com/cost-of-living/compare_cities.jsp?country1=Philippines&amp;country2=Poland&amp;city1=Manila&amp;city2=Warsaw&amp;tracking=getDispatchComparison&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3>Interactivity &amp;amp; Maps with Streamlit&lt;span class="absolute -mt-20" id="interactivity--maps-with-streamlit">&lt;/span>
&lt;a href="#interactivity--maps-with-streamlit" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>This is a really cool &lt;strong>new feature from Streamlit&lt;/strong>.&lt;/p>
&lt;h3>The Agents&lt;span class="absolute -mt-20" id="the-agents">&lt;/span>
&lt;a href="#the-agents" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Its been a while since I got to know about &lt;a href="https://fossengineer.com/ai-agents-crewai/" target="_blank" rel="noopener">&lt;strong>CrewAI&lt;/strong>&lt;/a>&lt;/p>
&lt;p>Not its time to do something with it&lt;/p>
&lt;h4>Adding memory to the AI to know your preferences&lt;span class="absolute -mt-20" id="adding-memory-to-the-ai-to-know-your-preferences">&lt;/span>
&lt;a href="#adding-memory-to-the-ai-to-know-your-preferences" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ul>
&lt;li>&lt;a href="https://docs.mem0.ai/examples/personal-travel-assistant" target="_blank" rel="noopener">https://docs.mem0.ai/examples/personal-travel-assistant&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq-1">&lt;/span>
&lt;a href="#faq-1" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>How to&amp;rsquo;s about SQLite&lt;span class="absolute -mt-20" id="how-tos-about-sqlite">&lt;/span>
&lt;a href="#how-tos-about-sqlite" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>SQLite is a very handy and portable DB to place some logs.&lt;/p>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">Storing in SQLite 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;/div>
&lt;/details>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">Reading SQLite 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;/div>
&lt;/details>
&lt;p>And now, there is even a fork of it&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/PGpL5hYpY1o" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">More about SQLite Fork - libSQL [Optimized for AI] 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;p>SQLite is the most deployed database in history, with over &lt;strong>1 trillion active users&lt;/strong>. It was developed 25 years ago by &lt;strong>Richard Hipp&lt;/strong> for a &lt;strong>US Navy damage control system&lt;/strong>. This lightweight database is contained in a single &lt;strong>600 KB file&lt;/strong>, requires &lt;strong>no server process&lt;/strong>, and is an essential part of many modern applications.&lt;/p>
&lt;p>Although &lt;strong>SQLite&lt;/strong> is in the &lt;strong>public domain&lt;/strong>, its development is managed by just &lt;strong>three people&lt;/strong>, with &lt;strong>no outside contributions&lt;/strong> allowed. Despite these limitations, SQLite has become ubiquitous due to its simplicity and reliability.&lt;/p>
&lt;p>In &lt;strong>October 2022&lt;/strong>, a new fork called &lt;strong>libSQL&lt;/strong> was introduced, with a focus on &lt;strong>community-controlled development&lt;/strong>. It retains &lt;strong>SQL-like compatibility&lt;/strong> with SQLite, but introduces new features to address some of SQLite’s limitations.&lt;/p>
&lt;p>Key features of &lt;strong>libSQL&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>One database per user&lt;/strong>: This approach could &lt;strong>improve performance&lt;/strong>, &lt;strong>reduce latency&lt;/strong>, and &lt;strong>enhance security&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>Server mode&lt;/strong>: Allows access to the database via &lt;strong>HTTP&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>Native replication system&lt;/strong>: Enables embedded &lt;strong>replica features&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>Encryption at rest&lt;/strong>: Adds an extra layer of &lt;strong>security&lt;/strong> for data storage.&lt;/li>
&lt;li>&lt;strong>Web Assembly triggers&lt;/strong>: Lets you run &lt;strong>code when specific events&lt;/strong> occur in the database.&lt;/li>
&lt;li>&lt;strong>Shared schema across multiple databases&lt;/strong>: Makes it easier to manage databases together.&lt;/li>
&lt;li>&lt;strong>Vector queries&lt;/strong>: Optimized for &lt;strong>AI applications&lt;/strong>, enabling complex data operations.&lt;/li>
&lt;/ul>
&lt;p>Benefits and Challenges of libSQL:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Performance&lt;/strong>: The one-database-per-user model can significantly &lt;strong>boost performance&lt;/strong> and reduce &lt;strong>latency&lt;/strong>, but it may create challenges with &lt;strong>data retrieval&lt;/strong> and &lt;strong>combining data&lt;/strong> across different locations.&lt;/li>
&lt;li>&lt;strong>Security&lt;/strong>: Enhanced &lt;strong>security&lt;/strong> through encryption and the isolated nature of individual user databases.&lt;/li>
&lt;li>However, retrieving and combining data from different databases may &lt;strong>not be practical&lt;/strong> in all cases, especially when data is spread across geographically distant locations.&lt;/li>
&lt;/ul>
&lt;p>In conclusion, &lt;strong>libSQL&lt;/strong> brings significant improvements over &lt;strong>SQLite&lt;/strong> by offering a more &lt;strong>flexible, community-driven approach&lt;/strong> to database management. With its new features and robust capabilities, it has the potential to &lt;strong>revolutionize&lt;/strong> how we build and manage databases, especially for applications requiring high &lt;strong>performance&lt;/strong>, &lt;strong>security&lt;/strong>, and &lt;strong>AI integration&lt;/strong>.&lt;/p>
&lt;p>SQLite may be &lt;strong>underappreciated&lt;/strong>, but with libSQL, it becomes even more powerful and adaptable to modern needs.&lt;/p>
&lt;/div>
&lt;/details>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">Reading SQLite DBs 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;p>You can explore a SQLite via a script, like we did &lt;a href="https://jalcocert.github.io/JAlcocerT/scrap-and-chat-with-the-web/#old-school-scrapping" target="_blank" rel="noopener">during the Scrapping Post&lt;/a>&lt;/p>
&lt;p>There is a cool project for this - &lt;a href="https://github.com/sqlitebrowser/sqlitebrowser" target="_blank" rel="noopener">https://github.com/sqlitebrowser/sqlitebrowser&lt;/a>&lt;/p>
&lt;p>&lt;strong>sqlitebrowser&lt;/strong> - DB Browser for SQLite (DB4S) is an open-source tool for creating, designing, and editing SQLite database files.&lt;/p>
&lt;p>It simplifies database management for users and developers, eliminating the need for complex SQL commands.&lt;/p>
&lt;p>&lt;strong>Key Features:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Visual interface resembling a spreadsheet.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Allows creation and modification of database files.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Supports searching, editing, and deleting database records.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Facilitates importing/exporting of data in various formats (CSV, SQL).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Offers SQL query capabilities with result inspection.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Provides graphical plotting of data.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Key Information:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Continuous and nightly builds are available for download.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Compatible with Windows, macOS, Linux, and FreeBSD.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Installation options include package managers like Chocolatey, Homebrew, and Snap.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The project has a rich history of community contributions and updates.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Conclusions:&lt;/strong>&lt;/p>
&lt;p>DB4S is a valuable tool for users needing an intuitive interface for SQLite database management.&lt;/p>
&lt;p>&lt;strong>Similar Projects:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>DBeaver: A universal database tool for developers.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>HeidiSQL: A lightweight SQL client for MySQL, SQL Server, and PostgreSQL.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/details>
&lt;h3>Interesting software for Vacations&lt;span class="absolute -mt-20" id="interesting-software-for-vacations">&lt;/span>
&lt;a href="#interesting-software-for-vacations" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Interesting maps for offline mode:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://organicmaps.app/news/" target="_blank" rel="noopener">https://organicmaps.app/news/&lt;/a>&lt;/li>
&lt;li>Maps.me&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">flatpak install flathub app.organicmaps.desktop&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>&lt;a href="https://github.com/joaovitoriasilva/endurain" target="_blank" rel="noopener">https://github.com/joaovitoriasilva/endurain&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/johanohly/AirTrail" target="_blank" rel="noopener">https://github.com/johanohly/AirTrail&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/HomeLab/airtrail.png" alt="AirTrail UI" loading="lazy" />&lt;/p>
&lt;blockquote>
&lt;p>GPL3.0 | A modern, open-source personal flight tracking system&lt;/p>
&lt;/blockquote>
&lt;p>See also the AdventureLog project:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/seanmorley15/AdventureLog" target="_blank" rel="noopener">https://github.com/seanmorley15/AdventureLog&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://github.com/IoTechCrafts/AdventureLog" target="_blank" rel="noopener">https://github.com/IoTechCrafts/AdventureLog&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>It has very interestin &lt;a href="https://adventurelog.app/docs/usage/usage.html" target="_blank" rel="noopener">use cases&lt;/a>, even integration with Immich&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/selfhosted-apps-spring-2025/#immich" target="_blank" rel="noreferrer">&lt;img
alt="Selfhosting Immich"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/Photo/immich-map.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Selfhosting Immich&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Sring Y25 Post&lt;/div>&lt;/a>
&lt;/div>
&lt;p>Or the&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/itskovacs/trip?tab=License-1-ov-file#readme" target="_blank" rel="noopener">https://github.com/itskovacs/trip?tab=License-1-ov-file#readme&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Share media with your friends (airdrop for all devices):&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/seemoo-lab/opendrop" target="_blank" rel="noopener">https://github.com/seemoo-lab/opendrop&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/SnapDrop/snapdrop" target="_blank" rel="noopener">https://github.com/SnapDrop/snapdrop&lt;/a> - Game changer!&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>GPL 3.0 | A Progressive Web App for local file sharing&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>
&lt;p>VPN&lt;/p>
&lt;ul>
&lt;li>Wireguird with &lt;code>.conf&lt;/code> file you have vpn setup on ubuntu&lt;/li>
&lt;li>and maybe a &lt;a href="https://jalcocert.github.io/JAlcocerT/travel-router-gl-mt3000-review" target="_blank" rel="noopener">travel router&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/rohitkumbhar/surmai" target="_blank" rel="noopener">https://github.com/rohitkumbhar/surmai&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>MIT | Surmai is a personal/family &lt;strong>travel organizer&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;h3>HomeAssistant&lt;span class="absolute -mt-20" id="homeassistant">&lt;/span>
&lt;a href="#homeassistant" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>With HA we also can&amp;hellip;&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://pirateweather.net/en/latest/ha/" target="_blank" rel="noopener">https://pirateweather.net/en/latest/ha/&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
After &lt;a href="https://jalcocert.github.io/JAlcocerT/trip-planner-with-weather/" target="_blank" rel="noopener">Weather Planning&lt;/a>, there is also the financial aspects of travelling. &lt;a href="https://gitlab.com/fossengineer1/py_vacations" target="_blank" rel="noopener">&lt;strong>Source Code&lt;/strong>&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>Scrapping and LLMs&lt;span class="absolute -mt-20" id="scrapping-and-llms">&lt;/span>
&lt;a href="#scrapping-and-llms" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Get Google Flights information with python.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/scrap-and-chat-with-the-web/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Scrapping Tools&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/create-streamlit-chatgpt" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Together with AI to summarize - Streamlit MultiChat - Project&lt;/span>&lt;/a>
&lt;/div>
&lt;!--
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://JAlcocerT.github.io/JAlcocerT/" >&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Left Card&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://JAlcocerT.github.io/JAlcocerT/" >&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Right Card&lt;/span>&lt;/a>
&lt;/div>
--></description></item><item><title>Improving a Blog</title><link>https://JAlcocerT.github.io/JAlcocerT/a-better-fossengineer/</link><pubDate>Mon, 01 Jun 2026 23:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/a-better-fossengineer/</guid><description>
&lt;p>The kind of thing i use now to test websites for people i Just met: &lt;code>https://spanishflowacademy.com/&lt;/code>&lt;/p>
&lt;p>If &lt;a href="https://jalcocert.github.io/JAlcocerT/diy-webs-via-paas/" target="_blank" rel="noopener">these audits show a problem&lt;/a> you might need:&lt;/p>
&lt;p>set -a
. ./.env
set +a&lt;/p>
&lt;p>uv run &amp;ndash;with openai &amp;ndash;with pillow &lt;br>
&amp;ldquo;${CODEX_HOME:-$HOME/.codex}/skills/.system/imagegen/scripts/image_gen.py&amp;rdquo; &lt;br>
generate-batch &lt;br>
&amp;ndash;input tmp/imagegen/playwright-symphony-komodo-cover-prompts.jsonl &lt;br>
&amp;ndash;out-dir output/imagegen/covers &lt;br>
&amp;ndash;concurrency 3&lt;/p>
&lt;p>&lt;a href="https://github.com/lycheeverse/lychee" target="_blank" rel="noopener">https://github.com/lycheeverse/lychee&lt;/a>
&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>It was time to stop those ads.&lt;/p>
&lt;p>And to use:&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://diy.jalcocertech.com" target="_blank" rel="noopener">https://diy.jalcocertech.com&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://webaudit.jalcocertech.com/" target="_blank" rel="noopener">https://webaudit.jalcocertech.com/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://ebooks.jalcocertech.com/" target="_blank" rel="noopener">https://ebooks.jalcocertech.com/&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>&lt;a href="https://github.com/openai/skills" target="_blank" rel="noopener">https://github.com/openai/skills&lt;/a>
An excuse to try the free web audit engine
&lt;a href="https://developers.openai.com/codex/pricing" target="_blank" rel="noopener">https://developers.openai.com/codex/pricing&lt;/a>&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>I made a review on the OSS &amp;lsquo;portfolio&amp;rsquo;.&lt;/p>
&lt;p>&lt;a href="https://developers.openai.com/showcase" target="_blank" rel="noopener">https://developers.openai.com/showcase&lt;/a>
&lt;a href="https://developers.openai.com/blog/designing-delightful-frontends-with-gpt-5-4" target="_blank" rel="noopener">https://developers.openai.com/blog/designing-delightful-frontends-with-gpt-5-4&lt;/a>&lt;/p>
&lt;p>Could foss/ still be HUGO and look as sleek?&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-yellow-100 bg-yellow-50 text-yellow-900 dark:border-yellow-200/30 dark:bg-yellow-700/30 dark:text-yellow-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
⚠️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Id keep JAMstack to avoid Mythos and similar coming inside my homelab :)
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">dig fossengineer.com any
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ping fossengineer.com&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Not &lt;a href="https://github.com/JAlcocerT/docs-testing/tree/master" target="_blank" rel="noopener">with codex cli&lt;/a> this time, but directly with IDE:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git init &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git add . &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git commit -m &lt;span class="s2">&amp;#34;Initial commit: better ai docs&amp;#34;&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> gh repo create fossengineer-hugo --private --source&lt;span class="o">=&lt;/span>. --remote&lt;span class="o">=&lt;/span>origin --push&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://gitlab.com/fossengineer/fossengineer" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
foss | Github ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/fossengineer-hugo" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
foss reloaded x HomeLab integration | Github ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>HUGO Vibe Coded Re-build&lt;/p>
&lt;p>To offer this via fossengineer, I can try: &lt;em>these are next steps&lt;/em>&lt;/p>
&lt;ol>
&lt;li>As is (later removing adsense)&lt;/li>
&lt;li>The local KB offer&lt;/li>
&lt;li>The webpage offer&lt;/li>
&lt;li>Finally remodel the webpage to avoid the shape of a blog, as is more a news/docs one - vibe coding ofc.&lt;/li>
&lt;/ol>
&lt;p>With that remota data (yaml) fetching from the home-lab repo.&lt;/p>
&lt;h3>Posts&lt;span class="absolute -mt-20" id="posts">&lt;/span>
&lt;a href="#posts" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>Videos&lt;span class="absolute -mt-20" id="videos">&lt;/span>
&lt;a href="#videos" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/oss-automatic-docs-and-tech-video/#about-foss---repo-to-video" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/oss-automatic-docs-and-tech-video/#about-foss---repo-to-video&lt;/a>&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Web CMS stuff: &lt;em>Strapi directus&amp;hellip;&lt;/em>?&lt;/p>
&lt;p>This was &lt;a href="https://youtu.be/UFxlU9gMp_A" target="_blank" rel="noopener">how i Tinkered&lt;/a> last year actually.&lt;/p>
&lt;p>But I said no more to custom CMS integrations.&lt;/p>
&lt;p>Actually: Not doing more (DFY) websites for others.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://consulting.jalcocertech.com/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Consulting | DWY ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Detecting Broken Links&lt;span class="absolute -mt-20" id="detecting-broken-links">&lt;/span>
&lt;a href="#detecting-broken-links" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">How to use Lychee for broken link detection 🚀&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;p>I like &lt;a href="https://github.com/lycheeverse/lychee" target="_blank" rel="noopener">Lychee&lt;/a> for static sites because it checks links from Markdown, HTML, and already deployed websites.&lt;/p>
&lt;p>For a quick check of the live GitHub Pages entry page:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">lychee --verbose --no-progress https://jalcocert.github.io/JAlcocerT&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>My first run against the deployed entry page found:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-txt" data-lang="txt">&lt;span class="line">&lt;span class="cl">471 Total
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">464 Unique
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">469 OK
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2 Errors
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1 Redirect&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The two broken links were missing favicon assets:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-txt" data-lang="txt">&lt;span class="line">&lt;span class="cl">https://jalcocert.github.io/JAlcocerT/favicon.svg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">https://jalcocert.github.io/JAlcocerT/favicon-dark.svg&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>I fixed those by publishing the existing &lt;code>JAT.svg&lt;/code> logo as &lt;code>static/favicon.svg&lt;/code> and &lt;code>static/favicon-dark.svg&lt;/code>, which Hugo serves from the site root.&lt;/p>
&lt;p>When I tried the full sitemap-based external scan, lychee started checking outbound links from every deployed page. That surfaced rate-limit/backoff warnings from hosts linked in the blog, including &lt;code>github.com&lt;/code> and &lt;code>whois.jalcocertech.com&lt;/code>. The &lt;code>whois.jalcocertech.com&lt;/code> link comes from older blog content, not from GitHub Pages hosting itself.&lt;/p>
&lt;p>For the full deployed Hugo site, use the sitemap as the input list:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">curl -sS https://jalcocert.github.io/JAlcocerT/sitemap.xml &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="p">|&lt;/span> rg -o &lt;span class="s1">&amp;#39;&amp;lt;loc&amp;gt;[^&amp;lt;]+&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="p">|&lt;/span> sed &lt;span class="s1">&amp;#39;s#&amp;lt;loc&amp;gt;##&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &amp;gt; /tmp/jalcocert-urls.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">GITHUB_TOKEN&lt;/span>&lt;span class="o">=&lt;/span>your_token_here &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>lychee --cache --no-progress --max-concurrency &lt;span class="m">16&lt;/span> --max-retries &lt;span class="m">0&lt;/span> --files-from /tmp/jalcocert-urls.txt&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The token helps when the site has many GitHub links. If a third-party host keeps rate-limiting automated checks, add it to &lt;code>.lycheeignore&lt;/code> or use &lt;code>--exclude&lt;/code>.&lt;/p>
&lt;p>For a Hugo workflow, first build the site and then scan the generated HTML:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">hugo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lychee --root-dir public &lt;span class="s2">&amp;#34;public/**/*.html&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>If some URLs are expected to fail, redirect, throttle bots, or require auth, keep them out of the noise with a &lt;code>.lycheeignore&lt;/code> file:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-txt" data-lang="txt">&lt;span class="line">&lt;span class="cl"># .lycheeignore
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">https://example.com/private-area
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">https://www.linkedin.com/.*&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And for GitHub Actions, I placed the workflow at &lt;code>.github/workflows/links.yml&lt;/code>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Links&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">push&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">branches&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;main&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">workflow_dispatch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">schedule&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">cron&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;21 4 * * 1&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">permissions&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">contents&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">read&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">lychee&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">env&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">SITE_URL&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https://jalcocert.github.io/JAlcocerT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/checkout@v4&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Build sitemap URL list&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> curl -fsSL &amp;#34;${SITE_URL}/sitemap.xml&amp;#34; \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> | grep -o &amp;#39;&amp;lt;loc&amp;gt;[^&amp;lt;]*&amp;#39; \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> | sed &amp;#39;s#&amp;lt;loc&amp;gt;##&amp;#39; \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> &amp;gt; jalcocert-urls.txt&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">lycheeverse/lychee-action@v2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">continue-on-error&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">env&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">GITHUB_TOKEN&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ secrets.GITHUB_TOKEN }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">args&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>--&lt;span class="l">cache --no-progress --max-concurrency 16 --max-retries 0 --files-from jalcocert-urls.txt&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/details>
&lt;h3>Scanning SiteMaps&lt;span class="absolute -mt-20" id="scanning-sitemaps">&lt;/span>
&lt;a href="#scanning-sitemaps" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Sitemap URL:&lt;/p>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/sitemap.xml" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/sitemap.xml&lt;/a>&lt;/p>
&lt;p>RSS feed for latest blog posts:&lt;/p>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/blog/index.xml" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/blog/index.xml&lt;/a>&lt;/p>
&lt;p>Curl latest 10 posts:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">sudo snap install ripgrep --classic
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -sS https://jalcocert.github.io/JAlcocerT/blog/index.xml &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="p">|&lt;/span> rg -o &lt;span class="s1">&amp;#39;&amp;lt;item&amp;gt;&amp;lt;title&amp;gt;[^&amp;lt;]+&amp;lt;/title&amp;gt;&amp;lt;link&amp;gt;[^&amp;lt;]+&amp;lt;/link&amp;gt;&amp;lt;pubDate&amp;gt;[^&amp;lt;]+&amp;lt;/pubDate&amp;gt;&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="p">|&lt;/span> sed -E &lt;span class="s1">&amp;#39;s#&amp;lt;item&amp;gt;&amp;lt;title&amp;gt;([^&amp;lt;]+)&amp;lt;/title&amp;gt;&amp;lt;link&amp;gt;([^&amp;lt;]+)&amp;lt;/link&amp;gt;&amp;lt;pubDate&amp;gt;([^&amp;lt;]+)&amp;lt;/pubDate&amp;gt;#- \1 | \3 | \2#&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="p">|&lt;/span> head -n &lt;span class="m">10&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Current top result from that command is:&lt;/p>
&lt;ul>
&lt;li>Vacations with Python + ADK | Tue, 02 Jun 2026 09:20:21 +0100 | &lt;a href="https://JAlcocerT.github.io/JAlcocerT/py-vacations/" target="_blank" rel="noopener">https://JAlcocerT.github.io/JAlcocerT/py-vacations/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>To curl all URLs from the sitemap:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl"> curl -sS https://jalcocert.github.io/JAlcocerT/sitemap.xml &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="p">|&lt;/span> rg -o &lt;span class="s1">&amp;#39;&amp;lt;loc&amp;gt;[^&amp;lt;]+&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="p">|&lt;/span> sed &lt;span class="s1">&amp;#39;s#&amp;lt;loc&amp;gt;##&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Robots and Agents&lt;span class="absolute -mt-20" id="robots-and-agents">&lt;/span>
&lt;a href="#robots-and-agents" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;a href="https://github.com/JAlcocerT/JAlcocerT/actions/runs/26818896547" target="_blank" rel="noopener">https://github.com/JAlcocerT/JAlcocerT/actions/runs/26818896547&lt;/a>&lt;/p>
&lt;p>Sitemap URL:&lt;/p>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/sitemap.xml" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/sitemap.xml&lt;/a>&lt;/p>
&lt;p>RSS feed for latest blog posts:&lt;/p>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/blog/index.xml" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/blog/index.xml&lt;/a>&lt;/p>
&lt;p>Curl latest 10 posts:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">sudo snap install ripgrep --classic
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -sS https://jalcocert.github.io/JAlcocerT/blog/index.xml &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="p">|&lt;/span> rg -o &lt;span class="s1">&amp;#39;&amp;lt;item&amp;gt;&amp;lt;title&amp;gt;[^&amp;lt;]+&amp;lt;/title&amp;gt;&amp;lt;link&amp;gt;[^&amp;lt;]+&amp;lt;/link&amp;gt;&amp;lt;pubDate&amp;gt;[^&amp;lt;]+&amp;lt;/pubDate&amp;gt;&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="p">|&lt;/span> sed -E &lt;span class="s1">&amp;#39;s#&amp;lt;item&amp;gt;&amp;lt;title&amp;gt;([^&amp;lt;]+)&amp;lt;/title&amp;gt;&amp;lt;link&amp;gt;([^&amp;lt;]+)&amp;lt;/link&amp;gt;&amp;lt;pubDate&amp;gt;([^&amp;lt;]+)&amp;lt;/pubDate&amp;gt;#- \1 | \3 | \2#&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="p">|&lt;/span> head -n &lt;span class="m">10&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Current top result from that command is:&lt;/p>
&lt;ul>
&lt;li>Vacations with Python + ADK | Tue, 02 Jun 2026 09:20:21 +0100 | &lt;a href="https://JAlcocerT.github.io/JAlcocerT/py-vacations/" target="_blank" rel="noopener">https://JAlcocerT.github.io/JAlcocerT/py-vacations/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>To curl all URLs from the sitemap:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl"> curl -sS https://jalcocert.github.io/JAlcocerT/sitemap.xml &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="p">|&lt;/span> rg -o &lt;span class="s1">&amp;#39;&amp;lt;loc&amp;gt;[^&amp;lt;]+&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="p">|&lt;/span> sed &lt;span class="s1">&amp;#39;s#&amp;lt;loc&amp;gt;##&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>For crawlers, I added a simple &lt;code>robots.txt&lt;/code>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-txt" data-lang="txt">&lt;span class="line">&lt;span class="cl">User-agent: *
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Allow: /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sitemap: https://jalcocert.github.io/JAlcocerT/sitemap.xml&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>In Hugo, this lives at:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-txt" data-lang="txt">&lt;span class="line">&lt;span class="cl">static/robots.txt&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And after deployment it should be available at:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-txt" data-lang="txt">&lt;span class="line">&lt;span class="cl">https://jalcocert.github.io/JAlcocerT/robots.txt&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This file does not secure anything. It is just a crawler hint. The useful part here is the sitemap line, because it gives search engines and polite crawlers the canonical map of the site.&lt;/p>
&lt;p>For AI agents, the trendy file is &lt;code>llms.txt&lt;/code>. The emerging convention is to publish a Markdown file at the site root:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-txt" data-lang="txt">&lt;span class="line">&lt;span class="cl">https://jalcocert.github.io/JAlcocerT/llms.txt&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>So I added:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-txt" data-lang="txt">&lt;span class="line">&lt;span class="cl">static/llms.txt&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Think of it as a curated, LLM-friendly site index: what this site is about, which pages matter, and where agents should start. Some projects also publish &lt;code>llms-full.txt&lt;/code>, which contains a larger Markdown dump of key content for agents that want more context in one request.&lt;/p>
&lt;p>I would treat &lt;code>llms.txt&lt;/code> as a low-cost experiment, not as guaranteed SEO magic. It can help agents and AI coding tools understand a site faster, but classic signals still matter: sitemap, RSS, clean HTML, canonical URLs, metadata, and pages that answer specific questions.&lt;/p></description></item><item><title>Ive been in a wedding..</title><link>https://JAlcocerT.github.io/JAlcocerT/what-do-i-do/</link><pubDate>Sun, 31 May 2026 09:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/what-do-i-do/</guid><description>
&lt;p>&lt;strong>TL;DR&lt;/strong>&lt;/p>
&lt;p>For anyone wondering what I do and how to copy me.&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>There was no QR app around here, so the grandma smiles were lost.&lt;/p>
&lt;p>It was quite interesting to see people I havent seen for like 10y&lt;/p>
&lt;p>One of them, even has a home-lab too!&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">claude --dangerously-skip-permissions -p &lt;span class="s2">&amp;#34;promptwhateverrrr&amp;#34;&lt;/span> &lt;span class="c1">#yolo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#codex --dangerously-bypass-approvals-and-sandbox&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">codex --yolo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">For non-interactive runs:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">codex &lt;span class="nb">exec&lt;/span> --dangerously-bypass-approvals-and-sandbox &lt;span class="s2">&amp;#34;your task&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This skips approval prompts and sandboxing, and the docs say to use it only inside an externally hardened or isolated environment. (developers.openai.com
(&lt;a href="https://developers.openai.com/codex/cli/reference/" target="_blank" rel="noopener">https://developers.openai.com/codex/cli/reference/&lt;/a>))&lt;/p>
&lt;p>A less extreme option is:&lt;/p>
&lt;p>codex -s danger-full-access -a never&lt;/p>
&lt;p>where -s danger-full-access changes the sandbox policy and -a never disables approval pauses. The docs also recommend preferring &amp;ndash;add-dir or workspace-write when possible in stead of forcing full access. (developers.openai.com (&lt;a href="https://developers.openai.com/codex/cli/reference/" target="_blank" rel="noopener">https://developers.openai.com/codex/cli/reference/&lt;/a>))&lt;/p>
&lt;p>Yes. Codex CLI has web search.&lt;/p>
&lt;p>Use it like:&lt;/p>
&lt;p>codex &amp;ndash;search&lt;/p>
&lt;p>or for non-interactive mode:&lt;/p>
&lt;p>codex exec &amp;ndash;search &amp;ldquo;Find the current docs for X and update this repo accordingly&amp;rdquo;&lt;/p>
&lt;p>What it does: &amp;ndash;search enables live web search for that run. The docs say it sets web_search = &amp;ldquo;live&amp;rdquo; instead of the default &amp;ldquo;cached&amp;rdquo; mode. (developers.openai.com
(&lt;a href="https://developers.openai.com/codex/cli/reference" target="_blank" rel="noopener">https://developers.openai.com/codex/cli/reference&lt;/a>)) In practice, the model gets a web-search tool and decides when to call it based on your prompt. You can nudge it directly: “search the web”, “verify current docs”, “find the latest release notes”, etc.&lt;/p>
&lt;p>You can also configure search behavior. The config reference shows tools.web_search can be a boolean or an object with context_size, allowed_domains, and approximate location.(developers.openai.com (&lt;a href="https://developers.openai.com/codex/config-reference" target="_blank" rel="noopener">https://developers.openai.com/codex/config-reference&lt;/a>)) Example intent:&lt;/p>
&lt;p>Use it like:&lt;/p>
&lt;p>codex &amp;ndash;search&lt;/p>
&lt;p>or for non-interactive mode:&lt;/p>
&lt;p>codex exec &amp;ndash;search &amp;ldquo;Find the current docs for X and update this repo accordingly&amp;rdquo;&lt;/p>
&lt;p>What it does: &amp;ndash;search enables live web search for that run. The docs say it sets web_search = &amp;ldquo;live&amp;rdquo; instead of the default &amp;ldquo;cached&amp;rdquo; mode. (developers.openai.com
(&lt;a href="https://developers.openai.com/codex/cli/reference" target="_blank" rel="noopener">https://developers.openai.com/codex/cli/reference&lt;/a>)) In practice, the model gets a web-search tool and decides when to call it based on your prompt. You can nudge it directly:
“search the web”, “verify current docs”, “find the latest release notes”, etc.
tools.web_search = true&lt;/p>
&lt;p>or constrained:&lt;/p>
&lt;p>allowed_domains = [&amp;ldquo;developers.openai.com&amp;rdquo;, &amp;ldquo;github.com&amp;rdquo;]&lt;/p>
&lt;p>Public web results identify Jesús/Jesus Alcocer Tagua as a software/data engineer and data analytics specialist, originally from Spain and based in Poland. Exadel lists him as a speaker for a 2025 RAG meetup and describes him as having 6+ years of experience building data products, with a mechanical engineering background. (events.exadel.com(&lt;a href="https://events.exadel.com/event/rag-powered-real-estate" target="_blank" rel="noopener">https://events.exadel.com/event/rag-powered-real-estate&lt;/a>))&lt;/p>
&lt;p>He appears connected to Exadel: a LinkedIn post by Exadel People refers to him as a Data Science Engineer at Exadel presenting on schema-aware AI. (linkedin.com
(&lt;a href="https://www.linkedin.com/posts/exadel-people_sql-to-insight-pipeline-with-ai-activity-7432721791468367872-E83B" target="_blank" rel="noopener">https://www.linkedin.com/posts/exadel-people_sql-to-insight-pipeline-with-ai-activity-7432721791468367872-E83B&lt;/a>))&lt;/p>
&lt;p>There are also public business registry/directory records for JAlcocerTech - Jesus Alcocer Tagua, a Poland-based sole proprietorship in software/programming and IT consulting, started in 2024. (owg.pl (&lt;a href="https://www.owg.pl/ceidg/jalcocertech_jesus_alcocer_tagua_9%2C74%2C525268%2C5252685135?utm_source=openai" target="_blank" rel="noopener">https://www.owg.pl/ceidg/jalcocertech_jesus_alcocer_tagua_9%2C74%2C525268%2C5252685135?utm_source=openai&lt;/a>))&lt;/p>
&lt;p>Older academic traces point to a 2014 University of Seville mechanical/industrial engineering thesis authored by Jesús Alcocer Tagua on computational modeling of bicycle tire-ground interaction. (biblus.us.es (&lt;a href="https://biblus.us.es/bibing/proyectos/abreproy/90128/fichero/Memoria%2BTFG.pdf" target="_blank" rel="noopener">https://biblus.us.es/bibing/proyectos/abreproy/90128/fichero/Memoria%2BTFG.pdf&lt;/a>))&lt;/p>
&lt;p>So, in short: he seems to be a Spanish-born, Poland-based software/data engineer with a mechanical engineering background, working in data/AI and running a small software/IT business.&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>I didnt mentiont about my bike trips across Europe, nor my adventure with fixing this old Civic.&lt;/p>
&lt;p>Some knew about my chemistry experiments, but not about me growing tomatoes nor doing soap with recycled oil.&lt;/p>
&lt;p>Its been very fun to:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Listen (quietly) people flexing about 5k monthly paychecks&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Listen (also quietly) poeple being so confused about switzerland not giving days off for people who get married&lt;/p>
&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>If you get similar confussions, you deliver value (if anywhere) far faaaar away from end customers&lt;/p>
&lt;/blockquote>
&lt;ol start="3">
&lt;li>
&lt;p>Listen (I was about to, but no, i kept silence) people complaining about taxes and making understand that is fine to avoid them - while being the type that get some kind of benefit under the table&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Listen that people is fully booked but dont rise prices&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Its been inspiring to:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Talk with a very motivated junior IT engineer working at &lt;code>roostwood.app&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Talk with a self-made 24yo with ~10y sales experience (for real)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Realize that for people with a real business, the common question that makes them resonate the most is: &lt;em>How do you get clients?&lt;/em>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3>Whats next for me&lt;span class="absolute -mt-20" id="whats-next-for-me">&lt;/span>
&lt;a href="#whats-next-for-me" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Leads leads leads.&lt;/p>
&lt;p>Because the tech part is more than covered.&lt;/p>
&lt;p>And as someone said: &lt;em>I have everything pretty much automated&lt;/em>&lt;/p>
&lt;p>Anyway, leads&amp;hellip;for?&lt;/p>
&lt;ol>
&lt;li>Slubne - wedding planners&lt;/li>
&lt;li>Around the &lt;a href="https://jalcocert.github.io/JAlcocerT/how-to-check-hot-pump-viability/" target="_blank" rel="noopener">heat sensor learnings&lt;/a>: Aerotermia / thermo viability + efficient gardening / crops intelligence&lt;/li>
&lt;li>Real Estate with the learnings of ADK and the UI/X of trip-planner and solar&lt;/li>
&lt;li>Agentic BI: Shopify thingy&lt;/li>
&lt;li>Fossengineer to go ad-less + better website SEO and &lt;a href="https://jalcocert.github.io/JAlcocerT/diy-webs-via-paas/" target="_blank" rel="noopener">audits&lt;/a> + posts with images via codex and all new posts referencing docker-compose to my Home-Lab repo &lt;code>/foss-post&lt;/code>&lt;/li>
&lt;li>Multibody to go OSS (probably the rigid version for now), like diode.computer does&lt;/li>
&lt;li>Not yet restaurants, nor the agentic KB (yet)&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>How do you have time for all this?&lt;span class="absolute -mt-20" id="how-do-you-have-time-for-all-this">&lt;/span>
&lt;a href="#how-do-you-have-time-for-all-this" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Im still one person&lt;/p>
&lt;p>Just that im using:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/gitea" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">AI via CLIs | Post Section ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/forgejo" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Forgejo | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>Particularly: &lt;a href="https://github.com/ogulcancelik/herdr#install" target="_blank" rel="noopener">https://github.com/ogulcancelik/herdr#install&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ghostty&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">herdr &lt;span class="c1">#claude /agent view&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>How do you recommend me getting started?&lt;span class="absolute -mt-20" id="how-do-you-recommend-me-getting-started">&lt;/span>
&lt;a href="#how-do-you-recommend-me-getting-started" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>Get ready to pay 20$/m for an AI sub (massive time return)&lt;/li>
&lt;li>Get familiar with git (must) and markdown&lt;/li>
&lt;li>Prepare a safe (linux) environment for AI to work: a cheap VPS, old laptop, Pi&amp;hellip; will do&lt;/li>
&lt;li>Use any of:&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">claude &lt;span class="c1">#closed source, amazing performance, sub cant be used with other harnesses&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">codex &lt;span class="c1">#&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>Dont forget to use skills and create yours&lt;/p>
&lt;/blockquote>
&lt;ol start="5">
&lt;li>
&lt;p>When you are confident enough to give long task to AI, you can start paralel sessions and start overseing the progress&lt;/p>
&lt;/li>
&lt;li>
&lt;p>You will be the blocker again when your orchestration throughput gets maxed out due to those sessions&lt;/p>
&lt;/li>
&lt;li>
&lt;p>As you will be learning a lot: &lt;em>use AI to make a f&lt;/em> blog/website for good*&lt;/p>
&lt;/li>
&lt;/ol></description></item><item><title>Energy Solutions in the AI era</title><link>https://JAlcocerT.github.io/JAlcocerT/how-to-check-hot-pump-viability/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/how-to-check-hot-pump-viability/</guid><description>
&lt;p>In retrospective, 12m2 of solar panels are enough to pay no electricity bill in south Spain.&lt;/p>
&lt;p>But how can we now this in advance?&lt;/p>
&lt;p>Ive also seen invoices with less than 100kwh in regular months, then spike to 360wkh in august&lt;/p>
&lt;p>Guess why :)&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /poc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/go-solar-trajectory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run build&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx wrangler pages deploy dist --project-name=solar-trajectory&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>&lt;a href="https://solar-trajectory.pages.dev/" target="_blank" rel="noopener">https://solar-trajectory.pages.dev/&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>&lt;a href="https://17e286bf.trip-planner-9lt.pages.dev/?sid=06380&amp;amp;lat=50.9167&amp;amp;lon=5.7833&amp;amp;name=Maastricht&amp;#43;Airport&amp;#43;Zuid&amp;#43;Limburg&amp;amp;country=NL" target="_blank" rel="noopener">https://17e286bf.trip-planner-9lt.pages.dev/?sid=06380&amp;lat=50.9167&amp;lon=5.7833&amp;name=Maastricht+Airport+Zuid+Limburg&amp;country=NL&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;p>There are now two concepts:&lt;/p>
&lt;ul>
&lt;li>Face sun now: sets the panel normal directly toward the current sun vector. This is the tracker-style instantaneous optimum.&lt;/li>
&lt;li>Use annual fixed: finds the best fixed tilt/azimuth for the selected latitude using a clear-sky &lt;br>
geometry proxy: it samples the year and maximizes max(0, sun · panelNormal) * sin(solarAltitude).&lt;/li>
&lt;/ul>
&lt;p>Important: this is not yet a real PV yield optimum. It ignores clouds, shading, roof constraints, DNI/ DHI split, temperature losses, and self-consumption.&lt;/p>
&lt;p>It answers: “geometrically, what fixed panel orientation catches the most clear-sky sun at this latitude?”&lt;/p>
&lt;p>Is this for you if your kwh is 0.26 eur?&lt;/p>
&lt;p>go-solar.pages.dev/era5-cities/&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">sudo docker ps -q &lt;span class="p">|&lt;/span> xargs -r sudo docker stop
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo docker start mqtt-dht11-dashboard emqx 0ce58d132af6
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo docker container prune -f &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/messaging-protocols/#mqtt-x-picow-x-dht22" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/messaging-protocols/#mqtt-x-picow-x-dht22&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/RPi/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm start&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker compose up --build -d&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol>
&lt;li>Stop the local Node process.&lt;/li>
&lt;li>From mqtt-dht11-dashboard, run docker compose up &amp;ndash;build -d&lt;/li>
&lt;li>The container should continue using the existing data/readings.sqlite&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/data-experiments/dht11-telemetry.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/d6PyYCBft44" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/cHIPjAG2dkk" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!--
https://youtube.com/shorts/cHIPjAG2dkk
-->
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl"> sudo ufw status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ufw allow 1883/tcp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mosquitto_sub -h 192.168.1.106 -p &lt;span class="m">1883&lt;/span> -t &lt;span class="s2">&amp;#34;esp32/temperature/dht11&amp;#34;&lt;/span> -v
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mosquitto_sub -h 192.168.1.106 -p &lt;span class="m">1883&lt;/span> -t &lt;span class="s2">&amp;#34;esp32/humidity/dht11&amp;#34;&lt;/span> -v&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>the esp32 got &lt;code>192.168.1.109&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>see Tools -&amp;gt; Serial Monitor at arduinoIDE for the logs&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;p>// &amp;mdash;- Configuration &amp;mdash;-
const char* WIFI_SSID = &amp;ldquo;your-wifi&amp;rdquo;;
const char* WIFI_PASSWORD = &amp;ldquo;your-password&amp;rdquo;; // const char* handles special chars ($, @, etc.)
const char* MQTT_BROKER = &amp;ldquo;192.168.1.106&amp;rdquo;;
const int MQTT_PORT = 1883;
const int DHT_PIN = 4; // GPIO4 (D4) — best category, no special boot functions
const int PUBLISH_MS = 5000;&lt;/p>
&lt;p>&lt;a href="https://github.com/JAlcocerT/RPi/blob/main/Z_MicroControllers/ESP32/esp32-c/arduino-idea-esp32-internal-temp.png" target="_blank" rel="noopener">https://github.com/JAlcocerT/RPi/blob/main/Z_MicroControllers/ESP32/esp32-c/arduino-idea-esp32-internal-temp.png&lt;/a>&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/RPi/blob/main/Z_MicroControllers/ESP32/esp32-c/esp32-dht11-mqtt.cpp" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">ESP32 &amp;#43; DHT1 &amp;#43; MQTT ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/emqx" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">EMQX Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;blockquote>
&lt;p>Open ArduinoIDE and select &lt;code>ESP32 Dev Module&lt;/code> + &lt;code>CTRL + U&lt;/code> to compile the sketch &lt;code>esp32-internal-temp-mqtt.cpp&lt;/code> into the board with the right wifi pwd.&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/electronics-101/#quick-iot-samples" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/electronics-101/#quick-iot-samples&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">ssh casa@192.168.1.106
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./Home-Lab/emqx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker compose up -d&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Check if the container is running&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker ps &lt;span class="p">|&lt;/span> grep emqx
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Watch EMQX logs live&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker logs emqx -f&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>Connect to the UI via: &lt;code>http://192.168.1.106:18083&lt;/code> then add &lt;code>admin/public&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>the new node app is at &lt;code>http://192.168.1.106:3000/&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://github.com/JAlcocerT/RPi/blob/main/Z_MicroControllers/ESP32/esp32-c/mqtt-dht11-dashboard/dht11-telemetry.png" target="_blank" rel="noopener">https://github.com/JAlcocerT/RPi/blob/main/Z_MicroControllers/ESP32/esp32-c/mqtt-dht11-dashboard/dht11-telemetry.png&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/JAlcocerT/RPi/tree/main/Z_MicroControllers/ESP32/esp32-c/mqtt-dht11-dashboard" target="_blank" rel="noopener">https://github.com/JAlcocerT/RPi/tree/main/Z_MicroControllers/ESP32/esp32-c/mqtt-dht11-dashboard&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/JAlcocerT/RPi/blob/main/Z_MicroControllers/ESP32/esp32-c/esp32-dht11-mqtt-emqx.cpp" target="_blank" rel="noopener">https://github.com/JAlcocerT/RPi/blob/main/Z_MicroControllers/ESP32/esp32-c/esp32-dht11-mqtt-emqx.cpp&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;a href="https://www.youtube.com/shorts/ZcsaFZgWoEc" target="_blank" rel="noopener">https://www.youtube.com/shorts/ZcsaFZgWoEc&lt;/a>&lt;/p>
&lt;p>Poprawne podsumowanie:&lt;/p>
&lt;ul>
&lt;li>Prąd: ~100 kWh/m (avg 95.9)&lt;/li>
&lt;li>Ciepło worst month: ~2.5 GJ (Feb 2025) ≈ 684 kWh thermal&lt;/li>
&lt;li>Ciepło avg: ~0.8 GJ/m ≈ 220 kWh thermal/m&lt;/li>
&lt;/ul>
&lt;p>coming from &lt;a href="https://jalcocert.github.io/JAlcocerT/thermodynamics/" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/thermodynamics/&lt;/a> and from&lt;/p>
&lt;p>Where some magic happend: &lt;code>https://go-solar.pages.dev/era5-cities/&lt;/code>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /poc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./poc/go-solar&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make eu-capitals-raw&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make eu-capitals-status &lt;span class="c1">#-missing&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make era5-cities-bake # resumable, only fetches new 31&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make era5-cities-bake-local
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make ship&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>&lt;code>https://go-solar.pages.dev/era5-cities/&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/data-experiments/gosolar-eu-ui.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>What to bring from the experiment:&lt;/p>
&lt;ul>
&lt;li>The 5 IR readings + DHT22 (T_surface_in_u, T_surface_in_t, T_air_in, optional T_surface_out_u, T_surface_out_t)&lt;/li>
&lt;li>Date + hour of the measurement (to look up the matching ERA5 GHI / T_air_out for that timestamp)&lt;/li>
&lt;li>Material used + €/m² actually paid&lt;/li>
&lt;li>Any photos of the patch + sensor placement (just nice to have)&lt;/li>
&lt;/ul>
&lt;p>What to bring from the bills:&lt;/p>
&lt;ul>
&lt;li>12 monthly kWh totals&lt;/li>
&lt;li>Their real €/kWh (bill total ÷ kWh)&lt;/li>
&lt;li>Contracted power (kW)&lt;/li>
&lt;li>AC unit age/model if known&lt;/li>
&lt;/ul>
&lt;p>The flow we&amp;rsquo;ll run:&lt;/p>
&lt;ol>
&lt;li>Plug measurements into /era5-cities/Sevilla measured-seasonal section&lt;/li>
&lt;li>Calibrate AC COP using bills vs model prediction (per zzzzz-post-experiment.md step B5)&lt;/li>
&lt;li>Run the three-scenario projection (best/likely/worst)&lt;/li>
&lt;li>Generate the parent-facing one-pager from the template&lt;/li>
&lt;li>Decide whether to scale to full roof&lt;/li>
&lt;/ol>
&lt;p>The docs to reference when you&amp;rsquo;re back:&lt;/p>
&lt;ul>
&lt;li>zzz-azotea-experiment-actionplan.md — execution checklist&lt;/li>
&lt;li>zzz-experiment-expectations.md — sanity-check bands for the readings&lt;/li>
&lt;li>zzzzz-post-experiment.md — workflow → parent presentation&lt;/li>
&lt;/ul>
&lt;p>Good luck with the measurement weekend. Pick a clear-sky day, 14:30–16:30, AC steady-state for an hour beforehand, and remember the slab needs 12+ hours after patch
application to equilibrate. See you on the other side of the empirical confirmation.&lt;/p>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>How about doing &lt;code>energysolutions&lt;/code> NOW?&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/heat_pump.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>+++ Solar assisted heat pump simulation (SAHP)&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Coming from these &lt;a href="https://github.com/JAlcocerT/poc/blob/main/aerothermics/z-next-steps.md" target="_blank" rel="noopener">next steps&lt;/a> to improve &lt;a href="https://github.com/JAlcocerT/poc/blob/main/aerothermics/all-features.md" target="_blank" rel="noopener">the existing features&lt;/a>.&lt;/p>
&lt;p>Its just all about &lt;a href="https://en.wikipedia.org/wiki/Heat_pump" target="_blank" rel="noopener">heat pumps&lt;/a>.&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/go-solar
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make ship &lt;span class="c1">#https://go-solar.pages.dev/era5-cities/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./poc/aerothermics&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make deploy &lt;span class="c1">#https://main.aerothermics-landing.pages.dev/&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Anti-barbell example (what I steered you away from):&lt;/p>
&lt;ul>
&lt;li>Free tier (limited)&lt;/li>
&lt;li>€9/mo (more bins, more years)&lt;/li>
&lt;li>€29/mo (API, batch)&lt;/li>
&lt;li>€99 consult&lt;/li>
&lt;li>Result: 4-way choice, weak free tier, no clear premium positioning&lt;/li>
&lt;/ul>
&lt;p>Barbell example (what you have):&lt;/p>
&lt;ul>
&lt;li>Free, unlimited tool&lt;/li>
&lt;li>€ paid call&lt;/li>
&lt;li>Done&lt;/li>
&lt;/ul>
&lt;h3>CheckList&lt;span class="absolute -mt-20" id="checklist">&lt;/span>
&lt;a href="#checklist" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>The aerotermia PoC:&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /poc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/aero&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="2">
&lt;li>The IoT setup: &lt;em>sensor pushing data via mqtt&lt;/em>&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /RPi
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./RPi/&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="3">
&lt;li>The historical invoice records: &lt;em>use kreuzberg or your eyes for once&lt;/em>&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>If you dont go crazy, 100kwh/m avg seems reasonable, invoices in spain inform about neighbours, they do x2 (lol)&lt;/p>
&lt;/blockquote>
&lt;ol start="4">
&lt;li>Wrapping all together:&lt;/li>
&lt;/ol>
&lt;h3>What about blender?&lt;span class="absolute -mt-20" id="what-about-blender">&lt;/span>
&lt;a href="#what-about-blender" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>How much Tilt matters for FV&lt;span class="absolute -mt-20" id="how-much-tilt-matters-for-fv">&lt;/span>
&lt;a href="#how-much-tilt-matters-for-fv" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Depending on: latitude, day of the year, hour&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/JAlcocerT/poc/blob/main/aerothermics/z-tilt-101.md" target="_blank" rel="noopener">https://github.com/JAlcocerT/poc/blob/main/aerothermics/z-tilt-101.md&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>From PoC to OutReach</title><link>https://JAlcocerT.github.io/JAlcocerT/poc-107/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/poc-107/</guid><description>
&lt;p>For social previews, use:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.opengraph.xyz/url/https%3A%2F%2Febooks.jalcocertech.com" target="_blank" rel="noopener">https://www.opengraph.xyz/url/https%3A%2F%2Febooks.jalcocertech.com&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://cards-dev.twitter.com/validator" target="_blank" rel="noopener">https://cards-dev.twitter.com/validator&lt;/a> (after deploy)&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>TL;DR&lt;/strong>&lt;/p>
&lt;p>When was the last time you saw the fight club, matrix or Mr robot?&lt;/p>
&lt;blockquote>
&lt;p>a copy of a copy of a copy of a copy&lt;/p>
&lt;/blockquote>
&lt;p>single serving things&lt;/p>
&lt;p>Within the x300:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># cd ./Home-Lab/forgejo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gh status &lt;span class="c1">#make sure to where you are logged (to bring github goodies to forgejo you will need this)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#http://192.168.1.2:3034/jalcocert/optimum-path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make migrate-repo REPO_OWNER=JAlcocerT REPO_NAME=optimum-path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make add-collaborator NEW_USER=hermesagent REPO_OWNER=JAlcocerT REPO_NAME=optimum-path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make migrate-repo &lt;span class="nv">REPO_OWNER&lt;/span>&lt;span class="o">=&lt;/span>JAlcocerT &lt;span class="nv">REPO_NAME&lt;/span>&lt;span class="o">=&lt;/span>leads-slubnechwile
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make add-collaborator &lt;span class="nv">NEW_USER&lt;/span>&lt;span class="o">=&lt;/span>hermesagent &lt;span class="nv">REPO_OWNER&lt;/span>&lt;span class="o">=&lt;/span>JAlcocerT &lt;span class="nv">REPO_NAME&lt;/span>&lt;span class="o">=&lt;/span>leads-slubnechwile &lt;span class="c1">#this will require apify/firecrawl keys later on&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make list-user-repos NEW_USER=hermesagent #now showing x5!&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Then in the Pi with Forgejo connected:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone http://192.168.1.2:3034/JAlcocerT/leads-slubnechwile &lt;span class="c1">#hermesagent changeme123&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux ls
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux new -s claude-leads&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#mkdir leads&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./leads
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude --dangerously-skip-permissions&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make fetch &lt;span class="c1">#make help&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make enrich
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make &lt;span class="nb">export&lt;/span> &lt;span class="c1">#nano ./data/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make sample&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This remind me &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution/#json-to-toon" target="_blank" rel="noopener">about TooN&lt;/a> for prompts.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone forgejo-home:jalcocert/eda-f1.git&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Let the magic start:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">claude &lt;span class="c1">#/web-setup #https://claude.ai/code/onboarding&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>The service to rule them all&lt;span class="absolute -mt-20" id="the-service-to-rule-them-all">&lt;/span>
&lt;a href="#the-service-to-rule-them-all" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>It was just about bringing these learnings to &lt;code>jalcocertech-services&lt;/code>:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/JAlcocerT/leads-slubnechwile" target="_blank" rel="noopener">https://github.com/JAlcocerT/leads-slubnechwile&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/JAlcocerT/make-landing" target="_blank" rel="noopener">https://github.com/JAlcocerT/make-landing&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">i want the alex hormozi skill to rate whats useful from this repo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">as a personal lead getter and enrich, is this all fluff? or can sth
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">be use to create a blueprint?&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>yea, ive destilled Hormozi videos recently ;)&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>Founders write strategy decks, ship nothing.&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;p>Dont be a founder.&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>85 people in a call celebrating shipping a POC in 2 weeks.&lt;/p>
&lt;p>Outside this room, single developers with personal agent setups are shipping equivalent work in &lt;strong>2 days&lt;/strong>.&lt;/p>
&lt;p>The internal velocity feels fast &lt;em>relative to before&lt;/em>, not relative to what&amp;rsquo;s actually possible.&lt;/p>
&lt;p>The gap isn&amp;rsquo;t the tooling. The gap is the corporate substrate.&lt;/p>
&lt;p>&lt;strong>Now → 6 months (mid 2026)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Junior dev / data-analyst hiring freezes deepen. Big 4 analyst intakes already cut.&lt;/li>
&lt;li>Personal-velocity gap widens — solo devs with multi-agent setups ship 10x while enterprise still gates tools.&lt;/li>
&lt;li>Internal POCs proliferate.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>24 → 36 months (2028)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Enterprise products from creative spike deployed at scale → &lt;strong>clear-I/O white-collar cull broadens&lt;/strong>: accountants, ops, admin, mid-analytics, customer service. The &amp;ldquo;fluff jobs not worried today&amp;rdquo; wake up.&lt;/li>
&lt;li>Services firms compress to a needle: partners + AI-tool resellers + regulatory work survive, the rest gone.&lt;/li>
&lt;li>Munich Re-style protected industries show first PM compression (still slower than IT services).&lt;/li>
&lt;li>AI literacy becomes universal → &lt;strong>creative-dev moat erodes&lt;/strong>. The buffer phase ends.&lt;/li>
&lt;/ul>
&lt;p>Expert consulting — for those who value getting outcomes right the first time &lt;em>and before the tsunami arrives&lt;/em> 👇&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/consulting.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Tier of Service for the ones that cant wait to get value&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/ebooks.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks with free value.&lt;/div>&lt;/a>
&lt;/div>
&lt;ol>
&lt;li>
&lt;p>Two windows to capitalise (2026 → mid-2028) — champion role + brand/ship as complementary plays with shared closing date.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Macro hedge (the third failure mode) — currency-debasement risk, policy playbook, asset implications, and the three-hedge framing (employer / career / currency).&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Closer: &amp;ldquo;Most people hedge zero of three. Hedging one is good. Hedging all three is the actual position.&amp;rdquo;&lt;/p>
&lt;h3>The only way Im shipping now&lt;span class="absolute -mt-20" id="the-only-way-im-shipping-now">&lt;/span>
&lt;a href="#the-only-way-im-shipping-now" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>This is beyond &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution-with-dao/#for-vibe-coders" target="_blank" rel="noopener">a good UI prompt&lt;/a>.&lt;/p>
&lt;p>Also more than a &lt;a href="https://jalcocert.github.io/JAlcocerT/how-to-perform-free-web-audit/#programmatic-free-audits-for-websites" target="_blank" rel="noopener">good initial skeleton&lt;/a> with docker, make and &lt;a href="https://jalcocert.github.io/JAlcocerT/diy-landing-boilerplate/#what-should-a-landing-have" target="_blank" rel="noopener">whatever atf goodies&lt;/a> you listed.&lt;/p>
&lt;p>Must have &lt;a href="https://jalcocert.github.io/JAlcocerT/diy-landing-boilerplate/#tested-few-esp" target="_blank" rel="noopener">esp connected to pb &lt;/a>or just bring your own DRIP&lt;/p>
&lt;blockquote>
&lt;p>yea, &lt;a href="https://github.com/JAlcocerT/poc_webs_magnet/blob/master/.env.sample" target="_blank" rel="noopener">pocketbase&lt;/a> does the lead trick&lt;/p>
&lt;/blockquote>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /jalcocertech-services&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./jalcocertech-services/z-shipping-blueprint&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Layer 0: Capture infra ← YOU HAVE THIS
Layer 1: ICP (who) ← MISSING
Layer 2: Offer (Tier 1/2/3) ← MISSING
Layer 3: Lead magnet + VSL ← MISSING
Layer 4: Enrichment + nurture ← MISSING
Layer 5: Sales process / book ← MISSING&lt;/p>
&lt;p>Hormozi rigor now: Shape ✓ MAGIC ✓ Value Eq ✓ Without-pattern ✓ Damaging admissions ✓ Value Stack
✓ Guarantee typed ✓ VSL ✓ Lead magnet ✓ Risk-reversal ✓.&lt;/p>
&lt;ol start="0">
&lt;li>Define a product/service&lt;/li>
&lt;li>Get a Landing: cal+forms&lt;/li>
&lt;li>Outreach&amp;hellip;&lt;/li>
&lt;/ol>
&lt;p>Its not just to get the leads&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>But to understand the different treat on &lt;a href="https://github.com/JAlcocerT/make-landing/tree/master/z-hormozi-actions" target="_blank" rel="noopener">how to cold vs warm&lt;/a>, after &lt;a href="https://github.com/JAlcocerT/make-landing/blob/master/z-hormozi-feedback.md" target="_blank" rel="noopener">getting feedback&lt;/a>.&lt;/p>
&lt;p>Just &lt;a href="https://github.com/JAlcocerT/make-landing/blob/master/z-starting-emails.md" target="_blank" rel="noopener">start today&lt;/a> sending mails:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://github.com/JAlcocerT/make-landing/tree/master/z-hormozi-actions&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://github.com/JAlcocerT/make-landing/blob/master/mjml-email/send_mjml_api_email.py&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Dont get &lt;a href="https://github.com/JAlcocerT/leads-slubnechwile/blob/main/zzz-hormozi-actionplan-leadarchitect.md#q-im-overwhelmed-where-do-i-start-today" target="_blank" rel="noopener">overwhelmed&lt;/a>&lt;/p>
&lt;p>This is &lt;a href="https://github.com/JAlcocerT/leads-slubnechwile/blob/main/zzz-hormozi-actionplan-leadarchitect.md#phase-1--start-the-14-day-clock-day-1-90-min" target="_blank" rel="noopener">the action plan&lt;/a>&lt;/p>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">Outbound email 101 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;ol>
&lt;li>Get a domain&lt;/li>
&lt;li>Get a workspace &lt;code>https://workspace.google.com/&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>&lt;a href="https://admin.google.com/" target="_blank" rel="noopener">https://admin.google.com/&lt;/a>&lt;/p>
&lt;p>dont forget to add&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">SPF: Host: @ TXT &amp;#34;v=spf1 include:_spf.google.com ~all&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">DMARC: Host: _dmarc TXT &amp;#34;v=DMARC1; p=quarantine; rua=mailto:dmarc@DOMAIN; pct=100; adkim=s; aspf=s&amp;#34;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/details>
&lt;blockquote>
&lt;p>&lt;code>https://mxtoolbox.com/&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;p>ACV = Annual Contract Value.&lt;/p>
&lt;p>Money one customer pays per year.&lt;/p>
&lt;p>Example:&lt;/p>
&lt;ul>
&lt;li>Client pays $500/mo → ACV = $6,000&lt;/li>
&lt;li>Client pays $2k one-time + $300/mo retainer → ACV = $5,600&lt;/li>
&lt;li>Wedding photographer charges €1,500 bundle once → ACV = €1,500&lt;/li>
&lt;/ul>
&lt;p>Why it matters in playbook:&lt;/p>
&lt;p>&amp;ldquo;ACV &amp;gt;$3k&amp;rdquo; rule = your target client&amp;rsquo;s CUSTOMERS must pay them &amp;gt;$3k/yr each. Reason: if their customer = $500/yr,
they can&amp;rsquo;t afford to pay you $3.5k/mo for outbound. Math breaks.&lt;/p>
&lt;p>┌──────────────┬────────────────────────────────────┐
│ Client&amp;rsquo;s ACV │ Can pay you $3.5k/mo? │
├──────────────┼────────────────────────────────────┤
│ &amp;lt;$3k │ No. 1 deal barely covers your fee. │
├──────────────┼────────────────────────────────────┤
│ $3-10k │ Maybe. Need 5+ closes/yr to ROI. │
├──────────────┼────────────────────────────────────┤
│ &amp;gt;$10k │ Yes. 1-2 closes = 3-10x ROI. │
└──────────────┴────────────────────────────────────┘&lt;/p>
&lt;p>Hormozi version: &amp;ldquo;Their unit economics need to support your fee.&amp;rdquo;&lt;/p>
&lt;p>Related terms you&amp;rsquo;ll see:&lt;/p>
&lt;ul>
&lt;li>MRR = Monthly Recurring Revenue (your $3.5k/mo retainer × clients)&lt;/li>
&lt;li>LTV = Lifetime Value (ACV × years they stay)&lt;/li>
&lt;li>CAC = Customer Acquisition Cost (what it costs you to close 1 client)&lt;/li>
&lt;/ul>
&lt;p>Eat your own dog food = use your own product/service as a customer.&lt;/p>
&lt;p>Origin: 1980s tech — Microsoft VP forced engineers to run their own software internally before
shipping. If it&amp;rsquo;s not good enough for you, not good enough to sell.&lt;/p>
&lt;p>Hormozi version: &amp;ldquo;your outbound IS your demo.&amp;rdquo;&lt;/p>
&lt;p>If you sell outbound to B2B SaaS, your own outbound campaigns = the proof. Prospects see your
cold email, hire you because the email worked on them.&lt;/p>
&lt;p>If you sell consulting, your own biz growth = the case study.&lt;/p>
&lt;p>If you sell weight-loss coaching, your body = the billboard.&lt;/p>
&lt;p>Why it matters for biz:&lt;/p>
&lt;ol>
&lt;li>Skin in the game (Taleb link) — you eat the same risk you sell&lt;/li>
&lt;li>Free case study — your own metrics = the testimonial&lt;/li>
&lt;li>Credibility moat — competitors selling &amp;ldquo;outbound for SaaS&amp;rdquo; who don&amp;rsquo;t run outbound = exposed&lt;br>
instantly&lt;/li>
&lt;li>Product feedback loop — you find bugs/gaps before customers do&lt;/li>
&lt;li>Damaging admissions earned — you can say &amp;ldquo;I tried this exact thing, here&amp;rsquo;s where it broke&amp;rdquo; &lt;br>
because you actually did&lt;/li>
&lt;/ol>
&lt;p>The anti-pattern Hormozi attacks:&lt;/p>
&lt;p>▎ &amp;ldquo;The curse of modernity is people better at explaining than doing.&amp;rdquo; — Taleb&lt;/p>
&lt;p>Coaches who don&amp;rsquo;t run businesses. Marketing agencies whose own marketing is broken. Sales &lt;br>
trainers who haven&amp;rsquo;t sold in 10 years. Course-sellers whose only revenue is the course.&lt;/p>
&lt;p>Test for your biz: name your top 3 services. For each, are YOU your own customer? If no, either&lt;br>
start using it or shut up about it.&lt;/p>
&lt;p>For your TSL Poland Agentic RevOps idea (per your agentic-revops-tls.md): you should be using &lt;br>
your own agentic outbound to acquire your first 5 TSL clients. Those agents = your demo. Their&lt;br>
booking calendars = your case study.&lt;/p>
&lt;p>▎ &amp;ldquo;If you wouldn&amp;rsquo;t pay for it, why should they?&amp;rdquo;&lt;/p>
&lt;h3>Destilling read books&lt;span class="absolute -mt-20" id="destilling-read-books">&lt;/span>
&lt;a href="#destilling-read-books" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Stage 1 reading on a Stage 4 shelf = procrastination via knowledge accumulation.&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Some of the best money is deciding to stop spending bad money.&amp;rdquo; — same with reading time.&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>&lt;strong>Premature pivot&lt;/strong> — every new book seems like the missing piece. The missing piece is usually applying the previous book harder.&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Model&lt;/th>
&lt;th>Source&lt;/th>
&lt;th>Where it bites in YOUR biz&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Reciprocity / Scarcity / Authority / Social Proof / Commitment / Liking / Unity&lt;/td>
&lt;td>Cialdini&lt;/td>
&lt;td>Every cold email, every offer page&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Calibrated questions (&amp;ldquo;How am I supposed to do that?&amp;rdquo;)&lt;/td>
&lt;td>Voss&lt;/td>
&lt;td>Every sales call objection&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Loss aversion (2× pain of equal gain)&lt;/td>
&lt;td>Kahneman&lt;/td>
&lt;td>Pricing / guarantee design&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>80/20 → 64/4 → 51.2/0.8&lt;/td>
&lt;td>Koch&lt;/td>
&lt;td>Customer / channel / SKU pruning&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Skin in the game&lt;/td>
&lt;td>Taleb&lt;/td>
&lt;td>Performance pricing, founder-led sales&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Convex bets (asymmetric upside, capped downside)&lt;/td>
&lt;td>Taleb / Duke&lt;/td>
&lt;td>Offer testing, channel testing&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Survivorship bias / halo effect&lt;/td>
&lt;td>Rosenzweig&lt;/td>
&lt;td>Don&amp;rsquo;t copy founder stories blindly&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Default effect / nudge&lt;/td>
&lt;td>Thaler&lt;/td>
&lt;td>Onboarding flow, default tier&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Memento mori / amor fati&lt;/td>
&lt;td>Stoics&lt;/td>
&lt;td>Operator psychology when revenue dips&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Scale + control = wealth&lt;/td>
&lt;td>DeMarco&lt;/td>
&lt;td>Filter on every new biz idea&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>10 models. That&amp;rsquo;s the operating playbook from 100 books.&lt;/strong>&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-yellow-100 bg-yellow-50 text-yellow-900 dark:border-yellow-200/30 dark:bg-yellow-700/30 dark:text-yellow-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
⚠️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
To destill operator knowledge for actions, ive &lt;a href="https://github.com/JAlcocerT/jalcocertech-services/blob/master/docs/destilled-ebooks/z-read-books-notes/z-hormozi-curated.md" target="_blank" rel="noopener">put this together&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>&lt;strong>Offers&lt;/strong> — make it so good they feel stupid saying no. Value Equation: (Dream × Likelihood) ÷ (Time × Effort).&lt;/li>
&lt;li>&lt;strong>Leads&lt;/strong> — Core Four (warm, content, cold, paid) + Lead Getters (referrals, employees, agencies, affiliates). Pick one, commit 12-24 mo.&lt;/li>
&lt;li>&lt;strong>Money Models&lt;/strong> — sequence offers (attraction → upsell → downsell → continuity) so 30-day profit ≥ CAC.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>What PoCs have you done YTD?&lt;span class="absolute -mt-20" id="what-pocs-have-you-done-ytd">&lt;/span>
&lt;a href="#what-pocs-have-you-done-ytd" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Not counting small things like: &lt;code>https://aegis-freedom.pages.dev/&lt;/code> nor &lt;code>https://the-poincare-lab.pages.dev/&lt;/code> nor &lt;code>https://btc-powerlaw.pages.dev/&lt;/code>&lt;/p>
&lt;p>Nor the services organization.&lt;/p>
&lt;ol>
&lt;li>Telecom PoCs - RDKb &amp;amp; iperf3&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/iperf&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Thethings you learn when tinkering with DNS:https://jalcocert.github.io/JAlcocerT/private-dns-with-docker/#speed-tests&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/AIBI/iperf3-dashboard.png" alt="poc vite fastapi iperf3" loading="lazy" />&lt;/p>
&lt;ol start="2">
&lt;li>
&lt;p>GenBi solutions&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Make PM/Pdm&amp;rsquo;s life harder&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/poc-103/#helping-pms-and-pdms" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/poc-103/#helping-pms-and-pdms&lt;/a>&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/poc/pm-pdm-copilot-brdprd.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;ol start="4">
&lt;li>
&lt;p>Farm Analytics &lt;code>iotsolutions&lt;/code>: PicoW/ESP32 with DHT11/22 to MQTT&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Go solar and Aerotermia: &lt;code>energysolutions&lt;/code>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>One that you can try anytime: &lt;code>https://go-solar.pages.dev/&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/heat-transfer-ice/#solar-thermal-power" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/heat-transfer-ice/#solar-thermal-power&lt;/a>&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gosolar.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;ul>
&lt;li>Other that you can get some of my time:&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/aerotermia.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;ol start="6">
&lt;li>Electronics and&amp;hellip;MBSD too&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux new -s claude-mbsd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux attach -t claude-electronics #http://192.168.1.2:3034/hermesagent/electronics-101&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude --dangerously-skip-permissions&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/radial_engine_combustion_animation.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/inline6_combustion.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/inline1_thermo.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;blockquote>
&lt;p>You bet I did &lt;code>https://multibodysystemsdynamics.com/&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;ol start="7">
&lt;li>Coming up: Telecom PoC - AD&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/telco-geo-anomaly-detection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx wrangler pages deploy dist --project-name=telco&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make deploy PROJECT=my-name&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>Surprise, this was taken by&amp;hellip;a game (?) &lt;code>https://telco.pages.dev/&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>So i just got &lt;a href="https://telco-geo-anomaly.pages.dev/" target="_blank" rel="noopener">https://telco-geo-anomaly.pages.dev/&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;h3>Which Tech Talks have you done YTD?&lt;span class="absolute -mt-20" id="which-tech-talks-have-you-done-ytd">&lt;/span>
&lt;a href="#which-tech-talks-have-you-done-ytd" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The last one, &lt;a href="https://jalcocert.github.io/JAlcocerT/plants-102-and-iot/#big-data-tech-talk" target="_blank" rel="noopener">around iot x big data&lt;/a> with the dht22&lt;/p>
&lt;h3>Keep Stop Start - Doing&lt;span class="absolute -mt-20" id="keep-stop-start---doing">&lt;/span>
&lt;a href="#keep-stop-start---doing" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/volumetric_map.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/brayton_jet.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/rankine_steam.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/stirling_engine.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/vapor_compression_fridge.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/volumetric_map.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/vvt_cam_phasing.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/wankel_rotary.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>What you can do with the Makefile&lt;/p>
&lt;p>cd trajectory-optimization&lt;/p>
&lt;p>make help # list all targets make pending # animation + setup study (the in-flight pair)
make animation # just the Phase-4 lap MP4 make setup-study # just the brake/mass/CoG sweep
make practice-plan # the actual deliverable — corner targets
make phase4 # just the OCP at user-match calibration make all # everything (4-6 hours)&lt;/p></description></item><item><title>From PoCs to a Brand</title><link>https://JAlcocerT.github.io/JAlcocerT/poc-106/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/poc-106/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Spinning agents like crazy.&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>How long can agents run?&lt;/p>
&lt;p>How good codex + openai monthly sub can get?&lt;/p>
&lt;p>And the open models?&lt;/p>
&lt;p>Lets figure out.&lt;/p>
&lt;h2>Testing Agents&lt;span class="absolute -mt-20" id="testing-agents">&lt;/span>
&lt;a href="#testing-agents" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Get ready to see &lt;a href="https://github.com/JAlcocerT/Home-Lab/blob/main/forgejo/forgejo-for-agents.md" target="_blank" rel="noopener">&lt;strong>forgejo&lt;/strong> for agents&lt;/a> in action.&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Get Forgejo ready &lt;code>192.168.1.2:3034&lt;/code> as seen &lt;a href="https://jalcocert.github.io/JAlcocerT/selfhosting-media/#code-is-also-media" target="_blank" rel="noopener">here&lt;/a>.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>Because some of these projects are already running autonomously and pushing towards &lt;code>http://192.168.1.2:3034/hermesagent&lt;/code>&lt;/p>
&lt;p>The tricks: &lt;em>forgejo, claude code, termix and tmux&lt;/em>&lt;/p>
&lt;p>As long as this works &lt;code>https://status.claude.com/&lt;/code> you are good to go&lt;/p>
&lt;p>For additional piece of mind, get to know if you are logged in to important places:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">gh auth status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> glab auth status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> For plain Git over SSH, check each host:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ssh -T git@github.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ssh -T git@gitlab.com&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Get your brand kit first&lt;span class="absolute -mt-20" id="get-your-brand-kit-first">&lt;/span>
&lt;a href="#get-your-brand-kit-first" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Whats your excuse not to &lt;a href="https://github.com/JAlcocerT/jalcocertech-services/tree/master/design-brand-kit" target="_blank" rel="noopener">have one&lt;/a>?&lt;/p>
&lt;p>If you dont like claude design, you have:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/VoltAgent/awesome-design-md" target="_blank" rel="noopener">https://github.com/VoltAgent/awesome-design-md&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/nexu-io/open-design" target="_blank" rel="noopener">https://github.com/nexu-io/open-design&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://open-design.ai/templates/" target="_blank" rel="noopener">https://open-design.ai/templates/&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /jalcocertech-services &lt;span class="c1">#https://github.com/JAlcocerT/jalcocertech-services/tree/master/design-brand-kit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./jalcocertech-services/design-brand-kit&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>FOSS&lt;span class="absolute -mt-20" id="foss">&lt;/span>
&lt;a href="#foss" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Review OSS, create SEO ready posts.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">claude &lt;span class="c1">#/skills #/foss-post - inside ./agent/skills&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#so could we have a test run of the skill for the repo: https://codeberg.org/Forgejo/forgejo&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And a &lt;strong>SEO ready&lt;/strong> hugo theme:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npm run seo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">linkchecker --check-extern --no-warnings http://localhost:1313/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker run --rm -it -u $(id -u):$(id -g) ghcr.io/linkchecker/linkchecker:latest --verbose https://www.example.com&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv add linkchecker &lt;span class="c1">#pip3 install linkchecker&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># In one terminal:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> hugo server -D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># In another:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">cd&lt;/span> tests/seo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> npm run seo:external &lt;span class="c1"># localhost:1313 (lychee or linkchecker)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> npm run seo:external:prod &lt;span class="c1"># against fossengineer.com&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> bash external-links.sh --internal-only &lt;span class="c1"># skip external HTTP (faster)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> bash external-links.sh --tool&lt;span class="o">=&lt;/span>linkchecker &lt;span class="c1"># force a specific tool&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Open question worth your attention before 1.1a: /static/ vs /assets/ for the cover PNGs.&lt;/p>
&lt;ul>
&lt;li>/static/img/covers/foo.png — served as-is, no processing. Simplest. PNG-only.&lt;/li>
&lt;li>/assets/covers/foo.png — Hugo can process them: generate WebP, multiple widths for srcset, hash for cache-busting. ~30% smaller transfer for the cover itself.&lt;/li>
&lt;/ul>
&lt;p>have we added what are the killer features/claims of nanoclaw?&lt;/p>
&lt;p>ive been recently making some upgrades to this repository (hugo ssg with a
lot of selfhosted posts and docs), id like to make the seo even better, but
not from the content writing, but from the theme perspective, can you have a
look to the repo, also to z-seo-improvements and lmk what can we do?
ideally, we can have a z-seo-plan.md and generate local tests for the seo to
be 100% even before publishing (this goes to cf pages btw)&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">can we do as well: https://github.com/transmute-app/transmute
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">https://github.com/olalie/tapmap
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">https://github.com/mauriceboe/TREK&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Create video to ship to tech yt.&lt;/p>
&lt;p>You like &lt;code>selfh.st&lt;/code>?&lt;/p>
&lt;p>Me too. &lt;em>And thats not sth new&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>&lt;a href="https://github.com/abhigyanpatwari/GitNexus?tab=readme-ov-file" target="_blank" rel="noopener">https://github.com/abhigyanpatwari/GitNexus?tab=readme-ov-file&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>GitNexus: The Zero-Server Code Intelligence Engine - GitNexus is a client-side knowledge graph creator that runs entirely in your browser.&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>Drop in a GitHub repo or ZIP file, and get an interactive knowledge graph wit a built in Graph RAG Agent. Perfect for code exploration&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;h3>RevOps&lt;span class="absolute -mt-20" id="revops">&lt;/span>
&lt;a href="#revops" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Agents for lead enrich pipelines?&lt;/p>
&lt;p>One pagers customized to your pain points for warm leads?&lt;/p>
&lt;p>What? personalized outbound?&lt;/p>
&lt;p>Now you have no excuses for the cold automatized thing, while you do the &lt;a href="https://github.com/JAlcocerT/slubne-chwile-y26/blob/master/b2b-vs-b2c.md#cold-call-script--partner-playbook" target="_blank" rel="noopener">cold calls for B2B&lt;/a>&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-yellow-100 bg-yellow-50 text-yellow-900 dark:border-yellow-200/30 dark:bg-yellow-700/30 dark:text-yellow-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
⚠️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Ill assume you have a &lt;a href="https://github.com/JAlcocerT/RPi/blob/main/Z_RPi_Cam/homelab-selfhosting.sh" target="_blank" rel="noopener">secure/proper place&lt;/a> to run agents &lt;em>like a spare Pi with access to a local Forgejo&lt;/em>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>you can enrich leads with amazing info like&amp;hellip;how long does the domain even exist?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">whois leadarchitect.org&lt;span class="p">|&lt;/span> grep -i -E &lt;span class="s2">&amp;#34;(creation|created|registered)&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Web Audits&lt;span class="absolute -mt-20" id="web-audits">&lt;/span>
&lt;a href="#web-audits" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I made this one as a lead magnet: &lt;em>to show a problem - must websites are terrible&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/poc_webs_magnet&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker ps -a --filter &lt;span class="s2">&amp;#34;name=pocketbase&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/pocketbase" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">PocketBase | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/poc_webs_magnet/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
PoC Web Magets ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;h3>GenBI&lt;span class="absolute -mt-20" id="genbi">&lt;/span>
&lt;a href="#genbi" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I was doing &lt;a href="https://jalcocert.github.io/JAlcocerT/a-diy-boilerplate-to-ship/#the-tech-talk" target="_blank" rel="noopener">some tech talk&lt;/a> around this.&lt;/p>
&lt;!--
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/langchain-db-ui" target="_blank" rel="noreferrer">&lt;img
alt="Example - LangChain x DB &amp;#43; UI"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Example - LangChain x DB &amp;#43; UI&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Wrapping LangChain DB Queries into a custom UI to get insights&lt;/div>&lt;/a>
&lt;/div>
-->
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/langchain-db-ui" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
LangChain x DB x UI Github ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;h4>Call it Shopify QnA&lt;span class="absolute -mt-20" id="call-it-shopify-qna">&lt;/span>
&lt;a href="#call-it-shopify-qna" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;h3>Eng&lt;span class="absolute -mt-20" id="eng">&lt;/span>
&lt;a href="#eng" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The comeback to engineering is real (with AI).&lt;/p>
&lt;h4>Electr Eng&lt;span class="absolute -mt-20" id="electr-eng">&lt;/span>
&lt;a href="#electr-eng" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Bc i have PyScipe is there too.&lt;/p>
&lt;p>Even though I just wanted to plant tomatoes and had some doubt with the Kickback&amp;hellip;&lt;/p>
&lt;p>That got simulated and &lt;a href="https://github.com/JAlcocerT/VideoEditingRemotion/tree/main/remotion-electronics" target="_blank" rel="noopener">made a quick remotion video&lt;/a>&lt;/p>
&lt;p>Now, for the agents to continue:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/electronics-101/tree/master&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#or within my pi4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux ls &lt;span class="c1">#http://192.168.1.2:3034/hermesagent/electronics-101/src/branch/master/PLAN.md&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux attach -t claude-electronics &lt;span class="c1">#http://192.168.1.2:3034/hermesagent/electronics-101&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/electronic/forgejo-electronics-mirror.png" alt="Github to Forgejo mirror" loading="lazy" />&lt;/p>
&lt;h4>Mech Eng&lt;span class="absolute -mt-20" id="mech-eng">&lt;/span>
&lt;a href="#mech-eng" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Bc i have my mbsd ready to avoid agents alucinating physics.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/multi-body/tree/master #the HUB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/mbsd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make add-collaborator NEW_USER=hermesagent REPO_OWNER=JAlcocerT REPO_NAME=mbsd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone forgejo-home:hermesagent/mbsd.git &lt;span class="c1">#http://192.168.1.2:3034/hermesagent/mbsd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./mbsd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux new -s claude-mbsd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux attach -t claude-mbsd &lt;span class="c1">#http://192.168.1.2:3034/hermesagent/electronics-101&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude --dangerously-skip-permissions -p &amp;#34;ive been tinkering with multi body system dynamics on this repository, what are you thought of it?&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install -y python3-sympy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install -y python3-scipy python3-matplotlib&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>PS: including with some &lt;a href="https://github.com/JAlcocerT/mbsd/tree/master/z-fluid-mechanics" target="_blank" rel="noopener">fluid dynamics around combustion&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/cc-long-plan.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>3D-mbsd-sim/ v1 is complete. Five commits, all five ROADMAP acceptance criteria hit:&lt;/p>
&lt;p>┌───────────────────────────────────────────┬─────────────────────────────┬───────────────────┐
│ Commit │ Acceptance │ Achieved │
├───────────────────────────────────────────┼─────────────────────────────┼───────────────────┤
│ C1 60953cf quaternions + Body3D / MBody3D │ q→R→q round-trip &amp;lt; 1e-13 │ ~1e-15 │
├───────────────────────────────────────────┼─────────────────────────────┼───────────────────┤
│ C2 75062a8 constraints + Jacobians │ analytic vs FD &amp;lt; 1e-7 │ 1.6e-10 │
├───────────────────────────────────────────┼─────────────────────────────┼───────────────────┤
│ C3 3561d43 solvers │ ‖C‖_∞ &amp;lt; 1e-9 + body-ω match │ 7.7e-11 / 4.2e-11 │
├───────────────────────────────────────────┼─────────────────────────────┼───────────────────┤
│ C4 084e066 dynamics + Cardan │ rel error &amp;lt; 1e-4 over 1 rev │ 1.8e-7 │
├───────────────────────────────────────────┼─────────────────────────────┼───────────────────┤
│ C5 9c861d0 precession + bugfix │ │ ΔKE/KE₀ │
└───────────────────────────────────────────┴─────────────────────────────┴───────────────────┘&lt;/p>
&lt;p>Bonus catch: the C5 work surfaced a critical bug in forces3d.py — g_local(qi) was being called with the full 7-vector instead of the 4-component quaternion slice.&lt;/p>
&lt;p>The Cardan demo accidentally survived because all bodies had rG=0 (short-circuiting the gravity-torque path) and the dynamics were dominated by the constraint-side drive.&lt;/p>
&lt;p>Precession had no constraints to mask it — the mass-matrix permutation made Euler&amp;rsquo;s equations unsolvable until I fixed the slice.&lt;/p>
&lt;p>Now both demos pass with margins of 3–5 orders of magnitude.&lt;/p>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">About mbsd 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;p>Big picture: this is a serious end-to-end MBSD playground — Kinematics → Dynamics → Synthesis, with applied tracks (multi-cylinder engine NVH, quarter-car suspension, real-time bike) and a distilled e-book tying it together.&lt;/p>
&lt;p>The reference-coordinate (&lt;code>[x, y, θ]&lt;/code>) formulation in &lt;code>2D-Kinematics/mbody.py&lt;/code> is a clean choice for didactics; Newton-Raphson position + analytical Jacobians + RK45 dynamics is the standard, validated path and you&amp;rsquo;ve kept it consistent across modules.&lt;/p>
&lt;p>A few honest observations:&lt;/p>
&lt;p>&lt;strong>Strengths&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>The kinematic → dynamic → synthesis progression mirrors how the field is actually taught (Jálon/Shabana). The fact that &lt;code>2D-Dynamics&lt;/code> reuses &lt;code>2D-Kinematics&lt;/code> rather than reinventing it is the right call.&lt;/li>
&lt;li>Validation discipline is good: energy conservation, analytical comparison (Scotch yoke), kinematic-vs-dynamic ω plots. That&amp;rsquo;s how you catch subtle bugs.&lt;/li>
&lt;li>The applied chapters (rocking couples, balance shafts, ISO 8608 road profiles, skyhook damping) give the toolkit a &lt;em>reason to exist&lt;/em> beyond toy mechanisms — that&amp;rsquo;s what most academic MBSD repos lack.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Risks / gaps worth flagging&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>No constraint stabilization visible&lt;/strong> in the dynamics loop (Baumgartner or coordinate projection). RK45 + holonomic constraints drifts over long runs; your energy plots may already be hiding this. Worth checking &lt;code>‖C(q,t)‖&lt;/code> over time on the bike sim.&lt;/li>
&lt;li>&lt;strong>Reference-coordinate mass matrix in &lt;code>forces.py&lt;/code>&lt;/strong> — your readme equation shows an off-diagonal &lt;code>m·(dA/dθ)·r_G&lt;/code> term, which means M is &lt;em>not&lt;/em> constant when r_G ≠ 0. The &amp;ldquo;constant mass matrix&amp;rdquo; claim only holds when each body&amp;rsquo;s reference point coincides with its CG. Worth a one-line note.&lt;/li>
&lt;li>&lt;strong>&lt;code>3D-mbsd&lt;/code> is essentially empty&lt;/strong> (just &lt;code>from-2d-to-3d.md&lt;/code> + readme). The jump from planar to spatial (quaternions/Euler params, non-constant M, gyroscopic terms) is where most homegrown MBSD codes die. Either commit to it or be honest in the top-level readme that it&amp;rsquo;s a planning stub.&lt;/li>
&lt;li>&lt;strong>Top-level sprawl&lt;/strong>: ~60 PNGs and a dozen subprojects in repo root makes the entry point noisy. A &lt;code>results/&lt;/code> or &lt;code>gallery/&lt;/code> folder + tighter root readme would help a newcomer find the spine.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/details>
&lt;p>Full test-suite status across both versions:&lt;/p>
&lt;p>v1: test_quaternions ✓
test_constraints3d ✓
test_solver3d ✓
examples/cardan.py ✓ (1.8e-7 vs analytical)
examples/precession ✓ (3.5e-9 / 2.8e-9 conservation)&lt;/p>
&lt;p>v2: test_v2_joints ✓ (sph + cyl + hel)
test_v2_contact ✓ (sphere-sphere + sphere-plane)
test_energy_regression_3d ✓ (3 cases)
validation/baumgarte_3d ✓
examples/ball_in_bowl ✓
examples/gear_pair ✓ (spur + helical identical)&lt;/p>
&lt;p>Limitations documented in v2:&lt;/p>
&lt;ul>
&lt;li>Helical joint and gear ratio constraints use arctan2(sin, cos) extracted from quaternions → valid only for relative rotation within ±π (per gear). Cumulative-angle tracking is v3 scope.&lt;/li>
&lt;li>Helix angle on gears is informational only — the constraint is identical for spur and helical with rigid bearings; the axial-force difference shows up in Lagrange-multiplier postprocessing (v3 surface).&lt;/li>
&lt;li>Sphere–sphere and sphere–plane contacts are bilateral (no lift-off, no impact, no friction). Unilateral / frictional contact is v3 scope.&lt;/li>
&lt;/ul>
&lt;ul>
&lt;li>#great, i got this feedback about this repo: [Pasted text #1 +15 lines] could you detect all the loose ends, things that are planned but not finished, any new good to haves and
#create a PLAN.md for it? remember to commit and push&lt;/li>
&lt;li>i want you to complete the full plan in one sitting, work as long as required, do frequent commits and push, remember that any new section/script must have supporting output
graphs and a .md that explains the meaning of what was generated. id rather dont move around existing content.&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">claude --dangerously-skip-permissions &lt;span class="c1">#get the CLAUDE.md ready&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Detach with Ctrl+B then D. Reattach later with tmux ls&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux attach -t claude-mbsd&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/cc-baumgarte-3d.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>v6 complete and pushed. Six commits total:&lt;/p>
&lt;ul>
&lt;li>v6.C1 (0c1436b) — sympy-derived analytic LevaJoint Jacobian, 23×–47× speedup, ~5e-10 vs FD. Constraint formulation refactored to body-j tangents (smooth) to unblock the analytic path.&lt;/li>
&lt;li>v6.C1 follow-up (b9c0d02) — leva_joint_friction.py promoted from snapshot to full dynamics (closes v5.C3 deferral).
7 - v6.C2 (06b1432) — flex3d.py lumped-segment builder, cantilever matches Euler-Bernoulli f₁ to 0.25%.&lt;/li>
&lt;li>v6.C3 (e68ca4a) — 4-disk crankshaft, FFT 4.60 Hz vs analytic eigenproblem 4.62 Hz (0.42% err).&lt;/li>
&lt;li>v6.C4 (bbce25f) — anti-roll bar two-pendulum analog: 0% R/L without ARB, 99.9% with.&lt;/li>
&lt;li>v6.C5 (7c225b3) — bike frame lateral flex, compliant deflects 2.69× stiff under sprint pulse.&lt;/li>
&lt;li>v6.C6 (52b9f7f) — closing docs: ROADMAP/PLAN/README updated, per-demo .md write-ups for the four new flex demos.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/crankshaft_torsional_animation.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>http://192.168.1.2:3034/hermesagent/mbsd/commit/4c4ab2923b103a8930bf708c9e12a1048ee4c52e#diff-f99d28e48292f29a25a740f0df4624a646a2fe1b&lt;/p>
&lt;p>Results at 3000 RPM:&lt;/p>
&lt;ul>
&lt;li>Cylinder p_max = 5.07 MPa (50 bar, typical NA gasoline) ✓ matches expected&lt;/li>
&lt;li>Mean gas torque = 20.4 N·m, peak oscillating = 363 N·m&lt;/li>
&lt;li>Firing fundamental at 25 Hz dominates (0.5 × crank rev = 1 × firing)&lt;/li>
&lt;li>Multi-harmonic spectrum confirmed: top peak only 20.5% of total amplitude&lt;/li>
&lt;li>20 sec wall-clock total&lt;/li>
&lt;/ul>
&lt;p>The bridge in one line:
sys.path.insert(0, os.path.join(PARENT, &amp;lsquo;..&amp;rsquo;, &amp;lsquo;z-fluid-mechanics&amp;rsquo;))
from engine.physics import cylinder_volume, nozzle_flow, wiebe_rate, woschni_qp&lt;/p>
&lt;p>The .md covers why the response is dominated by firing fundamental, why the v6.C3 chain at f_1 = 4.62 Hz is sub-resonance at 3000 RPM (would
need 40× stiffer K_SECTION for an idle-speed-boom demo), engineering interpretation (Campbell diagrams, TVD design), and extensions (TVD on on
combustion drive, multi-cylinder firing, full Campbell sweep).&lt;/p>
&lt;p>This is the first demo that quantitatively closes the loop: fuel-derived energy → cylinder pressure → crank torque → torsional flex → e
measurable flywheel vibration. None of the intermediate steps abstracted away. Both projects share Wiebe/Woschni physics; this demo proves they agree end-to-end.&lt;/p>
&lt;p>How about sales?&lt;/p>
&lt;p>Where this fits in the additive-manufacturing pipeline
Phase Need What we provide
Concept design &amp;ldquo;Will this geometry survive its load history?&amp;rdquo; Multi-body simulation of the loaded chain; load envelope per part
Material selection &amp;ldquo;Will this resonate?&amp;rdquo; Torsional / bending modal analysis; FRF + Campbell diagrams
Process planning &amp;ldquo;Will the part fatigue here?&amp;rdquo; Stress history from the dynamic simulation; fatigue post-processing
Pre-print verification &amp;ldquo;Is this design sound mechanically?&amp;rdquo; Full system simulation including all the dynamic couplings
Iteration &amp;ldquo;Why didn&amp;rsquo;t it work?&amp;rdquo; Open kernel + analytic acceptance criteria — diagnose, don&amp;rsquo;t just observe&lt;/p>
&lt;p>The competitor: proprietary stacks (Adams, RecurDyn, MSC, Dymola) at $50k–500k per seat, with a closed source that prevents deep audit and ties you to a vendor roadmap.&lt;/p>
&lt;p>The advantage of this kernel:&lt;/p>
&lt;p>Open: every algorithm is auditable.
Validated: every commit has analytic acceptance criteria, all passing.
Composable: bridges across domains (combustion ↔ structural ↔ vehicle) in a way the proprietary stacks struggle with because they&amp;rsquo;re organised by subsystem rather than by physics.
Lightweight: runs on a Raspberry Pi 5. No license server, no cloud bill.&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/data-experiments/radial_engine_animation.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;blockquote>
&lt;p>&lt;a href="https://www.youtube.com/watch?v=eCR1P5w2Oik" target="_blank" rel="noopener">Radial&lt;/a>, not &lt;a href="https://www.youtube.com/watch?v=mjpfIXyWEnw" target="_blank" rel="noopener">rotary&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;!--
https://www.youtube.com/watch?v=-pxpNivvpw8
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/-pxpNivvpw8" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;blockquote>
&lt;p>See also &lt;a href="https://www.youtube.com/@pierrejansen2702" target="_blank" rel="noopener">https://www.youtube.com/@pierrejansen2702&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl"> my friend who is a potential lead mechanical engineer is asking me about the tests that we have run against this framework, could we add that to the faq as well? anything else that could be added from the physical standpoint to validate that there are not strange bugs in the
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> restrictions and in general the mechanics?❯ whats a 0d engine and a 3d rans? can amesim be replaced with pyscipe and a similar thermal one? add it in another faq sectio
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ❯ in the meantime, can you have a look to z-poc-trip-planner-v4? would that have the potential to have ons statically deployable part? like if i want for 2 or 3 locations the historicals?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Open question from my last message: do you want me to add an FAQ section to SALES.md titled &amp;#34;If I wanted to replace Amesim entirely with open source, what would I assemble?&amp;#34; covering the three deployment patterns (OpenModelica route / Julia route / Python-everything route) &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Destill notes autonomously&lt;span class="absolute -mt-20" id="destill-notes-autonomously">&lt;/span>
&lt;a href="#destill-notes-autonomously" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>From ebooks: &lt;code>https://github.com/JAlcocerT/ebook-ideas/tree/master/z-z-destilled&lt;/code>&lt;/p>
&lt;p>Or videos: &lt;code>https://github.com/JAlcocerT/my-logseq-notes/tree/main/distilled-videos&lt;/code>&lt;/p>
&lt;p>Because the &lt;code>yt distill&lt;/code> is so cool tbh:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-13">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/poc/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/yt-distil
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;OPENAI_API_KEY=sk-your-actual-key-here&amp;#34;&lt;/span> &amp;gt; .env
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux new-session -d -s yt &amp;#39;for url in https://www.youtube.com/watch?v=0EqJD2o-Mnk https://www.youtube.com/watch?v=HGZOxBfnF-E https://www.youtube.com/watch?v=BYpTRiRqS1Y https://www.youtube.com/watch?v=8C_6qojTA78 https://www.youtube.com/watch?v=jqo0lVveh98 https://www.youtube.com/watch?v=MH-IMJxbUY4 https://www.youtube.com/watch?v=qsXxckCbci0 https://www.youtube.com/watch?v=CoPs-Bk8M9Y https://www.youtube.com/watch?v=-HJg4TYBgtI https://www.youtube.com/watch?v=n6SHLmKcY0E; do uv run yt-distil run &amp;#34;$url&amp;#34; --no-qna -y; done&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux attach -t yt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/ebook-ideas&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/my-logseq-notes/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make daily #you can combine this with your daily notes/learnings&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make &lt;span class="nb">help&lt;/span> &lt;span class="c1">#including fireflies pull info for your reference in md&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-13"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Once thats done, I have just to go to &lt;code>/home/jalcocert/poc/yt-distil/out&lt;/code>&lt;/p>
&lt;p>And risk my full homelab by telling codex to do things for me:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-14">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">codex &lt;span class="s2">&amp;#34;Have a look to the distilled videos at /home/jalcocert/poc/yt-distil/out id like you to take each of those and copy the summary.md and transcript.txt towards /home/jalcocert/my-logseq-notes/distilled-videos/business-hormozi? ideally, you would have a look to the summary and rename each folder in the destination with some slug that makes sense as per the summary.md info. DOnt erase any file.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux new-session -d -s yt &amp;#39;cd /home/jalcocert/poc/yt-distil &amp;amp;&amp;amp; uv run yt-distil run &amp;#34;https://www.youtube.com/watch?v=qsXxckCbci0&amp;#34; --no-qna -y&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-14"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Once there, you continue the destillation&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-15">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">claude &lt;span class="c1">#/resume&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude --dangerously-skip-permissions&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#do without me until your are done&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#while :; do claude -p &amp;#34;Your task here&amp;#34; --dangerously-skip-permissions; done&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-15"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Once done:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-16">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /home/jalcocert/my-logseq-notes &lt;span class="c1">#distilled-videos&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git add distilled-videos/business-hormozi
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;added more biznez&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-16"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Even for this blog&amp;hellip;&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-17">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">curl -fsSL https://hermes-agent.nousresearch.com/install.sh &lt;span class="p">|&lt;/span> bash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#hermes #just run it&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-17"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>I couldnt avoid to &lt;strong>make an UI for this&lt;/strong>&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/yt-distill.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-18">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl"> curl -fsSL https://deno.land/install.sh &lt;span class="p">|&lt;/span> sh&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-18"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Random&lt;span class="absolute -mt-20" id="random">&lt;/span>
&lt;a href="#random" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h4>Go Solar with Trip Planner and Aerotermia&lt;span class="absolute -mt-20" id="go-solar-with-trip-planner-and-aerotermia">&lt;/span>
&lt;a href="#go-solar-with-trip-planner-and-aerotermia" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Because whenyou do stuff you get more ideas.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://go-solar.pages.dev/" target="_blank" rel="noopener">https://go-solar.pages.dev/&lt;/a> - Simulation is deterministic and offline, but cannot answer &amp;ldquo;how much will my panel actually produce on my roof next July?&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/data-experiments/gosolar-hotday.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Annual GHI (kWh/m²/year) (Recommended)
The canonical &amp;lsquo;solar resource&amp;rsquo; map. Sums shortwave_radiation across a typical year. Matches what PVGIS and SolarGIS publish.
2. Layer toggle: GHI / DNI / DNI-to-GHI ratio
Three rasters, user switches between them. The DNI/GHI ratio is the CSP-vs-PV indicator from the FAQ. More work, but visually answers your own doc.
3. Annual DNI only
Beam-only map — the right view if the followup story is mirrors/CSP.
4. Type something.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
HomeLab | Github ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/poc/main/tree/go-solar/z-era5-map" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Go Solar | Landing x App | Github ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-19">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make era5-cities-bake
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run dev&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-19"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/data-experiments/gosolar-seville.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>See &lt;code>http://localhost:3001/era5-cities/Sevilla/&lt;/code>&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/data-experiments/gosolar-seville-10y.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Like combining: this, this and this trip planner v4: &lt;em>yes, the one statically deployed as well&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-20">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make trip-deploy CF_PROJECT=trip-planner&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make trip-ship &lt;span class="nv">CF_PROJECT&lt;/span>&lt;span class="o">=&lt;/span>trip-planner &lt;span class="c1">#https://17e286bf.trip-planner-9lt.pages.dev&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-20"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The result?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-21">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /poc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/go-solar
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make deploy &lt;span class="nv">CF_PROJECT&lt;/span>&lt;span class="o">=&lt;/span>go-solar&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-21"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>What if someone would take couple sensor, store its data and see how everything works for a particular house?&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>α changes how much solar energy enters the game at the top surface&lt;/li>
&lt;li>h_top sets how fast the surface dumps heat back to air/sky (mostly out of your control)&lt;/li>
&lt;li>U sets how much of the surface&amp;rsquo;s heat ends up crossing into your living space vs being lost back outside&lt;/li>
&lt;/ul>
&lt;p>What.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-22">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make era5-raw CITY=Madrid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make era5-raw CITY=Barcelona&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make ship &lt;span class="c1">#go-solar is default&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-22"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>&lt;code>https://go-solar.pages.dev/era5-cities/Sevilla/&lt;/code> &lt;del>&lt;code>http://localhost:3001/era5-cities/Sevilla/&lt;/code>&lt;/del>&lt;/p>
&lt;/blockquote>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-23">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make eu-capitals-raw
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make era5-cities-bake
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make ship&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-23"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;strong>If this works.&lt;/strong>&lt;/p>
&lt;h3>Optimum Racing Line&lt;span class="absolute -mt-20" id="optimum-racing-line">&lt;/span>
&lt;a href="#optimum-racing-line" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Coming from&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-24">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-24"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>This will be combined with the forgejo hermesagent mbsd version later on :)&lt;/p>
&lt;/blockquote>
&lt;h3>Make videos bc why not&lt;span class="absolute -mt-20" id="make-videos-bc-why-not">&lt;/span>
&lt;a href="#make-videos-bc-why-not" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h4>F1&lt;span class="absolute -mt-20" id="f1">&lt;/span>
&lt;a href="#f1" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-25">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./eda-f1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">opencode &lt;span class="c1">#https://opencode.ai/go #this can also be used with hermes!&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#also z.ai coding plan&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-25"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;del>I&lt;/del> Codex made a quick alias&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-26">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">gcp &lt;span class="s2">&amp;#34;adding opencode ideas&amp;#34;&lt;/span> &lt;span class="c1">#nop, its not google cloud just a quick commit puush&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-26"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Until this point, I had remotionJS in the repo.&lt;/p>
&lt;p>But to make the story more compeling brought: &lt;code>huashu-design&lt;/code>&lt;/p>
&lt;p>Also opencode added some thoughts to increase virality &lt;a href="https://github.com/JAlcocerT/eda-f1/blob/master/z-opencode-ideas.md" target="_blank" rel="noopener">here&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-27">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make help #make race_rhythm...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make lc_per_lap &lt;span class="nv">ARGS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;--year 2025 --event Miami --session R --driver VER&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-27"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/karting/race_rhythm_ALO_miami_2025_vs_2026.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-28">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make teammate_season &lt;span class="nv">ARGS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;--year 2025 --driver-a ALO --driver-b STR&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-28"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/karting/teammate_season_ALO_vs_STR_2025.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Then, made a script &lt;code>/f1-analysis&lt;/code> at &lt;code>./.claude/skills&lt;/code>&lt;/p>
&lt;h4>Geospatial&lt;span class="absolute -mt-20" id="geospatial">&lt;/span>
&lt;a href="#geospatial" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>The french real estate &lt;a href="https://jalcocert.github.io/JAlcocerT/geo-maps-and-data/#geo-from-r-to-py" target="_blank" rel="noopener">5Y transaction granularity&lt;/a> was a surprise: &lt;code>https://www.data.gouv.fr/datasets/demandes-de-valeurs-foncieres&lt;/code>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-29">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">head -n &lt;span class="m">100&lt;/span> ValeursFoncieres-2024.txt &amp;gt; french2024subset.txt&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-29"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-30">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude --dangerously-skip-permissions -p &amp;#34;ive been tinkering with geospatial data on this repository, what are you thought of it?&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-30"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>And blender&amp;hellip;&lt;span class="absolute -mt-20" id="and-blender">&lt;/span>
&lt;a href="#and-blender" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I got to know about tmux this year thx to using blender.&lt;/p>
&lt;p>Now i use it for AI loads.&lt;/p>
&lt;p>And AI loads to generate more blender stuff&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-31">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-31"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Longer Unsupervised Tasks&lt;span class="absolute -mt-20" id="longer-unsupervised-tasks">&lt;/span>
&lt;a href="#longer-unsupervised-tasks" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>im quite confident now that given a brd Ill get a decent PoC.&lt;/p>
&lt;p>or actually anyof the artifacts above.&lt;/p>
&lt;p>Luckily, we have &lt;code>PLANS.md&lt;/code> for a while: &lt;a href="https://developers.openai.com/cookbook/articles/codex_exec_plans" target="_blank" rel="noopener">https://developers.openai.com/cookbook/articles/codex_exec_plans&lt;/a>&lt;/p>
&lt;p>See more: &lt;a href="https://developers.openai.com/cookbook/examples/gpt-5/codex_prompting_guide#using-agentsmd" target="_blank" rel="noopener">https://developers.openai.com/cookbook/examples/gpt-5/codex_prompting_guide#using-agentsmd&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-32">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude --dangerously-skip-permissions&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-32"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Your manager is threatening you that you might need to do agentic stuff?&lt;/p>
&lt;p>They still dont like &lt;a href="https://jalcocert.github.io/JAlcocerT/setup-bi-tools-docker/#syncing-expectations" target="_blank" rel="noopener">to sync expectations&lt;/a>?&lt;/p>
&lt;p>You can tell them that you have a PM/Pdm + &lt;a href="https://github.com/JAlcocerT/poc/tree/main/libg/why-postmortem" target="_blank" rel="noopener">Postmortem why why why&lt;/a> that actually does their job of their full team better.&lt;/p>
&lt;ul>
&lt;li>&lt;code>https://pm-pdm-checks.pages.dev/&lt;/code>&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-33">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx wrangler@latest pages deploy dist-pdm-magazine --project-name pm-pdm-checks --branch main&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir dist-why-postmortem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp why-postmortem-magazine.html dist-why-postmortem/index.html
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx wrangler@latest pages deploy dist-why-postmortem &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --project-name why-postmortem-checks &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --branch main
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx wrangler@latest pages deploy dist-why-postmortem-magazine --project-name why-postmortem-checks --branch main&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-33"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>&lt;code>https://why-postmortem-checks.pages.dev&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>They will soon be a layer to remove.&lt;/p>
&lt;p>What? how? who says that?&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/consulting.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Tier of Service for the ones that cant wait to get value&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/ebooks.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks with free value.&lt;/div>&lt;/a>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Hardening a Pi for Agents&lt;span class="absolute -mt-20" id="hardening-a-pi-for-agents">&lt;/span>
&lt;a href="#hardening-a-pi-for-agents" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Then just choose whatever provider that allow for &lt;strong>24/7 queries&lt;/strong>:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;code>https://www.kimi.com/&lt;/code> and kimiclaw&amp;hellip;&lt;/p>
&lt;/li>
&lt;li>&lt;/li>
&lt;/ol>
&lt;p>get ready for SDD: &lt;a href="https://www.youtube.com/watch?v=b6cbxSaa4U4" target="_blank" rel="noopener">https://www.youtube.com/watch?v=b6cbxSaa4U4&lt;/a>&lt;/p>
&lt;p>and openspec: &lt;a href="https://www.youtube.com/watch?v=nFq4POtqom4" target="_blank" rel="noopener">https://www.youtube.com/watch?v=nFq4POtqom4&lt;/a>&lt;/p>
&lt;p>because &lt;strong>context is the new code&lt;/strong>: &lt;a href="https://www.youtube.com/watch?v=bSG9wUYaHWU" target="_blank" rel="noopener">https://www.youtube.com/watch?v=bSG9wUYaHWU&lt;/a>&lt;/p>
&lt;p>(It always was)&lt;/p>
&lt;p>Matt Potcock was a great inspiration with &lt;a href="https://www.youtube.com/watch?v=EJyuu6zlQCg" target="_blank" rel="noopener">the /grill-me&lt;/a>&lt;/p>
&lt;h4>OSS Models APIs x Agents&lt;span class="absolute -mt-20" id="oss-models-apis-x-agents">&lt;/span>
&lt;a href="#oss-models-apis-x-agents" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Using Ollama with Gemma 4 is a reasonable option.&lt;/p>
&lt;p>You can also get some compute or pay API use for: Kimi vs Deepseek&lt;/p>
&lt;p>You also have: &lt;a href="https://z.ai/blog/glm-5" target="_blank" rel="noopener">https://z.ai/blog/glm-5&lt;/a>&lt;/p>
&lt;p>Which is at the top of the arena for now: &lt;a href="https://arena.ai/leaderboard/code?license=open-source" target="_blank" rel="noopener">https://arena.ai/leaderboard/code?license=open-source&lt;/a>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://chat.z.ai/auth" target="_blank" rel="noopener">https://chat.z.ai/auth&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3>What the&amp;hellip;&lt;span class="absolute -mt-20" id="what-the">&lt;/span>
&lt;a href="#what-the" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Say thanks to:&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://github.com/alchaincyf/huashu-design" target="_blank" rel="noopener">Huashu Design&lt;/a>: &lt;a href="https://skills.sh/alchaincyf/huashu-design/huashu-design" target="_blank" rel="noopener">https://skills.sh/alchaincyf/huashu-design/huashu-design&lt;/a>&lt;/li>
&lt;li>&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-34">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$urls&lt;/span> &lt;span class="o">=&lt;/span> @&lt;span class="o">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://www.youtube.com/watch?v=0EqJD2o-Mnk&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://www.youtube.com/watch?v=HGZOxBfnF-E&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://www.youtube.com/watch?v=BYpTRiRqS1Y&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://www.youtube.com/watch?v=8C_6qojTA78&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://www.youtube.com/watch?v=jqo0lVveh98&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://www.youtube.com/watch?v=MH-IMJxbUY4&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://www.youtube.com/watch?v=qsXxckCbci0&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://www.youtube.com/watch?v=CoPs-Bk8M9Y&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://www.youtube.com/watch?v=-HJg4TYBgtI&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://www.youtube.com/watch?v=n6SHLmKcY0E&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">foreach &lt;span class="o">(&lt;/span>&lt;span class="nv">$url&lt;/span> in &lt;span class="nv">$urls&lt;/span>&lt;span class="o">)&lt;/span> &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> uv run yt-distil run &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$url&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> --no-qna -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-34"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>or:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-35">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> url in &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> https://www.youtube.com/watch?v&lt;span class="o">=&lt;/span>0EqJD2o-Mnk &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> https://www.youtube.com/watch?v&lt;span class="o">=&lt;/span>HGZOxBfnF-E &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> https://www.youtube.com/watch?v&lt;span class="o">=&lt;/span>BYpTRiRqS1Y &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> https://www.youtube.com/watch?v&lt;span class="o">=&lt;/span>8C_6qojTA78 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> https://www.youtube.com/watch?v&lt;span class="o">=&lt;/span>jqo0lVveh98 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> https://www.youtube.com/watch?v&lt;span class="o">=&lt;/span>MH-IMJxbUY4 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> https://www.youtube.com/watch?v&lt;span class="o">=&lt;/span>qsXxckCbci0 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> https://www.youtube.com/watch?v&lt;span class="o">=&lt;/span>CoPs-Bk8M9Y &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> https://www.youtube.com/watch?v&lt;span class="o">=&lt;/span>-HJg4TYBgtI &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> https://www.youtube.com/watch?v&lt;span class="o">=&lt;/span>n6SHLmKcY0E&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> uv run yt-distil run &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$url&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> --no-qna -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-35"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://www.youtube.com/watch?v=3fsJFUvA6Ts
https://www.youtube.com/watch?v=0EqJD2o-Mnk
https://www.youtube.com/watch?v=HGZOxBfnF-E
https://www.youtube.com/watch?v=BYpTRiRqS1Y
https://www.youtube.com/watch?v=8C_6qojTA78
https://www.youtube.com/watch?v=jqo0lVveh98
https://www.youtube.com/watch?v=MH-IMJxbUY4
https://www.youtube.com/watch?v=qsXxckCbci0
https://www.youtube.com/watch?v=CoPs-Bk8M9Y
https://www.youtube.com/watch?v=-HJg4TYBgtI
https://www.youtube.com/watch?v=n6SHLmKcY0E -->
&lt;p>Having firefliesAI integrated into my logseq &lt;code>.md&lt;/code> notes helps a lot:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-36">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /my-logseq-notes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make meeting&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-36"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Really but how&lt;span class="absolute -mt-20" id="really-but-how">&lt;/span>
&lt;a href="#really-but-how" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>Im using a RPi&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Spinning agents like&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3>Interesting Articles&lt;span class="absolute -mt-20" id="interesting-articles">&lt;/span>
&lt;a href="#interesting-articles" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;a href="https://larsfaye.com/articles/the-question-is-the-work" target="_blank" rel="noopener">https://larsfaye.com/articles/the-question-is-the-work&lt;/a>&lt;/li>
&lt;li>Again - &lt;a href="https://knowledge.insead.edu/strategy/who-killed-nokia-nokia-did" target="_blank" rel="noopener">https://knowledge.insead.edu/strategy/who-killed-nokia-nokia-did&lt;/a> Pm/PdMs&amp;hellip;plzzz&lt;/li>
&lt;/ol>
&lt;h3>TBC&lt;span class="absolute -mt-20" id="tbc">&lt;/span>
&lt;a href="#tbc" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>WIP&lt;/p>
&lt;p>to go with boilerplate at some poiint (?) or as ebook&lt;/p>
&lt;p>Entrepre-AI Quick Spin:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-37">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make container-build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make container-up&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-37"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Top Questions&lt;span class="absolute -mt-20" id="top-questions">&lt;/span>
&lt;a href="#top-questions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Just in case you want to move from employee to sth else&lt;/p>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/poc-102/#who-sells-what" target="_blank" rel="noopener">Understanding who sells what&lt;/a> and that you might want more risk and upside helps :)&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/questions-for-engineers/" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/questions-for-engineers/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/poc-103/#ai-engineering-blueprint-define--create" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/poc-103/#ai-engineering-blueprint-define--create&lt;/a>&lt;/li>
&lt;/ul>
&lt;!-- ![alt text](/blog_img/apps/image.png) -->
&lt;h4>The one-page challenger sheet&lt;span class="absolute -mt-20" id="the-one-page-challenger-sheet">&lt;/span>
&lt;a href="#the-one-page-challenger-sheet" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ul>
&lt;li>&lt;a href="https://www.skills.sh/?q=hormozi" target="_blank" rel="noopener">https://www.skills.sh/?q=hormozi&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-yellow-100 bg-yellow-50 text-yellow-900 dark:border-yellow-200/30 dark:bg-yellow-700/30 dark:text-yellow-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
⚠️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Using this &lt;a href="https://github.com/JAlcocerT/my-logseq-notes/blob/main/distilled-videos/business-hormozi/z-procedural-hormozi-check.md" target="_blank" rel="noopener">procedural destilled hormozi&lt;/a> to &lt;a href="https://github.com/JAlcocerT/my-logseq-notes/blob/main/distilled-videos/business-hormozi/z-hormozi-rating-my-ideas.md" target="_blank" rel="noopener">rate ideas&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>&amp;ldquo;If you can&amp;rsquo;t charge more than others, it&amp;rsquo;s because you aren&amp;rsquo;t better than others.&amp;rdquo; (Hormozi)&lt;/p>
&lt;/blockquote>
&lt;p>Build the offer. Don&amp;rsquo;t drop the price.&lt;/p>
&lt;blockquote>
&lt;p>What happenswhen you distil yt videos :)&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>That you can scrap shitty ideas faster, &lt;a href="https://github.com/JAlcocerT/slubne-chwile-y26/blob/master/b2b-vs-b2c.md" target="_blank" rel="noopener">like this b2c vs b2b&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;p>The opening — 5 questions in order&lt;/p>
&lt;ol>
&lt;li>&lt;strong>What&amp;rsquo;s the business? Who do you help?&lt;/strong>&lt;/li>
&lt;li>&lt;strong>What are the numbers?&lt;/strong> (revenue, profit, margin, CAC, LTV, close rate, churn %)&lt;/li>
&lt;li>&lt;strong>What do you want?&lt;/strong> (10x revenue? Exit? Sleep at night?)&lt;/li>
&lt;li>&lt;strong>What&amp;rsquo;s stopping you?&lt;/strong> (their narrative — note it, don&amp;rsquo;t trust it)&lt;/li>
&lt;li>&lt;strong>If we doubled lead flow tomorrow, can you handle it?&lt;/strong> — THE triage question&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Numbers checklist&lt;/strong>&lt;/p>
&lt;p>Required:&lt;/p>
&lt;ul>
&lt;li>Trailing 12-mo revenue&lt;/li>
&lt;li>Net profit / margin&lt;/li>
&lt;li>CAC + LTV (calculate ratio)&lt;/li>
&lt;li>Close rate&lt;/li>
&lt;li>Marketing spend (by channel + %)&lt;/li>
&lt;li>Retention / churn&lt;/li>
&lt;li>Sales velocity (units/month)&lt;/li>
&lt;li>Avg ticket / AOV&lt;/li>
&lt;/ul>
&lt;p>Optional but high-signal:&lt;/p>
&lt;ul>
&lt;li>Payback period&lt;/li>
&lt;li>Cash conversion cycle&lt;/li>
&lt;li>Repeat purchase rate&lt;/li>
&lt;li>Customer profile mix&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Red flags table&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Symptom&lt;/th>
&lt;th>Likely diagnosis&lt;/th>
&lt;th>Prescription&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Close rate &amp;gt;80%&lt;/td>
&lt;td>Underpriced&lt;/td>
&lt;td>Raise price 20-40% + guarantee&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Close rate &amp;lt;10%&lt;/td>
&lt;td>Offer mismatch OR cold-traffic motion broken&lt;/td>
&lt;td>Add Tier-1 front-end / VSL / lead magnet&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LTV/CAC ≈ 1:1 or worse&lt;/td>
&lt;td>Attribution broken OR wrong customer&lt;/td>
&lt;td>Fix tracking first, then re-evaluate&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CAC rising w/ flat CPMs&lt;/td>
&lt;td>Negative word-of-mouth&lt;/td>
&lt;td>Audit reputation, fix product-market fit&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Churn &amp;gt;3%/month structural&lt;/td>
&lt;td>Wrong customer segment&lt;/td>
&lt;td>ICP swap (see right-customers folder)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;lt;20% take-rate on upsell&lt;/td>
&lt;td>Offer mismatch&lt;/td>
&lt;td>Restructure into Tier 1 → Tier 2 → Tier 3 ladder&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>70%+ revenue from 1 channel&lt;/td>
&lt;td>Single-channel risk&lt;/td>
&lt;td>Parallel channel build + email nurture&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Founder works &amp;lt;5 hrs/wk on biz&lt;/td>
&lt;td>Comfort/distraction&lt;/td>
&lt;td>Trade-off conversation, not tactic&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;ldquo;Need more customers&amp;rdquo; but can&amp;rsquo;t deliver&lt;/td>
&lt;td>Supply-constrained mislabeled as demand&lt;/td>
&lt;td>Hire + price up + capacity build&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Revenue ≠ growing despite spend more&lt;/td>
&lt;td>Creative cap OR attribution broken&lt;/td>
&lt;td>Better creative + per-campaign data&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Margin &amp;lt;10%&lt;/td>
&lt;td>Death zone&lt;/td>
&lt;td>Drop low OR go high (avoid middle)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Spending up = revenue up but unmeasured&lt;/td>
&lt;td>No optimization possible&lt;/td>
&lt;td>Attribution before more spend&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>One-trick-pony churn after delivery&lt;/td>
&lt;td>Need consumables in offer&lt;/td>
&lt;td>Add recurring / community / continuing-ed tier&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-38">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">use the huashu skills and your creativity to define my brand kit, i have a logo on this folder and a photo of me&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-38"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-39">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">claude --dangerously-skip-permissions -p &lt;span class="s2">&amp;#34;see this repo where i have my kindle clippings at ./z-read-books-notes, i have destilled some of th ebooks at ./z-z-destilled, and there are some scripts to make your life easier by extracting notes form the same books. Would you be able to go through all of them and extract are the insights i highlighted? place the outputs at ./z-read-books-notes&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-39"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Buckets: Stoicism, Modern Philosophy, Behavioral Econ, Persuasion, Neuromarketing/Sales, Money/Investing, Economics, Taleb-verse, Productivity, Habits, Minimalism, Psychology/Brain, Society/History, Health, Business Memoir, Fiction.&lt;/p>
&lt;p>The essentialist filter — what stays (E)&lt;/p>
&lt;p>For every commitment, possession, project, or input, run:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Test&lt;/th>
&lt;th>Question&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Vital few&lt;/strong>&lt;/td>
&lt;td>If I could only do 3 things this quarter, would this be one?&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Trade-off&lt;/strong>&lt;/td>
&lt;td>What am I giving up to do this? Worth it?&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>90% rule&lt;/strong>&lt;/td>
&lt;td>On a 0–10 scale of &amp;ldquo;yes,&amp;rdquo; is this 9+? If 7 or below → no.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Sleep test&lt;/strong>&lt;/td>
&lt;td>Will future-me thank present-me for this?&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Cost of yes&lt;/strong>&lt;/td>
&lt;td>What good thing must this push out?&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Defaults are no. Yes must be earned.&lt;/p>
&lt;p>Here is the &lt;strong>Tl;DR&lt;/strong> of the &amp;ldquo;Hormozi Omni-Protocol.&amp;rdquo;&lt;/p>
&lt;p>Think of it as the ultimate operating system for building a business that people feel &amp;ldquo;stupid saying no to.&amp;rdquo;&lt;/p>
&lt;ol>
&lt;li>The Diagnostic (The &amp;ldquo;Is it broken?&amp;rdquo; Check)&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>The Triage:&lt;/strong> If you doubled leads and your business broke, you have an &lt;strong>Operations&lt;/strong> problem. If it didn&amp;rsquo;t break, you have a &lt;strong>Marketing&lt;/strong> problem.&lt;/li>
&lt;li>&lt;strong>The Barbell:&lt;/strong> Stay out of the &amp;ldquo;Middle.&amp;rdquo; Either be the &lt;strong>cheapest/automated&lt;/strong> or the &lt;strong>most expensive/transformative&lt;/strong>. Never both.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The Offer Engine (The &amp;ldquo;Value Equation&amp;rdquo;)&lt;/li>
&lt;/ol>
&lt;p>We re-engineer your product using a mathematical formula:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Goal:&lt;/strong> Increase the &lt;strong>Dream Outcome&lt;/strong> and &lt;strong>Certainty&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>Goal:&lt;/strong> Decrease the &lt;strong>Time it takes&lt;/strong> and the &lt;strong>Effort required&lt;/strong> from the customer.&lt;/li>
&lt;li>&lt;strong>The MAGIC Name:&lt;/strong> Give the product a name that announces the &lt;strong>Avatar&lt;/strong>, the &lt;strong>Goal&lt;/strong>, and the &lt;strong>Timeframe&lt;/strong> (e.g., &lt;em>The 12-Week ‘Get Fit’ Founder Blueprint&lt;/em>).&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>The Sales Machine (The &amp;ldquo;Silent Salesman&amp;rdquo;)&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>The VSL:&lt;/strong> A short, high-energy video that proves you’ve done it, explains the plan, and stacks the value so the price looks tiny.&lt;/li>
&lt;li>&lt;strong>The Guarantee:&lt;/strong> Use &amp;ldquo;Teeth in the Agreement.&amp;rdquo; If they don&amp;rsquo;t get the result, you pay the price (refund or work for free).&lt;/li>
&lt;li>&lt;strong>Damaging Admissions:&lt;/strong> Be honest about why your product &lt;em>isn&amp;rsquo;t&lt;/em> for everyone to build instant trust.&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>The Scale &amp;amp; Retention (The &amp;ldquo;Long Game&amp;rdquo;)&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>The 3 Churn Cliffs:&lt;/strong> Focus entirely on the first &lt;strong>24 hours&lt;/strong>, &lt;strong>30 days&lt;/strong>, and &lt;strong>6 months&lt;/strong> to keep customers for life.&lt;/li>
&lt;li>&lt;strong>One Channel:&lt;/strong> Don&amp;rsquo;t be a &amp;ldquo;jack of all trades.&amp;rdquo; Master &lt;strong>one&lt;/strong> marketing channel (Ads, Content, or Cold Outreach) before adding a second.&lt;/li>
&lt;li>&lt;strong>Hire to Buy Time:&lt;/strong> Only hire people once the founder is physically unable to take more sales calls.&lt;/li>
&lt;/ul>
&lt;ol start="5">
&lt;li>The &amp;ldquo;Kill-Switch&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>Red Dress Syndrome:&lt;/strong> If you’re chasing a new idea because the current one is &amp;ldquo;hard,&amp;rdquo; stop. The next one will be hard too. &lt;strong>Confront the business you have.&lt;/strong>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>&lt;strong>In one sentence:&lt;/strong> We analyze the business for structural flaws, re-brand the offer to be irresistible using the Value Equation, and build an automated funnel (VSL) to sell it at a premium price.&lt;/p>
&lt;h3>From questions to forms&lt;span class="absolute -mt-20" id="from-questions-to-forms">&lt;/span>
&lt;a href="#from-questions-to-forms" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Its hard to achieve anything w/o disqulifying ideas/ppl.&lt;/p>
&lt;p>trust me :)&lt;/p>
&lt;p>Luckily, you can now:&lt;/p>
&lt;ol>
&lt;li>Programmatically &lt;strong>create forms&lt;/strong> for your product with a psyc/business/hormozi review&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-40">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv run python main.py create survey-consulting-qualifier.json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make create-qualifier&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-40"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/disqualified.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;ol start="2">
&lt;li>Bring &lt;strong>qualified leads&lt;/strong> towards your pocketbase instance:&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-41">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://github.com/Raqibnur/quick-waitlist #if you dont want to setup pb, there are other projects for inspiration&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-41"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="3">
&lt;li>Do cool D&amp;amp;A or just send them goodies / DRIP campaigns:&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-42">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://github.com/JAlcocerT/leads-slubnechwile&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-42"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="4">
&lt;li>Lead scrap + enrich with a personalized offer?&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-43">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-43"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>&lt;a href="https://app.fireflies.ai/welcome/ai-skills" target="_blank" rel="noopener">https://app.fireflies.ai/welcome/ai-skills&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://app.fireflies.ai/skills" target="_blank" rel="noopener">https://app.fireflies.ai/skills&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>It will just allow to get the summary, so get the mp3 and use whisper:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-44">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make meeting-mp3 &lt;span class="c1">#get the mp3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make meeting-transcribe &lt;span class="c1">#use openAI to get the full summary&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-44"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>Evne more by having &lt;code>jalcocertech-services/design-brand-kit/refined-assets/stationery/jalc-letterhead-lead-brief-v1.html&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;h4>From Forms to Services Landing Pages&lt;span class="absolute -mt-20" id="from-forms-to-services-landing-pages">&lt;/span>
&lt;a href="#from-forms-to-services-landing-pages" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Whats the excuse now not to have cool landings with all the forms and lead acquisition in place?&lt;/p>
&lt;hr>
&lt;h2>agentssss&lt;span class="absolute -mt-20" id="agentssss">&lt;/span>
&lt;a href="#agentssss" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://github.com/tinyhumansai/openhuman" target="_blank" rel="noopener">https://github.com/tinyhumansai/openhuman&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>built with &lt;a href="https://tinyhumans.gitbook.io/openhuman/developing/architecture" target="_blank" rel="noopener">rust&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>&lt;a href="https://github.com/earendil-works/pi" target="_blank" rel="noopener">https://github.com/earendil-works/pi&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>he narrative arc across all four: Each post explicitly cross-references the others, so they form a coherent stack story for readers landing on any one of them.&lt;/p>
&lt;p>Project Layer Position
Agent OS Coding standards Captures conventions, injects them into AI coding tools (Claude Code, Cursor, Antigravity). MIT, pure markdown + bash, v3 explicitly retreated to its strongest niche.
OpenSpec Coding workflow Spec-driven (/opsx:propose → /opsx:apply → /opsx:archive) across 29 AI tools. MIT, npm CLI, brownfield-first delta model.
Paperclip Orchestration The company that hires NanoClaw/OpenClaw/Hermes as employees. Org charts, hard-stop budgets, board governance, multi-company isolation. MIT, Node + Postgres.
Hermes Agent Assistant runtime Nous Research&amp;rsquo;s self-improving agent. 22 messaging platforms, 7 terminal backends (incl. serverless Modal/Daytona), built-in learning loop, first-class hermes claw migrate from OpenClaw. MIT, Python 3.11+.
Layer map I built in the posts (each post that needs it has the same table for consistency):&lt;/p>
&lt;p>┌ Orchestration ──── Paperclip
├ Assistant runtime ─ OpenClaw / NanoClaw / Hermes Agent
├ Coding standards ── Agent OS
└ Coding workflow ── OpenSpec
Five-design-principle treatment applied to each post (the pattern you liked from NanoClaw/OpenClaw) — surfaces each project&amp;rsquo;s opinionated claims, not just its feature list. For Hermes, I leaned heavily on the self-improvement angle and the hermes claw migrate &amp;ldquo;polite-but-clear&amp;rdquo; positioning as a successor to OpenClaw.&lt;/p>
&lt;h4>OpenClaw vs NanoClaw&lt;span class="absolute -mt-20" id="openclaw-vs-nanoclaw">&lt;/span>
&lt;a href="#openclaw-vs-nanoclaw" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Openclaw can be connected to tg, whatsapp, signal &amp;hellip;even nextcloud talk&lt;/p>
&lt;p>And for web search it brings DDG without apikey, but also allow interestingly to plug firecrwawl search or searxng&lt;/p>
&lt;h4>AgentOS&lt;span class="absolute -mt-20" id="agentos">&lt;/span>
&lt;a href="#agentos" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ul>
&lt;li>&lt;a href="https://github.com/buildermethods/agent-os" target="_blank" rel="noopener">https://github.com/buildermethods/agent-os&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;strong>MIT&lt;/strong> | Agent OS is a system for injecting your codebase standards and writing better specs for spec-driven development.&lt;/p>
&lt;/blockquote>
&lt;h4>OpenSpec&lt;span class="absolute -mt-20" id="openspec">&lt;/span>
&lt;a href="#openspec" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ul>
&lt;li>&lt;a href="https://github.com/Fission-AI/OpenSpec" target="_blank" rel="noopener">https://github.com/Fission-AI/OpenSpec&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>MIT | Spec-driven development (SDD) for AI coding assistants.&lt;/p>
&lt;/blockquote>
&lt;h4>paperclip&lt;span class="absolute -mt-20" id="paperclip">&lt;/span>
&lt;a href="#paperclip" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ul>
&lt;li>&lt;a href="https://github.com/paperclipai/paperclip" target="_blank" rel="noopener">https://github.com/paperclipai/paperclip&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>MIT | Open-source orchestration for zero-human companies&lt;/p>
&lt;/blockquote>
&lt;h4>Hermes&lt;span class="absolute -mt-20" id="hermes">&lt;/span>
&lt;a href="#hermes" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>As seen recently: &lt;a href="https://github.com/nousresearch/hermes-agent" target="_blank" rel="noopener">https://github.com/nousresearch/hermes-agent&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-45">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">mkdir -p ~/.hermes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker run -it --rm &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -v ~/.hermes:/opt/data &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> nousresearch/hermes-agent setup&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-45"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;a href="https://www.youtube.com/watch?v=jIP0q7HEC0g" target="_blank" rel="noopener">https://www.youtube.com/watch?v=jIP0q7HEC0g&lt;/a>&lt;/p>
&lt;p>I gave it a try with: &lt;code>https://aistudio.google.com/api-keys&lt;/code>&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/GenAI/hermes-agent.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>To use it via OpenAI API:&lt;/p></description></item><item><title>Selfhosting local Gen-AI (LLMs x Agents)</title><link>https://JAlcocerT.github.io/JAlcocerT/blog/selfhost-2605-ollama-cloud/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/blog/selfhost-2605-ollama-cloud/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Docker Model Run&lt;/p>
&lt;p>LocalModels: with Docker and &lt;a href="#about-ubuntu-2604-lts" >Ubuntu 26.04&lt;/a>&lt;/p>
&lt;!--
https://www.youtube.com/watch?v=tYg6T_DAP-k
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/tYg6T_DAP-k" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Running LLMs locally, even on a &lt;a href="#how-to-enhance-a-raspberry-pi-for-ai" >PI&lt;/a>, should not be a problem in 2025.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/where-to-deploy/" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/where-to-deploy/&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">sudo docker compose -f ./z-homelab-setup/evolution/2605_docker-compose.yml logs -f ollama&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Ollama What?&lt;span class="absolute -mt-20" id="ollama-what">&lt;/span>
&lt;a href="#ollama-what" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Ollama makes it easy to get up and running with large language models locally. It is &lt;strong>like Docker for managing LLMs&lt;/strong>.&lt;/p>
&lt;p>With &lt;a href="https://github.com/Decentralised-AI/ollama/blob/main/docs/modelfile.md" target="_blank" rel="noopener">modelfile&lt;/a>, it creates a &lt;a href="https://github.com/Decentralised-AI/ollama/tree/main/examples" target="_blank" rel="noopener">profile&lt;/a> of a model: &lt;strong>ollama create your_model_profile -f ./testmodelfile&lt;/strong>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">ollama run testmodelfile&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Install it with docker or with CLI:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://hub.docker.com/r/ollama/ollama" target="_blank" rel="noopener">https://hub.docker.com/r/ollama/ollama&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://gpt-index.readthedocs.io/en/stable/examples/llm/ollama.html" target="_blank" rel="noopener">https://gpt-index.readthedocs.io/en/stable/examples/llm/ollama.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps -a --filter &amp;#34;name=ollama&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker run -d &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --name ollama &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --restart unless-stopped &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -v /srv/data/ollama:/root/.ollama &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -p 11434:11434 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> ollama/ollama
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#podman run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>If you want it baremetal:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">curl https://ollama.ai/install.sh &lt;span class="p">|&lt;/span> sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#netstat -tuln&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ss -tulnp | grep &amp;#39;:11434&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This will work:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">sudo systemctl status ollama
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo systemctl stop ollama&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/ollama" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Ollama | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yml" data-lang="yml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;3&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">ollama&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ollama/ollama:latest&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c">#0.1.17&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">container_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ollama&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">ports&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;11434:11434&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">ollama_data:/root/.ollama&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">ollama_data:&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Ollama xCPU only&lt;span class="absolute -mt-20" id="ollama-xcpu-only">&lt;/span>
&lt;a href="#ollama-xcpu-only" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Get some models: &lt;a href="https://ollama.com/search" target="_blank" rel="noopener">https://ollama.com/search&lt;/a>&lt;/p>
&lt;p>This time ill go: &lt;a href="https://ollama.com/library/gemma4" target="_blank" rel="noopener">https://ollama.com/library/gemma4&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker exec -it ollama bash&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ollama --version &lt;span class="c1">#0.24.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ollama run orca-mini:3b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ollama pull gemma4 &lt;span class="c1">#this model is 10GB currently top ~40 at https://arena.ai/leaderboard/text&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ollama run wizardcoder:13b-python&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://ollama.ai/library/sqlcoder&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ollama run codellama&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ollama list
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl http://localhost:11434/api/tags &lt;span class="c1">#list them too&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> ollama ollama show gemma4 &lt;span class="c1">#8B params&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> -it ollama ollama run gemma4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You can now also: &lt;a href="https://docs.ollama.com/integrations" target="_blank" rel="noopener">https://docs.ollama.com/integrations&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">ollama launch openclaw&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Or just:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ollama launch codex&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ollama launch opencode&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-yellow-100 bg-yellow-50 text-yellow-900 dark:border-yellow-200/30 dark:bg-yellow-700/30 dark:text-yellow-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
⚠️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Get Forgejo ready as seen &lt;a href="https://jalcocert.github.io/JAlcocerT/selfhosting-media/#code-is-also-media" target="_blank" rel="noopener">here&lt;/a>.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>Ollama x REST API&lt;span class="absolute -mt-20" id="ollama-x-rest-api">&lt;/span>
&lt;a href="#ollama-x-rest-api" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>To connect via API to your Ollama instance: &lt;a href="https://github.com/jmorganca/ollama/blob/main/docs/api.md" target="_blank" rel="noopener">https://github.com/jmorganca/ollama/blob/main/docs/api.md&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># curl -X POST http://localhost:11434/api/generate -d &amp;#39;{&amp;#34;model&amp;#34;: &amp;#34;orca-mini:3b&amp;#34;, &amp;#34;prompt&amp;#34;:&amp;#34;What is a large language model?&amp;#34;}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl http://localhost:11434/api/generate -d &lt;span class="s1">&amp;#39;{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;model&amp;#34;: &amp;#34;gemma4&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;prompt&amp;#34;:&amp;#34;Why is the sky blue?&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">}&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>For the &lt;strong>x300 5600g&lt;/strong> this was 2min:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">time&lt;/span> curl http://localhost:11434/api/generate -d &lt;span class="s1">&amp;#39;{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;model&amp;#34;: &amp;#34;gemma4&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;prompt&amp;#34;: &amp;#34;Why is the sky blue?&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;stream&amp;#34;: false
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">}&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>For the mac M2:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You can also:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">curl http://localhost:11434/api/generate -d &lt;span class="s1">&amp;#39;{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;model&amp;#34;: &amp;#34;orca-mini:3b&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;prompt&amp;#34;: &amp;#34;what is docker?&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;stream&amp;#34;: false
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">}&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> grep -o &lt;span class="s1">&amp;#39;&amp;#34;response&amp;#34;:&amp;#34;[^&amp;#34;]*&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> cut -d&lt;span class="s1">&amp;#39;&amp;#34;&amp;#39;&lt;/span> -f4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>OpenWebUI&lt;span class="absolute -mt-20" id="openwebui">&lt;/span>
&lt;a href="#openwebui" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://github.com/open-webui/open-webui" target="_blank" rel="noopener">https://github.com/open-webui/open-webui&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2>With Python - llama-index&lt;span class="absolute -mt-20" id="with-python---llama-index">&lt;/span>
&lt;a href="#with-python---llama-index" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;a href="https://docs.llamaindex.ai/en/stable/examples/llm/ollama.html" target="_blank" rel="noopener">https://docs.llamaindex.ai/en/stable/examples/llm/ollama.html&lt;/a>&lt;/p>
&lt;h2>Ollama + Home Assistant&lt;span class="absolute -mt-20" id="ollama--home-assistant">&lt;/span>
&lt;a href="#ollama--home-assistant" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;a href="https://community.home-assistant.io/t/custom-integration-ollama-conversation-local-ai-agent/636103/7" target="_blank" rel="noopener">https://community.home-assistant.io/t/custom-integration-ollama-conversation-local-ai-agent/636103/7&lt;/a>
&lt;a href="https://github.com/ej52/hass-ollama-conversation" target="_blank" rel="noopener">https://github.com/ej52/hass-ollama-conversation&lt;/a>&lt;/p>
&lt;h2>Custom Roles&lt;span class="absolute -mt-20" id="custom-roles">&lt;/span>
&lt;a href="#custom-roles" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-13">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">ollama create mymodel -f ./Modelfile
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ollama list
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ollama run mymodel&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-13"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h4>Ollama with LangChain&lt;span class="absolute -mt-20" id="ollama-with-langchain">&lt;/span>
&lt;a href="#ollama-with-langchain" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ul>
&lt;li>👉 &lt;a href="https://www.youtube.com/watch?v=k_1pOF1mj8k" target="_blank" rel="noopener">https://www.youtube.com/watch?v=k_1pOF1mj8k&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-14">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-dockerfile" data-lang="dockerfile">&lt;span class="line">&lt;span class="cl">&lt;span class="k">FROM&lt;/span>&lt;span class="s"> orca-mini:3b&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>PARAMETER temperature 0.5&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>SYSTEM &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>You are an expert software developer. Answer as a software developer, my assitant, only.&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-14"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Ollama with a RAG: llama-index&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-15">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://www.youtube.com/watch?v=k_1pOF1mj8k&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo systemctl status ollama&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo systemctl stop ollama&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ollama list&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ollama run orca-mini:3b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#deepseek-coder:6.7b-base &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">###&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://pypi.org/project/llama-index/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://docs.llamaindex.ai/en/stable/examples/llm/ollama.html&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">###&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">### Install the Package&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#pip install llama-index&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#pip show llama-index&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">### Ollama with orca-mini:3b is running in Ollama&amp;#39;s Docker container and the just execute the Python script&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#python3 ollama-langchain.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">llama_index.llms&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Ollama&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">llm&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Ollama&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;orca-mini:3b&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">llm&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">complete&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;What is a vector database?&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-15"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>Ollama Alternatives&lt;span class="absolute -mt-20" id="ollama-alternatives">&lt;/span>
&lt;a href="#ollama-alternatives" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>JAN&lt;span class="absolute -mt-20" id="jan">&lt;/span>
&lt;a href="#jan" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://github.com/janhq/jan" target="_blank" rel="noopener">https://github.com/janhq/jan&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>AGPLv3 | Jan is an open source alternative to ChatGPT that runs 100% offline on your computer&lt;/p>
&lt;/blockquote>
&lt;h2>Local Audio&lt;span class="absolute -mt-20" id="local-audio">&lt;/span>
&lt;a href="#local-audio" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;!-- https://www.youtube.com/watch?v=dQ841Pd6YvQ -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/dQ841Pd6YvQ" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Ollama with &lt;a href="https://jalcocert.github.io/JAlcocerT/cad-design-mbsd/#rendering-on-a-mac-m2" target="_blank" rel="noopener">the mac M2&lt;/a> has been interesting!&lt;/p>
&lt;p>What else am I running since last month?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-16">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/Home-Lab/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./Home-Lab/z-homelab-setup/evolution &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps --filter &amp;#34;status=running&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo docker compose -f 2605_docker-compose.yml up -d ollama uptime....pihole nextcloud ncdb.......
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ollama run&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-16"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>After the initial setup and checking how fast the M2 is with blender&lt;/p>
&lt;p>Im not surprised the performance with Ollama&lt;/p>
&lt;blockquote>
&lt;p>For a daily driver OS, &lt;code>ZORIN 18&lt;/code> is working nicely for me.&lt;/p>
&lt;/blockquote>
&lt;p>But it was about time to do a format C to &lt;a href="https://jalcocert.github.io/JAlcocerT/asrock-x300-home-server/" target="_blank" rel="noopener">my x300&lt;/a>.&lt;/p>
&lt;p>So&amp;hellip;why not trying ubuntu &lt;code>26.04 LTS&lt;/code> that has recently been &lt;a href="https://releases.ubuntu.com" target="_blank" rel="noopener">released&lt;/a>?&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://ubuntu.com/about/release-cycle" target="_blank" rel="noopener">https://ubuntu.com/about/release-cycle&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://releases.ubuntu.com" target="_blank" rel="noopener">https://releases.ubuntu.com&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>I gave it a try first via: &lt;em>then, added to my usb drive with Ventoy and the other OS&amp;rsquo;s&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-17">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo apt install gnome-boxes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gnome-boxes&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-17"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>or&amp;hellip;with &lt;a href="https://github.com/JAlcocerT/Home-Lab/blob/main/z-benchmarks/vm-101.md" target="_blank" rel="noopener">these other options&lt;/a>, like:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-18">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo mkdir -p /var/lib/libvirt/images
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo cp /home/jalcocert/Desktop/ubuntu-26.04-desktop-amd64.iso /var/lib/libvirt/images/&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-18"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Yep, they need to be here:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-19">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">find /var/lib/libvirt/images -maxdepth &lt;span class="m">1&lt;/span> -type f -iname &lt;span class="s1">&amp;#39;*.iso&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-19"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Then install from the copied &lt;code>.ISO&lt;/code>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-20">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo virt-install &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --name ubuntu-vm &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --memory &lt;span class="m">3096&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --vcpus &lt;span class="m">2&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --disk &lt;span class="nv">size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">30&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --cdrom /var/lib/libvirt/images/ubuntu-26.04-desktop-amd64.iso &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --os-variant generic &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --network &lt;span class="nv">network&lt;/span>&lt;span class="o">=&lt;/span>default &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --graphics spice
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#virsh list --all&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo virsh shutdown ubuntu-vm&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-20"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Sitting at &lt;strong>1.2gb RAM&lt;/strong> at start up!&lt;/p>
&lt;p>Once ready, you can use the scripts at my repo to install all the goodies for your server:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-21">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">sudo apt install git
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git config --global user.name &amp;#34;JAlcocerT&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git config --global user.email &amp;#34;JAlcocerT&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-21"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Once git is ready, just tested the latest setup script:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-22">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#flatpak install flathub app.zen_browser.zen&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/Home-Lab
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo ./z-benchmarks/Benchmark_101.sh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#for a homelab that you wont use desktop, you are good to go with this&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo ./z-desktop-x-homelab/Linux_Setup_101.sh #You are good to go with browsers OBS tailscale etc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /home/ubuntu/Home-Lab
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#chmod +x z-homelab-setup/homelab-selfhosting.sh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo ./z-homelab-setup/homelab-selfhosting.sh &lt;span class="c1">#make sure to know what you are doing!&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-22"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Get back to work with:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-23">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#curl -LsSf https://astral.sh/uv/install.sh | sh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv --version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv python list &lt;span class="c1">#https://docs.astral.sh/uv/guides/install-python/&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-23"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Or put the &lt;a href="https://jalcocert.github.io/JAlcocerT/poc-105/#using-the-latest-agents" target="_blank" rel="noopener">agents to work&lt;/a> as we have seen:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-24">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">curl -fsSL https://deb.nodesource.com/setup_22.x &lt;span class="p">|&lt;/span> sudo -E bash - &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo apt install -y nodejs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#node --version&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">apt install npm
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm install -g @openai/codex #https://github.com/openai/codex/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">codex&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-24"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/home-lab" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
home-lab | Repo ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>This was also an opportunity to do a format on the 1TB drive &lt;a href="https://jalcocert.github.io/JAlcocerT/selfhosted-apps-nov-2025/#selfhosted-adventures" target="_blank" rel="noopener">where I tried umbrelOS&lt;/a> with a &lt;a href="https://jalcocert.github.io/JAlcocerT/selfhosted-apps-nov-2025/#big-data-analytics-with-on-chain-data" target="_blank" rel="noopener">btc node&lt;/a>.&lt;/p>
&lt;blockquote>
&lt;p>Umbrel (the btc node mostly) took ~837GB!&lt;/p>
&lt;/blockquote>
&lt;p>Lets make some space: &lt;em>formatting a 1TB drive as ext4 and adding it to &lt;a href="https://jalcocert.github.io/JAlcocerT/asrock-x300-home-server/" target="_blank" rel="noopener">my x300&lt;/a> as permanent additional storage&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-25">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">lsblk -o NAME,SIZE,MODEL,TYPE,FSTYPE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#lsblk -d -o NAME,SIZE,MODEL,TYPE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#lsblk -f&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">du -sh /media/jalcocert/1234-fb02-4e46-948d-abcdef134567/* &lt;span class="c1">#see those 837gb&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#for just a linux drive, ext4 seems to be the best option and will allow for nextcloud to have its data folder there&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo umount /dev/sda1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## different tool, &amp;#39;parted&amp;#39; is easier for scripting/one-liners than fdisk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo parted /dev/sda --script mklabel gpt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo parted /dev/sda --script mkpart primary ext4 0% 100%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># -L assigns a label&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># /dev/sda1 is the new partition we just made&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo mkfs.ext4 -L data1tb /dev/sda1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lsblk -f /dev/sda
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo mkdir -p /mnt/data1tb/nextcloud/db &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo chown -R 1000:1000 /mnt/data1tb/nextcloud/db&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-25"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>Once this is done, download the mobile nc app and &lt;code>More -&amp;gt; settings -&amp;gt; auto upload&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;p>If you dont know who are you connected to:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-26">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ip neigh #see other devices connected to the same router&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip route &lt;span class="p">|&lt;/span> grep default
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#default via 192.168.0.1 dev wlp3s0 proto dhcp metric 600 &lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-26"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>See other &lt;em>local devices&lt;/em> connected to the same router:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-27">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">ip neigh&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-27"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You can check these selfhosted and Linux docs.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/how-to-perform-free-web-audit" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Web Audits 101 x BlogSpot | Post ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/how-to-perform-free-web-audit" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Web Audits 101 x BlogSpot | Post ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>Or reach out for doubts:&lt;/p>
&lt;!--
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/tiersofservice/dwi/selfh-landing-astro-fastapi-bot.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;/div>
-->
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/consulting.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/ebooks.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks with free value.&lt;/div>&lt;/a>
&lt;/div>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Prepare &lt;a href="https://jalcocert.github.io/JAlcocerT/selfhosted-apps-sept-2025/#which-linux-to-get-started" target="_blank" rel="noopener">Ventoy&lt;/a> if you are ready to go with &lt;a href="#about-ubuntu-2604-lts" >the latest ubuntu&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>About Protocols&lt;span class="absolute -mt-20" id="about-protocols">&lt;/span>
&lt;a href="#about-protocols" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Is ADL the next big thing after MCP eating the context windows?&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/nextmoca/adl" target="_blank" rel="noopener">https://github.com/nextmoca/adl&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>ADL (Agent Definition Language) is an open source, vendor‑neutral spec for describing what an AI agent is and is allowed to do, so the same agent definition can be inspected, versioned, audited, and reused across different platforms and runtimes.&lt;/p>
&lt;p>&lt;strong>Core idea&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>ADL solves fragmentation where each team or vendor defines “agents” differently (YAML, ad‑hoc JSON, in‑code configs), which hurts governance, security, portability, and audits. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;li>It provides a single declarative file that captures an agent’s purpose, tools, retrieval (RAG) sources, LLM config, permissions, dependencies, and governance metadata. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>What ADL is&lt;/p>
&lt;p>An ADL file describes, in JSON/JSON‑compatible form: &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Agent metadata&lt;/strong>: name, description, role, owner, version, lifecycle timestamps. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;li>&lt;strong>LLM configuration&lt;/strong>: provider, model, temperature, max tokens, provider‑specific params. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;li>&lt;strong>Tools&lt;/strong>: callable functions with names, params, types, invocation mode (python_function, http, mcp, etc.), optional return schemas and categories. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;li>&lt;strong>RAG inputs&lt;/strong>: indices/corpora (docs, code, images) with paths, types, locations, and metadata. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;li>&lt;strong>Permissions&lt;/strong>: allowed file paths, network domains, env vars, sandbox limits. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;li>&lt;strong>Dependencies&lt;/strong>: packages and versions, referenced code. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;li>&lt;strong>Governance &amp;amp; audit&lt;/strong>: who created/updated it, when, and why, aligned with SemVer. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Analogy: OpenAPI defines HTTP APIs and Terraform defines infra; &lt;strong>ADL is the contract for agents&lt;/strong>. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/p>
&lt;p>What ADL is not&lt;/p>
&lt;p>ADL only covers static definition, not runtime behavior: &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/p>
&lt;ul>
&lt;li>Not agent‑to‑agent protocol (A2A) for messaging/coordination. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;li>Not a runtime tool protocol like MCP (how tools are called/streamed). &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;li>Not OpenAPI (HTTP interface spec) and not a workflow engine (Airflow, Temporal, etc.). &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;li>Not a prompt format or wire/RPC protocol. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>It is meant to sit alongside A2A, MCP, OpenAPI, and workflow systems as the &lt;strong>definition layer&lt;/strong> of the agent stack. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/p>
&lt;p>ADL is a spec for describing an agent; RAG and similar tools are mechanisms an agent can use. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/p>
&lt;p>&lt;strong>Role in the stack&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>ADL is a &lt;strong>definition layer&lt;/strong>: it declares an agent’s goal, tools, RAG sources, permissions, and model config in a portable, vendor‑neutral file. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;li>RAG, MCP, workflows, OpenAPI, etc., are &lt;strong>implementation layers&lt;/strong>: they govern how the agent actually retrieves data, calls tools, or runs steps at runtime. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>ADL vs RAG&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>RAG is a pattern: chunk, embed, and retrieve documents/code/images to augment prompts, implemented via vector DBs and retrieval libraries. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;li>ADL does not replace RAG; instead, it describes which RAG indices/corpora an agent may access, where they live, and with what metadata and constraints. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;li>Put differently: RAG answers “how do we fetch context at runtime?”, while ADL answers “which RAG sources is this agent allowed to use and under what configuration?”. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2>ADL vs tool protocols (e.g., MCP)&lt;span class="absolute -mt-20" id="adl-vs-tool-protocols-eg-mcp">&lt;/span>
&lt;a href="#adl-vs-tool-protocols-eg-mcp" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>Tool protocols like MCP define &lt;strong>how&lt;/strong> an agent talks to tools: streaming, message formats, error handling. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;li>ADL defines &lt;strong>what&lt;/strong> tools exist for a given agent: names, parameter schemas, invocation mode (python_function, http, mcp), and categories. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;li>You can use MCP and RAG under the hood, while ADL sits above them as the declarative contract that a security or platform team can inspect and version‑control. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Governance advantage&lt;/p>
&lt;ul>
&lt;li>Existing RAG setups and tool registries are often scattered across YAML, code, and infra; ADL centralizes all that into one inspectable artifact. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;li>This makes it easier to audit “what can this agent possibly do or access?” than with ad‑hoc RAG configs or per‑framework agent definitions. &lt;a href="https://www.nextmoca.com/blogs/agent-definition-language-adl-the-open-source-standard-for-defining-ai-agents" target="_blank" rel="noopener">nextmoca&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>AI agents&lt;/p>
&lt;p>&lt;strong>Semantic Kernel&lt;/strong> (likely what you meant by &amp;ldquo;symantec kernal,&amp;rdquo; as no Symantec product matches this term) is Microsoft&amp;rsquo;s open-source SDK for building AI agents and integrating large language models (LLMs) into apps using C#, Python, or Java. It uses a central &amp;ldquo;kernel&amp;rdquo; to orchestrate semantic functions (natural language prompts), native code functions, memory, and planners for tasks like chaining prompts or agent workflows. &lt;a href="https://www.leanware.co/insights/langchain-vs-semantic-kernel-which-ai-framework-is-right-for-your-next-project" target="_blank" rel="noopener">leanware&lt;/a>&lt;/p>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h2>Large Language Models (LLMs)&lt;span class="absolute -mt-20" id="large-language-models-llms">&lt;/span>
&lt;a href="#large-language-models-llms" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://www.reddit.com/r/LocalLLaMA/comments/16xzxwv/streamingllm_a_simple_and_efficient_framework/" target="_blank" rel="noopener">StreamingLLM Framework&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.reddit.com/r/LocalLLaMA/comments/16s701v/this_is_one_of_the_best_13b_models_ive_tested_for/" target="_blank" rel="noopener">Best 13B LLM Models Discussion&lt;/a>&lt;/li>
&lt;/ul>
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://ollama.ai/" target="_blank" rel="noopener">https://ollama.ai/&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/jmorganca/ollama" target="_blank" rel="noopener">https://github.com/jmorganca/ollama&lt;/a>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://hub.docker.com/r/ollama/ollama" target="_blank" rel="noopener">https://hub.docker.com/r/ollama/ollama&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>👉 &lt;a href="https://www.youtube.com/watch?v=rIRkxZSn-A8" target="_blank" rel="noopener">https://www.youtube.com/watch?v=rIRkxZSn-A8&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://www.youtube.com/watch?v=MGr1V4LyGFA" target="_blank" rel="noopener">https://www.youtube.com/watch?v=MGr1V4LyGFA&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3>AI x Data&lt;span class="absolute -mt-20" id="ai-x-data">&lt;/span>
&lt;a href="#ai-x-data" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://github.com/chartbrew/chartbrew" target="_blank" rel="noopener">https://github.com/chartbrew/chartbrew&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/vanna-ai/vanna" target="_blank" rel="noopener">https://github.com/vanna-ai/vanna&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>vanna-ai/vanna: 🤖 Chat with your SQL database 📊. Accurate Text-to-SQL Generation via LLMs using Agentic Retrieval 🔄.&lt;/p>
&lt;p>Rill or WrenAI&lt;/p>
&lt;h3>Custom Chats&lt;span class="absolute -mt-20" id="custom-chats">&lt;/span>
&lt;a href="#custom-chats" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://github.com/assistant-ui/assistant-ui" target="_blank" rel="noopener">https://github.com/assistant-ui/assistant-ui&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>MIT | Typescript/React Library for AI Chat💬🚀&lt;/p>
&lt;/blockquote>
&lt;h3>TTS&lt;span class="absolute -mt-20" id="tts">&lt;/span>
&lt;a href="#tts" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>TTS is always interesting.&lt;/p>
&lt;p>But I dont have much time to act on it.&lt;/p>
&lt;p>I just got to know recently about:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://huggingface.co/kyutai/pocket-tts" target="_blank" rel="noopener">https://huggingface.co/kyutai/pocket-tts&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Which can be a good companion for:&lt;/p>
&lt;h3>How to Enhance a Raspberry Pi for AI&lt;span class="absolute -mt-20" id="how-to-enhance-a-raspberry-pi-for-ai">&lt;/span>
&lt;a href="#how-to-enhance-a-raspberry-pi-for-ai" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>You can do same thing I explain with my x300 in your Pis, miniPCs or cloud/VPS.&lt;/p>
&lt;ul>
&lt;li>Edge TPU on RPi - Coral Edge TPU (Tensor Processing Unit - an USB acccelerator )&lt;/li>
&lt;/ul>
&lt;p>TPU (Tensor Processing Unit)?&lt;/p>
&lt;p>Focus: TPUs are specifically &lt;strong>designed for running Google&amp;rsquo;s TensorFlow&lt;/strong> machine learning framework. They are optimized for high-performance matrix multiplication, a fundamental operation in many deep learning algorithms.&lt;/p>
&lt;p>Architecture: TPUs are &lt;strong>custom-designed by Google&lt;/strong> with a focus on maximizing performance for TensorFlow workloads. They prioritize speed and efficiency for specific tasks within the TensorFlow ecosystem.&lt;/p>
&lt;blockquote>
&lt;p>You will hear more and more about NPU - Neural Processing Units&lt;/p>
&lt;/blockquote>
&lt;p>While both are designed to &lt;strong>handle AI workloads&lt;/strong>, they have distinct differences in their focus, architecture, and availability.&lt;/p>
&lt;p>NPUs are designed to mimic the structure and function of the human brain, excelling at tasks that involve large-scale parallel processing.&lt;/p>
&lt;p>They are particularly well-suited for &lt;strong>various AI applications&lt;/strong>, including:&lt;/p>
&lt;ul>
&lt;li>🖼️ Image recognition&lt;/li>
&lt;li>💬 Natural language processing&lt;/li>
&lt;li>🗣️ Speech recognition&lt;/li>
&lt;/ul>
&lt;p>NPUs typically utilize a manycore architecture with specialized instructions and data formats optimized for AI algorithms. This allows them to handle complex neural networks efficiently.&lt;/p>
&lt;p>NPUs are often integrated into mobile processors from companies like Apple, Huawei, and Samsung.&lt;/p>
&lt;p>They are also available as standalone chips from some manufacturers.&lt;/p>
&lt;h3>About Ubuntu 2604 LTS&lt;span class="absolute -mt-20" id="about-ubuntu-2604-lts">&lt;/span>
&lt;a href="#about-ubuntu-2604-lts" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The latest, &lt;code>https://releases.ubuntu.com/&lt;/code> is coming with the kernel 7.&lt;/p>
&lt;p>I ended up trying it first &lt;a href="https://jalcocert.github.io/JAlcocerT/testing-nix-os/#interesting-stuff-regarding-emulation" target="_blank" rel="noopener">on a VM&lt;/a>, with a check with codex on the must follow steps for a reliable setup:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-28">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">sudo snap install gnome-boxes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gnome-boxes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#codex&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">apt update &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> apt upgrade -y&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-28"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>&lt;a href="https://github.com/JAlcocerT/Home-Lab/tree/main/z-benchmarks" target="_blank" rel="noopener">https://github.com/JAlcocerT/Home-Lab/tree/main/z-benchmarks&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/JAlcocerT/Home-Lab/tree/main/z-desktop-x-homelab" target="_blank" rel="noopener">https://github.com/JAlcocerT/Home-Lab/tree/main/z-desktop-x-homelab&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
You have them all updated into this script
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>You can test the speed with this script, which now includes &lt;a href="https://jalcocert.github.io/JAlcocerT/poc-101/#where-are-you-going" target="_blank" rel="noopener">the trip-planner v3&lt;/a>:&lt;/p>
&lt;p>Helium, zen&amp;hellip;are interesting browsers for you to give a try&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://winboat.app/" target="_blank" rel="noopener">https://winboat.app/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>With &lt;a href="https://jalcocert.github.io/JAlcocerT/testing-nix-os/#interesting-stuff-regarding-emulation" target="_blank" rel="noopener">a VM&lt;/a> you dont have GPU passthrough and hardware acceleration.&lt;/p>
&lt;p>&lt;a href="https://www.youtube.com/watch?v=qEI95GIRKaU" target="_blank" rel="noopener">https://www.youtube.com/watch?v=qEI95GIRKaU&lt;/a>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://apps.gnome.org/Maps/" target="_blank" rel="noopener">https://apps.gnome.org/Maps/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>There are interesting things going on: &lt;a href="https://agelesslinux.org/map.html" target="_blank" rel="noopener">https://agelesslinux.org/map.html&lt;/a>&lt;/p>
&lt;p>This is a good chance to make a system format from scratch and reset the system with all the goodies and latest learnings:&lt;/p>
&lt;ol start="0">
&lt;li>First, some backups and tests:&lt;/li>
&lt;/ol>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/sftp-go" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">SFTPGo | Docker Config Setup 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>Hopefully, you have your &lt;strong>important containers volumes&lt;/strong> pointing to external/non OS disks:&lt;/p>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/selfhosted-apps-spring-2025/#immich" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/selfhosted-apps-spring-2025/#immich&lt;/a>
&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/Photo/immich.png" alt="Immich UI" loading="lazy" />&lt;/p>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/image-backup-tools/#nc-vs-immich" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/image-backup-tools/#nc-vs-immich&lt;/a>
&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/media/NC-traefik/nc-32.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-29">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps -a --filter &amp;#34;name=nextcloud&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker ps -a --filter &lt;span class="s2">&amp;#34;name=nextcloud&amp;#34;&lt;/span> --format &lt;span class="s2">&amp;#34;table {{.Names}}\t{{.Mounts}}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker ps -a --filter &lt;span class="s2">&amp;#34;status=running&amp;#34;&lt;/span> --format &lt;span class="s2">&amp;#34;table {{.Names}}\t{{.Mounts}}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker exec -it commento_db-foss bash&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#psql -U commento -d commento&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#SELECT * FROM comments;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker stats netdata&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-29"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You can also backup your logs: &lt;a href="https://jalcocert.github.io/JAlcocerT/image-backup-tools/#server-maintainance" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/image-backup-tools/#server-maintainance&lt;/a>&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/HomeLab/statuspages/uptimekuma.png" alt="Uptime Kuma Monitoring Page" loading="lazy" />&lt;/p>
&lt;ol>
&lt;li>Like&amp;hellip;installing python?&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-30">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">curl -LsSf &lt;span class="o">[&lt;/span>https://astral.sh/uv/install.sh&lt;span class="o">](&lt;/span>https://astral.sh/uv/install.sh&lt;span class="o">)&lt;/span> &lt;span class="p">|&lt;/span> sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#powershell -c &amp;#34;irm [https://astral.sh/uv/install.ps1](https://astral.sh/uv/install.ps1) | iex&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv python install 3.12
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv run script.py&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-30"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Nah, manage everything via uv with whatever python version!&lt;/p>
&lt;blockquote>
&lt;p>Similarly as I did with this mac M2 :)&lt;/p>
&lt;/blockquote>
&lt;h3>Prompting 101&lt;span class="absolute -mt-20" id="prompting-101">&lt;/span>
&lt;a href="#prompting-101" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>First timer doing prompts?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-31">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">curl&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-31"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The &lt;strong>D.E.F.I.N.E.&lt;/strong> framework!&lt;/p>
&lt;p>This is a structured engineering mindset that treats a prompt like a formal &lt;strong>Project Requirements Document (PRD)&lt;/strong>.&lt;/p>
&lt;p>While &amp;ldquo;Creating&amp;rdquo; is the act of generation, &lt;strong>D.E.F.I.N.E.&lt;/strong> is the methodology pro users use to ensure that the creation doesn&amp;rsquo;t hallucinate or miss the mark.&lt;/p>
&lt;hr>
&lt;h4>&lt;strong>The D.E.F.I.N.E. Framework&lt;/strong>&lt;span class="absolute -mt-20" id="the-define-framework">&lt;/span>
&lt;a href="#the-define-framework" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>&lt;strong>D – Desired Outcome&lt;/strong>&lt;/p>
&lt;p>Pros start with the &amp;ldquo;Why&amp;rdquo; and the &amp;ldquo;Final Form.&amp;rdquo;&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Goal:&lt;/strong> Don&amp;rsquo;t just ask for &amp;ldquo;an email.&amp;rdquo; Ask for &amp;ldquo;a persuasive email that secures a follow-up meeting.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>The Format:&lt;/strong> Specify if you want a table, a code block, a list, or a JSON object.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>E – End User / Audience&lt;/strong>&lt;/p>
&lt;p>This sets the tone and complexity level.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Context:&lt;/strong> Is the AI writing for a skeptical CFO, a 5-year-old, or a Senior DevOps Engineer?&lt;/li>
&lt;li>&lt;strong>The Persona:&lt;/strong> You might also define the AI’s persona here (e.g., &amp;ldquo;Act as a legal expert&amp;rdquo;).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>F – Facts / Inputs&lt;/strong>&lt;/p>
&lt;p>AI is only as good as the data it’s chewing on.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Data:&lt;/strong> Provide the raw text, the statistics, or the URL.&lt;/li>
&lt;li>&lt;strong>The Reference:&lt;/strong> &amp;ldquo;Base your answer &lt;em>only&lt;/em> on the following transcript&amp;hellip;&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>I – In-Scope / Out-of-Scope (OOS)&lt;/strong>&lt;/p>
&lt;p>This is the &amp;ldquo;Guardrail&amp;rdquo; phase. It prevents the AI from wandering into irrelevant topics.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>In-Scope:&lt;/strong> &amp;ldquo;Focus specifically on the Q3 fiscal projections.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Out-of-Scope:&lt;/strong> &amp;ldquo;Do not mention the merger or the previous year’s losses.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>N – Needs, Constraints, &amp;amp; Dependencies&lt;/strong>&lt;/p>
&lt;p>This is the fine print that makes the output usable.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Constraints:&lt;/strong> &amp;ldquo;Must be under 200 words,&amp;rdquo; &amp;ldquo;Avoid passive voice,&amp;rdquo; or &amp;ldquo;No technical jargon.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Dependencies:&lt;/strong> &amp;ldquo;Assume the reader has already seen the first pitch deck.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>E – Evaluation &amp;amp; Execution&lt;/strong>&lt;/p>
&lt;p>The final check before the AI &amp;ldquo;runs&amp;rdquo; the task.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Evaluation:&lt;/strong> Ask the AI to critique its own work before presenting it. &amp;ldquo;Check your answer for logical fallacies.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Execution:&lt;/strong> Tell the AI how to finish. &amp;ldquo;Provide the summary first, then the detailed breakdown, then a list of follow-up questions.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;h4>Example: Applying D.E.F.I.N.E. to a Task&lt;span class="absolute -mt-20" id="example-applying-define-to-a-task">&lt;/span>
&lt;a href="#example-applying-define-to-a-task" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Instead of saying: &lt;em>&amp;ldquo;Write a marketing post about our new AI tool,&amp;rdquo;&lt;/em> a pro uses the framework:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>D:&lt;/strong> Create a LinkedIn post to drive sign-ups.&lt;br>
&lt;strong>E:&lt;/strong> Targeting Mid-level Product Managers who are &amp;ldquo;AI-fatigued.&amp;rdquo;&lt;br>
&lt;strong>F:&lt;/strong> Tool features: 10x faster rendering, zero-latency, local-only processing.&lt;br>
&lt;strong>I:&lt;/strong> Focus on the technical speed; ignore the pricing (OOS).&lt;br>
&lt;strong>N:&lt;/strong> Use a professional yet punchy tone. Max 150 words. Use emojis sparingly.&lt;br>
&lt;strong>E:&lt;/strong> Evaluate the post for &amp;ldquo;cringe&amp;rdquo; corporate speak and remove it before outputting.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>Why Pros Use This Over &amp;ldquo;Creating&amp;rdquo; Freehand&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Reduces Iteration:&lt;/strong> You get what you want in one &amp;ldquo;hit&amp;rdquo; rather than five follow-up prompts.&lt;/li>
&lt;li>&lt;strong>Scalability:&lt;/strong> You can turn a &lt;strong>D.E.F.I.N.E.&lt;/strong> block into a template for any future task.&lt;/li>
&lt;li>&lt;strong>Control:&lt;/strong> It moves the AI from &amp;ldquo;Creative Assistant&amp;rdquo; to &amp;ldquo;Precision Tool.&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>Which part of this framework do you find hardest to implement when you&amp;rsquo;re working with AI?&lt;/p>
&lt;p>While &lt;strong>DEFINE&lt;/strong> is about the architecture and preparation, &lt;strong>CREATE&lt;/strong> is the engine for the actual drafting and iterative execution. It is the framework used to turn those requirements into a high-quality final product.&lt;/p>
&lt;p>Here is how pro power users break down the &lt;strong>C.R.E.A.T.E.&lt;/strong> framework:&lt;/p>
&lt;hr>
&lt;p>&lt;strong>C – Character &amp;amp; Context&lt;/strong>&lt;/p>
&lt;p>Before the AI writes a single word, you must anchor its identity and the situation.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Role:&lt;/strong> Assign a specific &amp;ldquo;expert&amp;rdquo; persona (e.g., &amp;ldquo;You are a Senior Editor at a Tier-1 tech publication&amp;rdquo;).&lt;/li>
&lt;li>&lt;strong>The Background:&lt;/strong> Brief the AI on why this task is happening now.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>R – Reference &amp;amp; Resources&lt;/strong>&lt;/p>
&lt;p>Provide the &amp;ldquo;raw materials&amp;rdquo; for the build.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Examples (Few-Shot):&lt;/strong> Give the AI 2–3 examples of the style or format you want.&lt;/li>
&lt;li>&lt;strong>Knowledge:&lt;/strong> Attach documents, paste data, or provide links that the AI must use as its &amp;ldquo;source of truth.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>E – Explicit Instructions&lt;/strong>&lt;/p>
&lt;p>This is the &amp;ldquo;meat&amp;rdquo; of the prompt where you give the direct command.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Action:&lt;/strong> Use strong verbs (e.g., &amp;ldquo;Synthesize,&amp;rdquo; &amp;ldquo;Contrast,&amp;rdquo; &amp;ldquo;Draft,&amp;rdquo; &amp;ldquo;Refactor&amp;rdquo;).&lt;/li>
&lt;li>&lt;strong>The Structure:&lt;/strong> Tell it exactly how to organize the response (e.g., &amp;ldquo;Introduction, then 3 body paragraphs, then a TL;DR&amp;rdquo;).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>A – Adjustments &amp;amp; Constraints&lt;/strong>&lt;/p>
&lt;p>Set the boundaries to prevent &amp;ldquo;AI-isms&amp;rdquo; and hallucinations.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Tone/Voice:&lt;/strong> &amp;ldquo;Professional but provocative,&amp;rdquo; &amp;ldquo;Scientific and dry,&amp;rdquo; or &amp;ldquo;Empathetic.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Negative Constraints:&lt;/strong> Explicitly state what to avoid (e.g., &amp;ldquo;Do not use the word &amp;lsquo;delve&amp;rsquo;,&amp;rdquo; &amp;ldquo;No preamble,&amp;rdquo; or &amp;ldquo;Don&amp;rsquo;t mention competitors&amp;rdquo;).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>T – Type of Output&lt;/strong>&lt;/p>
&lt;p>Define the technical delivery.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Format:&lt;/strong> Do you need Markdown, a CSV table, a Python script, or a Mermaid diagram?&lt;/li>
&lt;li>&lt;strong>Length:&lt;/strong> Set word counts or &amp;ldquo;one-page&amp;rdquo; limits.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>E – Evolutionary Iteration&lt;/strong>&lt;/p>
&lt;p>Pro users rarely stop at the first output. This step turns a &amp;ldquo;chat&amp;rdquo; into a &amp;ldquo;workflow.&amp;rdquo;&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Feedback Loop:&lt;/strong> Ask the AI to &amp;ldquo;Review your response against my constraints and highlight where you might have missed a detail.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Multi-step refinement:&lt;/strong> &amp;ldquo;Now take that draft and rewrite it to be 20% more concise.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>The Distinction: DEFINE vs. CREATE&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>DEFINE&lt;/strong> is &lt;strong>Strategic&lt;/strong>: It’s used for project management, aligning stakeholders, and ensuring you know &lt;em>what&lt;/em> you need. It is the &amp;ldquo;Contract.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>CREATE&lt;/strong> is &lt;strong>Tactical&lt;/strong>: It’s the actual prompt engineering syntax used to talk to the LLM to get the work done. It is the &amp;ldquo;Execution.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Feature&lt;/th>
&lt;th style="text-align:left">&lt;strong>DEFINE&lt;/strong> (The Planner)&lt;/th>
&lt;th style="text-align:left">&lt;strong>CREATE&lt;/strong> (The Builder)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Primary Goal&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Clarity and alignment&lt;/td>
&lt;td style="text-align:left">Quality and output&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Best For&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Complex projects/Workflows&lt;/td>
&lt;td style="text-align:left">Prompt engineering/Drafting&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Focus&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Dependencies and End Users&lt;/td>
&lt;td style="text-align:left">Persona and Iteration&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Pro Tip:&lt;/strong> Use &lt;strong>DEFINE&lt;/strong> to organize your thoughts in a scratchpad or document, then translate those requirements into a &lt;strong>CREATE&lt;/strong> prompt for the AI.&lt;/p></description></item><item><title>Selfhosted Media</title><link>https://JAlcocerT.github.io/JAlcocerT/selfhosting-media/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/selfhosting-media/</guid><description>
&lt;p>&lt;strong>TL;DR&lt;/strong>&lt;/p>
&lt;p>Despite google giving 5TB now: &lt;em>Is there a reliable way not to loose photos for good?&lt;/em>&lt;/p>
&lt;p>+++ Can I use &lt;a href="#codex-x-ordering-my-media" >CLI agents to order my media&lt;/a>?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#codex #5.5 made a great job&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">df -hT&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Time to have a realiable &lt;strong>selfhosted cold storage around nextcloud&lt;/strong>, tailscale and my old 2200G with 4TB HDD :)&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/Home-Lab
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> Home-Lab&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Or just&amp;hellip;&lt;/p>
&lt;ol>
&lt;li>Do some &lt;strong>space&lt;/strong> to spin agents like crazy&lt;/li>
&lt;li>Have &lt;strong>forgejo&lt;/strong> going and tmux to see how each project goes by&lt;/li>
&lt;/ol>
&lt;p>Forgejo is an alternative to github (and to gitea):&lt;/p>
&lt;p>You can &lt;a href="https://codeberg.org/GramEditor/gram/releases/" target="_blank" rel="noopener">try gram&lt;/a> to eat less ram: &lt;em>which code is in forgejo/codeberg btw&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /tmp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -fLO https://codeberg.org/GramEditor/gram/releases/download/1.2.1/gram_1.2.1-1_x86_64.deb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm install -g opencode-ai&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Quick Media Transfers&lt;span class="absolute -mt-20" id="quick-media-transfers">&lt;/span>
&lt;a href="#quick-media-transfers" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>I know, you might be already familiar with &lt;strong>PairDrop&lt;/strong>&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/pairdrop" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">PairDrop | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>If what you want is sth that can be integrated with &lt;code>WinSCP&lt;/code>&lt;/p>
&lt;h2>Music Media&lt;span class="absolute -mt-20" id="music-media">&lt;/span>
&lt;a href="#music-media" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://github.com/Fingel/gelly" target="_blank" rel="noopener">https://github.com/Fingel/gelly&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>A native, lightweight music client for Jellyfin and Subsonic. Built with Rust and GTK. 🦀🐧&lt;/p>
&lt;/blockquote>
&lt;h3>Podcasts or Transcripts&lt;span class="absolute -mt-20" id="podcasts-or-transcripts">&lt;/span>
&lt;a href="#podcasts-or-transcripts" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Not telling you to remember that you can have &lt;a href="https://jalcocert.github.io/JAlcocerT/make-podcast/" target="_blank" rel="noopener">your own podcast&lt;/a>&lt;/p>
&lt;p>Neither that with some S2T transcripts, ffmpeg and yt-dl you can do sth nice:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /poc/yt-distil
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux new-session -d -s yt &amp;#39;cd /home/jalcocert/poc/yt-distil &amp;amp;&amp;amp; uv run yt-distil run &amp;#34;https://www.youtube.com/watch?v=qsXxckCbci0&amp;#34; --no-qna -y&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Video Media&lt;span class="absolute -mt-20" id="video-media">&lt;/span>
&lt;a href="#video-media" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Im sure that you are &lt;a href="https://jalcocert.github.io/JAlcocerT/how-to-torrent-with-a-raspberry/#qbittorrent-with-the-raspberry-pi" target="_blank" rel="noopener">already using qb&lt;/a> and prowlarr at &lt;code>6011&lt;/code> and &lt;code>9696&lt;/code>.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">sudo docker compose -f ./z-homelab-setup/evolution/2601_docker-compose.yml up -d qbittorrent
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#2601_docker-compose.yml up -d prowlarr&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo docker compose -f ./z-homelab-setup/evolution/2605_docker-compose.yml up -d prowlarr
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo docker compose -f ./z-homelab-setup/evolution/2602_docker-compose.yml up -d prowlarr&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And that you know how to quickly join your &lt;a href="https://jalcocert.github.io/JAlcocerT/docs/coolresources/video/#ffmpeg" target="_blank" rel="noopener">videos via FFMPEG&lt;/a>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ffmpeg for oa5!&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ls *.MP4 &lt;span class="p">|&lt;/span> sed &lt;span class="s2">&amp;#34;s/^/file &amp;#39;/; s/&lt;/span>$&lt;span class="s2">/&amp;#39;/&amp;#34;&lt;/span> &amp;gt; file_list.txt &lt;span class="c1">#add .mp4 of current folder to a list&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg -f concat -safe &lt;span class="m">0&lt;/span> -i file_list.txt -c copy output_video.mp4 &lt;span class="c1">#original audio&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Get-ChildItem -Filter &amp;#34;*.MP4&amp;#34; | ForEach-Object { &amp;#34;file &amp;#39;$($_.Name)&amp;#39;&amp;#34; } | Set-Content file_list.txt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ffmpeg -f concat -safe 0 -i file_list.txt -c copy output.mp4&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You can create your own torrent of your joined &lt;code>.MP4&lt;/code> with:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#croc send output-video.mp4&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Jellyfin and QBit&lt;span class="absolute -mt-20" id="jellyfin-and-qbit">&lt;/span>
&lt;a href="#jellyfin-and-qbit" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Because you will want to move &lt;a href="https://jalcocert.github.io/JAlcocerT/web-for-moto-blogger/#ffmpeg-video-workflow-for-windows" target="_blank" rel="noopener">those action cam videos&lt;/a>:&lt;/p>
&lt;p>You have it available at &lt;code>192.168.1.2:8096&lt;/code> and can serve clients at your smartTV.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/jellyfin" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Jellyfin | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/qbittorrent" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">QBittorrent Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo docker compose -f ./z-homelab-setup/evolution/2601_docker-compose.yml up -d jellyfin&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker ps -a &lt;span class="p">|&lt;/span> grep -i jellyfin&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://www.youtube.com/watch?v=lRwGtPek1FQ -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/lRwGtPek1FQ" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>And share them with your friends :)&lt;/p>
&lt;!--
https://blog.bartzz.com/setting-up-secure-transmission-torrent-with-vpn-using-docker/
https://www.nodinrogers.com/post/2021-12-10-transmission-in-docker-with-openvpn/
&lt;https://www.youtube.com/watch?v=5y1z_I_HnoA&amp;t=208s>
https://blog.bartzz.com/how-to-route-docker-container-through-another-container/
-->
&lt;p>Because this it not intended for you to use go to &lt;code>wolfmax4k&lt;/code>, nor visiting &lt;a href="https://open-slum.pages.dev/" target="_blank" rel="noopener">Anna&lt;/a>.&lt;/p>
&lt;h3>IPTV&lt;span class="absolute -mt-20" id="iptv">&lt;/span>
&lt;a href="#iptv" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://github.com/ardoviniandrea/ViniPlay" target="_blank" rel="noopener">https://github.com/ardoviniandrea/ViniPlay&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>A powerful, self-hosted IPTV player with a modern web interface.&lt;/p>
&lt;/blockquote>
&lt;h2>Non Video Media&lt;span class="absolute -mt-20" id="non-video-media">&lt;/span>
&lt;a href="#non-video-media" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>But what if you record yourself doing podcast or audiobooks?&lt;/p>
&lt;p>How could you share that?&lt;/p>
&lt;p>Well, you got astro themes like this one:&lt;/p>
&lt;p>That it has a public RSS and people would get notified.&lt;/p>
&lt;p>Also, you can use:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/Listenarrs/Listenarr" target="_blank" rel="noopener">https://github.com/Listenarrs/Listenarr&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Listenarr automates audiobook collection management similar to Sonarr or Radarr, but for audiobooks. It can search, download, and organize your library automatically using metadata from Audible and other sources.&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>Audiobookshelf&lt;/li>
&lt;/ul>
&lt;p>Audiobookshelf is the top open-source recommendation for self-hosted audiobook listening and streaming.&lt;/p>
&lt;p>It goes beyond basic MP3 players like Navidrome by offering audiobook-specific features such as chapter navigation, per-user progress syncing, and multi-device support.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/TortugaPower/BookPlayer" target="_blank" rel="noopener">https://github.com/TortugaPower/BookPlayer&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3>Code is also Media&lt;span class="absolute -mt-20" id="code-is-also-media">&lt;/span>
&lt;a href="#code-is-also-media" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>With all that its going on around github lately: &lt;a href="https://www.githubstatus.com/uptime" target="_blank" rel="noopener">https://www.githubstatus.com/uptime&lt;/a>&lt;/p>
&lt;p>Ive decided to get a code sync to my HomeLab: &lt;em>with Forgejo (codeberg) OSS model being &amp;gt; than gitea&lt;/em>&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/gitea" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Gitea | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/forgejo" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Forgejo | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /home-lab&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> home-lab/forgejo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker compose up -d&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>Go to forgejoUI at: &lt;code>http://localhost:3034/user/sign_up&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/forgejo.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Provide &lt;a href="https://github.com/JAlcocerT/Home-Lab/blob/main/forgejo/.env.sample" target="_blank" rel="noopener">github and forgejo creds&lt;/a> to make the one time migration happen: &lt;code>http://192.168.1.2:3034/user/settings/applications&lt;/code>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">cp .env.sample .env &lt;span class="c1">#provide the gh pat (scope=repo) and the one from forgejo!&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make list-github-repos &lt;span class="c1">#make help&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You should see a list of repos already.&lt;/p>
&lt;p>Copy some with:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make migrate-repo &lt;span class="nv">REPO_OWNER&lt;/span>&lt;span class="o">=&lt;/span>JAlcocerT &lt;span class="nv">REPO_NAME&lt;/span>&lt;span class="o">=&lt;/span>eda-f1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make list-repos #this will show one already&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Wanna get ready for agents 24/7 in the Pi?&lt;/p>
&lt;p>Better provide a separated user for agents to tinker:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># See all existing users forgejo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make list-users
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Create a new non-admin user (will be forced to change password on first login) &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make create-user &lt;span class="nv">NEW_USER&lt;/span>&lt;span class="o">=&lt;/span>hermesagent &lt;span class="nv">NEW_USER_EMAIL&lt;/span>&lt;span class="o">=&lt;/span>alice@example.com &lt;span class="nv">NEW_USER_PASSWORD&lt;/span>&lt;span class="o">=&lt;/span>changeme123
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Grant write access to a specific repo (can push, cannot delete or change settings) &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make add-collaborator &lt;span class="nv">NEW_USER&lt;/span>&lt;span class="o">=&lt;/span>hermesagent &lt;span class="nv">REPO_OWNER&lt;/span>&lt;span class="o">=&lt;/span>JAlcocerT &lt;span class="nv">REPO_NAME&lt;/span>&lt;span class="o">=&lt;/span>eda-f1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make list-user-repos &lt;span class="nv">NEW_USER&lt;/span>&lt;span class="o">=&lt;/span>hermesagent&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>The mental model is: password = web UI, SSH key = git over SSH, token = git over HTTPS + API/CLI tools. Three separate auth methods, all tied to the same account.&lt;/p>
&lt;/blockquote>
&lt;p>With that, instead of having agents doing weird stuff with access to your github pwd, they will just tinker with an non admin user of your forgejo instance.&lt;/p>
&lt;p>For additional security, you can have foregejo running separately from the Pi, like i did having it at my x300: &lt;code>http://192.168.1.12:3034&lt;/code>&lt;/p>
&lt;blockquote>
&lt;p>Make sure you adjusted &lt;a href="https://github.com/JAlcocerT/Home-Lab/blob/main/forgejo/docker-compose.yml#L21" target="_blank" rel="noopener">this env variable&lt;/a> accordingly&lt;/p>
&lt;/blockquote>
&lt;p>With this, you should get an error at the Pi4:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">gh status &lt;span class="c1">#make sure to be logged off to avoid potential pain&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Make some working copies for agents to work safely:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-13">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make migrate-repo &lt;span class="nv">REPO_OWNER&lt;/span>&lt;span class="o">=&lt;/span>JAlcocerT &lt;span class="nv">REPO_NAME&lt;/span>&lt;span class="o">=&lt;/span>electronics-101
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make add-collaborator &lt;span class="nv">NEW_USER&lt;/span>&lt;span class="o">=&lt;/span>hermesagent &lt;span class="nv">REPO_OWNER&lt;/span>&lt;span class="o">=&lt;/span>JAlcocerT &lt;span class="nv">REPO_NAME&lt;/span>&lt;span class="o">=&lt;/span>electronics-101
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make migrate-repo &lt;span class="nv">REPO_OWNER&lt;/span>&lt;span class="o">=&lt;/span>JAlcocerT &lt;span class="nv">REPO_NAME&lt;/span>&lt;span class="o">=&lt;/span>mbsd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make add-collaborator &lt;span class="nv">NEW_USER&lt;/span>&lt;span class="o">=&lt;/span>hermesagent &lt;span class="nv">REPO_OWNER&lt;/span>&lt;span class="o">=&lt;/span>JAlcocerT &lt;span class="nv">REPO_NAME&lt;/span>&lt;span class="o">=&lt;/span>mbsd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make list-user-repos NEW_USER=hermesagent #now showing x3!&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-13"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/electronic/forgejo-electronics-mirror.png" alt="Github to Forgejo mirror" loading="lazy" />&lt;/p>
&lt;p>&lt;em>Do this in the pi4 or wherever you will run agents&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-14">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">ssh-keygen -t ed25519 -C &lt;span class="s2">&amp;#34;hermesagent@pi-home&amp;#34;&lt;/span> -f ~/.ssh/id_ed25519_forgejo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># This creates two files:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># - ~/.ssh/id_ed25519_forgejo (private — never share) &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#- ~/.ssh/id_ed25519_forgejo.pub (public — paste this into Forgejo)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-14"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Copy this public to forgejo UI when logged in as hermes: &lt;code>http://192.168.1.2:3034/user/settings/keys&lt;/code>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-15">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">cat ~/.ssh/id_ed25519_forgejo.pub&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-15"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Then this works:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-16">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">ssh -T forgejo-home
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#curl -s -o /dev/null -w &amp;#34;HTTP %{http_code}\n&amp;#34; http://192.168.1.2:3034/api/v1/users/hermesagent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git ls-remote forgejo-home:jalcocert/eda-f1.git&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-16"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-yellow-100 bg-yellow-50 text-yellow-900 dark:border-yellow-200/30 dark:bg-yellow-700/30 dark:text-yellow-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
⚠️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
The ssh port at forgejo is not the default 22, so you need to
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>The &amp;ldquo;trick&amp;rdquo; is just telling SSH to connect to a non-standard port — and doing it in a way that hides the ugly detail behind a friendly alias. Let me show you what&amp;rsquo;s actually happening.&lt;/p>
&lt;p>Why the port matters&lt;/p>
&lt;p>ssh somewhere.com defaults to port 22. That&amp;rsquo;s hardcoded into the protocol. Your Pi at 192.168.1.2 already had a regular SSH daemon listening on port 22 (the one you use to get a shell on the box). Forgejo&amp;rsquo;s git SSH
endpoint is a separate service that has to live somewhere else.&lt;/p>
&lt;p>In your compose file:&lt;/p>
&lt;p>ports: - &amp;ldquo;2235:22&amp;rdquo; #SSH&lt;/p>
&lt;p>That line means: &amp;ldquo;inside the container, Forgejo&amp;rsquo;s SSH listens on port 22. Map that to port 2235 on the host.&amp;rdquo; So from your LAN, Forgejo&amp;rsquo;s SSH is reachable at 192.168.1.2:2235, while the host&amp;rsquo;s own SSH stays on 192.168.1.2:22. Two completely different SSH services on the same machine.
How we tell the SSH client&lt;br>
Three equivalent ways, ascending order of niceness:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Inline flag every time (annoying):
ssh -p 2235 &lt;a href="mailto:git@192.168.1.2" >git@192.168.1.2&lt;/a>
git clone -c core.sshCommand=&amp;ldquo;ssh -p 2235&amp;rdquo; &lt;a href="mailto:git@192.168.1.2" >git@192.168.1.2&lt;/a>:hermesagent/repo.git&lt;/p>
&lt;/li>
&lt;li>
&lt;p>URL-encoded port (works for git, not for plain ssh):
git clone ssh://git@192.168.1.2:2235/hermesagent/repo.git&lt;/p>
&lt;/li>
&lt;li>
&lt;p>~/.ssh/config alias ← what we did:
Read 1 file (ctrl+o to expand)&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>● Each line breakdown:&lt;/p>
&lt;p>┌────────────────────────────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Directive │ What it does │
├────────────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Host forgejo-home │ The alias. When you type forgejo-home anywhere SSH expects a hostname, the rest of this block kicks in. │
├────────────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ HostName 192.168.1.2 │ The actual IP/DNS name to dial. │
├────────────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ Port 2235 │ The key one. Tells SSH &amp;ldquo;for this host, use 2235 instead of the default 22.&amp;rdquo; │
├────────────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ User git │ Always git for Forgejo/Gitea/GitHub/GitLab — saves you typing git@. │
├────────────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ IdentityFile ~/.ssh/id_ed25519_forgejo │ Which private key to authenticate with. │
├────────────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ IdentitiesOnly yes │ &amp;ldquo;Only try this key, ignore any others ssh-agent has loaded.&amp;rdquo; Prevents weird auth failures when you have multiple keys. │
└────────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;/p>
&lt;p>After saving this, every git/ssh tool on the system treats forgejo-home as if it were a real hostname with all those settings pre-applied. That&amp;rsquo;s why a clean URL like forgejo-home:hermesagent/repo.git works — git
internally expands it to ssh -p 2235 -i ~/.ssh/id_ed25519_forgejo &lt;a href="mailto:git@192.168.1.2" >git@192.168.1.2&lt;/a> hermesagent/repo.git.&lt;/p>
&lt;p>File location &amp;amp; permissions&lt;/p>
&lt;ul>
&lt;li>File: ~/.ssh/config (per-user). System-wide equivalent is /etc/ssh/ssh_config but you almost never want that. - Permissions must be 600 (owner read/write only). SSH refuses to load it otherwise — that&amp;rsquo;s why I ran chmod 600 after creating it.&lt;/li>
&lt;li>You can have as many Host &lt;alias> blocks as you want — one per server. They stack in the same file.&lt;/li>
&lt;/ul>
&lt;p>So the whole &amp;ldquo;trick&amp;rdquo; was: figure out the right port from your docker-compose.yml (2235), then express it once in ~/.ssh/config so you never type it again.&lt;/p>
&lt;p>You can even go to: &lt;code>http://192.168.1.2:3034/jalcocert/mbsd&lt;/code> and make a fork for the agent hermes to take the repo as personal so that the ssh edits go there.&lt;/p>
&lt;p>Probably an overkill though.&lt;/p>
&lt;p>Lets move on:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-17">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone forgejo-home:hermesagent/electronics-101.git
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone forgejo-home:hermesagent/mbsd.git
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone forgejo-home:jalcocert/eda-f1.git&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker system df #just check if you have enough space in the small Pi&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-17"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Remember to &lt;a href="https://github.com/JAlcocerT/Home-Lab/blob/main/forgejo/docker-compose.yml#L11" target="_blank" rel="noopener">check env vars&lt;/a>!&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-18">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yml" data-lang="yml">&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">GITEA__server__DOMAIN=192.168.1.2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">GITEA__server__ROOT_URL=http://192.168.1.2:3034/&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">GITEA__server__SSH_DOMAIN=192.168.1.2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">GITEA__server__SSH_PORT=2235&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-18"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>What we have at this point:&lt;/p>
&lt;ol>
&lt;li>Github to Forgejo at homelab integration: just migrate whatever repo you want agents to work on&lt;/li>
&lt;li>A forgejo nonadmin user for the agents to make their changes&lt;/li>
&lt;li>Connection of the Pi blocked to github, but available to the agent forgejo account and repositories to work on are visible&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-19">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git config --global user.name &lt;span class="s2">&amp;#34;hermesagent&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git config --global user.email &lt;span class="s2">&amp;#34;alice@example.com&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-19"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Now you just have to choose which coding agent will be doing this while you plant tomatoes:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-20">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#opencode&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#codex&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-20"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And provide some instructions &lt;code>CLAUDE.md&lt;/code> at repo root:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-21">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl"> &lt;span class="k">-&lt;/span> This repo is &lt;span class="sb">`hermesagent/electronics-101`&lt;/span> on Forgejo at 192.168.1.2:3034.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">-&lt;/span> Only commit + push to this repo&amp;#39;s &lt;span class="sb">`origin`&lt;/span> remote. Never add other remotes, never push elsewhere.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">-&lt;/span> Author identity is already configured globally as hermesagent — don&amp;#39;t override it. - Don&amp;#39;t touch files outside this repo directory.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">-&lt;/span> Don&amp;#39;t modify ~/.ssh/, ~/.gitconfig, or any system config.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">-&lt;/span> Don&amp;#39;t run destructive commands (`rm -rf`, &lt;span class="sb">`git push --force`&lt;/span>, &lt;span class="sb">`git reset --hard origin/...`&lt;/span>) without an explicit task asking for them. - If unsure, stop and ask rather than guess.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - Make frequent commits and push, ideally one change, one commit&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-21"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>To go yolo:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-22">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">claude --dangerously-skip-permissions&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-22"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>YOLO is necessary but not sufficient for true unattended work.&lt;/p>
&lt;p>It solves one specific problem (the agent stopping to ask &amp;ldquo;can I run this command?&amp;rdquo;), but there are 2-3 other pieces depending on what you actually want.&lt;/p>
&lt;p>What it doesn&amp;rsquo;t solve&lt;/p>
&lt;ol>
&lt;li>Session persistence (don&amp;rsquo;t lose it when you disconnect)&lt;/li>
&lt;/ol>
&lt;p>If you start claude over SSH, then close your laptop, the session dies. Three ways to detach:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-23">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo apt update&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install -y tmux
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Option A: tmux — best for interactive work you might check back on&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new -s claude-electronics
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~/electronics-101
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude --dangerously-skip-permissions -p &amp;#34;ive been tinkering with electronics on this repository, what are you thought of it?&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude --dangerously-skip-permissions
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Detach with Ctrl+B then D. Reattach later with: tmux attach -t claude-electronics&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux ls
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux attach -t claude-electronics #for whenever you want to come back&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-23"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">About electronics 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;p>Honest read: this is a really well-structured self-study repo — not just code, but a curriculum. The pattern you&amp;rsquo;ve locked in (BRD → PySpice sim → curiosities.md → next-steps.md → real build) is the right shape for
learning electronics, and the L1–L15 + M1–M2 + 0a–0e progression actually mirrors how an EE textbook is organized, just driven by simulation instead of math.&lt;/p>
&lt;p>What stands out as strong:&lt;/p>
&lt;ul>
&lt;li>sample-pyscipe/ is the anchor — the protected-vs-unprotected MOSFET overlay (101V spike → 12.9V clamped) is exactly the kind of &amp;ldquo;scared straight&amp;rdquo; plot that makes a flyback diode unforgettable. Most tutorials just say
you need one.&lt;/li>
&lt;li>Per-folder ngspice Flatpak shim copied across L-series is the right call for hermetic, runnable-in-isolation samples, even if it looks redundant.&lt;/li>
&lt;li>z-ideas.md (891 lines) is doing real work as a backlog — and the L/M/0 series are clearly being pulled from it, not invented ad-hoc.&lt;/li>
&lt;/ul>
&lt;p>What I&amp;rsquo;d watch out for:&lt;/p>
&lt;ul>
&lt;li>The doc-to-code ratio is climbing fast (why.md 745, go-solar.md 1,643, interesting-simulations.md 1,164 in sample-pyscipe/ alone). Risk is that writing about circuits crowds out building them — next-steps.md lists a
real build that hasn&amp;rsquo;t happened yet. The simulations are training wheels; the JT-500 on a breadboard is the actual skill.&lt;/li>
&lt;li>The motor series stalling at M2 is the natural place: M3 (H-bridge shoot-through) is where PySpice starts fighting you, and M4 (PID servo) is where you really need it. Worth pushing through M3 before the momentum
dies.&lt;/li>
&lt;/ul>
&lt;p>Net: structurally one of the better learn-by-doing repos I&amp;rsquo;ve seen. Solder something next.&lt;/p>
&lt;/div>
&lt;/details>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-24">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Option B: nohup — fire and forget&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~/electronics-101
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nohup claude --dangerously-skip-permissions -p &lt;span class="s2">&amp;#34;your task here&amp;#34;&lt;/span> &amp;gt; run.log 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="p">&amp;amp;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-24"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>For unattended overnight runs, tmux is the right answer — you can reattach in the morning to see what happened.&lt;/p>
&lt;ol start="2">
&lt;li>Headless / one-shot mode&lt;/li>
&lt;/ol>
&lt;p>For &amp;ldquo;run a single task to completion and exit,&amp;rdquo; use -p (print mode):&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-25">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">claude --dangerously-skip-permissions -p &lt;span class="s2">&amp;#34;Refactor X to Y, run the tests, commit if green&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-25"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>It runs non-interactively, streams output, exits when done. Perfect for cron jobs or shell pipelines. No interactive UI, no prompts.
────
3. Recurring schedules
──── If &amp;ldquo;long-running&amp;rdquo; actually means &amp;ldquo;run every N minutes/hours,&amp;rdquo; you&amp;rsquo;ve got two options:&lt;/p>
&lt;ul>
&lt;li>System cron — standard, deterministic. crontab -e and add a claude -p &amp;hellip; &amp;ndash;dangerously-skip-permissions line.&lt;/li>
&lt;li>Claude Code&amp;rsquo;s /schedule skill — lets you set up scheduled remote agents from inside a Claude session. Better UX, but the agent runs in the cloud (different model from your local Pi).&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2>Others&lt;span class="absolute -mt-20" id="others">&lt;/span>
&lt;a href="#others" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://github.com/snapotter-hq/SnapOtter" target="_blank" rel="noopener">https://github.com/snapotter-hq/SnapOtter&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/transmute-app/transmute" target="_blank" rel="noopener">https://github.com/transmute-app/transmute&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-yellow-100 bg-yellow-50 text-yellow-900 dark:border-yellow-200/30 dark:bg-yellow-700/30 dark:text-yellow-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
⚠️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Make sure to understand &lt;a href="https://github.com/JAlcocerT/Home-Lab/blob/main/file-format.md" target="_blank" rel="noopener">file types&lt;/a>!
&lt;/div>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>MIT, Self hosted file converter for images, video, audio, json, excel and more. Supports over 2,000 conversions!&lt;/p>
&lt;/blockquote>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/coolresources/video/#video-as-a-code" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Video Docs Section with consolidated info ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;!--
covered at fossengineer x3
Yes — same code, three different GitHub URLs, all serving SnapOtter v1.17.0 with the exact same commit hash 6e103d3:
GitHub URL What we found
snapotter-hq/snapotter Original — package.json name snapotter, homepage snapotter.com
stirling-image/stirling-image Identical clone — same package.json, same commit hash
ashim-hq/ashim Identical clone — same package.json, same commit hash
All three repos still call themselves "snapotter" internally (in package.json, in the README, in branding assets) — only the outer GitHub org/repo name differs.
https://github.com/frederikemmer/MediaLyze
Self-hosted media library analysis for large video collections
https://github.com/ashim-hq/ashim same as snapotter
A Self Hosted Image Manipulator - 45+ tools, local AI, and pipelines in a single Docker container. No cloud, no telemetry. Your images never leave your machine.
https://github.com/stirling-image/stirling-image
-->
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/selfhosted-apps-spring-2025/#immich" target="_blank" rel="noreferrer">&lt;img
alt="Flask Intro"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/Photo/immich.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Flask Intro&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Deployed a Flask WebApp with https and NGINX to Hertzner&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/image-backup-tools/#nc-vs-immich" target="_blank" rel="noreferrer">&lt;img
alt="Data Chat Repo"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/media/NC-traefik/nc-32.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Data Chat Repo&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Source Code on Github&lt;/div>&lt;/a>
&lt;/div>
&lt;!--
![Immich UI](/blog_img/selfh/Photo/immich.png) -->
&lt;!--
![alt text](/blog_img/selfh/media/NC-traefik/nc-32.png) -->
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-yellow-100 bg-yellow-50 text-yellow-900 dark:border-yellow-200/30 dark:bg-yellow-700/30 dark:text-yellow-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
⚠️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
You can use cloudflare to just &lt;a href="https://jalcocert.github.io/JAlcocerT/image-backup-tools/#cf-waf-vs-zero-trust-access" target="_blank" rel="noopener">expose your services to certain countries/ips&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>You always have: &lt;code>http://192.168.1.2:6011/&lt;/code> and &lt;code>9696&lt;/code>:&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/Jellyfin/prowlarr-qbittorrent.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Or just metube:&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/HomeLab/metube.png" alt="MeTube UI" loading="lazy" />&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/image-backup-tools/#how-to-detect-duplicates-files-in-the-system" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/image-backup-tools/#how-to-detect-duplicates-files-in-the-system&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/vert" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Vert | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/mazanoke" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Mazanoke Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>That&amp;rsquo;s it for this month containers recap:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-26">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">docker ps -a --filter &lt;span class="nv">status&lt;/span>&lt;span class="o">=&lt;/span>exited --format &lt;span class="s1">&amp;#39;table {{.Names}}\t{{.Image}}\t{{.Status}}&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-26"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Problems with cognitive dilution due to AI usage?&lt;/p>
&lt;p>You might be seeking for a proper &lt;strong>knowledge base for the agentic era&lt;/strong>.&lt;/p>
&lt;p>Why not starting using AI to make projects you could only dream about?&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/consulting.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/ebooks.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks with free value.&lt;/div>&lt;/a>
&lt;/div>
&lt;h3>BackUps First!&lt;span class="absolute -mt-20" id="backups-first">&lt;/span>
&lt;a href="#backups-first" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h4>My HomeLab Recently&lt;span class="absolute -mt-20" id="my-homelab-recently">&lt;/span>
&lt;a href="#my-homelab-recently" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Last months it was all about &lt;a href="https://jalcocert.github.io/JAlcocerT/oss-automatic-docs-and-tech-video/#what-ive-tried-recently" target="_blank" rel="noopener">this&lt;/a> and &lt;a href="https://jalcocert.github.io/JAlcocerT/private-dns-with-docker/#faq" target="_blank" rel="noopener">this&lt;/a>.&lt;/p>
&lt;ul>
&lt;li>&lt;code>https://haveibeenpwned.com/&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3>Codex x Ordering My Media&lt;span class="absolute -mt-20" id="codex-x-ordering-my-media">&lt;/span>
&lt;a href="#codex-x-ordering-my-media" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>Again: &lt;a href="#backups-first" >BAAAACK-ups&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Continue at your own risk!&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Choose any agent:&lt;/p>
&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-27">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">codex
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#hermes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#gemini-cli&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-27"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h4>Visualizing the Changes via WebDav&lt;span class="absolute -mt-20" id="visualizing-the-changes-via-webdav">&lt;/span>
&lt;a href="#visualizing-the-changes-via-webdav" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Remember, Nextcloud brings its own WebDav: &lt;code>...../remote.php/dav/files/whateverusername&lt;/code>&lt;/p>
&lt;p>But as this will be for experimenting, just &lt;strong>go lean with a sftp-go&lt;/strong> setup:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-28">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./Home-Lab/sftp-go&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker compose -f docker-compose.pi.yml up -d &lt;span class="c1">#its just 2mb!&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker stats&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker ps -a --filter &lt;span class="nv">name&lt;/span>&lt;span class="o">=&lt;/span>sftp --format &lt;span class="s1">&amp;#39;table {{.Names}}\t{{.Image}}\t{{.Status}}&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-28"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>&lt;code>http://192.168.1.18:8066/web/admin/setup&lt;/code> create an user with root directory as &lt;code>/srv&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;p>Then try to connect even from the same Pi&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-29">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">sftp -P &lt;span class="m">2022&lt;/span> &amp;lt;username&amp;gt;@localhost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sftp -P 2022 jalcocert@192.168.1.18 #or from W11&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#scp... #for one time shares&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-29"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>If you prefer an UI: &lt;em>try winSCP as sftp/webdav client&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-30">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">choco install winscp &lt;span class="c1">#winget install WinSCP.WinSCP&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-30"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/media/winscp-ftp.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>And for workstations/servers/x300:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-31">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yml" data-lang="yml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">./sftpgo-data:/var/lib/sftpgo &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># persists users&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">/home:/srv/home&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">/mnt/data1tb:/srv/data1tb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">/mnt/data2tb:/srv/data2tb&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-31"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-32">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">rsync -avhW --no-compress --progress --partial -e &lt;span class="s2">&amp;#34;ssh -p 2022&amp;#34;&lt;/span> jalcocert@100.x.y.z:/source/ /destination/&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-32"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>How to NextCloud&lt;span class="absolute -mt-20" id="how-to-nextcloud">&lt;/span>
&lt;a href="#how-to-nextcloud" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Assuming:&lt;/p>
&lt;ul>
&lt;li>cloudflared_tunnel already exists as an external Docker network&lt;/li>
&lt;li>the host paths under /mnt/data2tb/nextcloud/&amp;hellip; exist and are writable&lt;/li>
&lt;li>your &lt;code>.env&lt;/code> values are set as expected&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-33">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">sync_root&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>openssl rand -base64 &lt;span class="m">24&lt;/span> &lt;span class="p">|&lt;/span> tr -d &lt;span class="s1">&amp;#39;=+/&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> cut -c1-16&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">sync_pass&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>openssl rand -base64 &lt;span class="m">24&lt;/span> &lt;span class="p">|&lt;/span> tr -d &lt;span class="s1">&amp;#39;=+/&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> cut -c1-16&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">set_var&lt;span class="o">()&lt;/span> &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">key&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$1&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">value&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$2&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> grep -q &lt;span class="s2">&amp;#34;^&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">key&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">=&amp;#34;&lt;/span> .env&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> sed -i &lt;span class="s2">&amp;#34;s|^&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">key&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">=.*|&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">key&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">=&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">value&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">|&amp;#34;&lt;/span> .env
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">printf&lt;/span> &lt;span class="s1">&amp;#39;\n%s=%s\n&amp;#39;&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$key&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$value&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &amp;gt;&amp;gt; .env
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">set_var MYSQL_ROOT_PASSWORD_SYNC &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">sync_root&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">set_var MYSQL_PASSWORD_SYNC &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">sync_pass&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">set_var MYSQL_DATABASE_SYNC &lt;span class="s2">&amp;#34;nextcloud_sync&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">set_var MYSQL_USER_SYNC &lt;span class="s2">&amp;#34;nextcloud_sync&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">set_var MYSQL_HOST_SYNC &lt;span class="s2">&amp;#34;nextclouddb-sync&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">set_var NEXTCLOUD_TRUSTED_DOMAINS_SYNC &lt;span class="s2">&amp;#34;http://192.168.1.2:8069&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-33"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Then just:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-34">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /Home-Lab
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> .Home-Lab/z-homelab-setup/evolution
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#/home/jalcocert/Home-Lab/z-homelab-setup/evolution/2602_docker-compose.yml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># sudo docker compose --env-file .env -f 2605_docker-compose.yml up -d wireshark&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo docker compose -f 2605_docker-compose.yml up -d nextclouddb-sync nextcloud-app-sync
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo docker compose -f ./z-homelab-setup/evolution/2605_docker-compose.yml up -d nextclouddb-sync nextcloud-app-sync&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># sudo docker compose -f 2605_docker-compose.yml logs -f nextclouddb-sync nextcloud-app-sync&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-34"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You can always do a quick CLI test:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-35">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker network create nextcloud_test_internal&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker run -d &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --name nextcloud-test-db &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --restart unless-stopped &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --network nextcloud_test_internal &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">MYSQL_INITDB_SKIP_TZINFO&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">MYSQL_ROOT_PASSWORD&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;change-root-pass&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">MYSQL_PASSWORD&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;change-db-pass&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">MYSQL_DATABASE&lt;/span>&lt;span class="o">=&lt;/span>nextcloud &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">MYSQL_USER&lt;/span>&lt;span class="o">=&lt;/span>nextcloud &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -v /mnt/data2tb/z-nextcloud/db:/config &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> linuxserver/mariadb:11.4.8
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker run -d &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --name nextcloud-test &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --restart unless-stopped &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --network nextcloud_test_internal &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -p 8100:80 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">MYSQL_PASSWORD&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;change-db-pass&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">MYSQL_DATABASE&lt;/span>&lt;span class="o">=&lt;/span>nextcloud &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">MYSQL_USER&lt;/span>&lt;span class="o">=&lt;/span>nextcloud &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">MYSQL_HOST&lt;/span>&lt;span class="o">=&lt;/span>nextcloud-test-db &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">NEXTCLOUD_TRUSTED_DOMAINS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;192.168.1.2 localhost minube.jalcocertech.com&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">OVERWRITEPROTOCOL&lt;/span>&lt;span class="o">=&lt;/span>http &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -v /mnt/data2tb/z-nextcloud/html:/var/www/html &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> nextcloud:32.0&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-35"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-36">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">du -h --max-depth&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">df -hT /mnt/data2tb /mnt/backup2tb&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-36"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>/sftpgo
/mnt/data2tb:/srv/data2tb&lt;/p>
&lt;p>So sftpgo has the whole /mnt/data2tb mounted inside it as /srv/data2tb.&lt;/p>
&lt;p>I also found compose references for pigallery2:&lt;/p>
&lt;p>/mnt/data2tb/Z_BackUP_HD-SDD/Z_FOTOS:/app/data/images:ro&lt;/p>
&lt;p>That one is read-only and appears in the evolution compose files, including the active 2602_docker-compose.yml. But in the current docker ps output from earlier, pigallery2 was not running, so the live user of /mnt/
data2tb right now is sftpgo.&lt;/p>
&lt;p>Summary:&lt;/p>
&lt;ul>
&lt;li>/mnt/data2tb is exFAT.&lt;/li>
&lt;li>Running container using it: sftpgo, mounted read/write.&lt;/li>
&lt;li>Compose-configured but not currently running from what I saw: pigallery2, read-only photo mount.&lt;/li>
&lt;li>Existing Nextcloud is not using the 2TB disk; it uses /mnt/data1tb/nextcloud/&amp;hellip;.&lt;/li>
&lt;/ul>
&lt;p>NTFS makes sense for this external backup drive if you want Windows compatibility. It’s a reasonable format for “copy files here and keep it portable.” It’s just not a good format for running Nextcloud/MariaDB
directly.&lt;/p>
&lt;p>I can see the drive, but I can’t mount it from here because mounting requires local authorization/password and this shell cannot show the sudo/polkit prompt.&lt;/p>
&lt;p>Please run this locally:&lt;/p>
&lt;p>sudo mkdir -p /mnt/backup2tb
sudo mount /dev/sdc2 /mnt/backup2tb
df -hT /mnt/data2tb /mnt/backup2tb&lt;/p>
&lt;p>1.2T /mnt/data2tb/Z_BackUP_HD-SDD
155G /mnt/data2tb/nc
78G /mnt/data2tb/old-Synced SEPT23
66G /mnt/data2tb/pixel8pro
62G /mnt/data2tb/immich
19G /mnt/data2tb/sftpgo
14G /mnt/data2tb/nextcloud
12G /mnt/data2tb/Sync_Pixel
6.3G /mnt/data2tb/2tbepam&lt;/p>
&lt;p>Destination already has:&lt;/p>
&lt;p>893G /mnt/backup2tb/Z_FOTOS
41G /mnt/backup2tb/Aficiones
20G /mnt/backup2tb/.Trash-1000
12G /mnt/backup2tb/Estudios&lt;/p>
&lt;blockquote>
&lt;p>&lt;code>http://192.168.1.2:8069/&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>You can test adding it to files as webdav already &lt;code>dav://192.168.1.2:8069/remote.php/dav/files/&amp;lt;your-username&amp;gt;/&lt;/code> which for me worked at 25mb/s locally&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-37">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> -u &lt;span class="m">1000&lt;/span> nextcloud-sync php occ status &lt;span class="c1">#pre-checks&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker exec -u 1000 nextcloud-sync php occ files:scan --path=&amp;#39;jesusalcocertech/files/YoutubeVideos&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker exec -u 1000 nextcloud-sync php occ files:scan jesusalcocertech # for the whole user&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#du . -sh&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-37"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You can use those exact commands to connect your pixel via usb-c: &lt;em>then just send the files via webdav (slow) or put them directly to your server&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-38">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># find /run/user/1000/gvfs -maxdepth 1 -type d&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lsusb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/run/user/1000/gvfs/mtp:host&lt;span class="o">=&lt;/span>Google_Pixel_9_Pro_52141FDAP000NM/Internal shared storage/DCIM/Camera
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dav://192.168.1.2:8069/remote.php/dav/files/&amp;lt;your-username&amp;gt;/&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-38"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>he trick was that the Pixel was mounted through GVFS MTP, not as a normal disk under /media or /mnt.&lt;/p>
&lt;p>The actual mount path was:&lt;/p>
&lt;p>/run/user/1000/gvfs/mtp:host=Google_Pixel_9_Pro_52141FDAP000NM&lt;/p>
&lt;p>So to browse files:&lt;/p>
&lt;p>cd &amp;lsquo;/run/user/1000/gvfs/mtp:host=Google_Pixel_9_Pro_52141FDAP000NM&amp;rsquo;
ls&lt;/p>
&lt;p>Then usually:&lt;/p>
&lt;p>cd &amp;lsquo;Internal shared storage/DCIM/Camera&amp;rsquo;&lt;/p>
&lt;p>To discover it next time:&lt;/p>
&lt;p>find /run/user/1000/gvfs -maxdepth 1 -type d&lt;/p>
&lt;p>Also, the phone must be unlocked and USB mode set to File transfer / Android Auto. Otherwise Linux may see the USB device but not expose the files.&lt;/p>
&lt;p>Files are at &lt;code>/mnt/data2tb/nextcloud/html/data/whateveruseryoucreated/files&lt;/code>&lt;/p>
&lt;p>This is the one im keeping for now: &lt;em>remember that you can use it via cf tunnels and just make it available for certain ips/countries&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-39">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#! docker compose -f ~/Desktop/Home-Lab/nextcloud/docker-compose.yml up -d
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="c1">#! docker exec -u www-data nc php occ user:resetpassword admin&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> -u &lt;span class="m">1000&lt;/span> nextcloud-sync php occ config:system:get trusted_domains
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> -u &lt;span class="m">1000&lt;/span> nextcloud-sync php occ config:system:set trusted_domains &lt;span class="m">1&lt;/span> --value&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;192.168.1.2:8069&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> -u &lt;span class="m">1000&lt;/span> nextcloud-sync php occ config:system:set trusted_domains &lt;span class="m">1&lt;/span> --value&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;whatever.domain.com&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> nextcloud php occ config:system:get trusted_domains &lt;span class="c1">#check the trusted domains&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-39"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>Point correctly the &lt;code>nextcloud-sync:80&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;p>About &lt;strong>manual scans of data&lt;/strong> you have scatter in folders, see this:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-40">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> nc chown -R www-data:www-data /var/www/html/data&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-40"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/nextcloud" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">NextCloud | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/immich" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Immich Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>Last month I was doing by hand some maintainance &lt;a href="https://jalcocert.github.io/JAlcocerT/oss-automatic-docs-and-tech-video/#faq" target="_blank" rel="noopener">via CLIs to nextcloud&lt;/a>&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/HomeLab/ncdu-nextcloud.png" alt="NCDU tool to check disk space" loading="lazy" />&lt;/p>
&lt;p>Nextcloud doesn&amp;rsquo;t expose SSH/FTP; it exposes files over &lt;strong>WebDAV on top of HTTPS&lt;/strong>.&lt;/p>
&lt;blockquote>
&lt;p>In windows &lt;code>add a network location&lt;/code> then &lt;code>https://whatever.yourdomain.com/remote.php/dav/files/whateverusername&lt;/code> - File size limit: Windows WebClient caps downloads at 50 MB by default&lt;/p>
&lt;/blockquote>
&lt;p>The integration &lt;strong>in linux&lt;/strong>:&lt;/p>
&lt;p>Via GNOME Files / Nautilus Files → &amp;ldquo;Other Locations&amp;rdquo; → in the Connect to Server bar enter: &lt;code>davs://whatever.domain.com/remote.php/dav/files/&amp;lt;your-username&amp;gt;/&lt;/code>&lt;/p>
&lt;blockquote>
&lt;p>(davs:// = WebDAV over HTTPS; plain dav:// = HTTP). It&amp;rsquo;ll prompt for username + app password.&lt;/p>
&lt;/blockquote>
&lt;pre class="mermaid mt-6">graph TD
%% Nodes
FIREBAT[Firebat Mini PC&lt;br/>Nextcloud Desktop Client]
LAPTOP[Laptop&lt;br/>Nextcloud Desktop Client]
BROWSER[Web Browser&lt;br/>User Interface]
subgraph Cloudflare_Infrastructure [Cloudflare Edge]
TUNNEL[Cloudflare Tunnel&lt;br/>Cloudflared]
end
subgraph Home_Network [Local Network / X300]
X300[ASRock X300 Server&lt;br/>Nextcloud Instance]
end
%% Connections
FIREBAT &lt;== "HTTPS (Sync)" ==> TUNNEL
TUNNEL &lt;== "Secure Pipe" ==> X300
LAPTOP &lt;== "Local/Remote Sync" ==> X300
BROWSER &lt;== "Web Access" ==> X300
%% Styling
style FIREBAT fill:#f9f,stroke:#333,stroke-width:2px
style X300 fill:#0082c9,stroke:#fff,stroke-width:2px,color:#fff
style TUNNEL fill:#f38020,stroke:#333,stroke-width:2px,color:#fff&lt;/pre>&lt;h3>How to Immich&lt;span class="absolute -mt-20" id="how-to-immich">&lt;/span>
&lt;a href="#how-to-immich" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The generated folders are different:&lt;/p>
&lt;p>thumbs = resized preview images
encoded-video = transcoded video versions
profile = profile images&lt;/p>
&lt;p>Those are not originals.&lt;/p>
&lt;p>The caveat: Immich can only preserve what it was given. If your phone/client uploaded an already-processed JPEG instead of the camera RAW/HEIC original, then Immich’s “original” is that uploaded JPEG. Also, if metadata
was stripped before upload by the source app/device, Immich cannot recreate it.&lt;/p>
&lt;p>So the practical answer:&lt;/p>
&lt;p>/mnt/data2tb/immich/library/upload = keep/backup; contains original uploaded assets
/mnt/data2tb/immich/library/thumbs = generated
/mnt/data2tb/immich/library/encoded-video = generated&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-42">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">rsync -a --info&lt;span class="o">=&lt;/span>progress2 /mnt/data2tb/immich/library/upload/ /mnt/backup2tb/backup_from_data2tb_immich/library/upload/ &lt;span class="c1">#130mb/s to usbC&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-42"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Got dups?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-43">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">jdupes -r -S /mnt/data2tb/pixel8pro /mnt/data2tb/Sync_Pixel&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-43"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-44">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo snap install czkawka #UI wont work&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">cd&lt;/span> /tmp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> wget https://github.com/qarmin/czkawka/releases/latest/download/linux_czkawka_cli_x86_64
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> chmod +x linux_czkawka_cli_x86_64
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> sudo install -m &lt;span class="m">755&lt;/span> linux_czkawka_cli_x86_64 /usr/local/bin/czkawka_cli
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Test it:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> czkawka_cli --help
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Then your duplicate scan should work as:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> czkawka_cli dup &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -d &lt;span class="s2">&amp;#34;/mnt/data2tb/old-Synced SEPT23&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -d &lt;span class="s2">&amp;#34;/mnt/data2tb/Z_BackUP_HD-SDD&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -f /mnt/backup2tb/czkawka_old_synced_vs_zbackup.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">czkawka_cli dup &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -d &lt;span class="s2">&amp;#34;/mnt/data2tb/old-Synced SEPT23&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -d &lt;span class="s2">&amp;#34;/mnt/data2tb/Z_BackUP_HD-SDD&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -f /mnt/backup2tb/czkawka_old_synced_vs_zbackup.txt&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-44"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-45">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl"> Even safer content-level compare, slower:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rsync -ainc --delete &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="s2">&amp;#34;/mnt/data2tb/Z_BackUP_HD-SDD/Z_FOTOS/&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="s2">&amp;#34;/mnt/backup2tb/Z_FOTOS/&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-45"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>rsync -ainc &amp;ndash;delete &lt;br>
&amp;ldquo;/mnt/data2tb/Z_BackUP_HD-SDD/Z_FOTOS/&amp;rdquo; &lt;br>
&amp;ldquo;/mnt/backup2tb/Z_FOTOS/&amp;rdquo; &lt;br>
&amp;gt; /mnt/backup2tb/rsync_compare_Z_FOTOS_checksum.txt&lt;/p>
&lt;pre>&lt;code>if you get tired of waiting
&lt;/code>&lt;/pre>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-46">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl"> rsync -a --info&lt;span class="o">=&lt;/span>progress2 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="s2">&amp;#34;/mnt/data2tb/Z_BackUP_HD-SDD/Z_FOTOS/&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="s2">&amp;#34;/mnt/backup2tb/Z_FOTOS/&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-46"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>I was using Immich wrong:&lt;/p>
&lt;ul>
&lt;li>&lt;code>/data/compose/14/library&lt;/code> -&amp;gt; mounted into immich_server as /usr/src/app/upload&lt;/li>
&lt;li>&lt;code>/data/compose/14/postgres&lt;/code> -&amp;gt; mounted into immich_postgres as /var/lib/postgresql/data&lt;/li>
&lt;/ul>
&lt;p>rclone authorize &amp;ldquo;drive&amp;rdquo; &amp;ldquo;someidcodewhatever&amp;rdquo; #you can do this from a laptop with browser access, then feedback the token it generates
rclone lsd googledrive:&lt;/p>
&lt;p>tmux new -s gdrive-backup
rclone copy &lt;br>
&amp;ldquo;/mnt/data2tb&amp;rdquo; &lt;br>
&amp;ldquo;googledrive:x300-backup/data2tb&amp;rdquo; &lt;br>
&amp;ndash;progress &lt;br>
&amp;ndash;transfers 4 &lt;br>
&amp;ndash;checkers 8 &lt;br>
&amp;ndash;log-file &amp;ldquo;/home/jalcocert/rclone-data2tb-to-gdrive.log&amp;rdquo; &lt;br>
&amp;ndash;log-level INFO&lt;/p>
&lt;pre>&lt;code>tmux attach -t gdrive-backup
&lt;/code>&lt;/pre>
&lt;p>After 1 week&amp;hellip;&lt;/p>
&lt;p>rclone copy &lt;br>
&amp;ldquo;/mnt/data2tb/Z_BackUP_HD-SDD/OA5Pro&amp;rdquo; &lt;br>
&amp;ldquo;googledrive:x300-backup/data2tb/Z_BackUP_HD-SDD/OA5Pro&amp;rdquo; &lt;br>
&amp;ndash;progress &lt;br>
&amp;ndash;transfers 1 &lt;br>
&amp;ndash;checkers 2 &lt;br>
&amp;ndash;tpslimit 4 &lt;br>
&amp;ndash;log-file &amp;ldquo;/home/jalcocert/rclone-oa5pro-retry.log&amp;rdquo; &lt;br>
&amp;ndash;log-level INFO&lt;/p>
&lt;p>What is backed up:&lt;/p>
&lt;p>/mnt/data2tb -&amp;gt; Google Drive x300-backup/data2tb
1.745 TiB uploaded
196137 files transferred
388643 checks completed&lt;/p>
&lt;p>Local backup drive also has key copies we made earlier:&lt;/p>
&lt;p>/mnt/backup2tb/backup_from_data2tb_nc
/mnt/backup2tb/backup_from_data2tb_immich
/mnt/backup2tb/backup_from_data2tb_phone_sync
/mnt/backup2tb/backup_from_data2tb_old_synced_sept23&lt;/p>
&lt;p>Before formatting, I’d do one last read-only check:&lt;/p>
&lt;p>df -hT /mnt/data2tb /mnt/backup2tb
lsblk -f&lt;/p>
&lt;p>Then we can identify the exact device behind /mnt/data2tb, unmount it, and format it to a Linux-native filesystem. For Docker/Nextcloud/DB data, I’d use:&lt;/p>
&lt;p>ext4&lt;/p>
&lt;p>Not exFAT, not NTFS.&lt;/p>
&lt;p>Do not format until we confirm the exact disk/device path.&lt;/p>
&lt;p>udo umount /mnt/backup2tb
[sudo] password for jalcocert:
jalcocert@jalcocert-x300:~$ tmux ls
gdrive-backup: 1 windows (created Sun May 17 16:19:54 2026)
mqtt: 1 windows (created Wed May 6 09:52:13 2026)
webapp: 1 windows (created Wed May 6 09:52:17 2026)
jalcocert@jalcocert-x300:~$&lt;/p>
&lt;p>tmux kill-session -t gdrive-backup&lt;/p>
&lt;p>Run these exactly.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-47">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Unmount:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo umount /mnt/data2tb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Format the internal NVMe partition as ext4:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo mkfs.ext4 -L data2tb /dev/nvme0n1p1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Get the new UUID:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo blkid /dev/nvme0n1p1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># sudo nano /etc/fstab&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-47"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>If you ever have to restore from this backup, you just run one command on your server to force Nextcloud to re-scan the folder and rebuild its database from the raw files:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-48">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">sudo -u www-data php /var/www/nextcloud/occ files:scan --all&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-48"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Breakdown:&lt;/p>
&lt;p>50G /data/compose/14/library/upload
6.8G /data/compose/14/library/encoded-video
669M /data/compose/14/library/thumbs
314M /data/compose/14/library/backups&lt;/p>
&lt;p>Go to: &lt;code>http://192.168.1.2:2283/map#12.43/36.33211/-6.14777&lt;/code>&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/media/immich.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>I still appreciate their map feature:&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/media/immich2.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-49">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">docker stop immich_server immich_machine_learning immich_postgres immich_redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker ps -a --filter &lt;span class="nv">name&lt;/span>&lt;span class="o">=&lt;/span>immich --format &lt;span class="s1">&amp;#39;table {{.Names}}\t{{.Status}}&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-49"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>I didnt like the immich makes strange paths inside: &lt;code>/mnt/data2tb/immich/library/upload&lt;/code>&lt;/p>
&lt;p>Immich stores files in an &lt;code>app-managed&lt;/code> layout, not a human folder layout.&lt;/p>
&lt;p>Example:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-50">/mnt/data2tb/immich/library/upload/&amp;lt;user-id&amp;gt;/&amp;lt;hash folders&amp;gt;/&amp;lt;asset-id&amp;gt;.jpg
/mnt/data2tb/immich/library/thumbs/&amp;lt;user-id&amp;gt;/...
/mnt/data2tb/immich/library/encoded-video/&amp;lt;user-id&amp;gt;/...&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-50"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>That is normal for Immich.&lt;/p>
&lt;p>It uses UUIDs, hash-like subfolders, thumbnails, encoded video copies, metadata, and a Postgres database to know what each file actually is.&lt;/p>
&lt;p>The folder names are optimized for the app, not for browsing manually.&lt;/p>
&lt;p>Nextcloud feels different because it exposes a user-facing filesystem:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-51">nextcloud/data/&amp;lt;user&amp;gt;/files/Photos/...
nextcloud/data/&amp;lt;user&amp;gt;/files/Documents/...&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-51"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>So Nextcloud’s storage mirrors what users see in the web UI.&lt;/p>
&lt;p>Immich’s storage is closer to an internal media database: the UI, albums, dates, people, locations, and search come from its database and generated assets, not from nice folder names.&lt;/p>
&lt;p>Short version: Nextcloud is file-first. Immich is photo-library-first.&lt;/p>
&lt;p>So, I said &lt;strong>bye to immich&lt;/strong>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-52">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">sudo rm -rf /data/compose/14&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-52"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;p>Baseline&lt;/p>
&lt;ol>
&lt;li>Automatic security updates
On Ubuntu/Debian, use unattended-upgrades for OS security patches.&lt;/li>
&lt;/ol>
&lt;p>sudo apt install unattended-upgrades
sudo dpkg-reconfigure unattended-upgrades&lt;/p>
&lt;p>Good for: kernel/security patches, OpenSSL, SSH, system packages.&lt;/p>
&lt;ol start="2">
&lt;li>Firewall with UFW
Default-deny inbound, allow only what you actually use.&lt;/li>
&lt;/ol>
&lt;p>Typical:&lt;/p>
&lt;p>sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw enable
sudo ufw status verbose&lt;/p>
&lt;p>Then only expose needed service ports, for example Nextcloud via reverse proxy ports 80/443, not every container port.&lt;/p>
&lt;ol start="3">
&lt;li>SSH hardening
Use keys, disable password login if possible.&lt;/li>
&lt;/ol>
&lt;p>In /etc/ssh/sshd_config:&lt;/p>
&lt;p>PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes&lt;/p>
&lt;p>Then:&lt;/p>
&lt;p>sudo systemctl reload ssh&lt;/p>
&lt;ol start="4">
&lt;li>Fail2ban or CrowdSec
Useful if SSH or web services are internet-facing.&lt;/li>
&lt;/ol>
&lt;p>Simple option:&lt;/p>
&lt;p>sudo apt install fail2ban
sudo systemctl enable &amp;ndash;now fail2ban&lt;/p>
&lt;ol start="5">
&lt;li>Reverse proxy only
Expose only Traefik/Nginx Proxy Manager/Caddy to the internet. Keep app containers internal unless they must be public.&lt;/li>
&lt;li>Backups
Security includes recovery. For your setup, I’d especially back up:&lt;/li>
&lt;/ol>
&lt;p>Nextcloud config
Nextcloud database
Nextcloud user data
Docker compose files
Reverse proxy config/certs&lt;/p>
&lt;ol start="7">
&lt;li>Docker hygiene
Avoid running random containers as privileged. Prefer:&lt;/li>
&lt;/ol>
&lt;p>no privileged: true unless required
pinned image tags where practical
bind mounts only where needed
no Docker socket exposed to web apps&lt;/p>
&lt;ol start="8">
&lt;li>Separate public vs private services
Public:&lt;/li>
&lt;/ol>
&lt;p>Nextcloud
maybe landing pages
reverse proxy&lt;/p>
&lt;p>Portainer
databases
dashboards
Home Assistant admin
file managers
SSH&lt;/p>
&lt;ol start="9">
&lt;li>VPN for admin access
Tailscale, WireGuard, or NetBird is usually better than exposing admin panels publicly.&lt;/li>
&lt;li>Monitoring
At minimum:&lt;/li>
&lt;/ol>
&lt;p>df -h
docker ps
systemctl &amp;ndash;failed&lt;/p>
&lt;p>Longer term, Uptime Kuma or Beszel are nice lightweight options.&lt;/p>
&lt;p>For your case, I’d do this order:&lt;/p>
&lt;ol>
&lt;li>Enable unattended security updates&lt;/li>
&lt;li>Configure UFW&lt;/li>
&lt;li>Confirm only 80/443/SSH are exposed&lt;/li>
&lt;li>Harden SSH&lt;/li>
&lt;li>Put admin tools behind VPN only&lt;/li>
&lt;li>Build a real Nextcloud backup routine&lt;/li>
&lt;/ol>
&lt;p>› do i need fail2ban if im exposing via cloudflare tunnels?&lt;/p>
&lt;p>• Usually: less need, but not zero.&lt;/p>
&lt;p>If your public services are exposed only through Cloudflare Tunnel, then random internet clients are not directly hitting your home IP/ports. That greatly reduces the usefulness of
Fail2ban on the homelab host, because attackers are connecting to Cloudflare, not directly to your server.&lt;/p>
&lt;p>You still may want Fail2ban if:&lt;/p>
&lt;p>SSH is exposed directly to the internet
Nextcloud is also reachable by direct IP/port, not only tunnel
you have local/LAN attackers or compromised LAN devices
you expose anything outside the tunnel&lt;/p>
&lt;p>If everything public goes through Cloudflare Tunnel, I would prioritize Cloudflare-side controls instead:&lt;/p>
&lt;p>Cloudflare Access for admin apps
WAF/security rules
rate limiting for login paths
country/IP restrictions if useful
2FA on Cloudflare account
no direct router port forwards to the homelab&lt;/p>
&lt;p>For your homelab, the better setup is:&lt;/p>
&lt;p>Public internet -&amp;gt; Cloudflare Tunnel -&amp;gt; selected apps
Admin access -&amp;gt; Tailscale/WireGuard/VPN
Router port forwards -&amp;gt; none, or only absolutely required
SSH -&amp;gt; LAN/VPN only&lt;/p>
&lt;p>Then Fail2ban becomes optional rather than essential. It’s still fine to install, but it won’t see most Cloudflare-side attack traffic unless requests reach your service with real
client IPs and your logs are configured accordingly.&lt;/p>
&lt;hr>
&lt;p>For a normal personal Google Drive account, you mainly need this:&lt;/p>
&lt;ol>
&lt;li>rclone installed on the server&lt;/li>
&lt;li>a Google account login in a browser&lt;/li>
&lt;li>an rclone remote config stored on the server&lt;/li>
&lt;/ol>
&lt;p>The artifact rclone creates is usually:&lt;/p>
&lt;p>~/.config/rclone/rclone.conf&lt;/p>
&lt;p>That file contains the Google Drive remote definition and OAuth token. Treat it like a secret.&lt;/p>
&lt;p>Typical setup:&lt;/p>
&lt;p>rclone config&lt;/p>
&lt;p>Then choose roughly:&lt;/p>
&lt;p>n) New remote
name: gdrive
storage: Google Drive
client_id: leave blank
client_secret: leave blank
scope: drive
root_folder_id: leave blank
service_account_file: leave blank
auto config: yes, if browser available&lt;/p>
&lt;p>After browser login, rclone saves credentials here:&lt;/p>
&lt;p>/home/jalcocert/.config/rclone/rclone.conf&lt;/p>
&lt;p>Test it:&lt;/p>
&lt;p>rclone lsd gdrive:
rclone mkdir gdrive:homelab-backups
rclone lsd gdrive:&lt;/p>
&lt;p>If the server has no browser/GUI, run:&lt;/p>
&lt;p>rclone config&lt;/p>
&lt;p>and when asked:&lt;/p>
&lt;p>Use auto config?
n&lt;/p>
&lt;p>Then rclone gives you a URL. Open that URL on your laptop/desktop, sign in to Google, copy the token/code back into the server prompt.&lt;/p>
&lt;p>For backups, the only artifact you need to preserve is:&lt;/p>
&lt;p>~/.config/rclone/rclone.conf&lt;/p>
&lt;p>If using restic, also preserve your restic repository password. Without it, the encrypted backup is unrecoverable.&lt;/p>
&lt;h3>How to Photos&lt;span class="absolute -mt-20" id="how-to-photos">&lt;/span>
&lt;a href="#how-to-photos" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>To open &lt;code>RW2&lt;/code> photos I needed:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-53">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo apt install geeqie&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">geeqie P1000130.RW2 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-53"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Geeqie: best if you want a lightweight viewer.&lt;/p>
&lt;p>It is focused on fast
browsing, thumbnails, zoom, and folder-based viewing, and it supports RW2
directly. It is not a RAW editor.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>RawTherapee: best if you want strong RAW processing and editing. It is much
heavier than a simple viewer, but it gives you serious control over
development.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>darktable: best if you want a full RAW workflow plus cataloging. It supports
RW2, but it is explicitly built as a RAW developer and uses substantial
memory, so it is the least lightweight of the three.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>gThumb or nomacs: decent general-purpose image viewers, but they are not as
clearly lightweight-and-RAW-focused as Geeqie, and Geeqie has the clearest
RW2 support documentation among the lightweight viewers I checked.&lt;/p>
&lt;p>My recommendation for your use case:&lt;/p>
&lt;ul>
&lt;li>Just view RW2: Geeqie&lt;/li>
&lt;li>View and do quick RAW edits: RawTherapee&lt;/li>
&lt;li>Full photo workflow: darktable&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3>How to youtube&lt;span class="absolute -mt-20" id="how-to-youtube">&lt;/span>
&lt;a href="#how-to-youtube" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>With claude code as a builder, ffmpeg, yt-dl and openai API key&amp;hellip;&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/yt-distill.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-54">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/yt-distill
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make up&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PORT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">8000&lt;/span> docker compose up --build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./out #to get the transcripts&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-54"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div></description></item><item><title>How to PoC 105 | A year of agents</title><link>https://JAlcocerT.github.io/JAlcocerT/poc-105/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/poc-105/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Shipping a lifetime in 6M!&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>There is live beyond claude desktop and &lt;a href="https://developers.openai.com/codex/app/windows" target="_blank" rel="noopener">codex app for windows&lt;/a>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">winget install Codex -s msstore&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/entrepreneur/bip/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>BiP | Docs ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/entrepreneur/#offers/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Offers | Docs ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;h2>Using the latest Agents&lt;span class="absolute -mt-20" id="using-the-latest-agents">&lt;/span>
&lt;a href="#using-the-latest-agents" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Whatever you will choose, make sure to have python and &lt;strong>specially node&lt;/strong> properly installed:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install -y nodejs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">node --version&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>For python, you can even do it via uv for full pro config:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">curl -LsSf &lt;span class="o">[&lt;/span>https://astral.sh/uv/install.sh&lt;span class="o">](&lt;/span>https://astral.sh/uv/install.sh&lt;span class="o">)&lt;/span> &lt;span class="p">|&lt;/span> sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#powershell -c &amp;#34;irm [https://astral.sh/uv/install.ps1](https://astral.sh/uv/install.ps1) | iex&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv python install 3.12
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv run script.py&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;em>Because uv is written in Rust, it is a standalone executable that doesn&amp;rsquo;t require Python to run. It can download and manage multiple Python versions (3.10, 3.12, 3.13, etc.) on its own, similar to how nvm works for Node.js.&lt;/em>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://github.com/openclaw/openclaw" target="_blank" rel="noopener">OpenClaw&lt;/a> (ex moltbot, ex clawdbot)&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#curl -fsSL https://openclaw.ai/install.sh | bash&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>MIT | Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>&lt;a href="https://docs.openclaw.ai/start/showcase" target="_blank" rel="noopener">https://docs.openclaw.ai/start/showcase&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;ol start="2">
&lt;li>&lt;a href="https://github.com/nousresearch/hermes-agent" target="_blank" rel="noopener">https://github.com/nousresearch/hermes-agent&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>With container setup: &lt;a href="https://hermes-agent.nousresearch.com/docs/user-guide/docker" target="_blank" rel="noopener">https://hermes-agent.nousresearch.com/docs/user-guide/docker&lt;/a> and this &lt;a href="https://www.youtube.com/watch?v=1nDiiXfMUK4" target="_blank" rel="noopener">inspiring video&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>MIT | The agent that grows with you&lt;/p>
&lt;/blockquote>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#mkdir -p ~/.hermes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker run -it --rm &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -v ~/.hermes:/opt/data &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> nousresearch/hermes-agent setup
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 20. Kimi Coding Plan (api.kimi.com) &amp;amp; Moonshot API&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 31. OpenCode Go (open models, $10/month subscription)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 19. Z.AI / GLM (Zhipu AI direct API)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#No inference provider configured. Run &amp;#39;hermes model&amp;#39; to choose a provider and model, or set an API key (OPENROUTER_API_KEY, OPENAI_API_KEY, etc.) in ~/.hermes/.env. Falling back to auto provider detection.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> ~/.bashrc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#hermes model&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo usermod -aG docker jalcocert &amp;amp;&amp;amp; newgrp docker #for the Pi setup&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/GenAI/hermes-agent.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
I recently formated &lt;a href="https://jalcocert.github.io/JAlcocerT/plants-103-inspiration/#monitoring-plants-while-travelling" target="_blank" rel="noopener">a Pi for monitoring plants&lt;/a> with the camera, and will use it to host these. The &lt;a href="https://github.com/JAlcocerT/RPi/blob/main/Z_SelfHosting/homelab-selfhosting.sh" target="_blank" rel="noopener">setup script&lt;/a> made it quick.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>Other CLIs&lt;span class="absolute -mt-20" id="other-clis">&lt;/span>
&lt;a href="#other-clis" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Its been a while since that &lt;a href="https://jalcocert.github.io/JAlcocerT/ai-tools-for-cli/" target="_blank" rel="noopener">AI CLI tools post&lt;/a> and the &lt;a href="https://jalcocert.github.io/JAlcocerT/vide-coding/#cli-based" target="_blank" rel="noopener">vibe coding one with CLI&lt;/a> last year:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#get the terminal of your choice ready!&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#/bin/bash -c &amp;#34;$(curl -fsSL https://raw.githubusercontent.com/mkasberg/ghostty-ubuntu/HEAD/install.sh)&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://www.warp.dev/" target="_blank" rel="noopener">Warp&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://opencode.ai/docs/cli/" target="_blank" rel="noopener">OpenCode&lt;/a>: which brings some free models (otherwise, BYO API)&lt;/p>
&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#curl -fsSL https://opencode.ai/install | bash&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install -g opencode-ai
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#choco install opencode&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/GenAI/opencode.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;blockquote>
&lt;p>You can also bring &lt;a href="https://opencode.ai/docs/commands/" target="_blank" rel="noopener">commands&lt;/a> and skills ofc: &lt;a href="https://opencode.ai/docs/skills/" target="_blank" rel="noopener">https://opencode.ai/docs/skills/&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;p>Ive used OpenCode lately to &lt;strong>harden my Pi&lt;/strong> &lt;a href="https://github.com/JAlcocerT/RPi/blob/main/Z_RPi_Cam/homelab-selfhosting.sh" target="_blank" rel="noopener">setup script&lt;/a>: &lt;em>this will be an excuse to try the chatgpt PRO plan next month, as anthropic doesnt let me use max here&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">opencode &lt;span class="c1">#/models #/connect&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Why a Pi again? To harden it and get &lt;a href="https://github.com/JAlcocerT/RPi/tree/main/Z_SelfHosting/agentic-pi" target="_blank" rel="noopener">those agents running&lt;/a> at home. No public IP in a VPS, nor messing with my home server.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>Agents x Knowledge Management&lt;span class="absolute -mt-20" id="agents-x-knowledge-management">&lt;/span>
&lt;a href="#agents-x-knowledge-management" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Dont let AI take away your thinking.&lt;/p>
&lt;p>Let AI &lt;strong>enhance your thinking&lt;/strong>.&lt;/p>
&lt;p>For this, owning a &lt;strong>good context layer&lt;/strong> is critical!&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Expect the compute*tokens/intelligence to keep dropping&lt;/p>
&lt;p>Ive heard very good comments about &lt;code>Gemma 4&lt;/code> on one of the new mac air.&lt;/p>
&lt;p>You can use this as an opportunity to leverage local AI withing your homelab as I did recently, here.&lt;/p>
&lt;p>Whenever you are shifting &lt;em>or force to shift&lt;/em> from:&lt;/p>
&lt;p>&lt;del>Can you manage the process?&lt;/del> &lt;em>thats really over&lt;/em>&lt;/p>
&lt;p>To: Can you produce outcomes with leverage?&lt;/p>
&lt;p>Just reach out:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/consulting.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Tier of Service for the ones that cant wait to get value&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/ebooks.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks with free value.&lt;/div>&lt;/a>
&lt;/div>
&lt;h3>Whats going on?&lt;span class="absolute -mt-20" id="whats-going-on">&lt;/span>
&lt;a href="#whats-going-on" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>AI is coming to the workspace.&lt;/p>
&lt;p>And we are about to see which works were more operational and trivial than others: &lt;code>https://github.com/anthropics/financial-services&lt;/code>&lt;/p>
&lt;blockquote>
&lt;p>You can also have a look to &lt;code>https://github.com/TauricResearch/TradingAgents&lt;/code> for Multi-Agents LLM Financial Trading Framework&lt;/p>
&lt;/blockquote>
&lt;p>This thing can make &lt;code>xls/xlsx&lt;/code> with DCF &amp;lsquo;models&amp;rsquo;&lt;/p>
&lt;blockquote>
&lt;p>Allow me to put model with quotes, bc if you cant bet your ass that it will work, &lt;strong>the models sucks&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>All shaped as plugin &amp;gt; skills &amp;gt; &amp;gt; &amp;gt; prompts&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#the skill to...create skills&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx skills add https://github.com/anthropics/skills --skill skill-creator&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Say you have a &lt;a href="https://github.com/JAlcocerT/PBi/blob/main/procedural.md" target="_blank" rel="noopener">procedural way to analyze PBI&lt;/a> dashboards in &lt;code>.md&lt;/code> - You can make a skill and a plugin
&lt;/div>
&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>&lt;a href="https://github.com/obra/superpowers" target="_blank" rel="noopener">https://github.com/obra/superpowers&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;strong>MIT&lt;/strong> | An agentic skills framework &amp;amp; software development methodology that works.&lt;/p>
&lt;/blockquote>
&lt;p>I got to know via &lt;a href="https://www.youtube.com/watch?v=utRYkiqGuZI" target="_blank" rel="noopener">https://www.youtube.com/watch?v=utRYkiqGuZI&lt;/a> and the intro blog is &lt;a href="https://blog.fsck.com/2025/10/09/superpowers/" target="_blank" rel="noopener">https://blog.fsck.com/2025/10/09/superpowers/&lt;/a> and latest releases &lt;a href="https://blog.fsck.com/agent-blog/2026/03/31/superpowers-v5-0-7/" target="_blank" rel="noopener">here&lt;/a>&lt;/p>
&lt;h3>Whats Working Whats Not Whats Next&lt;span class="absolute -mt-20" id="whats-working-whats-not-whats-next">&lt;/span>
&lt;a href="#whats-working-whats-not-whats-next" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Doing &lt;strong>quick PoCs&lt;/strong> that are useful with almost no effort: *and you get to know new concepts, like &lt;a href="https://github.com/JAlcocerT/poc/blob/main/stocks-simple/faq-xirr.md" target="_blank" rel="noopener">XIRR&lt;/a>.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/poc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/stocks-simple/web
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">podman build -t stocks-simple . &lt;span class="c1">#after 4min build...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">podman run -d --name stocks-simple &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -p 3000:3000 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">ALLOWED_DEV_ORIGINS&lt;/span>&lt;span class="o">=&lt;/span>192.168.1.18 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -v ./transactions.csv:/data/transactions.csv:ro &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -v stocks-cache:/data/.cache &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> stocks-simple &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>Because you saw sth was not right via &lt;code>https://aegis-freedom.pages.dev/&lt;/code> already&lt;/p>
&lt;/blockquote>
&lt;p>How big will be the &lt;em>PoC graveyard&lt;/em> by the end of this year?&lt;/p>
&lt;p>How many cool data projects with nice charts will never see the light?&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/memes/data-deadlock.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Not sure, we are still working in semantic silos:&lt;/p>
&lt;p>While human requirements are loosie loosie and people working at FMCG are still doing human RCA:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
PM/Pdm Copilot PoC ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/poc/libg/why-postmortem" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
WhyWhyWy PoC ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /poc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/libg/why-postmortem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run baml:generate #yea, this time it uses BAML&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run dev &lt;span class="c1">#&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/why-postmortem.png" alt="why why why to actions PoC" loading="lazy" />&lt;/p>
&lt;blockquote>
&lt;p>&lt;code>http://localhost:5173/&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;p>I made it initially as skill:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">/postmortem:blameless-check&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>These 2 share the &lt;a href="https://github.com/JAlcocerT/poc/blob/main/libg/why-postmortem/z-dna.md" target="_blank" rel="noopener">same dna&lt;/a> and shaped as per &lt;a href="https://github.com/JAlcocerT/poc/blob/main/libg/why-postmortem/brd-webapp-poc.md" target="_blank" rel="noopener">this brd&lt;/a>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Layer&lt;/th>
&lt;th>PM Copilot&lt;/th>
&lt;th>Why-Postmortem&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Domain&lt;/td>
&lt;td>Forward-looking — define the right product&lt;/td>
&lt;td>Backward-looking — learn from the incident&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Context&lt;/td>
&lt;td>Business goals, personas (Sec/Legal/DevOps/Finance), domain triggers, success-metric rules&lt;/td>
&lt;td>&lt;code>org.yaml&lt;/code>, &lt;code>services.yaml&lt;/code>, &lt;code>teams.yaml&lt;/code>, &lt;code>severity-matrix.yaml&lt;/code>, &lt;code>enums.yaml&lt;/code>, &lt;code>glossary.md&lt;/code>, &lt;code>history.md&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Funnel&lt;/td>
&lt;td>Why Engine → Persona Critique → Edge Cases → SMART Metrics → Traceability Matrix&lt;/td>
&lt;td>Timeline → Fishbone (6 cats) → 5-Whys per branch → Blameless Draft → Action Items&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Blameless Culture:&lt;/strong> This is the most important part. If the RCA finds &amp;ldquo;John forgot to click a button,&amp;rdquo; the root cause isn&amp;rsquo;t John—it’s &lt;strong>&amp;ldquo;The system allows a single point of failure without a confirmation step.&amp;rdquo;&lt;/strong>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>The &amp;ldquo;Action Item&amp;rdquo; Rule:&lt;/strong> Every RCA must result in at least one ticket in your backlog (Jira/Asana/Linear). If there’s no ticket, the RCA didn’t happen.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>AI for Patterns:&lt;/strong> Once you have 10 postmortems, feed them all to an AI and ask: &lt;em>&amp;ldquo;What is the recurring theme across our last 10 failures?&amp;rdquo;&lt;/em> This is where you find the &amp;ldquo;Grand Root Cause&amp;rdquo; of your team&amp;rsquo;s friction.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/nexu-io/open-design" target="_blank" rel="noopener">https://github.com/nexu-io/open-design&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Apache v2 | 🎨 Local-first, open-source alternative to Anthropic&amp;rsquo;s Claude Design.&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>19 Skills · ✨ 71 brand-grade Design Systems 🖼 Generate web · desktop · mobile prototypes · slides · images · videos · HyperFrames 📦 Sandboxed preview · HTML/PDF/PPTX/MP4 export 🤖 Runs on Claude Code / Codex / Cursor / Gemini / OpenCode / Qwen / Copilot / Hermes / Kimi CLI.&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm install -g @openai/codex #https://github.com/openai/codex/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">codex&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>&lt;a href="https://developers.openai.com/codex/cli" target="_blank" rel="noopener">Codex cli&lt;/a> can now create images, search the web and automate repeatable workflows via the &lt;code>exec&lt;/code> command &lt;em>bye n8n :,)&lt;/em>&lt;/p>
&lt;/blockquote>
&lt;p>Thanks to the references inside open-design, I got to know another skills:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-13">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx skills add https://github.com/alchaincyf/huashu-design --skill huashu-design&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude --dangerously-skip-permissions -p &amp;#34;promptwhateverrrr&amp;#34; #yolo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#gemini --prompt &amp;#34;are you able to be queried with non interactive mode?&amp;#34; -m gemini-2.5-flash --yolo --debug&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-13"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And yep, it makes even better slides as html: &lt;code>can you make a Presentation slides : 1920x1080 HTML deck, can be used as a PowerPoint presentation for the poc we have just built?&lt;/code>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-14">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npx decktape generic deck.html deck.pdf --size 1920x1080
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">node .claude/skills/huashu-design/scripts/render-video.js &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>--url &lt;span class="s2">&amp;#34;file:///C:/Users/j--e-/Desktop/poc/libg/why-postmortem/demo-video.html?record&amp;#34;&lt;/span> --duration &lt;span class="m">32&lt;/span> --out demo-video.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">node .claude/skills/huashu-design/scripts/render-video.js why-postmortem/demo-video.html --duration&lt;span class="o">=&lt;/span>&lt;span class="m">32&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-14"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://youtu.be/DGkMhY0bFt8 -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/DGkMhY0bFt8" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>With &lt;code>Huashu design&lt;/code> you can easily &lt;a href="https://github.com/JAlcocerT/jalcocertech-services/tree/master/design-brand-kit" target="_blank" rel="noopener">create a &lt;strong>brand kit&lt;/strong>&lt;/a> and generate not only pptx and video.&lt;/p>
&lt;p>But also infographic, one pagers&amp;hellip;&lt;/p>
&lt;p>Or even make a &lt;code>jalc-portrait-square-refined-1024-v2&lt;/code> around your brand assets.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/JAlcocerT/ebook-ideas/tree/master/z-z-destilled" target="_blank" rel="noopener">https://github.com/JAlcocerT/ebook-ideas/tree/master/z-z-destilled&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
To demo them publically w/o disclosing your domains you can always use &lt;a href="https://github.com/JAlcocerT/RPi/blob/main/Z_RPi_Cam/tailscale-serve-funnel.md" target="_blank" rel="noopener">tailscale funnels&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-15">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">htop &lt;span class="c1">#btop &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">iotop &lt;span class="c1">#iftop #ctop&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-15"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Apps that Inspire&lt;span class="absolute -mt-20" id="apps-that-inspire">&lt;/span>
&lt;a href="#apps-that-inspire" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;del>DocuSign&lt;/del> &lt;a href="https://www.docuseal.com/install#docker-instructions" target="_blank" rel="noopener">DocuSeal&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Tiinyhost&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Whats interesting?&lt;/p>
&lt;p>That you can get inspired by these webs UI/X with google stitch nowadays.&lt;/p>
&lt;p>Inspiring apps: all those &lt;code>pwa&lt;/code> like that just&amp;hellip;work&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;code>https://bentopdf.com/index.html&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Docuseal&lt;/p>
&lt;/li>
&lt;li>
&lt;p>it-tools&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Vert - Which uses &lt;a href="https://jalcocert.github.io/JAlcocerT/wasm/" target="_blank" rel="noopener">WASM&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Pairdrop&amp;hellip;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/scio-labs/inkathon" target="_blank" rel="noopener">https://github.com/scio-labs/inkathon&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Full-Stack DApp Boilerplate for Substrate and ink! Smart Contracts&lt;/p>
&lt;blockquote>
&lt;p>How about building like they&amp;rsquo;ve done?&lt;/p>
&lt;/blockquote></description></item><item><title>[Attraction] Show a Problem</title><link>https://JAlcocerT.github.io/JAlcocerT/diy-webs-via-paas/</link><pubDate>Sun, 10 May 2026 08:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/diy-webs-via-paas/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>If I ever talked with you about how to build a website: &lt;strong>its obsolete&lt;/strong>.&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://diy.jalcocertech.com" target="_blank" rel="noopener">https://diy.jalcocertech.com&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://webaudit.jalcocertech.com/" target="_blank" rel="noopener">https://webaudit.jalcocertech.com/&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>+++ &lt;a href="#what-about-gitlab-pages" >Gitlab Pages&lt;/a>&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>This is Vertigo.&lt;/p>
&lt;p>Not the U2 song.&lt;/p>
&lt;p>But&amp;hellip; see.&lt;/p>
&lt;p>Last year I completed all these pieces of the puzzle: &lt;a href="https://jalcocert.github.io/JAlcocerT/selfhosted-server-paas/" target="_blank" rel="noopener">PaaS&lt;/a> + &lt;a href="https://jalcocert.github.io/JAlcocerT/open-source-minimalist-websites/#using-decap-cms" target="_blank" rel="noopener">DecapCMS x Astro&lt;/a>&lt;/p>
&lt;p>Time to put those together with a quick WebApp/SaaS to free my time and &lt;strong>enhance the output of people&amp;rsquo;s DIYs&lt;/strong>.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/entrepreneur/bip/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>BiP | Docs ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/entrepreneur/bip/#initial-prompts-for-success" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Vibe Coding | Docs ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>How about &lt;strong>improving CX&lt;/strong> for DIYs websites?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/poc_webs_magnet&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker ps -a --filter &lt;span class="s2">&amp;#34;name=audit&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker logs --tail 120 auditmagnet-prod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker compose -f docker-compose.prod.yml up -d --build &lt;span class="c1">#https://webaudit.jalcocertech.com/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make help&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Was able to put some UI/X changes with &lt;code>cc&lt;/code> into the original product.&lt;/p>
&lt;p>As well as some backend changes like get leads flowing into pocketbase.&lt;/p>
&lt;p>See the details at [this section].&lt;/p>
&lt;p>You know that you can reach &lt;code>webaudit.jalcocertech.com&lt;/code> as created &lt;a href="https://jalcocert.github.io/JAlcocerT/how-to-perform-free-web-audit/#programmatic-free-audits-for-websites" target="_blank" rel="noopener">here&lt;/a> on &lt;a href="https://github.com/JAlcocerT/poc_webs_magnet" target="_blank" rel="noopener">this repo&lt;/a>&lt;/p>
&lt;p>The thing is: &lt;em>Does it needs to be a trade off between a Wordpress/Ghost/Wix or a code driven cool SSG?&lt;/em>&lt;/p>
&lt;p>Cant we go ECO/green and have websites that respect the environment?&lt;/p>
&lt;pre class="mermaid mt-6">flowchart LR
%% --- Styles ---
classDef free fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20;
classDef low fill:#FFF9C4,stroke:#FBC02D,stroke-width:2px,color:#FBC02D;
classDef mid fill:#FFE0B2,stroke:#F57C00,stroke-width:2px,color:#F57C00;
classDef high fill:#FFCDD2,stroke:#C62828,stroke-width:2px,color:#C62828;
classDef bridge fill:#E3F2FD,stroke:#1565C0,stroke-width:3px,color:#0D47A1;
%% --- Nodes ---
L0("Free Content&lt;br/>($0)"):::free
L1("AuditMagnet 🛡️&lt;br/>(Free Web Audit )"):::free
L11(" Blog/Youtube"):::free
L12(" ebooks"):::free
L2("DIY&lt;br/>(Optimization Guides) $"):::low
L3("Done With You&lt;br/>(Consulting) $$"):::mid
L4("Done For You&lt;br/>(Full Service) $$$"):::high
L44("GenBI&lt;br/>Shopify PoC"):::bridge
L45("Real Estate&lt;br/>Funnel Bot"):::bridge
%% --- Connections ---
L0 --> L1
L0 --> L2
L0 --> L11
L0 --> L12
L2 --> L3
L3 --> L4
L44 -->|Enhancing| L4
L45 -->|Enhancing| L4&lt;/pre>&lt;p>As per my service, you can at least be aware how good your site is:&lt;/p>
&lt;p>The &lt;strong>launch strategy&lt;/strong>: &lt;em>aka, focus strategy&lt;/em>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Element&lt;/th>
&lt;th style="text-align:left">Decision&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>One Avatar&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>One Product&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>One Channel&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The &lt;strong>Tier of Service&lt;/strong>: DIY (1b - &lt;em>leverages on actual tech stack Ive put together - PaaS x (WP/Ghost or SSG+CMS)&lt;/em>)&lt;/p>
&lt;p>The &lt;strong>tech stack&lt;/strong>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Requirement&lt;/th>
&lt;th style="text-align:left">Specification&lt;/th>
&lt;th style="text-align:left">Clarification / Decision&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Frontend Framework&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Styling/UI Library&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>&lt;a href="https://jalcocert.github.io/JAlcocerT/docs/dev/fe-vs-be/" target="_blank" rel="noopener">Backend&lt;/a>/Database&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>&lt;a href="https://jalcocert.github.io/JAlcocerT/docs/dev/authentication/" target="_blank" rel="noopener">Authentication&lt;/a>&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/poc_webs_magnet" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Web Magnet x Free Web Audits ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/diy-landing-boilerplate" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
DIY Landing x Astro Components x Chatbot ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/dev/authentication/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Authentication | Docs ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/dev/fe-vs-be/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>FE vs BE | Docs ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;h2>The journey to a CMS managed cool Website&lt;span class="absolute -mt-20" id="the-journey-to-a-cms-managed-cool-website">&lt;/span>
&lt;a href="#the-journey-to-a-cms-managed-cool-website" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/web-cms-101/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">CMS 101 | Docs ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/dev/fe-vs-be/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>FE vs BE | Docs ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="steps ml-4 mb-12 border-l border-gray-200 pl-6 dark:border-neutral-800 [counter-reset:step]">
&lt;h3>Discovering Github Pages&lt;span class="absolute -mt-20" id="discovering-github-pages">&lt;/span>
&lt;a href="#discovering-github-pages" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>Discovering SSGs&lt;span class="absolute -mt-20" id="discovering-ssgs">&lt;/span>
&lt;a href="#discovering-ssgs" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>Being amazed by Astro&lt;span class="absolute -mt-20" id="being-amazed-by-astro">&lt;/span>
&lt;a href="#being-amazed-by-astro" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>This was less than 3 years ago on a bus!&lt;/p>
&lt;h3>Think I could tweak them&lt;span class="absolute -mt-20" id="think-i-could-tweak-them">&lt;/span>
&lt;a href="#think-i-could-tweak-them" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>Tried few CMS and fail&lt;span class="absolute -mt-20" id="tried-few-cms-and-fail">&lt;/span>
&lt;a href="#tried-few-cms-and-fail" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>FrontMatterCMS was not enough&lt;/p>
&lt;h3>Build some flask/next webapps as CMS&lt;span class="absolute -mt-20" id="build-some-flasknext-webapps-as-cms">&lt;/span>
&lt;a href="#build-some-flasknext-webapps-as-cms" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>And failed&lt;/p>
&lt;h3>Tried Nuxt Content&lt;span class="absolute -mt-20" id="tried-nuxt-content">&lt;/span>
&lt;a href="#tried-nuxt-content" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>And it was nice. But.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Canvas Nuxt ContentCMS&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/bloggrify/bloggrify" target="_blank" rel="noopener">https://github.com/bloggrify/bloggrify&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3>And DecapCMS&lt;span class="absolute -mt-20" id="and-decapcms">&lt;/span>
&lt;a href="#and-decapcms" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>With the &lt;a href="https://github.com/JAlcocerT/Twilight" target="_blank" rel="noopener">Twilight&lt;/a> astro Theme first and the double terminal working in local mode:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npm run dev
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx decap-server &lt;span class="c1">#in terminal 2&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Then with &lt;a href="https://github.com/JAlcocerT/Portfolio" target="_blank" rel="noopener">Portfolio&lt;/a> where it worked with local + github oauth with changes commited and going to Ci/CD automatically&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make hugo-dev &lt;span class="c1">#hugo server --bind=&amp;#34;0.0.0.0&amp;#34; --baseURL=&amp;#34;http://localhost&amp;#34; --port=1313 #localhost:1313&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And to some extent, with &lt;a href="https://github.com/JAlcocerT/EntreAgujayPunto" target="_blank" rel="noopener">EntreAgujayPunto&lt;/a> (hugo theme gallery), where the container setup&amp;hellip;.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/EntreAgujayPunto.git #http://jalcocert-x300-1:8090/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install npm-run-all --save-dev
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run dev:full #decapcms local + hugo local dev&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">HUGO_BASEURL&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;http://jalcocert-x300-1&amp;#34;&lt;/span> &lt;span class="nv">HUGO_PORT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1313&lt;/span> npm run dev:full
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#hugo server --bind=&amp;#34;0.0.0.0&amp;#34; --baseURL=&amp;#34;http://192.168.1.100&amp;#34; --port=1313&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run cms&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make dev-all&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The last round was very recently, on &lt;a href="https://jalcocert.github.io/JAlcocerT/interesting-books/#decap-x-existing-astro-x-localhost" target="_blank" rel="noopener">this post&lt;/a>.&lt;/p>
&lt;p>Got to know about via &lt;code>selfh.st&lt;/code>&lt;/p>
&lt;p>But&amp;hellip;didnt tried it yet.&lt;/p>
&lt;/div>
&lt;h2>The journey of the infra side&lt;span class="absolute -mt-20" id="the-journey-of-the-infra-side">&lt;/span>
&lt;a href="#the-journey-of-the-infra-side" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Because not everything is code.&lt;/p>
&lt;div class="steps ml-4 mb-12 border-l border-gray-200 pl-6 dark:border-neutral-800 [counter-reset:step]">
&lt;h3>Played with Ubuntu&lt;span class="absolute -mt-20" id="played-with-ubuntu">&lt;/span>
&lt;a href="#played-with-ubuntu" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Inside VMs&lt;/p>
&lt;h3>Got a Pi&lt;span class="absolute -mt-20" id="got-a-pi">&lt;/span>
&lt;a href="#got-a-pi" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>Liked containers&lt;span class="absolute -mt-20" id="liked-containers">&lt;/span>
&lt;a href="#liked-containers" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>Got a VPS&lt;span class="absolute -mt-20" id="got-a-vps">&lt;/span>
&lt;a href="#got-a-vps" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>Tried VPSs&lt;span class="absolute -mt-20" id="tried-vpss">&lt;/span>
&lt;a href="#tried-vpss" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>Consolidated docker configs&lt;span class="absolute -mt-20" id="consolidated-docker-configs">&lt;/span>
&lt;a href="#consolidated-docker-configs" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>In one public repository&lt;/p>
&lt;p>Then at one with some order&lt;/p>
&lt;h3>Understood Proxies for HTTPs&lt;span class="absolute -mt-20" id="understood-proxies-for-https">&lt;/span>
&lt;a href="#understood-proxies-for-https" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>Tried few PaaS Tools&lt;span class="absolute -mt-20" id="tried-few-paas-tools">&lt;/span>
&lt;a href="#tried-few-paas-tools" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>Tinkered with UptimeKuma&lt;span class="absolute -mt-20" id="tinkered-with-uptimekuma">&lt;/span>
&lt;a href="#tinkered-with-uptimekuma" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>Also with Formbricks&lt;span class="absolute -mt-20" id="also-with-formbricks">&lt;/span>
&lt;a href="#also-with-formbricks" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>PB&amp;hellip;&lt;span class="absolute -mt-20" id="pb">&lt;/span>
&lt;a href="#pb" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>oh and the LightHouse CI&lt;span class="absolute -mt-20" id="oh-and-the--lighthouse-ci">&lt;/span>
&lt;a href="#oh-and-the--lighthouse-ci" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/dev/web-test-lighthouse.png" alt="lighthouse programmatic test" loading="lazy" />&lt;/p>
&lt;/div>
&lt;h2>What the experience show me&lt;span class="absolute -mt-20" id="what-the-experience-show-me">&lt;/span>
&lt;a href="#what-the-experience-show-me" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;strong>a CMS x Astro, why?&lt;/strong>&lt;/p>
&lt;p>From the experience: Dont do more than 3 websites to very close people if you they are not able to enable &lt;strong>self-service&lt;/strong>.&lt;/p>
&lt;p>Thats where &lt;a href="https://docs.vrite.io/self-hosting/configuration/" target="_blank" rel="noopener">selfhosted tools&lt;/a> like: &lt;a href="https://github.com/vriteio/vrite" target="_blank" rel="noopener">https://github.com/vriteio/vrite&lt;/a> are supposed to shine.&lt;/p>
&lt;blockquote>
&lt;p>Open-source developer content platform&lt;/p>
&lt;/blockquote>
&lt;p>I also got inspired by tools listed: &lt;a href="https://www.awesome-homelab.com/category/writing" target="_blank" rel="noopener">https://www.awesome-homelab.com/category/writing&lt;/a>&lt;/p>
&lt;p>Particularly by &lt;a href="https://www.awesome-homelab.com/item/novel-editor" target="_blank" rel="noopener">https://www.awesome-homelab.com/item/novel-editor&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>I would recommend you to consider DecapCMS or&amp;hellip;.&lt;/p>
&lt;/blockquote>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/web-cms-101/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">CMS 101 | Docs ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/dev/fe-vs-be/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>FE vs BE | Docs ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;h2>The journey of putting this together&lt;span class="absolute -mt-20" id="the-journey-of-putting-this-together">&lt;/span>
&lt;a href="#the-journey-of-putting-this-together" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Fast forward to today: lets put a web/app with UI to bundle all this.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/create-your-website/#select-the-deployment-method" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Web Deployment methods | Docs ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;h3>Creating a DIY x PaaS&lt;span class="absolute -mt-20" id="creating-a-diy-x-paas">&lt;/span>
&lt;a href="#creating-a-diy-x-paas" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I thought about building some kind of a PaaS instead of a SaaS&lt;/p>
&lt;p>But&amp;hellip;with no clients? really?&lt;/p>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">Creating a DIY PaaS for Launching Websites&amp;hellip; 🚀&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git init &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git add . &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git commit -m &lt;span class="s2">&amp;#34;Initial commit: Starting N ebooks DIY&amp;#34;&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> gh repo create 1toN-ebooks --private --source&lt;span class="o">=&lt;/span>. --remote&lt;span class="o">=&lt;/span>origin --push&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/details>
&lt;p>This can be easy, but not &lt;del>effort&lt;/del> token free.&lt;/p>
&lt;p>So skip.&lt;/p>
&lt;h3>Testing the Web Audits with EAyP v3&lt;span class="absolute -mt-20" id="testing-the-web-audits-with-eayp-v3">&lt;/span>
&lt;a href="#testing-the-web-audits-with-eayp-v3" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>See the &lt;a href="https://github.com/JAlcocerT/foldergram/blob/main/z-deploy.md" target="_blank" rel="noopener">deployment guide&lt;/a>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/foldergram&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker compose -f docker-compose.yml -f docker-compose.local.yml up -d --build --force-recreate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps -a --filter &amp;#34;name=foldergram&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># One-time copy&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp -r ./data/gallery/ jalcocert@192.168.1.2:/home/jalcocert/foldergram/data/gallery/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#But for photos, rsync is much better — it&amp;#39;s incremental (only copies new/changed files) and shows progress:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># First time or any subsequent sync&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#rsync -avz --progress ./data/gallery/ jalcocert@192.168.1.2:~/foldergram/data/gallery/&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Go to &lt;code>192.168.1.2:4141&lt;/code> and sync the pushed photos :)&lt;/p>
&lt;p>You can try to update files via: thay will be accessed by filebrowser&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker compose -f docker-compose.yml -f docker-compose.filebrowser.yml up -d&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker compose -f docker-compose.yml -f docker-compose.filebrowser.yml logs filebrowser&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Just remember to add &lt;code>_index.md&lt;/code> and &lt;code>index.md&lt;/code> so that the captions match what you want to write&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/foldergram" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Foldergram | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/filebrowser" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Filebrowser | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>The &lt;a href="https://jalcocert.github.io/JAlcocerT/do-your-instagram/#web-audits" target="_blank" rel="noopener">web audits&lt;/a> &amp;hellip;were fine&lt;/p>
&lt;p>but the edits and uploads&amp;hellip;not there.&lt;/p>
&lt;p>So for the v3&amp;hellip;&lt;/p>
&lt;p>I just played around the forked oss foldergram project:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /foldergram&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Few Changes since I drafted this early 2026&lt;span class="absolute -mt-20" id="few-changes-since-i-drafted-this-early-2026">&lt;/span>
&lt;a href="#few-changes-since-i-drafted-this-early-2026" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ol>
&lt;li>&lt;a href="https://github.com/JAlcocerT/jalcocertech-services/tree/master/forms" target="_blank" rel="noopener">Formbricks&lt;/a> is a survey engine, not &lt;a href="https://github.com/JAlcocerT/poc_webs_magnet/blob/master/z-lead-capture.md" target="_blank" rel="noopener">a lead database&lt;/a>.&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/poc_webs_magnet&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc_webs_magnet
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make pb-install pb-bootstrap
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps -a --filter &amp;#34;name=pocketbase&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker exec pocketbase /pb/pocketbase --version&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps -a --filter &amp;#34;name=magnet&amp;#34; #auditmagnet-prod&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make docker-up &lt;span class="c1">#make dev&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker compose logs -f&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/pocketbase" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">PocketBase | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Remember, you can always do your &lt;a href="#still-want-a-wp" >wordpress stuff&lt;/a>.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#/remote-control&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx skills add https://github.com/alchaincyf/huashu-design --skill huashu-design&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>But considering that you can make &lt;a href="https://github.com/JAlcocerT/poc_webs_magnet/blob/master/z-why-a-onepager.md" target="_blank" rel="noopener">awsome one pagers&lt;/a> that are converted to the landing&amp;hellip;&lt;/p>
&lt;p>what for?&lt;/p>
&lt;pre class="mermaid mt-6">mindmap
root((PaaS))
Web Containers
WP
Ghost
LinkStack
SSG + CMS
HUGO
Astro
DIY Landing
Real Estate
ChatBots&lt;/pre>&lt;p>Yea, what for?&lt;/p>
&lt;pre class="mermaid mt-6">graph TD
A[www.jalcocertech.com] --> B(blog/YT 0$);
A --> C(DIY 0/$);
A --> D(Consult via Cal.com - DWY $$);
A --> E(Services - DFY $$$);&lt;/pre>&lt;!-- ![Cal.com stripe integration for booking a meeting](/blog_img/email/cal-email-stripe.png) -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/qFMN0oDeCFg" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Or formbricks&amp;hellip;.&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/LWt0pV2FMHs" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://studio.youtube.com/video/LWt0pV2FMHs/edit -->
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>If you are building websites, get inspired:&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://github.com/gridaco/grida" target="_blank" rel="noopener">https://github.com/gridaco/grida&lt;/a>&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>Apache v2 | Grida — Ambitious 2D Graphics Editor for the Web&lt;/p>
&lt;/blockquote>
&lt;h3>Interesting Features for any Web&lt;span class="absolute -mt-20" id="interesting-features-for-any-web">&lt;/span>
&lt;a href="#interesting-features-for-any-web" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>Pop up at time or location of page&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Maps ✅&lt;/p>
&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://github.com/roblabs/maps-withastro" target="_blank" rel="noopener">https://github.com/roblabs/maps-withastro&lt;/a> ✅&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Leaflet + OSM ✅&lt;/p>
&lt;/li>
&lt;li>
&lt;p>MapLibre ✅ - &lt;a href="https://github.com/roblabs/maps-withastro/blob/main/src/MapLibre.astro" target="_blank" rel="noopener">https://github.com/roblabs/maps-withastro/blob/main/src/MapLibre.astro&lt;/a>&lt;/p>
&lt;ul>
&lt;li>An open source &lt;strong>visual editor&lt;/strong> for the &amp;lsquo;&lt;strong>MapLibre Style&lt;/strong> Specification&amp;rsquo; - &lt;a href="https://github.com/maplibre/maputnik" target="_blank" rel="noopener">https://github.com/maplibre/maputnik&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>komoot embed OK&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Adding interactive globe with the countries you have visited&lt;/p>
&lt;ul>
&lt;li>From &lt;a href="https://github.com/IoTechCrafts/astro-bento-portfolio-ssg/blob/master/src/components/Globe.tsx" target="_blank" rel="noopener">astro bento portfolio&lt;/a> (d3 &amp;amp; solid-js library) ✅&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h4>How Ive improved my websites&lt;span class="absolute -mt-20" id="how-ive-improved-my-websites">&lt;/span>
&lt;a href="#how-ive-improved-my-websites" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>You can see:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://gitlab.com/JAlcocerT/fossengineer" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
foss | Github ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/BeyondAJourney" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
BaJ | Github ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;h5>FOSS&lt;span class="absolute -mt-20" id="foss">&lt;/span>
&lt;a href="#foss" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h5>&lt;p>Fossengineer Docs and Theme Directory!&lt;/p>
&lt;p>WIP&lt;/p>
&lt;ol>
&lt;li>Keep HUGO as SSG&lt;/li>
&lt;li>Create Doc like section as companion to the blog&lt;/li>
&lt;li>Create theme directory that works as per the config added at the &lt;a href="https://github.com/JAlcocerT/Home-Lab/tree/main" target="_blank" rel="noopener">homelab repo&lt;/a>&lt;/li>
&lt;/ol>
&lt;h5>BaJ&lt;span class="absolute -mt-20" id="baj">&lt;/span>
&lt;a href="#baj" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h5>&lt;p>Beyond a journey&amp;hellip;&lt;/p>
&lt;p>A project that I phased out for now, but with interesting learnings around astro and static websites.&lt;/p>
&lt;h3>Other Static CMS&lt;span class="absolute -mt-20" id="other-static-cms">&lt;/span>
&lt;a href="#other-static-cms" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>What are Static Site Generators?&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/zensical/zensical" target="_blank" rel="noopener">https://github.com/zensical/zensical&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>MIT | A modern static site generator by the Material for MkDocs team&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>&lt;a href="https://github.com/plentico/plenti" target="_blank" rel="noopener">https://github.com/plentico/plenti&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Apache v2 | &lt;strong>Static Site Generator&lt;/strong> with Go backend and Svelte frontend&lt;/p>
&lt;/blockquote>
&lt;p>Build-Time Render Engine (aka Static Site Generator) with Go backend and Svelte frontend&lt;/p>
&lt;p>Ships with a fully integrated Git-CMS that you can host for cheap/free right with your static site&lt;/p>
&lt;p>Install &lt;a href="https://snapcraft.io/plenti" target="_blank" rel="noopener">plenti&lt;/a>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">snap install plenti&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>As the author mentions: Plenti = Hugo + NetlifyCMS&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=T4b55nfZiIw -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/T4b55nfZiIw" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!--
https://www.youtube.com/watch?v=Gr3KTOnsWEM&amp;list=PLbWvcwWtuDm0tIrvD_xHvUXHBftbHDy5T
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/Gr3KTOnsWEM" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>This is a very cool proposal for landing pages see &lt;a href="https://plenti.co/themes" target="_blank" rel="noopener">https://plenti.co/themes&lt;/a> !&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://github.com/keystonejs/keystone" target="_blank" rel="noopener">https://github.com/keystonejs/keystone&lt;/a>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;a href="https://keystonejs.com/docs" target="_blank" rel="noopener">https://keystonejs.com/docs&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Keystone helps you build faster and scale further than any other CMS or App Framework. Describe your schema, and get a powerful GraphQL API &amp;amp; beautiful Management UI for your content and data.&lt;/p>
&lt;blockquote>
&lt;p>MIT | The superpowered headless CMS for Node.js — built with GraphQL and React&lt;/p>
&lt;/blockquote>
&lt;h3>What about GitLab Pages?&lt;span class="absolute -mt-20" id="what-about-gitlab-pages">&lt;/span>
&lt;a href="#what-about-gitlab-pages" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Hosting a static website can be simple, secure, and cost-effective.&lt;/p>
&lt;p>GitLab Pages embodies these qualities by providing developers with a straightforward platform for hosting static sites directly from GitLab repositories.&lt;/p>
&lt;p>GitLab Pages is an integrated feature within GitLab that allows users to publish static websites directly from repositories in their GitLab accounts.&lt;/p>
&lt;p>It supports various static site generators like Jekyll, Hugo, and others, or simply HTML, CSS, and JavaScript, making it a versatile option for all types of static content.&lt;/p>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">GitLab: Open Source and Self-Hostable with Docker 🐰&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;p>One of the distinguishing features of &lt;strong>GitLab is its open-source nature&lt;/strong> and the ability to self-host the platform using Docker.&lt;/p>
&lt;blockquote>
&lt;p>You dont need to - but you can go deep the &lt;strong>rabbit hole&lt;/strong> and have [full control of Gitlab]&lt;/p>
&lt;/blockquote>
&lt;p>This contrasts significantly with services like GitHub Pages, Firebase, and Cloudflare Pages, where you do not control the underlying infrastructure.&lt;/p>
&lt;p>&lt;strong>Key Comparisons:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Open Source&lt;/strong>: GitLab is fully open source, which allows users to inspect, modify, and enhance the source code, providing a level of transparency and customization that is not available in proprietary platforms like Firebase or fully managed environments like GitHub Pages and Cloudflare Pages.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Self-Hosting&lt;/strong>: With GitLab, you have the &lt;strong>option to self-host&lt;/strong> your entire DevOps platform using Docker. This offers complete control over your data and the infrastructure, which is particularly important for organizations with strict data sovereignty or privacy requirements.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Infrastructure Control&lt;/strong>: While platforms like GitHub Pages and Cloudflare Pages offer convenience and ease of use, they do not allow for infrastructure control. This means you rely entirely on their managed services, which can be a limitation if you need more control over performance optimizations, security settings, or compliance measures.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>By choosing &lt;strong>GitLab&lt;/strong>, you leverage the benefits of an &lt;strong>open ecosystem&lt;/strong> and the flexibility to host your own instance, ensuring that you have full authority over your development and hosting environment.&lt;/p>
&lt;/div>
&lt;/details>
&lt;p>Key Features of GitLab Pages&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Seamless Integration with GitLab&lt;/strong>: Directly connect your static site&amp;rsquo;s repository with GitLab Pages for continuous integration and deployment without leaving the GitLab ecosystem.&lt;/li>
&lt;li>&lt;strong>Custom Domain Support&lt;/strong>: Easily connect your custom domain to your GitLab Pages site with the added benefit of free SSL certificates provided by Let&amp;rsquo;s Encrypt.&lt;/li>
&lt;li>&lt;strong>Automatic HTTPS&lt;/strong>: Secure your site by default with HTTPS, enhancing security and trust for your visitors.&lt;/li>
&lt;li>&lt;strong>CI/CD Pipeline&lt;/strong>: Leverage GitLab&amp;rsquo;s powerful CI/CD tools to automate the build and deployment process, ensuring that updates are pushed live with minimal manual intervention.&lt;/li>
&lt;li>&lt;strong>Free and Unlimited&lt;/strong>: Yes, you read that right. GitLab Pages is completely free and offers unlimited bandwidth, so you can focus on building and sharing your projects without worrying about hidden costs.&lt;/li>
&lt;/ul>
&lt;p>Getting Started with GitLab Pages&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Set Up Your Project&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>Ensure your static site project is hosted in a GitLab repository. If you&amp;rsquo;re using a static site generator, set up your project according to the specific requirements of that generator.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Configure GitLab CI/CD&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>Create a &lt;code>.gitlab-ci.yml&lt;/code> file in the root of your repository to define the build and deployment process. GitLab Pages integrates with GitLab CI/CD to build and deploy your site whenever you push changes.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Enable GitLab Pages&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>In the project’s settings, navigate to the &amp;lsquo;Pages&amp;rsquo; section to configure and enable GitLab Pages. This will automatically deploy your site to a GitLab subdomain, which you can then link to a custom domain if preferred.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>Enhancing Your Static Site with GitLab Pages&lt;/p>
&lt;p>GitLab Pages is not just for serving static content.&lt;/p>
&lt;p>You can enhance site interactivity and functionality using modern web development approaches:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Client-Side JavaScript&lt;/strong>: Enrich your site with dynamic content and interactive elements using JavaScript frameworks like React or Vue.js.&lt;/li>
&lt;li>&lt;strong>Third-Party APIs&lt;/strong>: Integrate APIs to bring dynamic data into your static site, such as e-commerce platforms, CMSes, or social media feeds.&lt;/li>
&lt;li>&lt;strong>WebAssembly&lt;/strong>: Use WebAssembly for high-performance web applications directly in the browser, which can be hosted as part of your static GitLab Pages site.&lt;/li>
&lt;/ul>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/micro-saas/#creating-a-quick-landing" target="_blank" rel="noreferrer">&lt;img
alt="NEW - Make landing"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/shipping/make-landing2.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">NEW - Make landing&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Landing Page x TailWind x VanillaJS x email to SQLITE&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/how-to-create-a-waiting-list/#ssg-astro-waiting-list" target="_blank" rel="noreferrer">&lt;img
alt="NEW - Make landing"
loading="lazy"
decoding="async"
src="https://raw.githubusercontent.com/JAlcocerT/waiting-to-landing/main/screens/demoLight.webp"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">NEW - Make landing&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Creating the Waiting2Landing Concept x Formbricks&lt;/div>&lt;/a>
&lt;/div></description></item><item><title>Thermodynamics</title><link>https://JAlcocerT.github.io/JAlcocerT/thermodynamics/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/thermodynamics/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>&lt;a href="https://www.youtube.com/watch?v=oygSFCZZyoU" target="_blank" rel="noopener">Lisa&lt;/a>, in this house we obey the laws of thermodynamics!&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Guess what happens when you take &lt;a href="https://github.com/JAlcocerT/Py_Trip_Planner/tree/main/poc-trip-planner-v4" target="_blank" rel="noopener">trip planner v4&lt;/a>, the go solar with the batteries and rainny days, with&amp;hellip;&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /poc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> poc/ &lt;span class="c1">#z-trip-planner-v4&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>What Happens is that you can validate the &lt;a href="https://forocoches.com/foro/showthread.php?t=9806597" target="_blank" rel="noopener">results of ppl in forums&lt;/a>.&lt;/p>
&lt;p>Or just create a way to check if aerothermics applies to you from such &lt;a href="https://github.com/JAlcocerT/poc/blob/main/aerothermics/dev-plan.md" target="_blank" rel="noopener">dev plan&lt;/a>:&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/aerotermia.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Es una pregunta excelente, porque a primera vista parece que la aerotermia es una máquina de &amp;ldquo;energía infinita&amp;rdquo; o un movimiento perpetuo al darte &lt;strong>4 kWh&lt;/strong> de calor por cada &lt;strong>1 kWh&lt;/strong> que pagas.&lt;/p>
&lt;p>Sin embargo, no violamos absolutamente ninguna ley; de hecho, la aerotermia es un ejemplo perfecto de cumplimiento estricto de la termodinámica.&lt;/p>
&lt;p>El truco está en que la gente suele confundir &lt;strong>eficiencia&lt;/strong> con &lt;strong>rendimiento&lt;/strong>.&lt;/p>
&lt;p>Aquí te explico por qué no estamos rompiendo el universo:&lt;/p>
&lt;h3>1. Primera Ley: Conservación de la Energía&lt;span class="absolute -mt-20" id="1-primera-ley-conservación-de-la-energía">&lt;/span>
&lt;a href="#1-primera-ley-conservaci%c3%b3n-de-la-energ%c3%ada" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;blockquote>
&lt;p>&amp;ldquo;La energía no se crea ni se destruye, solo se transforma&amp;rdquo;.&lt;/p>
&lt;/blockquote>
&lt;p>Si tu Panasonic entrega &lt;strong>$4\text{ kW}$&lt;/strong> térmicos dentro de tu casa consumiendo solo &lt;strong>$1\text{ kW}$&lt;/strong> de electricidad, parece que hemos &amp;ldquo;creado&amp;rdquo; $3\text{ kW}$ de la nada. &lt;strong>Falso.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Balance:&lt;/strong> $1\text{ kW}$ (Electricidad) + $3\text{ kW}$ (Calor extraído del aire exterior) = &lt;strong>$4\text{ kW}$&lt;/strong> (Calor entregado en casa).&lt;/li>
&lt;li>La energía total se conserva perfectamente. La máquina no &amp;ldquo;crea&amp;rdquo; calor, simplemente lo &lt;strong>transporta&lt;/strong> de un lugar a otro usando la electricidad como vehículo.&lt;/li>
&lt;/ul>
&lt;h3>2. Segunda Ley: La Entropía y el Flujo de Calor&lt;span class="absolute -mt-20" id="2-segunda-ley-la-entropía-y-el-flujo-de-calor">&lt;/span>
&lt;a href="#2-segunda-ley-la-entrop%c3%ada-y-el-flujo-de-calor" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;blockquote>
&lt;p>&amp;ldquo;El calor fluye espontáneamente de lo caliente a lo frío&amp;rdquo;.&lt;/p>
&lt;/blockquote>
&lt;p>Esta ley dice que no puedes enfriar algo que ya está frío para calentar algo que está caliente sin &amp;ldquo;pagar un peaje&amp;rdquo;.&lt;/p>
&lt;ul>
&lt;li>Para mover calor &amp;ldquo;cuesta arriba&amp;rdquo; (del aire frío de la calle a tu casa caliente), la naturaleza exige un &lt;strong>trabajo externo&lt;/strong>.&lt;/li>
&lt;li>Ese trabajo es el que realiza tu &lt;strong>compresor&lt;/strong>. Si intentaras hacer esto sin electricidad, sería imposible. La aerotermia &amp;ldquo;paga&amp;rdquo; el peaje termodinámico con los vatios que generan tus placas solares.&lt;/li>
&lt;/ul>
&lt;h3>3. El concepto de Eficiencia vs. COP&lt;span class="absolute -mt-20" id="3-el-concepto-de-eficiencia-vs-cop">&lt;/span>
&lt;a href="#3-el-concepto-de-eficiencia-vs-cop" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>En un radiador eléctrico tradicional, el rendimiento es del &lt;strong>100%&lt;/strong> (1 kW luz = 1 kW calor). Ahí estás limitado por la Primera Ley de forma directa.&lt;/p>
&lt;p>En la aerotermia no hablamos de rendimiento térmico, sino de &lt;strong>$COP$ (Coefficient of Performance)&lt;/strong>. No es una medida de creación de energía, sino una medida de &lt;strong>capacidad de bombeo&lt;/strong>. Es como una bomba de agua:&lt;/p>
&lt;ul>
&lt;li>No necesitas la energía de 1000 litros de agua para mover 1000 litros de agua.&lt;/li>
&lt;li>Solo necesitas la energía necesaria para vencer la fricción y la gravedad.&lt;/li>
&lt;/ul>
&lt;h3>4. El Ciclo de Carnot: El límite real&lt;span class="absolute -mt-20" id="4-el-ciclo-de-carnot-el-límite-real">&lt;/span>
&lt;a href="#4-el-ciclo-de-carnot-el-l%c3%admite-real" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Existe un límite teórico máximo de eficiencia que ninguna máquina puede superar (el Ciclo de Carnot).&lt;/p>
&lt;p>$$COP_{max} = \frac{T_{caliente}}{T_{caliente} - T_{fria}}$$&lt;/p>
&lt;p>&lt;em>(Nota: Las temperaturas deben estar en Kelvin).&lt;/em>&lt;/p>
&lt;p>Si en Barcelona hace $10\text{°C}$ ($283\text{ K}$) y quieres tu casa a $20\text{°C}$ ($293\text{ K}$), el límite termodinámico teórico sería un &lt;strong>$COP$ de $29,3$&lt;/strong>. Como tu máquina tiene un &lt;strong>$COP$ real de $4$&lt;/strong>, estás lejísimos de violar las leyes de la física; de hecho, ¡todavía hay mucho margen de mejora tecnológica!&lt;/p>
&lt;p>&lt;strong>En conclusión:&lt;/strong> Tu sistema es tan eficiente no porque rompa las reglas, sino porque es lo suficientemente inteligente para dejar que la naturaleza (el aire exterior) haga la mayor parte del trabajo pesado, mientras tus placas solares solo se encargan de empujar ese calor hacia dentro.&lt;/p>
&lt;p>¿Te habías fijado que cuando la máquina calienta tu casa, el aire que sale de la unidad exterior está mucho más frío que el ambiente? Ahí es donde ves físicamente cómo le estás &amp;ldquo;robando&amp;rdquo; la energía a la calle.&lt;/p>
&lt;hr>
&lt;p>¡Exacto! Has dado en el clavo. La &lt;strong>entropía&lt;/strong> es la que dicta las reglas del juego, pero es la &lt;strong>entalpía&lt;/strong> la que nos permite llevar la contabilidad de la energía que entra y sale de tu casa.&lt;/p>
&lt;p>Para entender tu aerotermia como un físico, hay que mirar el &lt;strong>Ciclo de Rankine&lt;/strong> de refrigeración. Aquí tienes las ecuaciones clave:&lt;/p>
&lt;h3>1. La Primera Ley y la Entalpía ($H$)&lt;span class="absolute -mt-20" id="1-la-primera-ley-y-la-entalpía-h">&lt;/span>
&lt;a href="#1-la-primera-ley-y-la-entalp%c3%ada-h" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>En termodinámica, cuando trabajamos con fluidos en movimiento (como el refrigerante R32 de tu Panasonic), no usamos solo la energía interna, sino la &lt;strong>entalpía&lt;/strong> ($h = u + Pv$), que mide la energía total de un sistema incluyendo el trabajo necesario para desplazar el fluido.&lt;/p>
&lt;p>El balance de energía en cada componente de tu máquina se define por la diferencia de entalpías:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>En el Compresor (Consumo eléctrico):&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>$$w_c = h_2 - h_1$$&lt;/p>
&lt;p>&lt;em>(Donde $h_1$ es la entalpía al entrar al compresor y $h_2$ al salir).&lt;/em>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>En el Condensador (Calor que calienta tu casa):&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>$$q_{out} = h_2 - h_3$$&lt;/p>
&lt;ul>
&lt;li>&lt;strong>En el Evaporador (Calor que robas de la calle):&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>$$q_{in} = h_1 - h_4$$&lt;/p>
&lt;h3>2. La Segunda Ley y la Entropía ($S$)&lt;span class="absolute -mt-20" id="2-la-segunda-ley-y-la-entropía-s">&lt;/span>
&lt;a href="#2-la-segunda-ley-y-la-entrop%c3%ada-s" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Aquí es donde entra la &lt;strong>entropía&lt;/strong>. En un mundo ideal (adiabático e irreversible), el compresor sería &lt;strong>isentrópico&lt;/strong> ($s_1 = s_2$), es decir, la entropía no cambiaría.&lt;/p>
&lt;p>Sin embargo, en tu máquina real, el compresor genera fricción y calor interno, por lo que:&lt;/p>
&lt;p>$$s_2 &amp;gt; s_1$$&lt;/p>
&lt;p>Ese aumento de entropía es lo que hace que tu sistema no sea &amp;ldquo;perfecto&amp;rdquo; y necesites más electricidad de tus placas de la que dictaría la teoría pura.&lt;/p>
&lt;h3>3. La ecuación del COP (El resumen de tu ahorro)&lt;span class="absolute -mt-20" id="3-la-ecuación-del-cop-el-resumen-de-tu-ahorro">&lt;/span>
&lt;a href="#3-la-ecuaci%c3%b3n-del-cop-el-resumen-de-tu-ahorro" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Combinando las entalpías, podemos calcular el rendimiento real de tu instalación:&lt;/p>
&lt;p>$$COP_{calefacción} = \frac{q_{out}}{w_c} = \frac{h_2 - h_3}{h_2 - h_1}$$&lt;/p>
&lt;p>Esta ecuación explica por qué tu sistema es tan eficiente: la diferencia de entalpía que obtienes en el condensador ($h_2 - h_3$) es mucho mayor que el trabajo que le pides al compresor ($h_2 - h_1$).&lt;/p>
&lt;h3>4. El Diagrama $P\text{-}h$ (Presión-Entalpía)&lt;span class="absolute -mt-20" id="4-el-diagrama-ptext-h-presión-entalpía">&lt;/span>
&lt;a href="#4-el-diagrama-ptext-h-presi%c3%b3n-entalp%c3%ada" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Los ingenieros no usan fotos para ver cómo funciona tu Panasonic, usan este diagrama. Es el &amp;ldquo;mapa&amp;rdquo; de lo que ocurre dentro de los tubos:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Eje Vertical:&lt;/strong> Presión ($P$).&lt;/li>
&lt;li>&lt;strong>Eje Horizontal:&lt;/strong> Entalpía ($h$).&lt;/li>
&lt;/ul>
&lt;p>En este gráfico se ve claramente cómo la válvula de expansión reduce la presión sin cambiar la entalpía (proceso &lt;strong>isentálpico&lt;/strong>, $h_3 = h_4$), pero el compresor aumenta tanto la presión como la entalpía para poder soltar el calor dentro de tu salón.&lt;/p>
&lt;hr>
&lt;h3>Resumen termodinámico para tu caso:&lt;span class="absolute -mt-20" id="resumen-termodinámico-para-tu-caso">&lt;/span>
&lt;a href="#resumen-termodin%c3%a1mico-para-tu-caso" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Entalpía:&lt;/strong> Es el &lt;strong>&amp;ldquo;cuánto&amp;rdquo;&lt;/strong>. Te dice cuántos Julios de calor estás moviendo realmente.&lt;/li>
&lt;li>&lt;strong>Entropía:&lt;/strong> Es el &lt;strong>&amp;ldquo;por qué&amp;rdquo;&lt;/strong>. Te explica por qué necesitas un compresor eléctrico y por qué el calor no entra solo a tu casa desde el frío exterior (la naturaleza prohíbe que la entropía del universo disminuya sin realizar un trabajo).&lt;/li>
&lt;/ul>
&lt;p>¡Exacto! Tienes una memoria termodinámica excelente. Estás pensando en la relación &lt;strong>$T \cdot \Delta S$&lt;/strong>.&lt;/p>
&lt;p>Esta combinación aparece principalmente por dos motivos fundamentales: para calcular el &lt;strong>calor&lt;/strong> en procesos reversibles y para entender la &lt;strong>exergía&lt;/strong> (la energía que realmente es útil).&lt;/p>
&lt;h3>1. La definición de Calor ($Q$)&lt;span class="absolute -mt-20" id="1-la-definición-de-calor-q">&lt;/span>
&lt;a href="#1-la-definici%c3%b3n-de-calor-q" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>En un proceso reversible, el calor transferido se define mediante la temperatura absoluta ($T$) y el cambio de entropía ($dS$):&lt;/p>
&lt;p>$$dQ = T \cdot dS$$&lt;/p>
&lt;p>Si integramos esto, tenemos que el calor total es:&lt;/p>
&lt;p>$$Q = \int T , dS$$&lt;/p>
&lt;p>&lt;strong>¿Para qué sirve en tu aerotermia?&lt;/strong>
En el diagrama de tu ciclo (específicamente en un diagrama &lt;strong>T-s&lt;/strong>, Temperatura vs Entropía), el área encerrada bajo la curva representa el calor que estás moviendo. Multiplicar la temperatura por el cambio de entropía te da la cantidad de energía en forma de calor que has logrado &amp;ldquo;bombear&amp;rdquo; desde el aire de la calle hacia tus fancoils.&lt;/p>
&lt;hr>
&lt;h3>2. La Energía Libre de Gibbs ($G$)&lt;span class="absolute -mt-20" id="2-la-energía-libre-de-gibbs-g">&lt;/span>
&lt;a href="#2-la-energ%c3%ada-libre-de-gibbs-g" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Esta es quizás la ecuación más famosa que utiliza ese término:&lt;/p>
&lt;p>$$G = H - T \cdot S$$&lt;/p>
&lt;p>O, en su forma de cambio:&lt;/p>
&lt;p>$$\Delta G = \Delta H - T \cdot \Delta S$$&lt;/p>
&lt;ul>
&lt;li>&lt;strong>$\Delta H$ (Entalpía):&lt;/strong> Es la energía total que se mueve.&lt;/li>
&lt;li>&lt;strong>$T \cdot \Delta S$:&lt;/strong> Es la energía &amp;ldquo;degradada&amp;rdquo; o &amp;ldquo;impuesto de la naturaleza&amp;rdquo;. Representa la energía que se pierde inevitablemente debido al desorden (entropía).&lt;/li>
&lt;li>&lt;strong>$\Delta G$:&lt;/strong> Es el trabajo útil que nos queda disponible.&lt;/li>
&lt;/ul>
&lt;p>En tu aerotermia, el término &lt;strong>$T \cdot \Delta S$&lt;/strong> representa la energía que se gasta simplemente en &amp;ldquo;vencer&amp;rdquo; las leyes de la física para mover el calor de un sitio frío a uno caliente. Cuanto mayor sea este término, más electricidad tendrán que aportar tus placas para compensar esa ineficiencia.&lt;/p>
&lt;hr>
&lt;h3>3. El Trabajo Perdido (Teorema de Gouy-Stodola)&lt;span class="absolute -mt-20" id="3-el-trabajo-perdido-teorema-de-gouy-stodola">&lt;/span>
&lt;a href="#3-el-trabajo-perdido-teorema-de-gouy-stodola" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Hay una ecuación específica para calcular cuánto estás desperdiciando en tu sistema debido a las irreversibilidades (fricción en el compresor, turbulencias del gas, etc.):&lt;/p>
&lt;p>$$W_{perdido} = T_{ambiente} \cdot \Delta S_{universo}$$&lt;/p>
&lt;p>Esta ecuación te dice que por cada grado de entropía que generas, multiplicas esa pérdida por la temperatura exterior.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Dato curioso:&lt;/strong> Esto explica por qué en &lt;strong>Polonia&lt;/strong> (con una $T_{ambiente}$ muy baja) el sistema es tan sensible. Cualquier ineficiencia se paga cara porque la termodinámica es mucho más implacable cuando intentas &amp;ldquo;ordenar&amp;rdquo; energía en ambientes muy fríos.&lt;/li>
&lt;/ul>
&lt;h3>Resumen visual:&lt;span class="absolute -mt-20" id="resumen-visual">&lt;/span>
&lt;a href="#resumen-visual" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Si la &lt;strong>Entalpía ($H$)&lt;/strong> es todo el dinero que tienes en la cartera, el término &lt;strong>$T \cdot S$&lt;/strong> es la parte de ese dinero que la inflación (la entropía) hace que no puedas gastar en nada útil. Lo que te queda para comprar (calentar la casa) es lo que realmente importa.&lt;/p>
&lt;p>¿Te suena haber visto estos diagramas de &lt;strong>Temperatura-Entropía (T-s)&lt;/strong> en algún momento de tu reforma o cuando investigabas la Panasonic? Son los que tienen forma de &amp;ldquo;campana&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Looking for similar &lt;strong>decision intelligence&lt;/strong> tools?&lt;/p>
&lt;p>Reach out throughput and outcomes, &lt;del>not availability&lt;/del>:&lt;/p>
&lt;h3>Aerotermia PoC x RPi DHT22&lt;span class="absolute -mt-20" id="aerotermia-poc-x-rpi-dht22">&lt;/span>
&lt;a href="#aerotermia-poc-x-rpi-dht22" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>What if&amp;hellip;you would actually have data for your in home temp and humidity?&lt;/p>
&lt;blockquote>
&lt;p>yes, &lt;a href="https://github.com/JAlcocerT/poc/blob/main/aerothermics/z-home-check.md" target="_blank" rel="noopener">your home&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;p>oh, it seems we &lt;a href="https://jalcocert.github.io/JAlcocerT/plants-102-and-iot/#current-setup-mqtt-dht22-pgsql" target="_blank" rel="noopener">did that&lt;/a> already :)&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./RPi/Z_MicroControllers/RPiPicoW/picow-dht-webapp&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>so&amp;hellip;lets pull from pgsql&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps | grep timescaledb&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> -it timescaledb psql -U pico -d sensors -c &lt;span class="s2">&amp;#34;SELECT topic, count(*) AS rows, min(ts) AS first_seen, max(ts) AS last_seen FROM readings GROUP BY topic ORDER BY count(*) DESC;&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>With&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> -i timescaledb psql -U pico -d sensors -c &lt;span class="s2">&amp;#34;\COPY (SELECT time_bucket(&amp;#39;1 hour&amp;#39;, ts) AS timestamp, avg(value) FILTER (WHERE topic = &amp;#39;pico/temperature/dht22&amp;#39;) AS T_indoor_C, avg(value) FILTER (WHERE topic = &amp;#39;pico/humidity/dht22&amp;#39;) AS RH_indoor_pct, count(*) FILTER (WHERE topic = &amp;#39;pico/temperature/dht22&amp;#39;) AS samples FROM readings WHERE topic IN (&amp;#39;pico/temperature/dht22&amp;#39;, &amp;#39;pico/humidity/dht22&amp;#39;) AND ts &amp;gt;= NOW() - INTERVAL &amp;#39;1 year&amp;#39; GROUP BY 1 HAVING count(*) FILTER (WHERE topic = &amp;#39;pico/temperature/dht22&amp;#39;) &amp;gt; 0 ORDER BY 1) TO STDOUT WITH (FORMAT CSV, HEADER true)&amp;#34;&lt;/span> &amp;gt; dht22_hourly.csv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;Add DHT22 hourly data&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git push&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Diurnal pattern (clean as a textbook):&lt;/p>
&lt;p>3-4 AM: coolest, 22.08°C, RH peaks ~40%
5-9 AM: warming kicks in, 22.6 → 23.5°C
13-14 PM: warmest, 24.10°C, RH lowest ~35%
17-22 PM: gentle cooldown to 22.5°C&lt;/p>
&lt;p>There are &lt;a href="https://github.com/JAlcocerT/poc/blob/main/aerothermics/z-next-steps.md" target="_blank" rel="noopener">some next steps&lt;/a> for the end of this year :)&lt;/p>
&lt;p>Will this ever become a &lt;code>energysolutions.jalcocertech.com&lt;/code>?&lt;/p>
&lt;p>Someone told me a long time ago that I would end up doing sth around energy and engineering, so who knows :)&lt;/p></description></item><item><title>FEM and a SelfOptimizing design loop</title><link>https://JAlcocerT.github.io/JAlcocerT/fem/</link><pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/fem/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>In the MBSD series we asked &lt;em>where does each part go and how fast&lt;/em>.&lt;/p>
&lt;p>FEM asks &lt;em>what happens to the material when it gets there&lt;/em>.&lt;/p>
&lt;p>Same bodies, different question — motion becomes deformation.&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Every post in the MBSD series treated mechanical bodies as &lt;strong>rigid&lt;/strong>: a crank doesn&amp;rsquo;t bend, a connecting rod doesn&amp;rsquo;t stretch, a suspension wishbone doesn&amp;rsquo;t flex.&lt;/p>
&lt;p>That assumption is what makes the equations of motion tractable — you get a clean ODE system for generalised coordinates $q(t)$ and integrate forward in time.&lt;/p>
&lt;p>But real parts do deform. The cyclic loading from a firing I4 engine (&lt;a href="https://jalcocert.github.io/JAlcocerT/inline-4-engine-analysis/" target="_blank" rel="noopener">see the engine NVH post&lt;/a>) subjects the crankshaft to millions of bending and torsion cycles. The question MBSD cannot answer is: &lt;em>what does that do to the material?&lt;/em> That is the domain of &lt;strong>Finite Element Analysis&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2>From Motion to Deformation&lt;span class="absolute -mt-20" id="from-motion-to-deformation">&lt;/span>
&lt;a href="#from-motion-to-deformation" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Will the &lt;a href="https://jalcocert.github.io/JAlcocerT/design-centric-mbsd/" target="_blank" rel="noopener">mechanisms designed as per the mbsd framework&lt;/a> break in their operations?&lt;/p>
&lt;h3>The Rigid Body Assumption (and When It Breaks)&lt;span class="absolute -mt-20" id="the-rigid-body-assumption-and-when-it-breaks">&lt;/span>
&lt;a href="#the-rigid-body-assumption-and-when-it-breaks" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>In every MBSD model, each body has a fixed mass $m$ and inertia tensor $\mathbf{I}$.&lt;/p>
&lt;p>Forces produce accelerations.&lt;/p>
&lt;p>The body moves as a whole — its shape never changes.&lt;/p>
&lt;p>This is valid as long as structural deformations are small compared to the motion itself, which is true for most kinematic and dynamic analyses.&lt;/p>
&lt;p>FEM drops that assumption.&lt;/p>
&lt;p>A body is no longer a point mass or a rigid solid — it is a &lt;strong>continuous elastic medium&lt;/strong>.&lt;/p>
&lt;p>The goal shifts from integrating trajectories to finding a &lt;strong>displacement field&lt;/strong> $\mathbf{u}(\mathbf{x})$: at every point in the solid, how much does the material move under load?&lt;/p>
&lt;h3>The Core FEM Equation&lt;span class="absolute -mt-20" id="the-core-fem-equation">&lt;/span>
&lt;a href="#the-core-fem-equation" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Where MBSD gives you:&lt;/p>
&lt;p>$$\mathbf{M}\ddot{q} + \mathbf{C}\dot{q} + \mathbf{K}q = \mathbf{F}(t)$$&lt;/p>
&lt;p>FEM (in its static structural form) gives you:&lt;/p>
&lt;p>$$\mathbf{K},\mathbf{u} = \mathbf{F}$$&lt;/p>
&lt;p>The stiffness matrix $\mathbf{K}$ encodes the material and geometry of the part. $\mathbf{F}$ is the applied load vector. $\mathbf{u}$ is the displacement at every node of the mesh — the answer you are looking for.&lt;/p>
&lt;p>From $\mathbf{u}$ you derive &lt;strong>strain&lt;/strong> $\boldsymbol{\varepsilon}$ (how much the material stretches) and &lt;strong>stress&lt;/strong> $\boldsymbol{\sigma}$ (the internal force per unit area), connected by the material&amp;rsquo;s constitutive law:&lt;/p>
&lt;p>$$\boldsymbol{\sigma} = \mathbf{C},\boldsymbol{\varepsilon}$$&lt;/p>
&lt;p>where $\mathbf{C}$ is the elasticity tensor (for isotropic materials it collapses to just Young&amp;rsquo;s modulus $E$ and Poisson&amp;rsquo;s ratio $\nu$).&lt;/p>
&lt;h3>How the Mesh Works&lt;span class="absolute -mt-20" id="how-the-mesh-works">&lt;/span>
&lt;a href="#how-the-mesh-works" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>FEM discretises the continuous domain into small &lt;strong>elements&lt;/strong> — triangles and quads in 2D, tetrahedra and hexahedra in 3D. Over each element, the displacement is approximated by &lt;strong>shape functions&lt;/strong> $N_i(\mathbf{x})$ that interpolate between nodal values.&lt;/p>
&lt;p>The element stiffness matrix $\mathbf{k}_e$ is computed by integrating over the element volume:&lt;/p>
&lt;p>$$\mathbf{k}&lt;em>e = \int&lt;/em>{V_e} \mathbf{B}^T \mathbf{C}, \mathbf{B}, dV$$&lt;/p>
&lt;p>where $\mathbf{B}$ is the strain-displacement matrix (derivatives of the shape functions).&lt;/p>
&lt;p>Global $\mathbf{K}$ is assembled by summing all element contributions — same idea as assembling the global mass matrix in a rigid-body model.&lt;/p>
&lt;h3>The Link Back to the MBSD Series&lt;span class="absolute -mt-20" id="the-link-back-to-the-mbsd-series">&lt;/span>
&lt;a href="#the-link-back-to-the-mbsd-series" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The two methods are not alternatives — they are &lt;strong>sequential&lt;/strong> in a real design loop:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>MBSD&lt;/strong> → compute the dynamic loads at each joint over the operating cycle (e.g. peak crank bearing force at 6000 rpm from the I4 model)&lt;/li>
&lt;li>&lt;strong>FEM&lt;/strong> → apply those loads to the part geometry, find where stress concentrations appear&lt;/li>
&lt;li>&lt;strong>Optimise&lt;/strong> → reshape the geometry to move stress peaks, reduce mass, or extend fatigue life&lt;/li>
&lt;li>&lt;strong>Repeat&lt;/strong> → the updated geometry changes the inertia, so you go back to step 1&lt;/li>
&lt;/ol>
&lt;p>This is the &lt;em>self-optimising design loop&lt;/em> in the post title. MBSD provides the boundary conditions; FEM evaluates the structure under them.&lt;/p>
&lt;p>The dimensional reduction idea from the MBSD series still applies here: a 2D plane-stress FEM on a crank cross-section is fast and informative before committing to a full 3D solid mesh.&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>MBSD tells you how parts move. FEM tells you whether they survive the trip.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/JAlcocerT/3Design/blob/main/z-freecad/fem-guide.md" target="_blank" rel="noopener">https://github.com/JAlcocerT/3Design/blob/main/z-freecad/fem-guide.md&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/3Design&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#freecad&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">exec&lt;span class="o">(&lt;/span>open&lt;span class="o">(&lt;/span>&lt;span class="s2">&amp;#34;/home/jalcocert/Desktop/3Design/z-freecad/slider_crank_fem.py&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>.read&lt;span class="o">())&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">Writing time CalculiX input file: 0.006 seconds.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">CalculiX solver run...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">CalculiX finished without error.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">CalculiX read results...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Read ccx results from frd file: /tmp/fcfem_joytblqk/FEMMeshGmsh.frd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Read ccx results from dat file: /tmp/fcfem_joytblqk/FEMMeshGmsh.dat
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Solver: True
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">── FEM Results ──────────────────────────────────
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Motor torque: 10.0 Nm
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Crank length: 100 mm
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Applied pin force: 100.0 N
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Material: AlMgSi1F31
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Max von Mises: 2.9595 MPa
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Mean von Mises: 0.6178 MPa
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Yield strength: 276 MPa (Al 6061-T6)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Safety factor: 93.26
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> OK — passes static check.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Max displacement: 0.0067 mm
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">─────────────────────────────────────────────────&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/data-experiments/freecad-fem.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-yellow-100 bg-yellow-50 text-yellow-900 dark:border-yellow-200/30 dark:bg-yellow-700/30 dark:text-yellow-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
⚠️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
FreeCAD FEM is a first-pass sanity check, not a production analysis tool.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>Running them in sequence — loads from dynamics, stress from FEM, geometry update, repeat — is what the self-optimising loop in the title actually means.&lt;/p>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Can FreeCAD do this?&lt;span class="absolute -mt-20" id="can-freecad-do-this">&lt;/span>
&lt;a href="#can-freecad-do-this" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Yes. FreeCAD’s &lt;strong>FEM Workbench&lt;/strong> is a fully capable GUI-driven FEM environment at no cost:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Solver backend&lt;/strong>: CalculiX for structural and thermal analysis; Elmer for multiphysics (electromagnetics, fluid-structure interaction)&lt;/li>
&lt;li>&lt;strong>Meshing&lt;/strong>: Gmsh or Netgen built in — you define the geometry in FreeCAD’s Part/PartDesign workbench and mesh it directly&lt;/li>
&lt;li>&lt;strong>Workflow&lt;/strong>: import a STEP file (e.g. from CadQuery), assign material properties, apply boundary conditions (fixed face, force, pressure), run, and visualise stress/displacement contours&lt;/li>
&lt;/ul>
&lt;p>For the MBSD design loop this means: export the crank geometry from CadQuery → open in FreeCAD FEM → apply the peak bearing loads from the MBSD model → read off the von Mises stress map.&lt;/p>
&lt;p>The &lt;strong>CfdOF add-on&lt;/strong> adds CFD (via OpenFOAM) to the same geometry, so you can do both structural and flow analysis from one tool.&lt;/p>
&lt;hr>
&lt;h3>OSS Programs and Python Libraries for FEM&lt;span class="absolute -mt-20" id="oss-programs-and-python-libraries-for-fem">&lt;/span>
&lt;a href="#oss-programs-and-python-libraries-for-fem" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;strong>GUI / standalone solvers:&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Tool&lt;/th>
&lt;th style="text-align:left">What it does&lt;/th>
&lt;th style="text-align:left">Notes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>FreeCAD FEM&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Structural + thermal FEM via CalculiX / Elmer&lt;/td>
&lt;td style="text-align:left">Best GUI entry point; free&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Elmer FEM&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Multiphysics solver (structural, EM, FSI)&lt;/td>
&lt;td style="text-align:left">Finnish government-backed; own GUI&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>CalculiX&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Structural FEM, Abaqus-compatible input&lt;/td>
&lt;td style="text-align:left">No GUI, but FreeCAD wraps it&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Code_Aster&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Large-scale structural/thermo-mechanical&lt;/td>
&lt;td style="text-align:left">Used by EDF; very mature&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Salome-Meca&lt;/strong>&lt;/td>
&lt;td style="text-align:left">GUI front-end for Code_Aster&lt;/td>
&lt;td style="text-align:left">Ships together as a bundle&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Python libraries:&lt;/strong>&lt;/p>
&lt;h3>The Heavyweights (Research and Multiphysics)&lt;span class="absolute -mt-20" id="the-heavyweights-research-and-multiphysics">&lt;/span>
&lt;a href="#the-heavyweights-research-and-multiphysics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>For solving complex PDEs — structural stress, heat dissipation, electromagnetics:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>FEniCS / FEniCSx&lt;/strong> — write the weak form of your physics in Python using UFL; it generates optimised C++ under the hood. Best for custom physics and HPC.&lt;/li>
&lt;li>&lt;strong>Firedrake&lt;/strong> — same UFL input language as FEniCS, different parallel backend. Excellent for unstructured tetrahedral meshes.&lt;/li>
&lt;li>&lt;strong>SfePy&lt;/strong> — batteries-included: pre-built solvers for fluid-structure interaction, heat conduction, acoustics. Less setup than FEniCS.&lt;/li>
&lt;/ul>
&lt;h3>Specialised for Engineering&lt;span class="absolute -mt-20" id="specialised-for-engineering">&lt;/span>
&lt;a href="#specialised-for-engineering" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Akantu&lt;/strong> — C++ core with a Python interface; designed for solid mechanics, contact, and fracture.&lt;/li>
&lt;li>&lt;strong>CALFEM for Python&lt;/strong> — port of the Lund University MATLAB toolkit. Transparent and educational; ideal if you want to see every matrix assembly step.&lt;/li>
&lt;li>&lt;strong>PyFEA&lt;/strong> — lightweight 2D/3D structural analysis; good for quick parametric studies.&lt;/li>
&lt;/ul>
&lt;h3>The Full Pipeline (CAD → Mesh → Solve → Visualise)&lt;span class="absolute -mt-20" id="the-full-pipeline-cad--mesh--solve--visualise">&lt;/span>
&lt;a href="#the-full-pipeline-cad--mesh--solve--visualise" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Step&lt;/th>
&lt;th style="text-align:left">Tool&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Geometry (CAD)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">CadQuery (Python) or FreeCAD&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Meshing&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Gmsh + &lt;code>gmsh-sdk&lt;/code> Python API&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Solving&lt;/strong>&lt;/td>
&lt;td style="text-align:left">FEniCS, SfePy, or CalculiX&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Visualisation&lt;/strong>&lt;/td>
&lt;td style="text-align:left">PyVista (VTK wrapper) or ParaView&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3>Which one should you pick?&lt;span class="absolute -mt-20" id="which-one-should-you-pick">&lt;/span>
&lt;a href="#which-one-should-you-pick" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">If you want&amp;hellip;&lt;/th>
&lt;th style="text-align:left">Use this&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>To learn FEM from scratch&lt;/strong>&lt;/td>
&lt;td style="text-align:left">CALFEM&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>GUI with no coding&lt;/strong>&lt;/td>
&lt;td style="text-align:left">FreeCAD FEM Workbench&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Custom PDEs / research&lt;/strong>&lt;/td>
&lt;td style="text-align:left">FEniCS / Firedrake&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Ready-to-go structural solvers&lt;/strong>&lt;/td>
&lt;td style="text-align:left">SfePy or Akantu&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Interactive 3D results in Python&lt;/strong>&lt;/td>
&lt;td style="text-align:left">PyVista&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h3>A Minimal FEM Example in Pure Python&lt;span class="absolute -mt-20" id="a-minimal-fem-example-in-pure-python">&lt;/span>
&lt;a href="#a-minimal-fem-example-in-pure-python" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The following assembles the global stiffness matrix $\mathbf{K}$ and solves $\mathbf{K}\mathbf{u} = \mathbf{F}$ for a simple two-element bar — the same matrix equation from the theory section, made concrete with numpy:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Two-element bar: 3 nodes, fixed at node 0, 10 kN load at node 2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Steel: E = 200 GPa, cross-section A = 1e-4 m^2, element length L = 0.5 m&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">E&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">L&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">200e9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">1e-4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">0.5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">k&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">E&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">A&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">L&lt;/span> &lt;span class="c1"># element axial stiffness&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Assemble global stiffness matrix (3x3)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">K&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">([&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span> &lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">k&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Apply BC: node 0 fixed (u0 = 0) — reduce system to free DOFs&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">K_free&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">K&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">:,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">F_free&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="mf">0.0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">10e3&lt;/span>&lt;span class="p">])&lt;/span> &lt;span class="c1"># 10 kN at node 2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Solve&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">u_free&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">linalg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">solve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">K_free&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">F_free&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">u&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="mf">0.0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">u_free&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Recover stress in each element: σ = E · ε = E · Δu / L&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">sigma&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">E&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">u&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">u&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">])&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">L&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Displacements: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">u&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mf">1e3&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> mm&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Stress element 1: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">sigma&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mf">1e6&lt;/span>&lt;span class="si">:&lt;/span>&lt;span class="s2">.1f&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> MPa&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Stress element 2: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">sigma&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mf">1e6&lt;/span>&lt;span class="si">:&lt;/span>&lt;span class="s2">.1f&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> MPa&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This is the same $\mathbf{K}\mathbf{u} = \mathbf{F}$ the theory describes, assembled by hand. Real FEM libraries do the same thing — just for thousands of elements in 3D, with shape functions handling the geometry automatically.&lt;/p></description></item><item><title>Heat Transfer (+ Go Solar PoC)</title><link>https://JAlcocerT.github.io/JAlcocerT/heat-transfer-ice/</link><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/heat-transfer-ice/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Who could have guessed that behind some IoT for watering plants you could find out the VPD concept.&lt;/p>
&lt;p>That can be also very helpful if your are planning to automate the windows of a future greenhouse with a PID.&lt;/p>
&lt;p>who.could.have.guessed.&lt;/p>
&lt;p>But there is a more direct line back to the MBSD series.&lt;/p>
&lt;p>Every engine post assumed rigid, isothermal parts.&lt;/p>
&lt;p>In reality, a crankshaft running at 6000 rpm is also a heat exchanger — combustion gases heat the piston crown, the cylinder wall carries that heat to the coolant, and the material properties of every part change with temperature.&lt;/p>
&lt;p>A crank that passes FEM at room temperature may fail at operating temperature because yield strength drops. That is the domain of heat transfer.&lt;/p>
&lt;p>The full engineering loop across these posts is:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Discipline&lt;/th>
&lt;th style="text-align:left">Question&lt;/th>
&lt;th style="text-align:left">Feeds into&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Fluid mechanics&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Where do the combustion forces come from?&lt;/td>
&lt;td style="text-align:left">MBSD&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>MBSD&lt;/strong>&lt;/td>
&lt;td style="text-align:left">How do bodies move under those forces?&lt;/td>
&lt;td style="text-align:left">FEM + Heat&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>FEM&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Does the part survive the mechanical load?&lt;/td>
&lt;td style="text-align:left">Design loop&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Heat transfer&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Does the part survive the thermal load?&lt;/td>
&lt;td style="text-align:left">Design loop&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2>The HEAT Physics&lt;span class="absolute -mt-20" id="the-heat-physics">&lt;/span>
&lt;a href="#the-heat-physics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Heat transfer is the fourth leg of the engineering loop: fluid mechanics computes combustion forces, MBSD propagates them through the mechanism, FEM checks if parts survive mechanically — and heat transfer tells you whether they survive thermally.&lt;/p>
&lt;p>In Electromagnetism, you have the four &lt;strong>Maxwell’s Equations&lt;/strong> which cover everything from how charges create fields to how moving magnets create electricity.&lt;/p>
&lt;p>In Heat Transfer, while there is one &amp;ldquo;Master Equation,&amp;rdquo; the complexity comes from the fact that heat moves in three fundamentally different ways.&lt;/p>
&lt;p>You can think of it as one law that wears three different &amp;ldquo;outfits.&amp;rdquo;&lt;/p>
&lt;h3>The &amp;ldquo;Master&amp;rdquo; Equation (The Heat Equation)&lt;span class="absolute -mt-20" id="the-master-equation-the-heat-equation">&lt;/span>
&lt;a href="#the-master-equation-the-heat-equation" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The single equation you are likely thinking of is the &lt;strong>Heat Diffusion Equation&lt;/strong>:&lt;/p>
&lt;p>$$\frac{\partial T}{\partial t} = \alpha \nabla^2 T$$&lt;/p>
&lt;p>This equation is the &amp;ldquo;boss.&amp;rdquo;&lt;/p>
&lt;p>It describes how temperature ($T$) changes over time ($t$) across a space.&lt;/p>
&lt;p>However, this primarily governs &lt;strong>Conduction&lt;/strong>.&lt;/p>
&lt;p>To actually solve a real-world problem, you have to &amp;ldquo;plug in&amp;rdquo; the specific laws for how heat enters or leaves the system.&lt;/p>
&lt;h3>The &amp;ldquo;Three Laws&amp;rdquo; of Heat Transfer&lt;span class="absolute -mt-20" id="the-three-laws-of-heat-transfer">&lt;/span>
&lt;a href="#the-three-laws-of-heat-transfer" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Unlike Maxwell&amp;rsquo;s equations, which are usually solved together, heat transfer is often broken down into these three distinct physical mechanisms:&lt;/p>
&lt;p>A. Conduction (Fourier’s Law)&lt;/p>
&lt;p>This is heat moving through a solid.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Law:&lt;/strong> $q = -k \nabla T$&lt;/li>
&lt;li>&lt;strong>The Logic:&lt;/strong> Heat flows from hot to cold at a rate proportional to the material&amp;rsquo;s &amp;ldquo;conductivity&amp;rdquo; ($k$).&lt;/li>
&lt;/ul>
&lt;p>B. Convection (Newton’s Law of Cooling)&lt;/p>
&lt;p>This is heat moving between a surface and a moving fluid (air or water).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Law:&lt;/strong> $q = h(T_s - T_\infty)$&lt;/li>
&lt;li>&lt;strong>The Logic:&lt;/strong> The faster the fluid moves or the larger the surface area, the more heat is stripped away.&lt;/li>
&lt;/ul>
&lt;p>C. Radiation (Stefan-Boltzmann Law)&lt;/p>
&lt;p>This is heat moving via electromagnetic waves (no medium required).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Law:&lt;/strong> $q = \epsilon \sigma (T_s^4 - T_{sur}^4)$&lt;/li>
&lt;li>&lt;strong>The Logic:&lt;/strong> This is the &amp;ldquo;wild card.&amp;rdquo; Because it is $T^4$, doubling the temperature doesn&amp;rsquo;t double the heat—it increases it &lt;strong>16x&lt;/strong>. This is why lightbulbs and stars are so intense.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Why it feels like &amp;ldquo;One Equation&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>The reason it feels like there is only one equation compared to Electromagnetism is &lt;strong>Energy Conservation&lt;/strong>.&lt;/p>
&lt;p>In EM, you have to track Electric fields ($E$) and Magnetic fields ($B$)—two different entities that interact. In Heat Transfer, you are only tracking one thing: &lt;strong>Internal Energy (Temperature)&lt;/strong>.&lt;/p>
&lt;p>Every heat transfer problem is essentially just an accounting balance:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>[Energy In] - [Energy Out] + [Energy Generated] = [Change in Stored Energy]&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;h4>The &amp;ldquo;Math Fight&amp;rdquo;&lt;span class="absolute -mt-20" id="the-math-fight">&lt;/span>
&lt;a href="#the-math-fight" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>The reason people &amp;ldquo;fight&amp;rdquo; with this math isn&amp;rsquo;t because there are too many equations, but because of &lt;strong>Boundary Conditions&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Electromagnetism:&lt;/strong> You often deal with vacuum or uniform materials.&lt;/li>
&lt;li>&lt;strong>Heat Transfer:&lt;/strong> You have to deal with the &amp;ldquo;real world&amp;rdquo; at the edges. One side of your metal plate might be touching cold water (Convection), while the other side is being hit by a laser (Radiation), and the inside is generating heat because of electricity (Joule Heating).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>In short:&lt;/strong> You have one main &amp;ldquo;accounting&amp;rdquo; equation (The Heat Equation), but you have to use the three specific laws (Fourier, Newton, Stefan-Boltzmann) to define what is happening at the borders of your object.&lt;/p>
&lt;p>Does comparing it to Maxwell&amp;rsquo;s equations make the &amp;ldquo;thermal circuit&amp;rdquo; idea (where $V=T$ and $I=q$) feel more or less intuitive to you?&lt;/p>
&lt;h4>Analogy - Heat vs Electr&lt;span class="absolute -mt-20" id="analogy---heat-vs-electr">&lt;/span>
&lt;a href="#analogy---heat-vs-electr" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>The thermal-electrical analogy is a powerful mental model because it allows you to take the highly developed tools of circuit analysis—like Kirchhoff’s Laws and SPICE simulators—and apply them to physical cooling and heating problems.&lt;/p>
&lt;p>This works because the fundamental physics of both systems follow the same &lt;strong>diffusion&lt;/strong> and &lt;strong>storage&lt;/strong> logic.&lt;/p>
&lt;ol>
&lt;li>The Core Mapping&lt;/li>
&lt;/ol>
&lt;p>To build a thermal &amp;ldquo;circuit,&amp;rdquo; you simply replace electrical variables with thermal ones:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Electrical Component&lt;/th>
&lt;th style="text-align:left">Thermal Equivalent&lt;/th>
&lt;th style="text-align:left">Units&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Voltage ($V$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Temperature ($T$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Volts $\rightarrow$ Kelvin ($K$)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Current ($I$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Heat Flow ($q$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Amps $\rightarrow$ Watts ($W$)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Charge ($Q$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Thermal Energy&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Coulombs $\rightarrow$ Joules ($J$)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Resistance ($R$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Thermal Resistance ($R_{\theta}$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Ohms $\rightarrow$ $K/W$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Capacitance ($C$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Thermal Mass ($C_{th}$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Farads $\rightarrow$ $J/K$&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="2">
&lt;li>Translating the Components&lt;/li>
&lt;/ol>
&lt;p>When you look at a physical object, you &amp;ldquo;see&amp;rdquo; it as a circuit board:&lt;/p>
&lt;p>Resistors (The Barriers)&lt;/p>
&lt;p>In a circuit, a resistor slows down electrons. In heat transfer, a &amp;ldquo;thermal resistor&amp;rdquo; represents anything that slows down heat:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Conduction:&lt;/strong> A thick piece of plastic has high thermal resistance; a thin piece of copper has low resistance.&lt;/li>
&lt;li>&lt;strong>Convection:&lt;/strong> The air layer sitting on a heatsink acts like a resistor. If you turn on a fan, you are effectively &amp;ldquo;turning the knob&amp;rdquo; to lower that resistance.&lt;/li>
&lt;/ul>
&lt;p>Capacitors (The Buffers)&lt;/p>
&lt;p>In electronics, a capacitor stores charge.&lt;/p>
&lt;p>n heat, a capacitor represents &lt;strong>Thermal Mass&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>A giant cast-iron skillet is like a massive high-voltage capacitor.&lt;/li>
&lt;/ul>
&lt;p>It takes a long time to &amp;ldquo;charge up&amp;rdquo; (get hot), but once it&amp;rsquo;s charged, it holds that energy for a long time even after the &amp;ldquo;power&amp;rdquo; (the stove) is turned off.&lt;/p>
&lt;p>Current Sources (The Heat Gen)&lt;/p>
&lt;p>A CPU, a laser, or a chemical reaction is modeled as a &lt;strong>Constant Current Source&lt;/strong>.&lt;/p>
&lt;p>It is pushing a specific amount of &amp;ldquo;Current&amp;rdquo; (Watts) into the system regardless of what the temperature is.&lt;/p>
&lt;ol start="3">
&lt;li>Applying Circuit Laws&lt;/li>
&lt;/ol>
&lt;p>This is where the magic happens. You can use standard circuit rules to solve complex heat problems:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Ohm’s Law ($V = IR$):&lt;/strong> Becomes &lt;strong>$\Delta T = q \cdot R_{\theta}$&lt;/strong>. If you know your CPU is putting out 65W ($q$) and your heatsink has a resistance of 0.5 K/W ($R$), you instantly know the temperature rise will be 32.5 degrees above the room temperature.&lt;/li>
&lt;li>&lt;strong>Kirchhoff’s Current Law (KCL):&lt;/strong> The heat flowing into a junction must equal the heat flowing out. This helps you track how heat splits between moving through a thermal pad versus moving through the air.&lt;/li>
&lt;li>&lt;strong>Series vs. Parallel:&lt;/strong>
&lt;ul>
&lt;li>&lt;strong>Series:&lt;/strong> Heat moving through a CPU lid, then through thermal paste, then through a heatsink (like resistors in a single wire).&lt;/li>
&lt;li>&lt;strong>Parallel:&lt;/strong> Heat escaping through the top of a device via a fan while simultaneously leaking through the bottom into the table.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>Where the Analogy Breaks Down&lt;/li>
&lt;/ol>
&lt;p>While brilliant, the analogy isn&amp;rsquo;t perfect. You have to be careful with two things:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Radiation:&lt;/strong> As we discussed, radiation is non-linear ($T^4$). In a circuit, this would be like having a resistor whose value changes drastically depending on the voltage. Most SPICE tools struggle with this without custom math.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Speed of Light vs. Speed of Heat:&lt;/strong> Electricity moves at near the speed of light. Heat is a &amp;ldquo;diffusion&amp;rdquo; process—it is slow and &amp;ldquo;sluggish.&amp;rdquo; While the equations look the same, the &lt;strong>time constants&lt;/strong> ($\tau = RC$) in thermal systems are usually measured in seconds or minutes, rather than nanoseconds.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Does thinking of a &amp;ldquo;heatsink&amp;rdquo; as just a &amp;ldquo;resistor to ground&amp;rdquo; make it easier to visualize how to keep a component cool?&lt;/p>
&lt;h2>Applications&lt;span class="absolute -mt-20" id="applications">&lt;/span>
&lt;a href="#applications" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Heat transfer x VPD x DHT&lt;span class="absolute -mt-20" id="heat-transfer-x-vpd-x-dht">&lt;/span>
&lt;a href="#heat-transfer-x-vpd-x-dht" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>In case you have some go-solar PoC system or you are just planting tomatoes and doing IoT/Big Data tech talks around:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/poc/tree/master/go-solar" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
PicoW Esp32 x DHT22 - PoC | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps | grep emqx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./RPi/Z_MicroControllers/RPiPicoW/picow-dht-webapp-vpd-poc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker compose up -d --build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Web → http://&amp;lt;host&amp;gt;:8001 · DB → localhost:5433.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker compose up -d --build webapp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker compose up -d #and here it goes timescaleDB + all the webApp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker exec -it timescaledb psql -U pico -d sensors&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps | grep timescaledb&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/RPi/tree/master/Z_MicroControllers/RPiPicoW/picow-dht-webapp-vpd-poc" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Go Solar PoC | Repo&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/RPi/tree/master/Z_MicroControllers/RPiPicoW/picow-dht-webapp-vpd-poc" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Go Solar PoC | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;h3>Heat transfer x MBSD x ICE&lt;span class="absolute -mt-20" id="heat-transfer-x-mbsd-x-ice">&lt;/span>
&lt;a href="#heat-transfer-x-mbsd-x-ice" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The &lt;strong>physics of combustion&lt;/strong> is a thing on its own&amp;hellip;&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/Z3ZvxIz20-c" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://www.youtube.com/watch?v=Z3ZvxIz20-c -->
&lt;p>&amp;lsquo;Bro started the video like an engineer and ended like a philosopher. Great video!&amp;rsquo;&lt;/p>
&lt;p>In an ICE, only about 30% of the fuel&amp;rsquo;s chemical energy reaches the crankshaft as useful work.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/JAlcocerT/mbsd/blob/master/z-fluid-mechanics/dinamica-gases-py.md" target="_blank" rel="noopener">https://github.com/JAlcocerT/mbsd/blob/master/z-fluid-mechanics/dinamica-gases-py.md&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/JAlcocerT/mbsd/blob/master/z-destilled-ebook/2d-slidercrank-multicylinder-combustion.md" target="_blank" rel="noopener">https://github.com/JAlcocerT/mbsd/blob/master/z-destilled-ebook/2d-slidercrank-multicylinder-combustion.md&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/mbsd/tree/master/z-fluid-mechanics" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Fluids inside MBSD | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;p>The rest, must go somewhere: &lt;em>like those vibrations you try to avoid via nvh&lt;/em>&lt;/p>
&lt;p>&lt;strong>Step 1 — Thermodynamic ODE.&lt;/strong> The same 0D ODE used throughout the enhancement scripts (Woschni heat transfer, Wiebe combustion, isentropic nozzle valves) is integrated over 2048 uniformly-spaced time steps covering 720° at n = 3000 rpm. Output: &lt;code>P(θ)&lt;/code> at every sample point.&lt;/p>
&lt;p>&lt;strong>Step 2 — Force trace.&lt;/strong> &lt;code>F_wiebe(θ) = (P(θ) − p_a) · A_piston&lt;/code>. Gauge pressure is used so the force is zero when the cylinder is at atmospheric (the reference load on the bearing from gas pressure alone, subtracting the atmospheric force that acts on both sides of the piston).&lt;/p>
&lt;p>&lt;strong>Step 3 — FFT.&lt;/strong> A single &lt;code>np.fft.rfft&lt;/code> over 2048 samples gives the single-sided amplitude spectrum &lt;code>H_wiebe[k]&lt;/code> for k = 0, 1, …, 8. These are the per-harmonic force amplitudes that the phasor framework consumes.&lt;/p>
&lt;p>Step 4 — Phasor sums. &amp;hellip;.&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
All the sauce to &lt;a href="https://github.com/JAlcocerT/mbsd/blob/master/z-fluid-mechanics/combustion-wiebe-nvh.md" target="_blank" rel="noopener">go from thermodynamics to NVH&lt;/a> plugging Wiebe
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Woschni heat transfer, Wiebe combustion&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run ./mbsd/z-fluid-mechanics/combustion_analysis_wiebe.py&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/wiebe_fig2_harmonics.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>The general picture is:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Energy path&lt;/th>
&lt;th style="text-align:left">Share&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">Crankshaft (useful work)&lt;/td>
&lt;td style="text-align:left">~30%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Exhaust gases&lt;/td>
&lt;td style="text-align:left">~30%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Cooling system (heat transfer problem)&lt;/td>
&lt;td style="text-align:left">~30%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Friction and misc losses&lt;/td>
&lt;td style="text-align:left">~10%&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The cooling system share is a heat transfer problem in exactly the sense of the theory above: &lt;em>conduction through the piston crown and cylinder wall, convection to the coolant, and radiation from the exhaust manifold.&lt;/em>&lt;/p>
&lt;p>&lt;strong>Why it matters for the MBSD design loop:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Piston crown&lt;/strong>: surface temperatures reach 300–400 °C during the power stroke. Steel yield strength at 400 °C is roughly 70% of its room-temperature value — so the FEM stress check must use temperature-dependent material properties, not datasheet values.&lt;/li>
&lt;li>&lt;strong>Exhaust valves&lt;/strong>: face temperatures 700–800 °C. This is why exhaust valves are often sodium-filled (sodium melts and sloshes, carrying heat from the face to the stem) or made from Inconel instead of steel.&lt;/li>
&lt;li>&lt;strong>Thermal expansion&lt;/strong>: a piston at 300 °C expands by roughly $\alpha \Delta T \cdot D \approx 12 \times 10^{-6} \times 250 \times 90 \approx 0.27,\text{mm}$ diametrically. This is why piston-to-bore clearances are set cold — the gap closes at temperature.&lt;/li>
&lt;/ul>
&lt;p>The heat path is: combustion gas → piston crown (conduction) → piston rings → cylinder wall (conduction) → coolant (convection) → radiator (convection + radiation). Each interface has a thermal resistance; minimising the total resistance is the thermal design problem.&lt;/p>
&lt;p>Some time ago I had to make a fluid mechanics project in Matlab — it is time to bring it to Python.&lt;/p>
&lt;h3>Solar (Thermal) Power&lt;span class="absolute -mt-20" id="solar-thermal-power">&lt;/span>
&lt;a href="#solar-thermal-power" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Ive noticed some ppl doing cool things on the internet with these.&lt;/p>
&lt;p>I could not resist to join the party.&lt;/p>
&lt;p>No, i dont mean that you have to go off-grid&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#streamlit run electronics-101/sample-pyscipe/solar_optimizer.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv run streamlit run .\solar_optimizer.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run uv run ./electronics-101/sample-pyscipe&lt;span class="se">\h&lt;/span>ome-scale-pv&lt;span class="se">\c&lt;/span>ompare_systems.py&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Just that you can estimate pretty acurately according to your latitude and few parameters how much can you get from the sun: &lt;em>coming frm this &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/sample-pyscipe/go-solar.md#solar-optimizer-interactive-tool" target="_blank" rel="noopener">previous streamlit app&lt;/a> and shaped by &lt;a href="https://github.com/JAlcocerT/poc/blob/main/go-solar/brd.md" target="_blank" rel="noopener">this brd&lt;/a>&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /poc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/go-solar/&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>See the UI at: &lt;code>localhost:3000&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gosolar.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Its all about the latitude, the tilt, the day of the year&amp;hellip; all &lt;a href="https://github.com/JAlcocerT/poc/blob/main/go-solar/z-features.md" target="_blank" rel="noopener">those features&lt;/a> :)&lt;/p>
&lt;h2>Tools&lt;span class="absolute -mt-20" id="tools">&lt;/span>
&lt;a href="#tools" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Assuming you are referring to &lt;strong>PyScipe&lt;/strong> (the Python interface for SPICE circuit simulators), the search for a direct equivalent in heat transfer depends on whether you want to solve thermal problems using &lt;strong>electrical analogies&lt;/strong> or &lt;strong>physical simulation&lt;/strong>.&lt;/p>
&lt;p>In engineering, heat transfer is often modeled using &amp;ldquo;Lumped Element&amp;rdquo; models where:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Voltage ($V$)&lt;/strong> = Temperature ($T$)&lt;/li>
&lt;li>&lt;strong>Current ($I$)&lt;/strong> = Heat Flow ($q$)&lt;/li>
&lt;li>&lt;strong>Resistance ($R$)&lt;/strong> = Thermal Resistance ($R_{th}$)&lt;/li>
&lt;li>&lt;strong>Capacitance ($C$)&lt;/strong> = Thermal Mass ($C_{th}$)&lt;/li>
&lt;/ul>
&lt;p>Because of this direct analogy, many engineers actually use &lt;strong>PySpice&lt;/strong> itself to solve heat transfer problems by building a &amp;ldquo;thermal circuit.&amp;rdquo;&lt;/p>
&lt;p>However, if you are looking for dedicated thermal libraries, here are the best equivalents:&lt;/p>
&lt;ol>
&lt;li>The Direct Functional Equivalent: &lt;strong>Heatrapy&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>If you want a library that feels like a &amp;ldquo;simulator&amp;rdquo; where you define materials and watch heat flow, &lt;strong>Heatrapy&lt;/strong> is the closest match.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>What it does:&lt;/strong> It is a lightweight framework for 1D and 2D thermal simulations using finite-difference methods.&lt;/li>
&lt;li>&lt;strong>Best for:&lt;/strong> Simulating phase-change materials, caloric effects, and multi-material systems without needing a full CFD (Computational Fluid Dynamics) suite.&lt;/li>
&lt;li>&lt;strong>Install:&lt;/strong> &lt;code>pip install heatrapy&lt;/code>&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The Professional Standard: &lt;strong>OpenMDAO / NASA OpenSource&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>For complex thermal-fluid systems (like spacecraft or engines), many professionals use &lt;strong>OpenMDAO&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>What it does:&lt;/strong> It’s an open-source framework for multidisciplinary analysis and optimization.&lt;/li>
&lt;li>&lt;strong>Thermal link:&lt;/strong> It is frequently paired with thermal plugins to solve large-scale steady-state and transient heat transfer problems.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>The &amp;ldquo;Object-Oriented&amp;rdquo; Modeling: &lt;strong>Modelica (via PyMarl / OMPython)&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>SPICE is to electronics what &lt;strong>Modelica&lt;/strong> is to general physical systems (heat, mechanics, fluids).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>What it does:&lt;/strong> Modelica uses a &amp;ldquo;connector&amp;rdquo; approach very similar to a SPICE netlist. You can connect a &amp;ldquo;Heat Port&amp;rdquo; to a &amp;ldquo;Thermal Conductor.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Python Interface:&lt;/strong> You can use &lt;strong>OMPython&lt;/strong> (OpenModelica) or &lt;strong>PyMarl&lt;/strong> to script and simulate thermal models using the Modelica Standard Library.&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>Specialized Tool: &lt;strong>ThermoSim&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>For those specifically working on thermodynamic cycles and heat exchangers:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>What it does:&lt;/strong> Focuses on mass and energy balances, heat exchanger design (evaporators, condensers), and power cycles.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Best for:&lt;/strong> Industrial applications and energy system design.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>If you want to stay in the &lt;strong>SPICE mindset&lt;/strong> (nodes, resistors, capacitors): Stick with &lt;strong>PySpice&lt;/strong> and just label your units as Kelvin and Watts.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>If you want to simulate &lt;strong>physical objects/materials&lt;/strong> in 1D/2D: Use &lt;strong>Heatrapy&lt;/strong>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>If you are building a &lt;strong>complex machine&lt;/strong> (like a fridge or a motor): Use &lt;strong>OpenModelica&lt;/strong> via Python.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>To model the specific modes of heat transfer—&lt;strong>conduction, convection, and radiation&lt;/strong>—the choice of tool depends on whether you want &amp;ldquo;Lego-style&amp;rdquo; connectivity or &amp;ldquo;Grid-style&amp;rdquo; physics.&lt;/p>
&lt;p>Here is how those tools handle the specific physics:&lt;/p>
&lt;ol>
&lt;li>Modelica (via OMPython / PyMarl)&lt;/li>
&lt;/ol>
&lt;p>&lt;a href="https://modelica.org/libraries/" target="_blank" rel="noopener">Modelica&lt;/a> uses a &lt;strong>Lumped Parameter&lt;/strong> approach. It treats physical parts as &amp;ldquo;components&amp;rdquo; with ports.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Conduction:&lt;/strong> You use a &lt;code>Thermal.Conduction&lt;/code> element. You input the thermal conductivity ($k$), area ($A$), and thickness ($L$). It solves $Q = \frac{k \cdot A}{L} \Delta T$.&lt;/li>
&lt;li>&lt;strong>Convection:&lt;/strong> You use a &lt;code>Convection&lt;/code> element. You must provide the heat transfer coefficient ($h$). It is excellent for &amp;ldquo;Fluid-to-Solid&amp;rdquo; interfaces.&lt;/li>
&lt;li>&lt;strong>Radiation:&lt;/strong> It has a specific &lt;code>Radiation&lt;/code> element that handles the $T^4$ math (Stefan-Boltzmann Law). You input the emissivity and the view factor.&lt;/li>
&lt;li>&lt;strong>Pros:&lt;/strong> It’s the only one that easily handles &lt;strong>Radiation&lt;/strong> and &lt;strong>Convection&lt;/strong> out of the box for complex systems (like a radiator cooling an engine).&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Heatrapy (Pure Python)&lt;/li>
&lt;/ol>
&lt;p>Heatrapy is a &lt;strong>Field-based&lt;/strong> solver. It divides a solid block into a grid of tiny points.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Conduction:&lt;/strong> This is Heatrapy’s bread and butter. It calculates how heat &amp;ldquo;diffuses&amp;rdquo; through a material over time. It is much more accurate for seeing &lt;em>where&lt;/em> a hot spot develops in a solid object.&lt;/li>
&lt;li>&lt;strong>Convection/Radiation:&lt;/strong> This is where it struggles. You usually have to &amp;ldquo;fake&amp;rdquo; these by setting boundary conditions (e.g., telling the edge of the grid that it is losing a certain amount of energy to the air).&lt;/li>
&lt;li>&lt;strong>Pros:&lt;/strong> If you want to see a heat map of a 2D metal plate, this is the tool.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>The &amp;ldquo;Electrical Analogy&amp;rdquo; (PySpice)&lt;/li>
&lt;/ol>
&lt;p>As mentioned before, if you use PySpice, you have to manually convert the physics into electrical components.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Heat Mode&lt;/th>
&lt;th style="text-align:left">SPICE Component&lt;/th>
&lt;th style="text-align:left">Parameter&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Conduction&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Resistor&lt;/strong>&lt;/td>
&lt;td style="text-align:left">$R_{th} = \frac{L}{k \cdot A}$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Convection&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Resistor&lt;/strong>&lt;/td>
&lt;td style="text-align:left">$R_{conv} = \frac{1}{h \cdot A}$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Thermal Mass&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Capacitor&lt;/strong>&lt;/td>
&lt;td style="text-align:left">$C_{th} = m \cdot c_p$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Radiation&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Non-linear Resistor&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Requires a &amp;ldquo;Voltage Controlled Current Source&amp;rdquo; because radiation is non-linear ($T^4$).&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>&lt;strong>The Radiation Problem:&lt;/strong> SPICE and Heatrapy struggle with radiation because radiation isn&amp;rsquo;t &amp;ldquo;linear.&amp;rdquo; Doubling the temperature doesn&amp;rsquo;t double the heat loss—it increases it by 16 times ($2^4$). &lt;strong>Modelica&lt;/strong> is the only one in this list that handles this &amp;ldquo;natively&amp;rdquo; without you having to write custom math.&lt;/p>
&lt;/blockquote>
&lt;p>Which should you choose?&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Choose Modelica (OMPython)&lt;/strong> if you are building a &lt;strong>System&lt;/strong>.
&lt;ul>
&lt;li>&lt;em>Example:&lt;/em> Modeling a satellite where heat comes from the sun (Radiation), moves through the frame (Conduction), and is released by a radiator (Radiation).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Choose Heatrapy&lt;/strong> if you are analyzing a &lt;strong>Part&lt;/strong>.
&lt;ul>
&lt;li>&lt;em>Example:&lt;/em> Modeling how long it takes for a specific iron rod to get hot at one end when the other end is in a fire.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Choose PySpice&lt;/strong> if you are an &lt;strong>Electrical Engineer&lt;/strong>.
&lt;ul>
&lt;li>&lt;em>Example:&lt;/em> You already have a circuit board designed in SPICE and you want to add a few &amp;ldquo;thermal resistors&amp;rdquo; to make sure the chips don&amp;rsquo;t melt.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Heat transfer closes the loop that MBSD, fluid mechanics, and FEM opened.&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Which can be a good excuse to &lt;a href="https://github.com/JAlcocerT/mbsd/blob/master/z-fluid-mechanics/z-mcia-thermodynamic-cycles.md" target="_blank" rel="noopener">recap thermodynamics and cycles&lt;/a> also each cycle typical applications
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>The combustion event produces forces (fluid), the forces drive motion (MBSD), the motion subjects parts to stress (FEM), and the same combustion event heats those parts — changing the material properties that FEM relied on.&lt;/p>
&lt;p>Run them in sequence and you have a physics-grounded design loop.&lt;/p>
&lt;p>Skip heat transfer and you are doing structural analysis with wrong material data.&lt;/p>
&lt;h3>I built some more&lt;span class="absolute -mt-20" id="i-built-some-more">&lt;/span>
&lt;a href="#i-built-some-more" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>As per &lt;a href="https://github.com/JAlcocerT/mbsd/blob/master/z-fluid-mechanics/z-next-steps.md" target="_blank" rel="noopener">these next steps&lt;/a>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>The effect of variable valve timming - &lt;a href="https://github.com/JAlcocerT/mbsd/tree/master/z-fluid-mechanics/improvements/01_vvt" target="_blank" rel="noopener">vvt&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Forced induction (Compressor/&lt;a href="https://github.com/JAlcocerT/mbsd/tree/master/z-fluid-mechanics/improvements/02_forced_induction" target="_blank" rel="noopener">Supercharger&lt;/a>)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/JAlcocerT/mbsd/tree/master/z-fluid-mechanics/improvements/03_diesel" target="_blank" rel="noopener">Diesel&lt;/a> (CI vs SI)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/JAlcocerT/mbsd/tree/master/z-fluid-mechanics/improvements/04_nvh_map" target="_blank" rel="noopener">NVH map&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/JAlcocerT/mbsd/tree/master/z-fluid-mechanics/improvements/05_turbo" target="_blank" rel="noopener">TurboCharger&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/JAlcocerT/mbsd/tree/master/z-fluid-mechanics/improvements/06_knock" target="_blank" rel="noopener">Knock&lt;/a> / detonation limit&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Cylinder deactivation&lt;/p>
&lt;/li>
&lt;li>
&lt;p>torsional crankshaft dynamics&lt;/p>
&lt;/li>
&lt;li>
&lt;p>volumetric efficiency&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/fi_fig3_efficiency.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
If you ever thought to build a pulse jet, a stirling engine or &lt;a href="https://github.com/JAlcocerT/mbsd/blob/master/z-fluid-mechanics/aerotermia_simulator.py" target="_blank" rel="noopener">aerotermia&lt;/a> at home, &lt;a href="https://github.com/JAlcocerT/mbsd/blob/master/z-fluid-mechanics/z-thermodynamic-cycles-applications.md#25-pulse-jet--resonant-intermittent-combustion" target="_blank" rel="noopener">check this &lt;code>.md&lt;/code>&lt;/a>.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Can FreeCAD do this?&lt;span class="absolute -mt-20" id="can-freecad-do-this">&lt;/span>
&lt;a href="#can-freecad-do-this" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Yes. The &lt;strong>FEM Workbench&lt;/strong> in FreeCAD handles thermal analysis alongside structural:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Steady-state heat conduction&lt;/strong>: apply a fixed temperature to one face, a convective boundary condition to another (you supply $h$ and $T_\infty$), and CalculiX solves for the temperature field and heat flux through the part&lt;/li>
&lt;li>&lt;strong>Coupled thermo-mechanical&lt;/strong>: run a thermal solve first, map the temperature field onto the structural mesh as a load, then run FEM — this is how you get thermally-corrected stress results&lt;/li>
&lt;li>&lt;strong>Workflow&lt;/strong>: the same STEP geometry used for structural FEM works unchanged; you just switch the analysis type and boundary conditions&lt;/li>
&lt;/ul>
&lt;p>For the ICE use case: import the piston geometry from CadQuery, apply $T = 380,°C$ on the crown face and a convective BC ($h = 3000,\text{W/m}^2\text{K}$, $T_\infty = 90,°C$) on the skirt, run CalculiX, and read off the temperature gradient and peak heat flux.&lt;/p>
&lt;hr>
&lt;h3>A Minimal Heat Transfer Example in Python&lt;span class="absolute -mt-20" id="a-minimal-heat-transfer-example-in-python">&lt;/span>
&lt;a href="#a-minimal-heat-transfer-example-in-python" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The following simulates 1D transient conduction through a piston crown using finite differences — the same physics as the heat diffusion equation $\partial T / \partial t = \alpha \nabla^2 T$, discretised by hand:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1D transient conduction through a piston crown&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Steel: k = 50 W/m·K, rho = 7800 kg/m³, cp = 500 J/kg·K&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">k&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">rho&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">50&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7800&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">500&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">alpha&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">k&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">rho&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">cp&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># thermal diffusivity m²/s ≈ 1.28e-5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">L&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">0.010&lt;/span> &lt;span class="c1"># 10 mm crown thickness&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">N&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">20&lt;/span> &lt;span class="c1"># nodes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">dx&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">L&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">N&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">dt&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">0.4&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">dx&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">alpha&lt;/span> &lt;span class="c1"># explicit stability: CFL &amp;lt; 0.5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">T&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">full&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">90.0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># start at coolant temperature&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">T_hot&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">380.0&lt;/span> &lt;span class="c1"># combustion-side BC (°C)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">T_cool&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">90.0&lt;/span> &lt;span class="c1"># coolant-side BC (°C)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">_&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">5.0&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">dt&lt;/span>&lt;span class="p">)):&lt;/span> &lt;span class="c1"># simulate 5 s&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">T&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">alpha&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">dt&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">dx&lt;/span>&lt;span class="o">**&lt;/span>&lt;span class="mi">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">:]&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">T&lt;/span>&lt;span class="p">[:&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">T&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">T_hot&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">T&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">T_cool&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">q_flux&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">k&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">T&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">])&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">dx&lt;/span> &lt;span class="c1"># W/m²&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Steady crown temperature profile: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="p">[[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="o">//&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">round&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> °C&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Heat flux into coolant: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">q_flux&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mf">1e3&lt;/span>&lt;span class="si">:&lt;/span>&lt;span class="s2">.1f&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> kW/m²&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># → same q you would plug into Newton&amp;#39;s law of cooling to size the coolant flow&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The boundary conditions here feed directly into the convection calculation: the heat flux $q$ at the wall is what Newton&amp;rsquo;s law of cooling ($q = h(T_s - T_\infty)$) must carry away. Size the coolant flow rate to handle that flux and you have closed the thermal design loop.&lt;/p>
&lt;hr>
&lt;h3>Combustion Models and Heat Release&lt;span class="absolute -mt-20" id="combustion-models-and-heat-release">&lt;/span>
&lt;a href="#combustion-models-and-heat-release" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The piston crown temperature used in the example above ($380,°C$) has to come from somewhere — that is the combustion model&amp;rsquo;s job. A combustion model computes the &lt;strong>heat release rate&lt;/strong> $\dot{Q}(\theta)$ as a function of crank angle, which is what drives the in-cylinder temperature and pressure trace $P(\theta)$ from the fluids post.&lt;/p>
&lt;p>Models are ranked by complexity and computational cost:&lt;/p>
&lt;h4>0D / Single-Zone Models (Thermodynamic)&lt;span class="absolute -mt-20" id="0d--single-zone-models-thermodynamic">&lt;/span>
&lt;a href="#0d--single-zone-models-thermodynamic" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>The entire cylinder contents are treated as one uniform zone — one temperature, one pressure, one composition at each crank angle. All spatial gradients are ignored.&lt;/p>
&lt;p>&lt;strong>The Wiebe function&lt;/strong> is the workhorse here. It describes the cumulative heat release as an S-curve:&lt;/p>
&lt;p>$$x_b(\theta) = 1 - \exp!\left[-a\left(\frac{\theta - \theta_0}{\Delta\theta}\right)^{m+1}\right]$$&lt;/p>
&lt;p>where $\theta_0$ is the start of combustion, $\Delta\theta$ is the combustion duration, $a \approx 6.908$ (for 99.9% burn completion), and $m$ is a shape factor (~2 for SI engines, ~0.5 for diesel). The heat release rate is the derivative:&lt;/p>
&lt;p>$$\dot{Q}(\theta) = Q_{total} \cdot \frac{dx_b}{d\theta}$$&lt;/p>
&lt;p>This is cheap to compute and fits measured pressure traces well with two tuning parameters ($\Delta\theta$, $m$). It is the standard for engine cycle simulation tools (GT-Power, WAVE, Ricardo WAVE).&lt;/p>
&lt;p>&lt;strong>Heat transfer to the wall&lt;/strong> in a 0D model uses the &lt;strong>Woschni correlation&lt;/strong>:&lt;/p>
&lt;p>$$h_c = C \cdot B^{-0.2} \cdot P^{0.8} \cdot T^{-0.55} \cdot w^{0.8}$$&lt;/p>
&lt;p>where $B$ is the bore diameter, $w$ is a characteristic gas velocity (function of mean piston speed and pressure rise), and $C$ is a calibration constant. This gives the convective heat transfer coefficient $h$ at each crank angle — exactly the $h$ that appears in Newton&amp;rsquo;s law of cooling.&lt;/p>
&lt;h4>2-Zone Models&lt;span class="absolute -mt-20" id="2-zone-models">&lt;/span>
&lt;a href="#2-zone-models" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>The cylinder is split into a &lt;strong>burned zone&lt;/strong> (products, high temperature) and an &lt;strong>unburned zone&lt;/strong> (fresh charge, lower temperature), each with its own temperature. This adds:&lt;/p>
&lt;ul>
&lt;li>A flame front that propagates from the spark plug outward&lt;/li>
&lt;li>Separate energy equations for each zone&lt;/li>
&lt;li>More accurate prediction of knock (auto-ignition in the unburned zone) and NO$_x$ formation (strongly temperature-dependent)&lt;/li>
&lt;/ul>
&lt;p>Still 0D spatially, but captures the burned/unburned temperature split that a single-zone model misses.&lt;/p>
&lt;h4>Quasi-Dimensional (Flame Speed) Models&lt;span class="absolute -mt-20" id="quasi-dimensional-flame-speed-models">&lt;/span>
&lt;a href="#quasi-dimensional-flame-speed-models" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Add a geometric model of the flame front — typically a sphere expanding from the spark plug clipped by the cylinder walls.&lt;/p>
&lt;p>The turbulent flame speed $S_T$ is modelled as a function of turbulence intensity $u&amp;rsquo;$ and laminar flame speed $S_L$:&lt;/p>
&lt;p>$$S_T \approx S_L + u&amp;rsquo;$$&lt;/p>
&lt;p>This links combustion to in-cylinder flow (tumble, swirl) without solving the Navier-Stokes equations.&lt;/p>
&lt;p>Useful for sensitivity studies of combustion chamber geometry.&lt;/p>
&lt;h4>3D CFD Combustion Models (Full Spatial)&lt;span class="absolute -mt-20" id="3d-cfd-combustion-models-full-spatial">&lt;/span>
&lt;a href="#3d-cfd-combustion-models-full-spatial" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Solve the Navier-Stokes equations plus species transport and a combustion sub-model on a 3D mesh that moves with the piston and valves.&lt;/p>
&lt;p>The main approaches:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Model&lt;/th>
&lt;th style="text-align:left">Approach&lt;/th>
&lt;th style="text-align:left">Cost&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>RANS + flamelet&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Time-averaged flow, tabulated chemistry&lt;/td>
&lt;td style="text-align:left">Hours per cycle&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>LES + flamelet&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Resolved large eddies, tabulated chemistry&lt;/td>
&lt;td style="text-align:left">Days per cycle&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>DNS&lt;/strong>&lt;/td>
&lt;td style="text-align:left">All scales resolved, detailed chemistry&lt;/td>
&lt;td style="text-align:left">Research only&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>OpenFOAM&lt;/strong> (via the &lt;code>reactingFoam&lt;/code> or &lt;code>XiFoam&lt;/code> solvers) is the main OSS option. &lt;code>XiFoam&lt;/code> implements the flame wrinkling model for SI engines; &lt;code>reactingFoam&lt;/code> handles diesel spray combustion with injector models.&lt;/p>
&lt;h4>Which Model for Which Question&lt;span class="absolute -mt-20" id="which-model-for-which-question">&lt;/span>
&lt;a href="#which-model-for-which-question" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Question&lt;/th>
&lt;th style="text-align:left">Model&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">Engine cycle efficiency, BSFC&lt;/td>
&lt;td style="text-align:left">0D single-zone + Wiebe&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Knock prediction, NO$_x$ trend&lt;/td>
&lt;td style="text-align:left">2-zone or quasi-dimensional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Combustion chamber shape optimisation&lt;/td>
&lt;td style="text-align:left">Quasi-dimensional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Injector spray, mixture formation&lt;/td>
&lt;td style="text-align:left">3D CFD (OpenFOAM)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Wall heat flux map for FEM thermal BC&lt;/td>
&lt;td style="text-align:left">3D CFD or Woschni on 0D&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>For the MBSD design loop the practical answer is: run a &lt;strong>0D model with the Wiebe function&lt;/strong> to get the pressure trace $P(\theta)$ and the Woschni $h(\theta)$, feed the cycle-averaged wall heat flux into the FEM thermal analysis, and only go to 3D CFD if the combustion chamber geometry is what you are optimising.&lt;/p>
&lt;hr>
&lt;h3>About Tools&lt;span class="absolute -mt-20" id="about-tools">&lt;/span>
&lt;a href="#about-tools" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;strong>Modelica&lt;/strong> is a standalone language, while &lt;strong>OMPython&lt;/strong>, &lt;strong>PyMarl&lt;/strong>, and &lt;strong>Heatrapy&lt;/strong> are Python-based tools or interfaces that allow you to stay within the Python ecosystem while solving physics problems.&lt;/p>
&lt;ol>
&lt;li>Modelica (The Language)&lt;/li>
&lt;/ol>
&lt;p>Modelica is a non-proprietary, object-oriented, equation-based language used to model complex physical systems (thermal, electrical, mechanical, etc.).&lt;/p>
&lt;p>Think of it as a &amp;ldquo;Lego set&amp;rdquo; for engineers: you connect a &amp;ldquo;heat source&amp;rdquo; block to a &amp;ldquo;pipe&amp;rdquo; block, and Modelica handles the underlying math.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Pros:&lt;/strong> Extremely powerful; handles &amp;ldquo;multi-physics&amp;rdquo; (e.g., how a hot motor affects a cooling fluid); huge library of pre-built components (Modelica Standard Library).&lt;/li>
&lt;li>&lt;strong>Cons:&lt;/strong> It is a &lt;strong>separate language&lt;/strong> from Python; has a steep learning curve; requires a &amp;ldquo;compiler&amp;rdquo; like OpenModelica or Dymola to actually run.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>OMPython (The Bridge)&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>OMPython&lt;/strong> is the official Python interface for &lt;strong>OpenModelica&lt;/strong>. It allows you to control Modelica from within a Python script. You can load a Modelica model, change parameters, run the simulation, and pull the results back into a NumPy array for plotting.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Pros:&lt;/strong> Best of both worlds—you get Modelica’s simulation power with Python&amp;rsquo;s data analysis (Matplotlib, Pandas).&lt;/li>
&lt;li>&lt;strong>Cons:&lt;/strong> It requires a full installation of OpenModelica on your computer to function; the syntax for sending commands can feel a bit clunky compared to native Python.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>PyMarl (The Automation Specialist)&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>PyMarl&lt;/strong> is a more specialized Python wrapper for Modelica. It is often used for automating large batches of simulations or performing &amp;ldquo;parameter sweeps&amp;rdquo; (e.g., &amp;ldquo;What happens to the temperature if I test 100 different thicknesses of insulation?&amp;rdquo;).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Pros:&lt;/strong> Simplified API compared to OMPython; great for researchers who need to run thousands of simulations in the background.&lt;/li>
&lt;li>&lt;strong>Cons:&lt;/strong> Less flexible than OMPython if you need to build models &amp;ldquo;on the fly&amp;rdquo; from scratch in Python.&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>Heatrapy (The Native Python Choice)&lt;/li>
&lt;/ol>
&lt;p>Unlike the others, &lt;strong>Heatrapy&lt;/strong> is a &amp;ldquo;pure&amp;rdquo; Python library. It doesn&amp;rsquo;t need Modelica. It uses the &lt;strong>Finite Difference Method&lt;/strong> to solve heat transfer specifically in solids and phase-change materials.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Pros:&lt;/strong> &lt;strong>No external software needed&lt;/strong> (just &lt;code>pip install heatrapy&lt;/code>); very easy to learn if you already know Python; specialized for things like phase-change materials (e.g., ice melting or solid-state cooling).&lt;/li>
&lt;li>&lt;strong>Cons:&lt;/strong> Much slower than Modelica for huge systems; limited to 1D and 2D heat transfer; doesn&amp;rsquo;t handle complex fluids (CFD) or mechanical parts well.&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Tool&lt;/th>
&lt;th style="text-align:left">Language Basis&lt;/th>
&lt;th style="text-align:left">Best For&amp;hellip;&lt;/th>
&lt;th style="text-align:left">Difficulty&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Modelica&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Modelica (Unique)&lt;/td>
&lt;td style="text-align:left">Heavy industrial systems, vehicles, power plants.&lt;/td>
&lt;td style="text-align:left">High&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>OMPython&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Python + Modelica&lt;/td>
&lt;td style="text-align:left">Using Python to analyze complex Modelica models.&lt;/td>
&lt;td style="text-align:left">Medium&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>PyMarl&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Python + Modelica&lt;/td>
&lt;td style="text-align:left">Large-scale automation and &amp;ldquo;what-if&amp;rdquo; testing.&lt;/td>
&lt;td style="text-align:left">Medium&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Heatrapy&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Pure Python&lt;/td>
&lt;td style="text-align:left">Rapid prototyping of simple heat flow in solids.&lt;/td>
&lt;td style="text-align:left">Low&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Modelica&lt;/strong> itself is its own language.&lt;/p>
&lt;p>Its files end in &lt;code>.mo&lt;/code>.&lt;/p>
&lt;p>However, the &amp;ldquo;Py&amp;rdquo; in &lt;strong>PySpice&lt;/strong>, &lt;strong>PyMarl&lt;/strong>, and &lt;strong>PyMAPDL&lt;/strong> (another thermal tool) indicates that they are &lt;strong>interfaces&lt;/strong>.&lt;/p>
&lt;p>They act like a translator: you write Python code, and the interface translates it into the &amp;ldquo;native tongue&amp;rdquo; of the heavy-duty simulation engine running in the background.&lt;/p></description></item><item><title>Fluidssss</title><link>https://JAlcocerT.github.io/JAlcocerT/fluids/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/fluids/</guid><description>
&lt;p>&lt;strong>TL;DR&lt;/strong>&lt;/p>
&lt;p>How about bringing fluid mechanics to the ICEs?&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/mbsd/tree/master/z-fluid-mechanics" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Fluids inside MBSD | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;p>+++ migrated to &lt;a href="https://github.com/JAlcocerT/mbsd/blob/master/z-fluid-mechanics/dinamica-gases-py.md" target="_blank" rel="noopener">py the good old MCIA model&lt;/a>&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>A constant speed at the crank?&lt;/p>
&lt;p>What kind of model was that?&lt;/p>
&lt;p>Reality is: intermitent forces driven by combustions are the ones pushing the slider down!&lt;/p>
&lt;!--
https://www.youtube.com/watch?v=2bJTkBsiTPc
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/2bJTkBsiTPc" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!--
https://www.youtube.com/watch?v=7xwODOr-xTo
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/7xwODOr-xTo" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h2>About Fluid Mechanics&lt;span class="absolute -mt-20" id="about-fluid-mechanics">&lt;/span>
&lt;a href="#about-fluid-mechanics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>The Missing Half of the MBSD Picture&lt;span class="absolute -mt-20" id="the-missing-half-of-the-mbsd-picture">&lt;/span>
&lt;a href="#the-missing-half-of-the-mbsd-picture" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Every engine post in the MBSD series treated the combustion force as a known input — a prescribed pressure pushing the piston down at the right moment.&lt;/p>
&lt;p>That is a clean assumption for studying crankshaft balance and NVH, but it hides the question: &lt;em>where does that force actually come from?&lt;/em>&lt;/p>
&lt;p>The answer is fluid mechanics.&lt;/p>
&lt;p>Specifically, the thermodynamics of a gas being compressed and then ignited. Fluid mechanics is the discipline that lets you compute $P(\theta)$ — the cylinder pressure as a function of crank angle — rather than just assuming it.&lt;/p>
&lt;p>The conceptual shift mirrors the one from MBSD to FEM:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Discipline&lt;/th>
&lt;th style="text-align:left">Question&lt;/th>
&lt;th style="text-align:left">Solves for&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>MBSD&lt;/strong>&lt;/td>
&lt;td style="text-align:left">How do bodies move under given forces?&lt;/td>
&lt;td style="text-align:left">$q(t)$, $\dot{q}(t)$ — positions and velocities&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>FEM&lt;/strong>&lt;/td>
&lt;td style="text-align:left">How does material deform under given loads?&lt;/td>
&lt;td style="text-align:left">$\mathbf{u}(\mathbf{x})$ — displacement field&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Fluid Mechanics&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Where do those forces come from?&lt;/td>
&lt;td style="text-align:left">$P$, $\rho$, $T$, $\mathbf{v}$ — pressure, density, temperature, velocity&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3>The Governing Equations&lt;span class="absolute -mt-20" id="the-governing-equations">&lt;/span>
&lt;a href="#the-governing-equations" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Fluid mechanics is built on three conservation laws applied to a continuous medium:&lt;/p>
&lt;p>&lt;strong>1. Conservation of mass (continuity):&lt;/strong>&lt;/p>
&lt;p>$$\frac{\partial \rho}{\partial t} + \nabla \cdot (\rho \mathbf{v}) = 0$$&lt;/p>
&lt;p>What goes in must come out — mass cannot appear or disappear inside a control volume.&lt;/p>
&lt;p>&lt;strong>2. Conservation of momentum (Navier-Stokes):&lt;/strong>&lt;/p>
&lt;p>$$\rho \left(\frac{\partial \mathbf{v}}{\partial t} + \mathbf{v} \cdot \nabla \mathbf{v}\right) = -\nabla P + \mu \nabla^2 \mathbf{v} + \mathbf{f}$$&lt;/p>
&lt;p>Forces on a fluid element — pressure gradients, viscosity, and body forces — produce acceleration. This is Newton&amp;rsquo;s second law for fluids.&lt;/p>
&lt;p>&lt;strong>3. Conservation of energy:&lt;/strong>&lt;/p>
&lt;p>$$\rho c_v \frac{DT}{Dt} = -P,(\nabla \cdot \mathbf{v}) + \nabla \cdot (k \nabla T) + \dot{q}_{combustion}$$&lt;/p>
&lt;p>Temperature changes come from compression work, heat conduction, and heat release from combustion.&lt;/p>
&lt;p>For an ideal gas these three equations are closed by the &lt;strong>equation of state&lt;/strong>:&lt;/p>
&lt;p>$$P = \rho R T$$&lt;/p>
&lt;h3>For an ICE: From Crank Angle to Cylinder Pressure&lt;span class="absolute -mt-20" id="for-an-ice-from-crank-angle-to-cylinder-pressure">&lt;/span>
&lt;a href="#for-an-ice-from-crank-angle-to-cylinder-pressure" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Inside a cylinder, the volume changes with crank angle $\theta$ following the slider-crank geometry (which you already know from the MBSD posts).&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/JAlcocerT/mbsd/blob/master/z-fluid-mechanics/dinamica-gases-py.md" target="_blank" rel="noopener">https://github.com/JAlcocerT/mbsd/blob/master/z-fluid-mechanics/dinamica-gases-py.md&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/JAlcocerT/mbsd/blob/master/z-destilled-ebook/2d-slidercrank-multicylinder-combustion.md" target="_blank" rel="noopener">https://github.com/JAlcocerT/mbsd/blob/master/z-destilled-ebook/2d-slidercrank-multicylinder-combustion.md&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Assuming an &lt;strong>ideal Otto cycle&lt;/strong>, the pressure during the compression and expansion strokes follows a &lt;strong>polytropic&lt;/strong> process:&lt;/p>
&lt;p>$$P V^\gamma = \text{const}$$&lt;/p>
&lt;p>where $\gamma = c_p / c_v \approx 1.35$ for hot combustion gases. This gives you the pressure trace $P(\theta)$ that acts on the piston crown — the force input that the MBSD engine models take as given.&lt;/p>
&lt;p>The combustion event itself adds a spike on top: the heat release from burning fuel raises temperature almost instantaneously at TDC, which via the ideal gas law drives a sharp pressure rise.&lt;/p>
&lt;p>Integrating $P(\theta)$ over the piston area and projecting along the connecting rod gives you exactly the slider force that feeds into the dynamics.&lt;/p>
&lt;p>This is the loop: fluid mechanics computes the gas forces → MBSD propagates them through the mechanism → FEM checks whether the parts survive the resulting stress.&lt;/p>
&lt;h2>Application of Gas mechanics&lt;span class="absolute -mt-20" id="application-of-gas-mechanics">&lt;/span>
&lt;a href="#application-of-gas-mechanics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>The ICE!&lt;span class="absolute -mt-20" id="the-ice">&lt;/span>
&lt;a href="#the-ice" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>It was a very interesting time back then.&lt;/p>
&lt;p>I mean&amp;hellip;when I was doing this kind of things in &lt;a href="https://jalcocert.github.io/JAlcocerT/matlab-vs-octave/" target="_blank" rel="noopener">matlab&lt;/a>.&lt;/p>
&lt;p>But similarly as I did with &lt;a href="https://jalcocert.github.io/JAlcocerT/cycling-and-the-4-bars-mechanism/#from-concepts-to-equations" target="_blank" rel="noopener">the bike simulator&lt;/a>, it is time to bring them to python.&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
The &lt;a href="https://github.com/JAlcocerT/mbsd/blob/master/z-fluid-mechanics/z-mcia-heattransfer.md" target="_blank" rel="noopener">heat/combustion model&lt;/a> is very important to improve &lt;a href="https://github.com/JAlcocerT/mbsd/blob/master/z-fluid-mechanics/z-course-summary.md" target="_blank" rel="noopener">the initial model from my studies&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Im still amazed at people like &lt;code>FarmCraft101&lt;/code> and their subs who provide OSS cad design for a new turbine which x2 the energy collection:&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=gXHXrdzIt38 -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/gXHXrdzIt38" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Crazy&amp;hellip;.&lt;/p>
&lt;p>This is being the year of bridging concepts.&lt;/p>
&lt;p>I would have never guessed how, where and when I would be coming back to them.&lt;/p>
&lt;p>The executing speed is less of a problem&lt;/p>
&lt;p>The blocker is being more about knowledge management.&lt;/p>
&lt;p>For that, you can always:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/consulting.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Bring AI to your workflow&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/ebooks.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks with free value.&lt;/div>&lt;/a>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Volumetric efficiency&lt;span class="absolute -mt-20" id="volumetric-efficiency">&lt;/span>
&lt;a href="#volumetric-efficiency" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;!-- https://www.youtube.com/watch?v=1eRsaOxxiUc -->
&lt;p>One of the best videos to understand VE:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/1eRsaOxxiUc" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>You can also make an engineering BSc and port your matlab files to explore more:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /mbsd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./mbsd/z-fluid&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/volumetric_map.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>&lt;strong>Volumetric efficiency&lt;/strong> ($\eta_v$) measures how well an engine breathes — how much fresh charge actually enters the cylinder compared to what could theoretically fit:&lt;/p>
&lt;p>$$\eta_v = \frac{m_{actual}}{m_{ideal}} = \frac{\text{mass of air-fuel charge inducted}}{\rho_{ambient} \cdot V_{displacement}}$$&lt;/p>
&lt;p>A naturally aspirated engine at peak torque typically reaches $\eta_v \approx 85\text{–}95%$.&lt;/p>
&lt;p>The gap from 100% comes from several fluid-mechanical losses:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Loss source&lt;/th>
&lt;th style="text-align:left">Mechanism&lt;/th>
&lt;th style="text-align:left">Effect on $\eta_v$&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Intake restriction&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Throttle, filter, port — pressure drop reduces charge density&lt;/td>
&lt;td style="text-align:left">$-5$ to $-15%$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Residual gases&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Hot exhaust gases left in clearance volume displace fresh charge&lt;/td>
&lt;td style="text-align:left">$-5$ to $-10%$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Charge heating&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Intake port and valve heat the incoming air, reducing density&lt;/td>
&lt;td style="text-align:left">$-3$ to $-8%$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Late intake valve closing&lt;/strong>&lt;/td>
&lt;td style="text-align:left">At high RPM, inertia can ram extra charge in (beneficial) or cause backflow (harmful)&lt;/td>
&lt;td style="text-align:left">$\pm$variable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Valve curtain area&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Flow is choked by the annular gap at the valve seat&lt;/td>
&lt;td style="text-align:left">RPM-dependent&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4>The VE–RPM Curve&lt;span class="absolute -mt-20" id="the-verpm-curve">&lt;/span>
&lt;a href="#the-verpm-curve" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>VE is not a fixed number — it varies with engine speed, and its shape is what engine tuners care about:&lt;/p>
&lt;ul>
&lt;li>At &lt;strong>low RPM&lt;/strong>: slow piston velocity means low charge inertia; the intake valve closes before the cylinder is full → low VE&lt;/li>
&lt;li>At &lt;strong>peak torque RPM&lt;/strong>: intake runner length is tuned so pressure waves arrive just before valve closing, ram-charging the cylinder → peak VE&lt;/li>
&lt;li>At &lt;strong>high RPM&lt;/strong>: flow velocity through the valves approaches sonic limits; viscous and inertia losses dominate → VE drops&lt;/li>
&lt;/ul>
&lt;p>This is why intake runner length is tuned for a target RPM band.&lt;/p>
&lt;p>Short runners favour high-RPM power; long runners favour mid-range torque.&lt;/p>
&lt;p>Variable-length intake manifolds (Honda VTEC, BMW Valvetronic, Toyota VVTL-i) shift the VE peak across the rev range.&lt;/p>
&lt;h4>VE Map&lt;span class="absolute -mt-20" id="ve-map">&lt;/span>
&lt;a href="#ve-map" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>In engine management, VE is stored as a &lt;strong>2D lookup table&lt;/strong> (map) indexed by RPM and throttle position (or manifold pressure).&lt;/p>
&lt;p>The ECU multiplies the map value by ambient air density to compute the injected fuel mass — this is the basis of &lt;strong>speed-density fuelling&lt;/strong>:&lt;/p>
&lt;p>$$m_{fuel} = \frac{\eta_v \cdot \rho_{air} \cdot V_{disp} \cdot n}{2 \cdot \lambda \cdot AFR_{stoich}}$$&lt;/p>
&lt;p>where $n$ is engine speed (rev/s), the factor of 2 accounts for the 4-stroke cycle, $\lambda$ is the air excess ratio, and $AFR_{stoich}$ is the stoichiometric air-fuel ratio (~14.7 for petrol).&lt;/p>
&lt;p>A VE map measured on a dyno (or estimated from pressure-trace data) is exactly the kind of table that feeds into the 0D combustion model from the heat transfer post — it sets the initial charge mass, which determines peak pressure and therefore the combustion force on the piston crown.&lt;/p>
&lt;p>VE map reference: &lt;a href="https://www.tactrix.com/index.php?option=com_content&amp;amp;view=category&amp;amp;layout=blog&amp;amp;id=36" target="_blank" rel="noopener">Tactrix open-source ECU data&lt;/a>&lt;/p>
&lt;h3>The Analogy&lt;span class="absolute -mt-20" id="the-analogy">&lt;/span>
&lt;a href="#the-analogy" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Heat can be related to electro-magnetism, remember?&lt;/p>
&lt;p>We can bring fluid variables to that same play:&lt;/p>
&lt;p>In fact, the &amp;ldquo;Triple Analogy&amp;rdquo; between &lt;strong>Electricity, Heat, and Fluid Mechanics&lt;/strong> is one of the most elegant corners of physics.&lt;/p>
&lt;p>When you combine them, you get what engineers call &lt;strong>Lumped Element Modeling&lt;/strong>.&lt;/p>
&lt;p>Just as we mapped heat to electricity, we can map fluid flow to both.&lt;/p>
&lt;p>The &amp;ldquo;Master Variable&amp;rdquo; in fluid mechanics that corresponds to Voltage or Temperature is &lt;strong>Pressure&lt;/strong>.&lt;/p>
&lt;ol>
&lt;li>The Fluid-Electric-Thermal Mapping&lt;/li>
&lt;/ol>
&lt;p>If you can visualize water flowing through a pipe, you can understand a circuit or a heat exchanger.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Electrical&lt;/th>
&lt;th style="text-align:left">Thermal&lt;/th>
&lt;th style="text-align:left">Fluid Mechanics&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Voltage ($V$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Temperature ($T$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Pressure ($P$)&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Current ($I$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Heat Flow ($q$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Volumetric Flow Rate ($Q$)&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Resistance ($R$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Thermal Resistance ($R_{th}$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Hydraulic Resistance ($R_h$)&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Capacitance ($C$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Thermal Mass ($C_{th}$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Compliance / Tank Volume&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Inductance ($L$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;em>(No direct simple analog)&lt;/em>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Inertance (Fluid Mass/Inertia)&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="2">
&lt;li>How Fluid Components &amp;ldquo;Mimic&amp;rdquo; the Others&lt;/li>
&lt;/ol>
&lt;p>Hydraulic Resistance (The Pipe)&lt;/p>
&lt;p>A narrow pipe or a clogged filter acts exactly like a resistor.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Math:&lt;/strong> $\Delta P = Q \cdot R_h$ (This is essentially Ohm&amp;rsquo;s Law for fluids).&lt;/li>
&lt;li>&lt;strong>The Physics:&lt;/strong> To push more water (Current) through a thin straw (High Resistance), you need to blow harder (Increase Pressure/Voltage).&lt;/li>
&lt;/ul>
&lt;p>Fluid Compliance (The Water Tower)&lt;/p>
&lt;p>A large tank or an elastic balloon in a plumbing system acts like a capacitor.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>In Electricity:&lt;/strong> A capacitor stores charge and resists sudden changes in voltage.&lt;/li>
&lt;li>&lt;strong>In Fluids:&lt;/strong> A water tower stores potential energy and keeps the city&amp;rsquo;s water pressure from dropping the second everyone turns on their taps. It &amp;ldquo;smooths out&amp;rdquo; the pressure.&lt;/li>
&lt;/ul>
&lt;p>Fluid Inertance (The &amp;ldquo;Water Hammer&amp;rdquo;)&lt;/p>
&lt;p>This is a unique fluid property that is the perfect analog for an &lt;strong>Inductor&lt;/strong> ($L$) in a circuit.&lt;/p>
&lt;ul>
&lt;li>When you suddenly shut a faucet and hear a &amp;ldquo;thump&amp;rdquo; in the walls, that is &lt;strong>Inductance&lt;/strong>. The moving fluid has mass and &amp;ldquo;wants&amp;rdquo; to keep moving, just like an inductor resists a change in current. Heat transfer doesn&amp;rsquo;t really have a natural version of this, which makes thermal systems much &amp;ldquo;simpler&amp;rdquo; (and more sluggish) than fluid or electric ones.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>The &amp;ldquo;Power&amp;rdquo; Connection&lt;/li>
&lt;/ol>
&lt;p>In all three systems, &lt;strong>Power&lt;/strong> is calculated by multiplying the &amp;ldquo;Push&amp;rdquo; (Across variable) by the &amp;ldquo;Flow&amp;rdquo; (Through variable):&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Electric Power:&lt;/strong> $P = V \cdot I$&lt;/li>
&lt;li>&lt;strong>Thermal Power:&lt;/strong> $P = \Delta T \cdot q$ (Though $q$ is already a power unit, Watts)&lt;/li>
&lt;li>&lt;strong>Fluid Power:&lt;/strong> $P = \Delta P \cdot Q$&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>Why this matters for Heat Transfer&lt;/li>
&lt;/ol>
&lt;p>In real engineering, these analogies often collide. Think of a &lt;strong>Liquid Cooling System&lt;/strong> in a high-end PC:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>The CPU&lt;/strong> creates &amp;ldquo;Current&amp;rdquo; (Heat).&lt;/li>
&lt;li>&lt;strong>The Water&lt;/strong> acts as a &amp;ldquo;Carrier&amp;rdquo; (Fluid Flow).&lt;/li>
&lt;li>&lt;strong>The Pump&lt;/strong> provides the &amp;ldquo;Voltage&amp;rdquo; (Pressure) to overcome the &amp;ldquo;Resistance&amp;rdquo; (Narrow tubes).&lt;/li>
&lt;li>&lt;strong>The Radiator&lt;/strong> acts as a &amp;ldquo;Transformer,&amp;rdquo; transferring the &amp;ldquo;Current&amp;rdquo; from the fluid system into the air.&lt;/li>
&lt;/ol>
&lt;h3>The Limits of the Analogy&lt;span class="absolute -mt-20" id="the-limits-of-the-analogy">&lt;/span>
&lt;a href="#the-limits-of-the-analogy" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>While the &amp;ldquo;math&amp;rdquo; matches up beautifully for &lt;strong>Laminar Flow&lt;/strong> (smooth water), it breaks down once the fluid becomes &lt;strong>Turbulent&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>In electricity, $V=IR$ is almost always a straight line (linear).&lt;/li>
&lt;li>In fluids, if you double the flow, the pressure required might quadruple (non-linear).&lt;/li>
&lt;/ul>
&lt;p>Does adding the &amp;ldquo;Pressure&amp;rdquo; and &amp;ldquo;Pipes&amp;rdquo; layer make the concept of Heat Resistance feel more like a physical &amp;ldquo;obstacle&amp;rdquo; to you?&lt;/p>
&lt;h3>Tools&lt;span class="absolute -mt-20" id="tools">&lt;/span>
&lt;a href="#tools" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;a href="https://github.com/projectchrono/chrono" target="_blank" rel="noopener">https://github.com/projectchrono/chrono&lt;/a>&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>High-performance C++ library for multiphysics and multibody dynamics simulations&lt;/p>
&lt;/blockquote>
&lt;ol start="2">
&lt;li>&lt;a href="https://github.com/OpenModelica/OpenModelica" target="_blank" rel="noopener">https://github.com/OpenModelica/OpenModelica&lt;/a>&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>OpenModelica is an open-source Modelica-based modeling and simulation environment intended for industrial and academic usage.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h4>OSS Programs and Python Libraries for Fluid Mechanics&lt;span class="absolute -mt-20" id="oss-programs-and-python-libraries-for-fluid-mechanics">&lt;/span>
&lt;a href="#oss-programs-and-python-libraries-for-fluid-mechanics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>&lt;strong>Can FreeCAD do this?&lt;/strong>&lt;/p>
&lt;p>Yes. FreeCAD has two relevant workbenches:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>FEM Workbench&lt;/strong> — structural and thermal FEM via CalculiX and Elmer solvers, with a GUI mesh generator. Good for static stress and simple heat transfer, not CFD.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>CfdOF Add-on&lt;/strong> — a CFD workbench built on top of &lt;strong>OpenFOAM&lt;/strong>. You define geometry in FreeCAD, mesh it (SnappyHexMesh or cfMesh), set boundary conditions, and run OpenFOAM in the background. Visualisation is done via ParaView. This is the closest you get to a free ANSYS Fluent workflow.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /3Design
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /z-openfoam
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make all &lt;span class="c1">#make help&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;strong>GUI / standalone solvers:&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Tool&lt;/th>
&lt;th style="text-align:left">What it does&lt;/th>
&lt;th style="text-align:left">Notes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>OpenFOAM&lt;/strong>&lt;/td>
&lt;td style="text-align:left">General-purpose CFD (incompressible, compressible, reacting flow)&lt;/td>
&lt;td style="text-align:left">Industry standard OSS CFD; steep learning curve, powerful&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>SU2&lt;/strong>&lt;/td>
&lt;td style="text-align:left">CFD + adjoint-based optimisation&lt;/td>
&lt;td style="text-align:left">From Stanford; good for aerodynamics and shape optimisation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Elmer FEM&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Multiphysics including fluid-structure interaction&lt;/td>
&lt;td style="text-align:left">Finnish government-backed; GUI available&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Code_Saturne&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Turbulent industrial CFD&lt;/td>
&lt;td style="text-align:left">From EDF; handles complex geometries well&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>DWSIM&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Chemical process simulation with thermodynamics&lt;/td>
&lt;td style="text-align:left">Good for ICE thermodynamic cycle modelling&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Python libraries:&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Library&lt;/th>
&lt;th style="text-align:left">Use case&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Cantera&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Combustion chemistry and thermodynamics — the right tool for computing the pressure trace $P(\theta)$ in an ICE from first principles&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>CoolProp&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Thermophysical properties of real fluids (density, enthalpy, viscosity as functions of $P$ and $T$)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>fluids&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Engineering pipe flow, friction factors, fittings — Darcy-Weisbach and beyond&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>thermo&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Equation-of-state thermodynamics for mixtures&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>PyFluids&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Wrapper around CoolProp with a cleaner API&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>fipy&lt;/strong>&lt;/td>
&lt;td style="text-align:left">PDE solver that can handle the full Navier-Stokes if you want to write it yourself&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>pySPH&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Smoothed Particle Hydrodynamics — mesh-free, good for free-surface flows&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>For the ICE use case specifically&lt;/strong>, the practical Python stack is:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># pip install cantera coolprop fluids&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">cantera&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">ct&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Define the gas mixture (air + fuel)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">gas&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ct&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Solution&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;gri30.yaml&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">gas&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">TPX&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">300&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">101325&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;CH4:1, O2:2, N2:7.52&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Compress to TDC (polytropic)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">gas&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">SP&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">gas&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">s&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">gas&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">P&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">compression_ratio&lt;/span> &lt;span class="o">**&lt;/span> &lt;span class="n">gamma&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Ignite and get pressure&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ct&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">IdealGasReactor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">gas&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">sim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ct&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ReactorNet&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">sim&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">advance&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">1e-3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Peak pressure: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">thermo&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">P&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mf">1e5&lt;/span>&lt;span class="si">:&lt;/span>&lt;span class="s2">.1f&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> bar&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This gives you the combustion pressure that feeds directly into the MBSD slider-crank force model.&lt;/p>
&lt;hr>
&lt;h3>Betz&amp;rsquo;s Law and the Limits of Fluid Energy Extraction&lt;span class="absolute -mt-20" id="betzs-law-and-the-limits-of-fluid-energy-extraction">&lt;/span>
&lt;a href="#betzs-law-and-the-limits-of-fluid-energy-extraction" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The &lt;strong>Betz Limit&lt;/strong> (formulated in 1919 by Albert Betz) is a fundamental result in fluid dynamics that establishes the maximum possible efficiency for any turbine operating in an open flow.&lt;/p>
&lt;p>It is a clean example of how continuity and momentum conservation together impose a hard ceiling on what engineering can achieve.&lt;/p>
&lt;p>&lt;strong>What it states:&lt;/strong> no turbine can capture more than &lt;strong>59.3%&lt;/strong> of the kinetic energy in a flowing fluid.&lt;/p>
&lt;p>The maximum power coefficient is:&lt;/p>
&lt;p>$$C_p = \frac{16}{27} \approx 0.593$$&lt;/p>
&lt;p>The reasoning is elegant.&lt;/p>
&lt;p>If a turbine extracted 100% of the kinetic energy, the fluid downstream would be stationary — and stationary fluid cannot make room for incoming fluid, so the flow stalls.&lt;/p>
&lt;p>If the turbine extracts nothing, the fluid passes through unchanged.&lt;/p>
&lt;p>The optimum is somewhere in between: the fluid must leave with enough velocity to keep moving out of the way.&lt;/p>
&lt;p>Solving the momentum balance across a rotor disk gives exactly $16/27$.&lt;/p>
&lt;h4>Why Hydro Turbines Are Not Bound by Betz&lt;span class="absolute -mt-20" id="why-hydro-turbines-are-not-bound-by-betz">&lt;/span>
&lt;a href="#why-hydro-turbines-are-not-bound-by-betz" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Betz Law applies specifically to &lt;strong>open-flow&lt;/strong> systems — where the fluid can expand and divert around the rotor.&lt;/p>
&lt;p>Most hydroelectric turbines operate in &lt;strong>closed conduits&lt;/strong>, which changes the physics entirely:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Open vs. closed systems&lt;/strong> — in a pipe or casing, water cannot &amp;ldquo;escape&amp;rdquo; around the blades. Every kilogram of water must pass through the runner. This confinement allows pressure to do work that velocity alone cannot.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Pressure energy vs. kinetic energy&lt;/strong> — wind turbines extract kinetic energy from moving air. Hydro turbines mostly extract &lt;strong>potential energy&lt;/strong> (head) converted to pressure. The Betz derivation does not apply to pressure-driven systems.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Incompressibility&lt;/strong> — water is ~800× denser than air and effectively incompressible. In a wind turbine the stream tube must widen as air slows down. In a pipe the cross-section is fixed, so flow diversion is not an issue.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>The exception is &lt;strong>hydrokinetic turbines&lt;/strong> (in open rivers or tidal streams without a dam).&lt;/p>
&lt;p>These sit in open flow just like wind turbines and are subject to the same 59.3% limit.&lt;/p>
&lt;h4>The Three Classic Hydro Turbines&lt;span class="absolute -mt-20" id="the-three-classic-hydro-turbines">&lt;/span>
&lt;a href="#the-three-classic-hydro-turbines" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Each is engineered for a specific combination of head (pressure) and flow rate:&lt;/p>
&lt;p>&lt;strong>Pelton (Impulse)&lt;/strong>&lt;/p>
&lt;p>Designed for high head, low flow — mountain streams falling hundreds of metres through a narrow pipe.&lt;/p>
&lt;p>A nozzle converts pressure to a high-speed jet; the jet strikes spoon-shaped buckets at atmospheric pressure.&lt;/p>
&lt;p>Energy is extracted purely through momentum change.&lt;/p>
&lt;p>Because the water jet is concentrated and controlled, efficiencies above &lt;strong>90%&lt;/strong> are routine.&lt;/p>
&lt;p>No open-flow diversion problem, hence no Betz limit.&lt;/p>
&lt;p>&lt;strong>Francis (Reaction)&lt;/strong>&lt;/p>
&lt;p>The most common turbine in the world (Hoover Dam).&lt;/p>
&lt;p>Designed for medium head and medium-to-high flow. Water enters radially through a spiral casing, passes through the runner blades, and exits axially.&lt;/p>
&lt;p>It operates fully submerged and uses both velocity and pressure — the pressure drop across the blades &amp;ldquo;reacts&amp;rdquo; against them to produce torque.&lt;/p>
&lt;p>Efficiencies up to &lt;strong>95%&lt;/strong>. Fully enclosed, so Betz does not apply.&lt;/p>
&lt;p>&lt;strong>Kaplan (Reaction / Propeller)&lt;/strong>&lt;/p>
&lt;p>Essentially a large ducted propeller. Designed for low head and very high flow — large, slow-moving rivers.&lt;/p>
&lt;p>Adjustable blades allow it to remain efficient as river levels change through the year.&lt;/p>
&lt;p>Like the Francis it is a reaction turbine enclosed in a housing, forcing all flow through the runner.&lt;/p>
&lt;p>Efficiencies typically &lt;strong>90–93%&lt;/strong>.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Turbine&lt;/th>
&lt;th style="text-align:left">Type&lt;/th>
&lt;th style="text-align:left">Head&lt;/th>
&lt;th style="text-align:left">Flow&lt;/th>
&lt;th style="text-align:left">Best use case&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Pelton&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Impulse&lt;/td>
&lt;td style="text-align:left">High&lt;/td>
&lt;td style="text-align:left">Low&lt;/td>
&lt;td style="text-align:left">Mountain / alpine&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Francis&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Reaction&lt;/td>
&lt;td style="text-align:left">Medium&lt;/td>
&lt;td style="text-align:left">Medium–High&lt;/td>
&lt;td style="text-align:left">Large dams&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Kaplan&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Reaction&lt;/td>
&lt;td style="text-align:left">Low&lt;/td>
&lt;td style="text-align:left">Very high&lt;/td>
&lt;td style="text-align:left">Flat rivers, tidal&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The common thread: where a wind turbine must &amp;ldquo;let go&amp;rdquo; of some energy just to keep air moving away, these hydro designs control every drop through a closed path — which is why they all exceed the Betz limit comfortably.&lt;/p></description></item><item><title>Plants while travelling</title><link>https://JAlcocerT.github.io/JAlcocerT/plants-103-inspiration/</link><pubDate>Tue, 05 May 2026 01:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/plants-103-inspiration/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Prep work for when you &lt;a href="https://jalcocert.github.io/JAlcocerT/tech-for-a-trip/" target="_blank" rel="noopener">go on a trip&lt;/a> and you have &lt;a href="https://jalcocert.github.io/JAlcocerT/plants-101/#growth-experiment" target="_blank" rel="noopener">tomatoes at home&lt;/a>&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>We come from:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/electronics-101" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Electronics 101 | Repo&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/VideoEditionRemorion" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Remotion x Video | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;p>And I know you love &lt;a href="https://jalcocert.github.io/JAlcocerT/tech-for-a-trip/" target="_blank" rel="noopener">travelling&lt;/a>.&lt;/p>
&lt;p>You can use the setups I will explain accordingly to &lt;a href="#when-is-the-best-weather-to-plant-what" >the typical weather&lt;/a> while you are not at home.&lt;/p>
&lt;h3>The IoT and Controlled Watering&lt;span class="absolute -mt-20" id="the-iot-and-controlled-watering">&lt;/span>
&lt;a href="#the-iot-and-controlled-watering" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Watchout for &lt;a href="https://jalcocert.github.io/JAlcocerT/electromagnetism-101/#how-to-avoid-frying-an-esp32-due-to-kickback" target="_blank" rel="noopener">that EMF kickback&lt;/a> when the DC switches off&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/electronics-101/tree/master/sample-pyscipe" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Electronics 101 | Repo&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/VideoEditingRemotion/tree/main/remotion-electronics" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Remotion x Video | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;p>This was possible by combining PySpice with RemotionJS:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/1veGKSFzqcQ" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h3>The Capilarity approach&lt;span class="absolute -mt-20" id="the-capilarity-approach">&lt;/span>
&lt;a href="#the-capilarity-approach" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Aka just physics approach.&lt;/p>
&lt;h2>Monitoring Plants while Travelling&lt;span class="absolute -mt-20" id="monitoring-plants-while-travelling">&lt;/span>
&lt;a href="#monitoring-plants-while-travelling" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;!-- ![Pi Camera](/blog_img/hardware/RPi4_2gb_cam.jpg) -->
&lt;p>Some time ago I put together &lt;a href="https://github.com/JAlcocerT/RPi/tree/main/Z_RPi_Cam" target="_blank" rel="noopener">this repo folder&lt;/a> to use your Pi as a streaming camera:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">choco install rpi-imager
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ip neigh&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/raspberry-pi-camera-setup/" target="_blank" rel="noreferrer">&lt;img
alt="Pi Cam 101"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/hardware/RPi4_2gb_cam.jpg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Pi Cam 101&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Using the raspberry camera for the first time&lt;/div>&lt;/a>
&lt;/div>
&lt;p>Particularly &lt;a href="https://jalcocert.github.io/JAlcocerT/raspberry-pi-camera-setup/#pi-camera---video-streaming" target="_blank" rel="noopener">with mjpg-streamer&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">ip neigh show 192.168.1.18
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/RPi
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/Home-Lab &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./RPi/Z_SelfHosting
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo bash homelab-selfhosting.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker --version #Docker version 26.1.5+dfsg1, build a72d7cd&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-yellow-100 bg-yellow-50 text-yellow-900 dark:border-yellow-200/30 dark:bg-yellow-700/30 dark:text-yellow-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
⚠️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Remember to enable the pi camera!
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#vcgencmd get_camera&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo raspi-config &lt;span class="c1">#OV5647 sensor (the classic 5MP Camera Module v1.3)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Now, these are the ones working: &lt;em>for Debian Trixie&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">rpicam-hello &lt;span class="c1">#Linux jalcocert 6.12.75+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.75-1+rpt1 (2026-03-11) aarch64 GNU/Linux&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rpicam-still -t &lt;span class="m">1000&lt;/span> -o pico.jpg --nopreview
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp jalcocert@192.168.1.18:~/pico.jpg .&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>As you can imagine, this worked back in time, but for the latest Trixie OS its&amp;hellip;tricky&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">rpicam-vid -t &lt;span class="m">15000&lt;/span> --width &lt;span class="m">1920&lt;/span> --height &lt;span class="m">1080&lt;/span> --framerate &lt;span class="m">30&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>--bitrate &lt;span class="m">10000000&lt;/span> --codec h264 -o clean_1080p.h264
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg -framerate &lt;span class="m">30&lt;/span> -i clean_1080p.h264 -c:v copy clean_1080p.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp jalcocert@192.168.1.18:/home/jalcocert/RPi/Z_SelfHosting/Frigate/clean_1080p.mp4 .&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>There where &lt;a href="https://github.com/JAlcocerT/RPi/tree/main/Z_SelfHosting/Frigate#gotchas-we-hit-in-order" target="_blank" rel="noopener">some gotchas&lt;/a>, but &lt;a href="https://github.com/JAlcocerT/RPi/blob/main/Z_SelfHosting/Frigate/docker-compose.yaml" target="_blank" rel="noopener">this Frigate stack&lt;/a> also does the trick.&lt;/p>
&lt;p>As i just wanted to see, I disabled the recordings at the &lt;code>config.yml&lt;/code> &lt;a href="https://github.com/JAlcocerT/RPi/tree/main/Z_SelfHosting/Frigate#enabling-recording-later-if-you-want-it" target="_blank" rel="noopener">like so&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./RPi/Z_SelfHosting/Frigate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo docker compose stop &lt;span class="c1"># stop both containers (keeps them, fast restart)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo docker compose start &lt;span class="c1"># start them again&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo docker compose down &lt;span class="c1"># stop + remove containers (network too)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo docker compose up -d &lt;span class="c1"># recreate from compose files (use after editing them)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker stats frigate #50% of the cpu for my pi4&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://raw.githubusercontent.com/JAlcocerT/RPi/main/Z_SelfHosting/frigate.png" alt="DHT22 x VPD x pgsql Webapp" loading="lazy" />&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
More about Frigate in a future post, for now &lt;a href="https://github.com/JAlcocerT/RPi/tree/main/Z_SelfHosting/Frigate" target="_blank" rel="noopener">enjoy the setup&lt;/a> at &lt;code>http://192.168.1.18:5000/&lt;/code>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h4>The DHT Home Monitoring&lt;span class="absolute -mt-20" id="the-dht-home-monitoring">&lt;/span>
&lt;a href="#the-dht-home-monitoring" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>I modified it recently to just be Node x PGsql (TimescaleDB)&lt;/p>
&lt;p>Going from this:&lt;/p>
&lt;p>&lt;img src="https://raw.githubusercontent.com/JAlcocerT/RPi/main/Z_MicroControllers/dht-webapp/dht-webapp.png" alt="DHT Webapp" loading="lazy" />&lt;/p>
&lt;p>To &lt;a href="https://github.com/JAlcocerT/RPi/blob/main/Z_MicroControllers/RPiPicoW/picow-dht-webapp-vpd-poc/docker-compose.yml" target="_blank" rel="noopener">such stack&lt;/a>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps | grep emqx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./RPi/Z_SelfHosting/pgsql&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps | grep timescaledb&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./RPi/Z_MicroControllers/RPiPicoW/picow-dht-webapp-vpd-poc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker compose up -d --build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Web → http://&amp;lt;host&amp;gt;:8001 · DB → localhost:5433.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker compose up -d --build webapp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker compose up -d #and here it goes timescaleDB + all the webApp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker exec -it timescaledb psql -U pico -d sensors&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>We still rely on EMQX for MQTT like the &lt;a href="#prior-picoesp-dht" >previous version&lt;/a>!&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/emqx" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">EMQX Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/pi-dht22-vpd" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">RPi DHT22 NodeJS - Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>&lt;img src="https://raw.githubusercontent.com/JAlcocerT/RPi/main/Z_MicroControllers/RPiPicoW/picow-dht-webapp-vpd-poc/dht22-vpd.png" alt="DHT22 x VPD x pgsql Webapp" loading="lazy" />&lt;/p>
&lt;blockquote>
&lt;p>The one you can visit anytime at &lt;code>http://192.168.1.2:8077/&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;h4>MQTT x Alerts&lt;span class="absolute -mt-20" id="mqtt-x-alerts">&lt;/span>
&lt;a href="#mqtt-x-alerts" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ol>
&lt;li>Initially I thought about webhooks&lt;/li>
&lt;li>Then, I reminded that I &lt;a href="https://jalcocert.github.io/JAlcocerT/wedding-photo-galleries/#gotify" target="_blank" rel="noopener">tried gotify last year&lt;/a>&lt;/li>
&lt;/ol>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/blob/main/gotify/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Gotify | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/blob/main/ntfy/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Ntfy | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>So far, one of the best experiments of the year:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/yrQ3Tjy8rPU" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://youtube.com/shorts/yrQ3Tjy8rPU -->
&lt;h3>Growth Experiment&lt;span class="absolute -mt-20" id="growth-experiment">&lt;/span>
&lt;a href="#growth-experiment" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Its been a while since &lt;a href="https://jalcocert.github.io/JAlcocerT/plants-101/#growth-experiment" target="_blank" rel="noopener">the last&lt;/a> review.&lt;/p>
&lt;p>How are the plants doing after ~6 weeks of planting them?&lt;/p>
&lt;p>The most developed tomatoe plants are having small flowers already at the top.&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/YvhEcUt1-to" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!--
https://youtube.com/shorts/YvhEcUt1-to
-->
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>When is the best weather to plant what?&lt;span class="absolute -mt-20" id="when-is-the-best-weather-to-plant-what">&lt;/span>
&lt;a href="#when-is-the-best-weather-to-plant-what" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>You can use my &lt;a href="https://github.com/JAlcocerT/Py_Trip_Planner/tree/main/poc-trip-planner-v4" target="_blank" rel="noopener">latest trip-planner v4&lt;/a> as launched &lt;a href="" >here&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/Py_Trip_Planner
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./Py_Trip_Planner/poc-trip-planner-v4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run dev&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/TripPlanner/trip-planner-v4.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Get the patters to know what to expect depending when you will be leaving your plants alone.&lt;/p>
&lt;h3>Inspiring resources&lt;span class="absolute -mt-20" id="inspiring-resources">&lt;/span>
&lt;a href="#inspiring-resources" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>You get a walk around AC/DC power transmission&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/45DNG8eUhwY" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
For transmiting power at same V, DC is more efficient than AC because of &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/samples-theory/0e-dc-vs-ac-power/transmission_effects_faq.md#summary-table-effect-magnitudes-at-60-hz-1-gw-765-kv-transmission" target="_blank" rel="noopener">effects like skin effect, corona&amp;hellip;&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- https://www.youtube.com/watch?v=45DNG8eUhwY -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/lYdx68V2jt0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://www.youtube.com/watch?v=lYdx68V2jt0 -->
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Turbines are a thing: there is an upcoming fluid post
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>Concepts&lt;span class="absolute -mt-20" id="concepts">&lt;/span>
&lt;a href="#concepts" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>VPD -&lt;/li>
&lt;/ol>
&lt;h3>Pi x Cam is trickier&lt;span class="absolute -mt-20" id="pi-x-cam-is-trickier">&lt;/span>
&lt;a href="#pi-x-cam-is-trickier" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Some time back, this worked:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/meinside/rpi-mjpg-streamer &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/rpi-mjpg-streamer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> rpi-mjpg-streamer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#curl -fsSL https://claude.ai/install.sh | bash&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># echo &amp;#39;export PATH=&amp;#34;$HOME/.local/bin:$PATH&amp;#34;&amp;#39; &amp;gt;&amp;gt; ~/.bashrc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#source ~/.bashrc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install gh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gh auth login &lt;span class="c1">#with a PAT for 30d&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~/RPi &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git push&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-yellow-100 bg-yellow-50 text-yellow-900 dark:border-yellow-200/30 dark:bg-yellow-700/30 dark:text-yellow-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
⚠️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
This worked with bullseye debian v11, but notanymore
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>So I got to know about: &lt;a href="https://github.com/bhaney/rtsp-simple-server#docker" target="_blank" rel="noopener">https://github.com/bhaney/rtsp-simple-server#docker&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">podman run --rm -it &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --name camera-stream &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --network&lt;span class="o">=&lt;/span>host &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --privileged &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --tmpfs /dev/shm:exec &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -v /run/udev:/run/udev:ro &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">MTX_PATHS_CAM_SOURCE&lt;/span>&lt;span class="o">=&lt;/span>rpiCamera &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> docker.io/bluenviron/mediamtx:1-rpi&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>http://192.168.1.18:8889/cam/&lt;/p>
&lt;/blockquote>
&lt;p>And finally: &lt;a href="https://github.com/AlexxIT/go2rtc" target="_blank" rel="noopener">https://github.com/AlexxIT/go2rtc&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">podman run -d --name go2rtc &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --restart always &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --privileged &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --network host &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --tmpfs /dev/shm:exec &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -v /run/udev:/run/udev:ro &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --device /dev/video0:/dev/video0 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --device /dev/media0:/dev/media0 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --device /dev/dma_heap/linux,cma:/dev/dma_heap/linux,cma &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --device /dev/dma_heap/system:/dev/dma_heap/system &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">GO2RTC_STREAMS_TOMATO_CAM&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;exec:rpicam-vid -t 0 --nopreview --codec h264 --inline --listen -o -&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">GO2RTC_ALLOW_ARBITRARY_EXEC&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nb">true&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> docker.io/alexxit/go2rtc:latest&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/rpi-mjpg-streamer" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">RPi mjpg streamer | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;h3>Prior Pico/ESP DHT&lt;span class="absolute -mt-20" id="prior-picoesp-dht">&lt;/span>
&lt;a href="#prior-picoesp-dht" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/RPi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git pull&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./RPi/Z_MicroControllers/dht-webapp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s mqtt &lt;span class="s1">&amp;#39;uv run mqtt_to_db.py&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s webapp &lt;span class="s1">&amp;#39;uv run uvicorn main:app --host 0.0.0.0 --port 8077&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux ls&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div></description></item><item><title>Electro-Magnetism for AC/DC engines</title><link>https://JAlcocerT.github.io/JAlcocerT/electromagnetism-for-ac-dc-motors/</link><pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/electromagnetism-for-ac-dc-motors/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Post &lt;a href="https://jalcocert.github.io/JAlcocerT/electromagnetism-101/" target="_blank" rel="noopener">electro-magnetism 101&lt;/a> and &lt;a href="https://jalcocert.github.io/JAlcocerT/electronics-101/" target="_blank" rel="noopener">electronics&lt;/a>&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Ive been doing &lt;a href="https://github.com/JAlcocerT/electronics-101/tree/master/samples-confidence" target="_blank" rel="noopener">additional electronics recaps&lt;/a> before going all in with more &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/z-ideas.md" target="_blank" rel="noopener">electronics ideas&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /electronics-101/samples-motors&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Circuits Recap&lt;span class="absolute -mt-20" id="circuits-recap">&lt;/span>
&lt;a href="#circuits-recap" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/clidey/electronics-101" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Electronics-101 Github ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;h2>Electric Engines&lt;span class="absolute -mt-20" id="electric-engines">&lt;/span>
&lt;a href="#electric-engines" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Wondering about &lt;a href="https://jalcocert.github.io/JAlcocerT/buying-car-data-analytics/" target="_blank" rel="noopener">buying a car&lt;/a>?&lt;/p>
&lt;h3>DC&lt;span class="absolute -mt-20" id="dc">&lt;/span>
&lt;a href="#dc" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>AC&lt;span class="absolute -mt-20" id="ac">&lt;/span>
&lt;a href="#ac" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>Modelling&lt;span class="absolute -mt-20" id="modelling">&lt;/span>
&lt;a href="#modelling" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h4>The L-R&lt;span class="absolute -mt-20" id="the-l-r">&lt;/span>
&lt;a href="#the-l-r" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Why all of this?&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Property&lt;/th>
&lt;th>DC (Brushed)&lt;/th>
&lt;th>Induction (Squirrel Cage)&lt;/th>
&lt;th>Synchronous&lt;/th>
&lt;th>BLDC&lt;/th>
&lt;th>Stepper&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Torque-Current&lt;/strong>&lt;/td>
&lt;td>Linear (τ ∝ I)&lt;/td>
&lt;td>Slip-dependent&lt;/td>
&lt;td>Sine (τ ∝ sin δ)&lt;/td>
&lt;td>Linear (τ ∝ I)&lt;/td>
&lt;td>Detent only&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Starting Torque&lt;/strong>&lt;/td>
&lt;td>High (max I)&lt;/td>
&lt;td>Medium (slip ↑)&lt;/td>
&lt;td>Very low (needs sync)&lt;/td>
&lt;td>High (if commutated)&lt;/td>
&lt;td>None (steps)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Max Efficiency&lt;/strong>&lt;/td>
&lt;td>70-90%&lt;/td>
&lt;td>85-95%&lt;/td>
&lt;td>90-98%&lt;/td>
&lt;td>85-98%&lt;/td>
&lt;td>&amp;lt;50% (intermittent)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Maintenance&lt;/strong>&lt;/td>
&lt;td>Brushes (wear)&lt;/td>
&lt;td>Minimal&lt;/td>
&lt;td>Slip rings (if EC)&lt;/td>
&lt;td>None&lt;/td>
&lt;td>None&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Speed Control&lt;/strong>&lt;/td>
&lt;td>Easy (V variation)&lt;/td>
&lt;td>Needs VFD&lt;/td>
&lt;td>Needs exciter&lt;/td>
&lt;td>Easy (PWM)&lt;/td>
&lt;td>Open-loop steps&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Speed Range&lt;/strong>&lt;/td>
&lt;td>0-max (smooth)&lt;/td>
&lt;td>~±5% around sync&lt;/td>
&lt;td>Fixed at sync&lt;/td>
&lt;td>0-max (smooth)&lt;/td>
&lt;td>Fixed (cogging)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Power Factor&lt;/strong>&lt;/td>
&lt;td>N/A (DC)&lt;/td>
&lt;td>Inductive (0.7-0.9)&lt;/td>
&lt;td>Controllable&lt;/td>
&lt;td>N/A (DC control)&lt;/td>
&lt;td>N/A (DC control)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Size/Weight&lt;/strong>&lt;/td>
&lt;td>Medium&lt;/td>
&lt;td>Large (for same torque)&lt;/td>
&lt;td>Large&lt;/td>
&lt;td>Small&lt;/td>
&lt;td>Tiny&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Cost (small, &amp;lt;1 kW)&lt;/strong>&lt;/td>
&lt;td>Low&lt;/td>
&lt;td>Medium&lt;/td>
&lt;td>High&lt;/td>
&lt;td>Medium&lt;/td>
&lt;td>Very low&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Cost (large, &amp;gt;10 kW)&lt;/strong>&lt;/td>
&lt;td>High&lt;/td>
&lt;td>Low&lt;/td>
&lt;td>Medium&lt;/td>
&lt;td>High&lt;/td>
&lt;td>N/A (not used)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Typical Uses&lt;/strong>&lt;/td>
&lt;td>Old tools, low speed&lt;/td>
&lt;td>Industrial baseline&lt;/td>
&lt;td>Power plants, precision&lt;/td>
&lt;td>EV, robotics, drones&lt;/td>
&lt;td>CNC, 3D printers&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Well, you can use this knowledge for fpv/drons:&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=MxG22nbBNvQ -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/MxG22nbBNvQ" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>See also &lt;a href="https://www.youtube.com/watch?v=SMymlTtM1w8" target="_blank" rel="noopener">this one&lt;/a>.&lt;/p>
&lt;p>The drone brushless DC motors will have present &lt;a href="https://jalcocert.github.io/JAlcocerT/electromagnetism-101/#3-faradays-law-of-induction" target="_blank" rel="noopener">Faraday law&lt;/a> with their &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/samples-theory/motors-ac-dc/backemf_vs_emf_kickback.md" target="_blank" rel="noopener">Back EMF&lt;/a>, same principle of &lt;a href="https://jalcocert.github.io/JAlcocerT/electronics-101/#conclusions" target="_blank" rel="noopener">the EMF kickback of the watering project&lt;/a>.&lt;/p>
&lt;p>$$\nabla \times \mathbf{E} = -\frac{\partial \mathbf{B}}{\partial t}$$&lt;/p>
&lt;p>Remember: A changing magnetic field creates an electric field!&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
&amp;ldquo;kV&amp;rdquo; on drone motors is &lt;strong>NOT kilovolts.&lt;/strong> It&amp;rsquo;s &lt;strong>motor constant:&lt;/strong> volts of back-EMF per 1000 RPM. More &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/samples-theory/motors-ac-dc/drone_motors.md" target="_blank" rel="noopener">about dron motors&lt;/a>.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>Or to understand electric cars &lt;a href="https://jalcocert.github.io/JAlcocerT/buying-car-data-analytics/#car-costs-analytics" target="_blank" rel="noopener">before buying one&lt;/a>&lt;/p>
&lt;p>&lt;strong>Total Energy Spent:&lt;/strong> Approximately &lt;strong>211 kWh&lt;/strong>.
&lt;strong>Efficiency:&lt;/strong> $211\text{ kWh} / 16.3\text{ (units of 100km)} = \mathbf{12.9\text{ kWh/100km}}$.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Note:&lt;/strong> You actually drove &lt;em>more efficiently&lt;/em> than your initial 15 kWh estimate!&lt;/p>
&lt;/blockquote>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Metric&lt;/th>
&lt;th style="text-align:left">Your Trip (EV)&lt;/th>
&lt;th style="text-align:left">Diesel Equivalent (Est.)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Total Distance&lt;/strong>&lt;/td>
&lt;td style="text-align:left">1,630 km&lt;/td>
&lt;td style="text-align:left">1,630 km @ 6L/100km&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Total &amp;ldquo;Fuel&amp;rdquo; Cost&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>~810 NOK&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>~2,050 NOK&lt;/strong> (at 6L/100km &amp;amp; 21 NOK/L)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Effort&lt;/strong>&lt;/td>
&lt;td style="text-align:left">8 charging stops&lt;/td>
&lt;td style="text-align:left">1 or 2 fuel stops&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Efficiency&lt;/strong>&lt;/td>
&lt;td style="text-align:left">12.9 kWh/100km&lt;/td>
&lt;td style="text-align:left">~60 kWh/100km (energy equiv.)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Efficiency $&lt;/strong>&lt;/td>
&lt;td style="text-align:left">~5,36$/100km&lt;/td>
&lt;td style="text-align:left">~11,96$/100km&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Unit Cost Comparison ($ USD per 1 kWh)&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Energy Source&lt;/th>
&lt;th style="text-align:left">Cost per kWh (USD)&lt;/th>
&lt;th style="text-align:left">Relative Price&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Home Charging&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>$0.15&lt;/strong>&lt;/td>
&lt;td style="text-align:left">1.0x (Baseline)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Diesel Fuel&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>$0.23&lt;/strong>&lt;/td>
&lt;td style="text-align:left">1.5x more expensive&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Public Charging (My electric Trip)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>$0.46&lt;/strong>&lt;/td>
&lt;td style="text-align:left">3.0x more expensive&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
More about &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/samples-theory/motors-ac-dc/cars_motors.md" target="_blank" rel="noopener">electric cars motors&lt;/a>, including &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/samples-theory/motors-ac-dc/srm_faq.md" target="_blank" rel="noopener">srm&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Application&lt;/th>
&lt;th>Motor Type&lt;/th>
&lt;th>Power&lt;/th>
&lt;th>Voltage&lt;/th>
&lt;th>Why&lt;/th>
&lt;th>Duty&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Starter&lt;/strong>&lt;/td>
&lt;td>DC Brushed&lt;/td>
&lt;td>1-2 kW&lt;/td>
&lt;td>12V&lt;/td>
&lt;td>Max torque from zero&lt;/td>
&lt;td>~2 sec burst&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Window&lt;/strong>&lt;/td>
&lt;td>DC Brushed&lt;/td>
&lt;td>0.1 kW&lt;/td>
&lt;td>12V&lt;/td>
&lt;td>Simple, cheap&lt;/td>
&lt;td>~5 sec per use&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Steering&lt;/strong>&lt;/td>
&lt;td>PMSM&lt;/td>
&lt;td>5-10 kW&lt;/td>
&lt;td>12-48V&lt;/td>
&lt;td>Smooth, precise, continuous&lt;/td>
&lt;td>Variable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Cooling Fan&lt;/strong>&lt;/td>
&lt;td>BLDC/Induction&lt;/td>
&lt;td>1-2 kW&lt;/td>
&lt;td>12-48V&lt;/td>
&lt;td>Long-running, efficient&lt;/td>
&lt;td>~30% duty&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>A/C Compressor&lt;/strong>&lt;/td>
&lt;td>BLDC&lt;/td>
&lt;td>3-5 kW&lt;/td>
&lt;td>400V (EV)&lt;/td>
&lt;td>Precise control, efficient&lt;/td>
&lt;td>~40% duty&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>EV Traction (old)&lt;/strong>&lt;/td>
&lt;td>Induction&lt;/td>
&lt;td>100-300 kW&lt;/td>
&lt;td>400V&lt;/td>
&lt;td>Proven, robust, simple control&lt;/td>
&lt;td>Continuous variable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>EV Traction (modern)&lt;/strong>&lt;/td>
&lt;td>PMSM&lt;/td>
&lt;td>100-300+ kW&lt;/td>
&lt;td>400-900V&lt;/td>
&lt;td>Higher efficiency, compact&lt;/td>
&lt;td>Continuous variable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Mild Hybrid&lt;/strong>&lt;/td>
&lt;td>BLDC/PMSM&lt;/td>
&lt;td>10-50 kW&lt;/td>
&lt;td>48V&lt;/td>
&lt;td>Efficient, regenerates&lt;/td>
&lt;td>~30% duty&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Plug-in Hybrid&lt;/strong>&lt;/td>
&lt;td>PMSM&lt;/td>
&lt;td>50-100 kW&lt;/td>
&lt;td>400V&lt;/td>
&lt;td>Full electric mode, regenerative&lt;/td>
&lt;td>40-60% duty&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>AC vs DC Power Transmission&lt;span class="absolute -mt-20" id="ac-vs-dc-power-transmission">&lt;/span>
&lt;a href="#ac-vs-dc-power-transmission" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>As experimented and summarized &lt;a href="https://github.com/JAlcocerT/electronics-101/tree/master/samples-theory/0e-dc-vs-ac-power" target="_blank" rel="noopener">here&lt;/a>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Scenario&lt;/th>
&lt;th>Winner&lt;/th>
&lt;th>Margin&lt;/th>
&lt;th>Why&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Same voltage, no transformers&lt;/td>
&lt;td>DC&lt;/td>
&lt;td>~0.5-1%&lt;/td>
&lt;td>No skin, eddy, corona, proximity losses. But negligible compared to&amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Distance &amp;lt; 100 km&lt;/td>
&lt;td>AC (regional grid)&lt;/td>
&lt;td>100×&lt;/td>
&lt;td>Transformers. Cheap, proven. Converter cost not justified.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Distance 100-500 km&lt;/td>
&lt;td>AC (765 kV step-up)&lt;/td>
&lt;td>50×&lt;/td>
&lt;td>Step-up transformer reduces loss exponentially. Still beats DC converters.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Distance &amp;gt; 500 km&lt;/td>
&lt;td>HVDC emerging&lt;/td>
&lt;td>10-20%&lt;/td>
&lt;td>DC cable footprint advantage starts dominating. Converters now efficient enough.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Submarine cable&lt;/td>
&lt;td>HVDC clear&lt;/td>
&lt;td>100×&lt;/td>
&lt;td>AC cables leak capacitive current. DC avoids repeater amplifiers every 50 km.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Async grid tie (different frequencies)&lt;/td>
&lt;td>HVDC only&lt;/td>
&lt;td>∞&lt;/td>
&lt;td>AC requires phase sync. DC is frequency-agnostic.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Pure DC renewable (solar arrays)&lt;/td>
&lt;td>HVDC&lt;/td>
&lt;td>20%&lt;/td>
&lt;td>Avoid AC inversion. DC stays DC all the way.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
More &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/samples-theory/0e-dc-vs-ac-power/hvdc_faq.md" target="_blank" rel="noopener">about HVDC&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>Converting Electrical Energy&lt;span class="absolute -mt-20" id="converting-electrical-energy">&lt;/span>
&lt;a href="#converting-electrical-energy" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>Rectifier (AC $\rightarrow$ DC)&lt;/li>
&lt;/ol>
&lt;p>A &lt;strong>Rectifier&lt;/strong> converts Alternating Current (&lt;strong>AC&lt;/strong>) into Direct Current (&lt;strong>DC&lt;/strong>).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>How it works:&lt;/strong> It uses diodes (which act like one-way valves) to block or redirect the &amp;ldquo;backwards&amp;rdquo; part of the AC wave so the electricity only flows in one direction.&lt;/li>
&lt;li>&lt;strong>Common Example:&lt;/strong> Your phone charger. It takes the AC from your wall and rectifies it into the DC your battery needs.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Inverter (DC $\rightarrow$ AC)&lt;/li>
&lt;/ol>
&lt;p>An &lt;strong>Inverter&lt;/strong> converts Direct Current (&lt;strong>DC&lt;/strong>) into Alternating Current (&lt;strong>AC&lt;/strong>).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>How it works:&lt;/strong> It uses high-speed switches (transistors) to &amp;ldquo;chop up&amp;rdquo; the flat DC signal and flip its polarity back and forth to mimic the wave shape of AC.&lt;/li>
&lt;li>&lt;strong>Common Example:&lt;/strong> Solar panels. They produce DC, but your home appliances need AC, so a &amp;ldquo;Solar Inverter&amp;rdquo; sits in the middle.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;a href="https://github.com/JAlcocerT/electronics-101/tree/master/sample-pyscipe/home-scale-pv" target="_blank" rel="noopener">Home pv&lt;/a> setups tend to have one of these!&lt;/p>
&lt;/blockquote>
&lt;ol start="3">
&lt;li>Transformer (AC $\rightarrow$ AC)&lt;/li>
&lt;/ol>
&lt;p>You are exactly right—a &lt;strong>Transformer&lt;/strong> stays within the same &amp;ldquo;lane&amp;rdquo; (AC to AC).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>How it works:&lt;/strong> It uses magnetic induction to change the &lt;strong>voltage&lt;/strong> and &lt;strong>current&lt;/strong> levels, but it cannot change the nature of the current. It cannot work with DC because it requires a changing magnetic field (which only AC provides).&lt;/li>
&lt;li>&lt;strong>Common Example:&lt;/strong> Those big grey cans on utility poles. They take high-voltage AC from the power lines and &amp;ldquo;step it down&amp;rdquo; to the 110V/230V AC used in your house.&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Device&lt;/th>
&lt;th style="text-align:left">Input&lt;/th>
&lt;th style="text-align:left">Output&lt;/th>
&lt;th style="text-align:left">Common Use&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Rectifier&lt;/strong>&lt;/td>
&lt;td style="text-align:left">AC&lt;/td>
&lt;td style="text-align:left">&lt;strong>DC&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Powering electronics from a wall outlet.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Inverter&lt;/strong>&lt;/td>
&lt;td style="text-align:left">DC&lt;/td>
&lt;td style="text-align:left">&lt;strong>AC&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Using a car battery to run a laptop or TV.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Transformer&lt;/strong>&lt;/td>
&lt;td style="text-align:left">AC&lt;/td>
&lt;td style="text-align:left">&lt;strong>AC&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Stepping voltage up/down for the grid.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Pro Tip:&lt;/strong> If you want to go from &lt;strong>DC to DC&lt;/strong> (like changing the voltage of a battery), you use something called a &lt;strong>DC-DC Converter&lt;/strong> (often a &amp;ldquo;Buck&amp;rdquo; or &amp;ldquo;Boost&amp;rdquo; converter).&lt;/p></description></item><item><title>How to PoC | Arbitrage with AI</title><link>https://JAlcocerT.github.io/JAlcocerT/poc-104/</link><pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/poc-104/</guid><description>
&lt;ul>
&lt;li>&lt;a href="https://app.fireflies.ai/perks" target="_blank" rel="noopener">https://app.fireflies.ai/perks&lt;/a>&lt;/li>
&lt;li>Perplexity and commet (from W11 only on the desktop)&lt;/li>
&lt;/ul>
&lt;p>do we really need &lt;code>betterpic&lt;/code> and similar tool?&lt;/p>
&lt;p>Or have they been superseeded by image 2 from openai?&lt;/p>
&lt;p>&lt;a href="https://skills.sh/" target="_blank" rel="noopener">https://skills.sh/&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://www.youtube.com/watch?v=qfWpPEgea2A&amp;amp;t=191s" target="_blank" rel="noopener">https://www.youtube.com/watch?v=qfWpPEgea2A&amp;t=191s&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://www.youtube.com/watch?v=rlLwSr-wIAg&amp;amp;t=431s" target="_blank" rel="noopener">https://www.youtube.com/watch?v=rlLwSr-wIAg&amp;t=431s&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://github.com/martingaido/ai-prompt-engineering-docs/blob/main/gemini-for-google-workspace-prompting-guide-101.pdf" target="_blank" rel="noopener">https://github.com/martingaido/ai-prompt-engineering-docs/blob/main/gemini-for-google-workspace-prompting-guide-101.pdf&lt;/a>&lt;/p>
&lt;p>aristotel onassis&lt;/p>
&lt;!-- engine starting
https://www.youtube.com/shorts/mzWr2ZGf7OU
https://www.youtube.com/watch?v=gmV4qwLfOMY
derivatives
The Trillion Dollar Equation
https://www.youtube.com/watch?v=A5w-dEgIU1M
-->
&lt;!--
https://www.youtube.com/shorts/D8Q0Y6R4NiI -->
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>People still dont believe that a PoC can be built in 1h, not in 6 months.&lt;/p>
&lt;p>How long will it take for this information to spread out?&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/entrepreneur/bip/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>BiP | Docs ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/entrepreneur/#offers/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Offers | Docs ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Lets continue the business/entrepreneurial/BiP series of this year.&lt;/p>
&lt;p>I hope you had time to &lt;em>Pressure-test your product brief&lt;/em> since &lt;a href="https://jalcocert.github.io/JAlcocerT/poc-103/" target="_blank" rel="noopener">the last one&lt;/a>.&lt;/p>
&lt;h2>Entrep CheckPoint&lt;span class="absolute -mt-20" id="entrep-checkpoint">&lt;/span>
&lt;a href="#entrep-checkpoint" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ol start="0">
&lt;li>
&lt;p>Prepare a &lt;a href="https://jalcocert.github.io/JAlcocerT/the-ideas-bucket-can-be-empty/#ideas-checklist" target="_blank" rel="noopener">checklist&lt;/a>: your brand should have one, including the unit economics and the value equation mindmap&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Dis-Qualify: &lt;del>specially if you have many ideas&lt;/del> always after first 10&lt;/p>
&lt;/li>
&lt;li>&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/data-experiments/life-flows-blured.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>While building:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>SMART or it doesnt ship: &lt;em>a mantra&lt;/em>, specially after building &lt;a href="https://github.com/JAlcocerT/poc/tree/main/libg/telecom-product" target="_blank" rel="noopener">this&lt;/a> on &lt;a href="https://jalcocert.github.io/JAlcocerT/poc-103/#helping-pms-and-pdms" target="_blank" rel="noopener">this section&lt;/a>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Lean: &lt;em>Perceived value is the only value&lt;/em>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>A friend told me that in big corporations the narrative is that the ultimate proof for achievement is revealed at linkedin.&lt;/p>
&lt;p>That having a website is like &lt;em>very cheap&lt;/em>, as you can write anything and you have no way to check if whats written is true or not.&lt;/p>
&lt;p>Not sure about you, but having as a hack for real value:&lt;/p>
&lt;ol>
&lt;li>The count of likes and hearts that an algorithm put in front of your face&lt;/li>
&lt;li>People re-inforcing pre-accepted ideas (herd behaviour, like whatever your boss posts)&lt;/li>
&lt;li>Telling how hard was your migration process to Canada and why you came back being another person&lt;/li>
&lt;/ol>
&lt;p>Doesnt seem quite&amp;hellip; there, right?&lt;/p>
&lt;p>Anyways, how can you proof value if you are not delivering any?&lt;/p>
&lt;p>Luckily, some of us have proofs:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/consulting.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Tier of Service for the ones that cant wait to get value&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/ebooks.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks with free value.&lt;/div>&lt;/a>
&lt;/div>
&lt;p>PS: you can make all the content of this blog as yours by just cloning :)&lt;/p>
&lt;p>PS2: from next year, new curated posts &lt;em>might&lt;/em> still be free, just not OSS, as Im preparing some changes around the consulting model.&lt;/p>
&lt;p>Industries?&lt;/p>
&lt;ol>
&lt;li>Aerospace&lt;/li>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/docs/engineering/mech/" target="_blank" rel="noopener">Mech Engineering&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/fmcg-concepts-101/" target="_blank" rel="noopener">FMCG&lt;/a>/Logistics/Consumer Insights/Intelligence&lt;/li>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/understading-crypto-with-ai/" target="_blank" rel="noopener">Crypto&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/docs/entrepreneur/marketing/" target="_blank" rel="noopener">Marketing&lt;/a> Analytics / &lt;a href="https://jalcocert.github.io/JAlcocerT/how-to-do-social-media-outreach/#a-ui-wrapper-around-apify" target="_blank" rel="noopener">RevOps&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/docs/engineering/telco/" target="_blank" rel="noopener">Telecom&lt;/a>/Big Data&lt;/li>
&lt;li>HealthCare Analytics&lt;/li>
&lt;li>AI and DevOps&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>Revops and GenBI is blooming!&lt;/p>
&lt;/blockquote>
&lt;h3>Roadmap Check 2605&lt;span class="absolute -mt-20" id="roadmap-check-2605">&lt;/span>
&lt;a href="#roadmap-check-2605" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Its all about:&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://agents.md/" target="_blank" rel="noopener">https://agents.md/&lt;/a>&lt;/li>
&lt;li>skills.sh, &lt;a href="https://github.com/openai/skills" target="_blank" rel="noopener">https://github.com/openai/skills&lt;/a>&lt;/li>
&lt;li>Agents like: &lt;em>openclaw or the selfimproving ones like Hermes&lt;/em>&lt;/li>
&lt;/ol>
&lt;h3>Whats next?&lt;span class="absolute -mt-20" id="whats-next">&lt;/span>
&lt;a href="#whats-next" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Goals without values and w/o decomposed actions are useless&lt;/p>
&lt;p>The last monthly review was &lt;a href="https://jalcocert.github.io/JAlcocerT/poc-102/#whats-next" target="_blank" rel="noopener">this one&lt;/a>&lt;/p>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">RoadMap26 Check | As of 0526 TBDDDD 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;p>Coming from &lt;a href="https://jalcocert.github.io/JAlcocerT/tech-recap-and-more-2025/#for-next-year" target="_blank" rel="noopener">last year end review&lt;/a>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Weddings serverless + ads - &lt;a href="https://jalcocert.github.io/JAlcocerT/bring-eyes-to-your-saas/" target="_blank" rel="noopener">WIP&lt;/a> and last one &lt;a href="https://jalcocert.github.io/JAlcocerT/quick-weddings-poc/" target="_blank" rel="noopener">here&lt;/a> ⚙️&lt;/p>
&lt;/li>
&lt;li>
&lt;p>To get back to mech simulations - &lt;em>not commercial&lt;/em> ✅ - &lt;a href="https://jalcocert.github.io/JAlcocerT/2d-mbsd" target="_blank" rel="noopener">MBSD 2D&lt;/a> With published ebook, the check on why I6 is the balance king and some math to blender video flow&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Prepare the DIY/DWY/DFY based on the ebooks and blog content ~ &lt;em>Wiki efforts&lt;/em> - &lt;a href="https://jalcocert.github.io/JAlcocerT/poc-101/" target="_blank" rel="noopener">WIP&lt;/a> ⚙️&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Books &lt;em>from D&amp;amp;A to web and concepts from kindle notes&lt;/em> - &lt;a href="https://github.com/JAlcocerT/jalcocertech-services/tree/master/repos/jalcocert-destillation" target="_blank" rel="noopener">Distillation WIP&lt;/a> ⚙️&lt;/p>
&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run build &amp;amp;&amp;amp; npx wrangler pages deploy dist --project-name jalcocertech-ebooks&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="3">
&lt;li>IoT &lt;em>end to end flow from sensor to dashboarding &lt;del>&amp;amp; langchain&lt;/del>&lt;/em> - &lt;a href="https://jalcocert.github.io/JAlcocerT/plants-102-and-iot/#mqtt-x-iot" target="_blank" rel="noopener">WIP&lt;/a> ⚙️&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>Put together an &lt;a href="https://ebooks.jalcocertech.com/books/iot/" target="_blank" rel="noopener">IoT 101 ebook&lt;/a>!&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>Visible at &lt;code>http://192.168.1.2:8077/&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;ol start="4">
&lt;li>Custom Marketing analytics &lt;em>from custom high signal content creation to funnels&lt;/em> Matplotlib, remotion/hyperframes stuff&amp;hellip;&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>The ideas cemetery&lt;/strong>&lt;/p>
&lt;ol start="6">
&lt;li>&lt;del>Scaling PRO Webs creation via PaaS&lt;/del> - A better DIY website with free (programmatic) audit - Free web audits &lt;a href="https://jalcocert.github.io/JAlcocerT/how-to-perform-free-web-audit/" target="_blank" rel="noopener">show problems here&lt;/a> ✅&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;code>https://diy.jalcocertech.com/&lt;/code>&lt;/li>
&lt;li>&lt;code>https://webaudit.jalcocertech.com/&lt;/code>&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;del>Real Estate Custom RAG and WebApp via DecapCMS&lt;/del> | Cancelled and &lt;a href="https://jalcocert.github.io/JAlcocerT/white-label-real-estate-solution/" target="_blank" rel="noopener">white-labelled&lt;/a>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;a href="https://realestate.jalcocertech.com/" target="_blank" rel="noopener">https://realestate.jalcocertech.com/&lt;/a>&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/details>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Personal monthly recap &lt;em>Where am I?&lt;/em> here
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>Keep Doing&lt;span class="absolute -mt-20" id="keep-doing">&lt;/span>
&lt;a href="#keep-doing" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>Following my roadmap for this year, as planned here.&lt;/li>
&lt;/ol>
&lt;p>Yea, im not considering &lt;code>Side-Quests26&lt;/code> nor &lt;code>Tech talks&lt;/code>.&lt;/p>
&lt;p>Oh, also not the monthly selfhosted/homelab recaps.&lt;/p>
&lt;ol start="2">
&lt;li>Monthly Life ~ IKIGAI Checks: &lt;em>just that not done in onenote, &lt;a href="https://github.com/JAlcocerT/my-logseq-notes" target="_blank" rel="noopener">but in .md&lt;/a>&lt;/em>&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /my-logseq-notes&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="3">
&lt;li>Quiiick PoCs: &lt;em>like the recent &lt;strong>iperf3&lt;/strong> speed monitoring &lt;a href="https://github.com/JAlcocerT/poc/tree/main/iperf" target="_blank" rel="noopener">related&lt;/a>&lt;/em>&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/poc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/iperf&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/Sync/iperf3-eth.png" alt="iPerf3 Ethernet local speeds" loading="lazy" />&lt;/p>
&lt;p>The recently upgraded &lt;a href="https://github.com/JAlcocerT/Py_Trip_Planner/tree/main/poc-vibe-weather" target="_blank" rel="noopener">&lt;strong>trip&lt;/strong> planner from v3&lt;/a> to v4:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/Py_Trip_Planner
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./Py_Trip_Planner/poc-trip-planner-v4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run dev&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker compose up -d --build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps | grep oc-trip-planner-v4-web-1&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>As i turned off Umami recently, I got it working at: &lt;code>http://192.168.1.2:3000&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/TripPlanner/trip-planner-v4.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;blockquote>
&lt;p>V3 used node+python, v4 is just node with &lt;a href="https://jalcocert.github.io/JAlcocerT/poc-101/#charts-for-data-products" target="_blank" rel="noopener">even nicer charts&lt;/a> with &lt;a href="https://github.com/JAlcocerT/Py_Trip_Planner/blob/main/poc-trip-planner-v4/tech-stack.md" target="_blank" rel="noopener">such tech stack&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;p>Or&amp;hellip;the one around &lt;strong>DHT&lt;/strong> temp/hum monitoring: I made a port to nodeJS to simplify the stack&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /RPi&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>With python+node you will need a more complex setup:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps | grep emqx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./RPi/Z_SelfHosting/pgsql&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker start timescaledb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker update --restart always timescaledb&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker inspect timescaledb --format &lt;span class="s1">&amp;#39;{{ .HostConfig.RestartPolicy.Name }}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># docker run -d --name timescaledb \&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># -e POSTGRES_USER=pico \&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># -e POSTGRES_PASSWORD=pico \&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># -e POSTGRES_DB=sensors \&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># -p 5432:5432 \&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># timescale/timescaledb:latest-pg16&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux ls&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./home/jalcocert/RPi/Z_MicroControllers/dht-webapp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./home/jalcocert/RPi/Z_MicroControllers/RPiPicoW/picow-dht-webapp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s mqtt &lt;span class="s2">&amp;#34;uv run mqtt_to_db.py&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s webapp &lt;span class="s2">&amp;#34;uv run uvicorn main:app --host 0.0.0.0 --port 8077&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Run order:&lt;/p>
&lt;ol>
&lt;li>docker compose up -d in Z_SelfHosting/pgsql&lt;/li>
&lt;li>Create table + trigger once (psql block in readme)&lt;/li>
&lt;li>mqtt_to_db.py (systemd or tmux)&lt;/li>
&lt;li>uvicorn main:app &amp;ndash;host 0.0.0.0 &amp;ndash;port 8000&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&lt;code>http://192.168.1.2:8077/&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;p>Than just one CLI and &lt;code>http://192.168.1.2:8078/&lt;/code>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./RPi/RPi/Z_MicroControllers/RPiPicoW/picow-dht-webapp-vpd-poc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker compose up -d --build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Web → http://&amp;lt;host&amp;gt;:8001 · DB → localhost:5433.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker compose up -d &lt;span class="c1">#and here it goes timescaleDB + all the webApp&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://raw.githubusercontent.com/JAlcocerT/RPi/main/Z_MicroControllers/RPiPicoW/picow-dht-webapp-vpd-poc/dht22-vpd.png" alt="DHT22 x VPD x pgsql Webapp" loading="lazy" />&lt;/p>
&lt;p>With this upgraded &lt;a href="https://github.com/JAlcocerT/RPi/blob/main/Z_MicroControllers/RPiPicoW/picow-dht-webapp-vpd-poc/z-tech-stack.md" target="_blank" rel="noopener">tech stack&lt;/a> and &lt;a href="https://github.com/JAlcocerT/RPi/blob/main/Z_MicroControllers/RPiPicoW/picow-dht-webapp-vpd-poc/z-data-lineage.md" target="_blank" rel="noopener">data lineage&lt;/a>!&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/trip-planner" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Trip Planner v4 - Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/pi-dht22-vpd" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">pi-dht22-vpd Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>I got also some updates for &lt;strong>finances&lt;/strong> with the aegis freedom poc and the stocks simple:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/poc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/stocks-simple/web
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run start
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make help&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ALLOWED_DEV_ORIGINS&lt;/span>&lt;span class="o">=&lt;/span>192.168.1.18,raspberrypi.local npm run dev&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="3">
&lt;li>Generating random data &lt;strong>animated videos &amp;amp; renders&lt;/strong>: &lt;em>is probably time to unify these&amp;hellip;&lt;/em>&lt;/li>
&lt;/ol>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://gitlab.com/fossengineer1/unfolding-data" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Unfolding Data | NEW Gitlab Repo&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://gitlab.com/fossengineer1/unfolding-data" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Unfolding Data | VideoEditingRemotion&lt;/span>&lt;/a>
&lt;/div>
&lt;p>Creating &lt;a href="https://jalcocert.github.io/JAlcocerT/about-motion-graphics/" target="_blank" rel="noopener">motion graphics&lt;/a> data stories is fun:&lt;/p>
&lt;p>Yea&amp;hellip; its about time:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">/eda-f1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/eda-geospatial&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="4">
&lt;li>Using GenAI to make &lt;em>real&lt;/em> engineering recaps&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /mbsd&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /3Design
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone /electronics-101&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="5">
&lt;li>Iterating&lt;/li>
&lt;/ol>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">From Vibe Coding to Agentic Engineering | Setup early May📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">I need Landing Page based with a cool and modern UI.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Create also a makefile with the following commands:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">*&lt;/span> &lt;span class="sb">`make help`&lt;/span> - Show available commands
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">*&lt;/span> &lt;span class="sb">`make install`&lt;/span> - Prepare the dependencies for local development
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">*&lt;/span> &lt;span class="sb">`make dev`&lt;/span> - Run development server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Create the &lt;span class="sb">`z-development-plan.md`&lt;/span> with independent and testable phases that can be completed sequentially.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">When it is completed, create a &lt;span class="sb">`z-walkthrough.md`&lt;/span> with the steps to deploy the application and what each part of the tech stack does on a high level to bring the features to life.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The &lt;span class="gs">**full copy**&lt;/span> of the landing, has to be goberned by a single &lt;span class="sb">`site.md`&lt;/span> file.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Consider adding a Terms of Service / &lt;span class="gs">**terms and conditions and privacy policy**&lt;/span> to the website, which will be governed by two separated markdown files.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Add also a faq section, that instead of been controlled via a json, lets have it controlled as per the frontmatter and content of separated markdown files inside the folder &lt;span class="sb">`faq`&lt;/span>. &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/details>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">Vibe Coding | Setup Jan26 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;p>Go to whatever LLM you are using and ask: &lt;code>do you think that these requirements are clear enough?&lt;/code>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">Create a sth sth sth like... a Landing Page based on NextJS with a cool and modern UI
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Include a &lt;span class="sb">`dockerfile`&lt;/span> and &lt;span class="sb">`docker-compose.yml`&lt;/span> that will control the title, description, open-graph image, favicon location and other global website variables via environment variables.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Add also a docker-compose.portainer.yml to use assuming that the image has been built already.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Create also a makefile with the following commands:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">*&lt;/span> &lt;span class="sb">`make help`&lt;/span> - Show available commands
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">*&lt;/span> &lt;span class="sb">`make install`&lt;/span> - Prepare the dependencies for local development
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">*&lt;/span> &lt;span class="sb">`make dev`&lt;/span> - Run development server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">*&lt;/span> &lt;span class="sb">`make container`&lt;/span> - Build and Run in Docker container
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Create the &lt;span class="sb">`z-development-plan.md`&lt;/span> with independent and testable phases that can be completed sequentially.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">When it is completed, create a &lt;span class="sb">`z-walkthrough.md`&lt;/span> with the steps to deploy the application and what each part of the tech stack does on a high level to bring the features to life.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Consider adding a Terms of Service / &lt;span class="gs">**terms and conditions and privacy policy**&lt;/span> to the website, which will be governed by two separated markdown files.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Add also a faq section, that instead of been controlled via a json, lets have it controlled as per the frontmatter and content of separated markdown files inside the folder &lt;span class="sb">`faq`&lt;/span>.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The logic should read them in order as per their file name and show them in the right component of the UI.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">&amp;gt; &lt;/span>&lt;span class="ge">When these change, consider sending an email to your existing clients!
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="ge">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Consider adding &lt;span class="gs">**Umami web analytics capabilities**&lt;/span> to the WebApp when using the container, by adding the possibility to feed the PUBLIC_UMAMI_SCRIPT_URL and PUBLIC_UMAMI_WEBSITE_ID to be used via &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">defer&lt;/span> &lt;span class="na">src&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;&amp;#34;&lt;/span> &lt;span class="na">data-website-id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">If you are using Python, design proper functions with docstrings, so that the codebase is understandable, scalable and self-documenting.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Then go to &lt;a href="#antigravity-ide" >AntiGravity IDE&lt;/a> and ask if the &lt;code>brd.md&lt;/code> refined already with Gemini is clear enough.&lt;/p>
&lt;p>If it is clear define the &lt;code>z-development-plan.md&lt;/code> and proceed with the development phases.&lt;/p>
&lt;p>As you will need to iterate across features, do it like a pro with change-requests / CRQ.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo apt install gh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gh auth login
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#gh repo create make-xyz --private --source=. --remote=origin --push&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git init &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git add . &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git commit -m &lt;span class="s2">&amp;#34;Initial commit: simple landing website&amp;#34;&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> gh repo create make-xyz --private --source&lt;span class="o">=&lt;/span>. --remote&lt;span class="o">=&lt;/span>origin --push
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">###du -sh .&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker stop $(docker ps -a -q) #stop all&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker system df&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make help&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker builder prune &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo journalctl --vacuum-size=500M&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get clean
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get autoremove&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;strong>Technical Stack and Design Requirements&lt;/strong>&lt;/p>
&lt;p>To develop a &lt;strong>modern, secure, and scalable web platform&lt;/strong> for hosting and streaming a single-user podcast.&lt;/p>
&lt;p>The platform must offer a seamless, content-driven user interface and a flexible content management system supporting both web uploads and direct file system access.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Requirement&lt;/th>
&lt;th style="text-align:left">Specification&lt;/th>
&lt;th style="text-align:left">Clarification / Decision&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Frontend Framework&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Styling/UI Library&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>&lt;a href="https://jalcocert.github.io/JAlcocerT/docs/dev/fe-vs-be/" target="_blank" rel="noopener">Backend&lt;/a>/Database&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>&lt;a href="https://jalcocert.github.io/JAlcocerT/docs/dev/authentication/" target="_blank" rel="noopener">Authentication&lt;/a>&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>And if you need more:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Requirement&lt;/th>
&lt;th style="text-align:left">Specification&lt;/th>
&lt;th style="text-align:left">Clarification / Decision&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Deployment&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Content Management&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Analytics&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Interactivity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>External Integrations&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/details>
&lt;blockquote>
&lt;p>The BRD, tech stack, clarifications, dev phases and walkthough. With sales and psyc plugged in!&lt;/p>
&lt;/blockquote>
&lt;h4>Those Weddings B2B&lt;span class="absolute -mt-20" id="those-weddings-b2b">&lt;/span>
&lt;a href="#those-weddings-b2b" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Move past &amp;ldquo;product thinking&amp;rdquo; into &amp;ldquo;distribution thinking,&amp;rdquo; which is where most SaaS projects actually live or die.&lt;/p>
&lt;p>A good &lt;a href="https://jalcocert.github.io/JAlcocerT/how-to-get-customers-programmatically/#lead-enrichment-x-firecrawl" target="_blank" rel="noopener">use case&lt;/a> for &lt;a href="https://github.com/JAlcocerT/leads-slubnechwile" target="_blank" rel="noopener">APIFY x lead enrichment&lt;/a> and a phone: &lt;em>in case you &lt;a href="https://github.com/JAlcocerT/slubne-chwile-y26/blob/master/b2b-vs-b2c.md" target="_blank" rel="noopener">doubt b2c vs b2b&lt;/a>&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">/home/jalcocert/Desktop/leads-slubnechwile/venv/bin/python apify/json_to_csv.py &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> ls -lh leads.csv &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> head -n &lt;span class="m">5&lt;/span> leads.csv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#title;price;phone;categories;website&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/leads-slubnechwile" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Leads Slubne ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/leads-slubnechwile" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Slubne ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>&lt;a href="https://colab.research.google.com/github/JAlcocerT/leads-slubnechwile/blob/main/101-firecrawl.ipynb" target="_blank" rel="noopener">&lt;img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open in Google Colab" loading="lazy" />&lt;/a>&lt;/p>
&lt;p>Make sure to have &lt;a href="https://github.com/JAlcocerT/slubne-chwile-y26/blob/master/b2b-vs-b2c.md#cold-call-script--partner-playbook" target="_blank" rel="noopener">the script prepared&lt;/a> with objections handling and psyc in place.&lt;/p>
&lt;blockquote>
&lt;p>Follows the &amp;ldquo;PAS&amp;rdquo; (Problem-Agitation-Solution) framework perfectly. Dont&amp;rsquo;t start with your product; start with their headache.&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>B2C covers the long tail (couples who search organically or click ads)&lt;/li>
&lt;li>B2B covers high-LTV bulk deals through photographers&lt;/li>
&lt;li>Email drip works on both (couple is in Firestore regardless of how they arrived)&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/data-experiments/business-ltv-cac.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;blockquote>
&lt;p>Measure which channel has better LTV/CAC and weight accordingly&lt;/p>
&lt;/blockquote>
&lt;h3>Stop Doing&lt;span class="absolute -mt-20" id="stop-doing">&lt;/span>
&lt;a href="#stop-doing" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>Collaborations with people around vague ideas/projects&lt;/li>
&lt;/ol>
&lt;p>those who dont have a clear&lt;em>er&lt;/em> (&amp;gt;=) than what I expect before executing my own worthless ideas are to be skipped.&lt;/p>
&lt;p>When you have certain volume, this is the kind of thing that you put into a &lt;em>dis&lt;/em>qualification form.&lt;/p>
&lt;p>Have your own &lt;a href="#ideas-checklist" >ideas checklist&lt;/a> in place!&lt;/p>
&lt;h3>Start Doing&lt;span class="absolute -mt-20" id="start-doing">&lt;/span>
&lt;a href="#start-doing" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>As code is cheap and so are videos&amp;hellip;&lt;/li>
&lt;/ol>
&lt;p>I need to think about the FOSS/JAlcocerTech yt videos rebump - TBC though&lt;/p>
&lt;ol start="2">
&lt;li>Data is no longer a full thing, a data product is the &lt;em>upcoming&lt;/em> new end to end&lt;/li>
&lt;/ol>
&lt;p>Because nobody will pay you to make a SQL group by and filters any more&lt;/p>
&lt;p>As you know, agents are coming to the workspace, that includes pbi, looker and whatever&lt;/p>
&lt;p>Why should you restrict yourself to existing dashboarding tools?&lt;/p>
&lt;p>not talking about streamlit pocs, but full stack data pocs&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /poc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude #/usage #as long as you have still tokens&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>References&lt;span class="absolute -mt-20" id="references">&lt;/span>
&lt;a href="#references" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;strong>The ideal reading order for a solopreneur:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Cardone&lt;/strong> — get your sales energy and mindset right&lt;/li>
&lt;li>&lt;strong>Cashvertising&lt;/strong> — learn the psychological triggers behind buying&lt;/li>
&lt;li>&lt;strong>Ogilvy&lt;/strong> — elevate your craft and build a lasting brand&lt;/li>
&lt;/ol>
&lt;p>Together those three cover the full spectrum from hustle to strategy.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /jalcocertech-services&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#submodule add https://github.com/JAlcocerT/ebook-ideas&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Im destilling my read ebooks notes: here, here and &lt;a href="https://github.com/JAlcocerT/ebook-ideas/tree/master/z-z-destilled" target="_blank" rel="noopener">here&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;ol start="4">
&lt;li>&lt;strong>The design of the design&lt;/strong>: I got to know &lt;a href="https://www.youtube.com/watch?v=EJyuu6zlQCg" target="_blank" rel="noopener">thanks to Matt&lt;/a>&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-13">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude #/skills&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/grill-me&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-13"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div></description></item><item><title>Launching a MBSD framework</title><link>https://JAlcocerT.github.io/JAlcocerT/design-centric-mbsd/</link><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/design-centric-mbsd/</guid><description>
&lt;p>&lt;strong>TL;DR&lt;/strong>&lt;/p>
&lt;p>The start of a system to &lt;strong>ship mechanisms as a code&lt;/strong>.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/mbsd/tree/master/z-fluid-mechanics" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Previous MBSD | Repo&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/mbsd/3Design" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
3Design | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>You know whats coming right?&lt;/p>
&lt;p>The era of drag and drop its slowly going to an end.&lt;/p>
&lt;p>And the time for concepts, semantics and &lt;strong>orchestrating outcomes&lt;/strong>.&lt;/p>
&lt;p>I consolidated the initial mbsd repo via: &lt;a href="https://github.com/juliusbrussee/caveman" target="_blank" rel="noopener">https://github.com/juliusbrussee/caveman&lt;/a> just to save tokens.&lt;/p>
&lt;h2>Gabe Morris - Mechanism&lt;span class="absolute -mt-20" id="gabe-morris---mechanism">&lt;/span>
&lt;a href="#gabe-morris---mechanism" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The one I forked because its so great: &lt;a href="https://github.com/JAlcocerT/mechanism" target="_blank" rel="noopener">https://github.com/JAlcocerT/mechanism&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/mechanism
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#choco install blender --version=4.2.2 -y #5.1.1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv add mapbox-earcut
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run blender-export/cam_to_stl.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run blender-export/gear_to_stl.py &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You can import the STLs to blender manually or with:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">blender --background --python blender-export/blender_import.py&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Kinematics only. No dynamics.&lt;/p>
&lt;p>Evidence:&lt;/p>
&lt;ul>
&lt;li>Zero mass/inertia/torque/force-balance code in mechanism/. Sole &amp;ldquo;forces&amp;rdquo; mention = stray word in origin docstring (mechanism.py:270).&lt;/li>
&lt;li>Solver = vector-loop position/velocity/acceleration via numerical iteration. No Newton-Euler, no kinetics.&lt;/li>
&lt;li>Cam output = SVAJ (geometric). No follower spring/preload force calc.&lt;/li>
&lt;li>Gears = involute geometry only. No bending/contact stress, no power transmission.&lt;/li>
&lt;li>README confirms: &amp;ldquo;perform kinematic analysis by utilizing degrees of freedom&amp;rdquo;.&lt;/li>
&lt;/ul>
&lt;p>What you get = θ, ω, α, position, velocity, acceleration of points/vectors. What you don&amp;rsquo;t get = required &lt;br>
input torque, joint reaction forces, link stresses, dynamic balancing.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/multi-body&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git init &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git add . &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git commit -m &lt;span class="s2">&amp;#34;Initial commit: better ai docs&amp;#34;&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> gh repo create multi-body --private --source&lt;span class="o">=&lt;/span>. --remote&lt;span class="o">=&lt;/span>origin --push&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#The trick&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git submodule add https://github.com/JAlcocerT/mechanism.git external/mechanism
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;Add mechanism repo as submodule&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git submodule add https://github.com/JAlcocerT/mbsd.git external/mbsd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;Add mbsd repo as submodule&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone --recurse-submodules https://github.com/JAlcocerT/multi-body.git&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Computational Mechanics&lt;span class="absolute -mt-20" id="computational-mechanics">&lt;/span>
&lt;a href="#computational-mechanics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Familiar now. Repo = 2D MBSD simulator (Python) + e-book chaining engine NVH source→driver and suspension arc.&lt;/p>
&lt;p>Simulator core (2D-Dynamics/)&lt;/p>
&lt;ul>
&lt;li>Saddle-point system: M·a + Cqᵀ·λ = Q, Cq·a = γ. Bodies, joints, constraints, contact, cam, terrain. - Outputs motions + Lagrange reactions.&lt;/li>
&lt;/ul>
&lt;p>E-book (z-destilled-ebook/) = 12 engine-NVH chapters + 4 suspension + 4 reference. Pipeline: cylinder
→ block → mounts → chassis → cabin → driver.&lt;/p>
&lt;p>Examples under 2D-Dynamics/examples/:&lt;/p>
&lt;ul>
&lt;li>multi-cylinder-nograv/ — i4, boxer4, flat4, V, combustion, balance shafts, mounts, active damping,&lt;br>
chassis modal&lt;/li>
&lt;li>suspension-terrain/ — quarter_car, road_profile_psd, design_space_sweep, active_suspension&lt;/li>
&lt;li>Adjacent: cam-follower, four-bar, pendulums, scotch-yoke, terrain-wheel&lt;/li>
&lt;/ul>
&lt;h2>MBSD Framework Applications&lt;span class="absolute -mt-20" id="mbsd-framework-applications">&lt;/span>
&lt;a href="#mbsd-framework-applications" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>From Augmented Reality Simulations, to engine balance, NVH, synthesis&amp;hellip;&lt;/p>
&lt;h3>Engine Balance&lt;span class="absolute -mt-20" id="engine-balance">&lt;/span>
&lt;a href="#engine-balance" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Every engine in the MBSD series was analysed using the same tool: &lt;strong>phasor analysis&lt;/strong>.&lt;/p>
&lt;p>Each cylinder&amp;rsquo;s reciprocating inertia force is represented as a rotating vector at a given harmonic order ($1\times$, $2\times$, &amp;hellip; engine speed).&lt;/p>
&lt;p>Sum the vectors for all cylinders — if they cancel, that order is balanced; if they don&amp;rsquo;t, you have a free force or moment that will shake the engine.&lt;/p>
&lt;p>The two sources of imbalance are:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Free forces&lt;/strong> — net unbalanced force transmitted to the mounts and chassis&lt;/li>
&lt;li>&lt;strong>Free moments (couples)&lt;/strong> — net unbalanced torque that rocks the engine about its mounts&lt;/li>
&lt;/ul>
&lt;h4>The Phasor Method&lt;span class="absolute -mt-20" id="the-phasor-method">&lt;/span>
&lt;a href="#the-phasor-method" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>For a multi-cylinder engine with crank throws at angles $\phi_k$, the $n$-th order force phasor for cylinder $k$ is:&lt;/p>
&lt;p>$$\vec{F}_k^{(n)} = F_0 \cdot e^{j n \phi_k}$$&lt;/p>
&lt;p>where $F_0 = m_r \cdot r \cdot \omega^2$ (rotating equivalent mass × crank radius × angular velocity squared). Balance requires $\sum_k \vec{F}_k^{(n)} = 0$ for each order of interest.&lt;/p>
&lt;p>For in-line engines the moment check adds a $z_k$ arm (cylinder spacing along the crankshaft axis): $\sum_k z_k \cdot \vec{F}_k^{(n)} = 0$.&lt;/p>
&lt;h4>Engine Family Balance Map&lt;span class="absolute -mt-20" id="engine-family-balance-map">&lt;/span>
&lt;a href="#engine-family-balance-map" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Engine&lt;/th>
&lt;th style="text-align:left">Config&lt;/th>
&lt;th style="text-align:left">Primary ($1\times$)&lt;/th>
&lt;th style="text-align:left">Secondary ($2\times$)&lt;/th>
&lt;th style="text-align:left">Free moment&lt;/th>
&lt;th style="text-align:left">Notes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I3&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Inline 3&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Yes — rocking couple&lt;/td>
&lt;td style="text-align:left">Characteristic 3-cyl rumble&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I4&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Inline 4&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>Not balanced&lt;/strong>&lt;/td>
&lt;td style="text-align:left">No&lt;/td>
&lt;td style="text-align:left">$2\times$ shakers standard; balance shafts optional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Inline 6&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">No&lt;/td>
&lt;td style="text-align:left">Perfectly balanced — smoothest inline config&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Flat-4 / Boxer-4&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Horizontally opposed&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>Yes — offset couple&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Cylinder offset creates hidden rocking moment&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V6 (60°)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">V-angle 60°&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Yes — rocking couple&lt;/td>
&lt;td style="text-align:left">Mount tuning critical; dominant in compact cars&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V8 Cross-plane&lt;/strong>&lt;/td>
&lt;td style="text-align:left">90° V, 90° firing&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">No&lt;/td>
&lt;td style="text-align:left">Uneven bank firing → characteristic burble; US muscle&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V8 Flat-plane&lt;/strong>&lt;/td>
&lt;td style="text-align:left">90° V, 180° firing&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>Not balanced&lt;/strong>&lt;/td>
&lt;td style="text-align:left">No&lt;/td>
&lt;td style="text-align:left">Even firing → high-RPM power; needs counter-rotating shafts&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V10&lt;/strong>&lt;/td>
&lt;td style="text-align:left">72° V&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">No&lt;/td>
&lt;td style="text-align:left">Near-ideal; F1 standard before displacement limits&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V12&lt;/strong>&lt;/td>
&lt;td style="text-align:left">60° V&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">No&lt;/td>
&lt;td style="text-align:left">Two I6 joined → inherently perfect&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Key takeaways from the series:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>I4&lt;/strong> is the most common compromise: primary balance achieved cheaply, secondary $2\times$ shaking accepted or suppressed with Lanchester balance shafts spinning at $2\omega$ in opposite directions.&lt;/li>
&lt;li>&lt;strong>Flat-plane V8&lt;/strong> (Ferrari 458, Ford GT500R) trades the cross-plane&amp;rsquo;s moment advantage for even $90°$ firing intervals — every bank fires evenly, which improves exhaust scavenging and high-RPM breathing, but the $2\times$ secondary forces require counter-rotating balance shafts or stiff mounts.&lt;/li>
&lt;li>&lt;strong>Boxer-4&lt;/strong> feels balanced on paper but the lateral offset between opposing cylinders ($\Delta z \neq 0$) produces a rocking couple that a true opposed-piston engine (with zero offset) would not have.&lt;/li>
&lt;li>&lt;strong>V12&lt;/strong> is the engineering endpoint: two I6 crankshafts joined at the middle — every order cancels, no free moments, no balance shafts needed. Cost and length are the only constraints.&lt;/li>
&lt;/ul>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/inline-4-engine-analysis/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>I4 Engine | Post&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/v8-engine-analysis/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>V8 Engine | Post&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/v6-engine-analysis/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>V6 &amp;#43; Engine Mounts | Post&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/v10-v12-engine-analysis/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>V10 / V12 | Post&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/flat-boxer-engine/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Flat vs Boxer | Post&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/simulating-the-shape-of-engine-balance/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Engine Balance Visuals | Post&lt;/span>&lt;/a>
&lt;/div>
&lt;h4>NVH&lt;span class="absolute -mt-20" id="nvh">&lt;/span>
&lt;a href="#nvh" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>NVH (Noise, Vibration, Harshness) is what happens &lt;em>after&lt;/em> the engine balance analysis.&lt;/p>
&lt;p>Even a perfectly balanced engine produces vibration — combustion pulses, torque ripple, tyre inputs. NVH engineering is the discipline of preventing that energy from reaching the driver.&lt;/p>
&lt;p>The pipeline across the MBSD posts follows a single chain:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-4">Engine (source) → Mounts → Block/Chassis → Suspension → Cabin → Driver&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Each stage has a transfer function that either amplifies or attenuates the vibration passing through it.&lt;/p>
&lt;p>&lt;strong>Stage 1 — Engine as a vibration source&lt;/strong>&lt;/p>
&lt;p>The phasor analysis from the engine balance section quantifies what the engine puts into the mounts. Key outputs per engine family:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Engine&lt;/th>
&lt;th style="text-align:left">Dominant free force&lt;/th>
&lt;th style="text-align:left">Dominant free moment&lt;/th>
&lt;th style="text-align:left">Peak amplitude (example)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">I4&lt;/td>
&lt;td style="text-align:left">$2\times$ vertical&lt;/td>
&lt;td style="text-align:left">None&lt;/td>
&lt;td style="text-align:left">78.96 N secondary force&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">I5&lt;/td>
&lt;td style="text-align:left">None&lt;/td>
&lt;td style="text-align:left">$1\times$ rocking&lt;/td>
&lt;td style="text-align:left">66.56 N·m primary moment&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">V6 60°&lt;/td>
&lt;td style="text-align:left">None&lt;/td>
&lt;td style="text-align:left">$1\times$ rocking couple&lt;/td>
&lt;td style="text-align:left">Mount-position dependent&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Flat-plane V8&lt;/td>
&lt;td style="text-align:left">$2\times$ lateral&lt;/td>
&lt;td style="text-align:left">None&lt;/td>
&lt;td style="text-align:left">Needs counter-rotating shafts&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Cross-plane V8&lt;/td>
&lt;td style="text-align:left">None&lt;/td>
&lt;td style="text-align:left">None&lt;/td>
&lt;td style="text-align:left">Clean — rumble is firing-order acoustics only&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">I6 / V12&lt;/td>
&lt;td style="text-align:left">None&lt;/td>
&lt;td style="text-align:left">None&lt;/td>
&lt;td style="text-align:left">Inherently zero — no shafts needed&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The rod ratio $R/L$ scales the $2\times$ component linearly — longer rods reduce secondary forces, which is why performance engines favour high rod ratios.&lt;/p>
&lt;p>&lt;strong>Stage 2 — Mount transmissibility&lt;/strong>&lt;/p>
&lt;p>The engine sits on rubber or hydraulic mounts. Their job is to present high stiffness at low frequency (to locate the engine) and low transmissibility at the excitation frequencies. The 1-DOF transmissibility is:&lt;/p>
&lt;p>$$T(r, \zeta) = \sqrt{\frac{1 + (2\zeta r)^2}{(1 - r^2)^2 + (2\zeta r)^2}}$$&lt;/p>
&lt;p>where $r = \omega / \omega_n$ is the frequency ratio. Isolation only begins above $r = \sqrt{2}$, so the mount natural frequency $\omega_n$ must be placed well below the lowest engine harmonic:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Mount type&lt;/th>
&lt;th style="text-align:left">Typical $\omega_n$&lt;/th>
&lt;th style="text-align:left">Damping $\zeta$&lt;/th>
&lt;th style="text-align:left">Best for&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">Soft rubber&lt;/td>
&lt;td style="text-align:left">~8 Hz&lt;/td>
&lt;td style="text-align:left">0.05–0.10&lt;/td>
&lt;td style="text-align:left">Passenger car comfort&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Stiff rubber&lt;/td>
&lt;td style="text-align:left">~25 Hz&lt;/td>
&lt;td style="text-align:left">0.10–0.15&lt;/td>
&lt;td style="text-align:left">Sport / truck (load handling)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Hydraulic&lt;/td>
&lt;td style="text-align:left">Frequency-dependent&lt;/td>
&lt;td style="text-align:left">High near resonance, low above&lt;/td>
&lt;td style="text-align:left">Best of both — used in premium cars&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>A 3-point mount layout for a transverse I4 (block mass ~150 kg, $I_z \approx 4,\text{kg·m}^2$) must be tuned so all 6-DOF rigid-body modes (lateral $F_x$, vertical $F_y$, pitch $M_{pitch}$, yaw $M_{yaw}$, roll $M_{roll}$) fall below the $2\times$ idle excitation frequency (~33 Hz at 1000 rpm idle).&lt;/p>
&lt;p>&lt;strong>Stage 3 — Suspension: the Pareto front&lt;/strong>&lt;/p>
&lt;p>The quarter-car model (sprung mass $m_s$ + unsprung mass $m_u$, spring $k_s$, damper $c_s$) gives three conflicting objectives that cannot all be minimised simultaneously:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Comfort&lt;/strong> — minimise sprung mass acceleration (cabin floor $g$-level)&lt;/li>
&lt;li>&lt;strong>Road holding&lt;/strong> — minimise tyre load variation (contact patch stays loaded)&lt;/li>
&lt;li>&lt;strong>Suspension travel&lt;/strong> — minimise rattle-space requirement&lt;/li>
&lt;/ul>
&lt;p>Sweeping $k_s$ and $c_s$ across the design space and evaluating all three metrics traces a &lt;strong>Pareto front&lt;/strong> — any point on it is optimal in the sense that improving one objective worsens another.&lt;/p>
&lt;p>Typical production pockets from the series:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Segment&lt;/th>
&lt;th style="text-align:left">$k_s$&lt;/th>
&lt;th style="text-align:left">$c_s$&lt;/th>
&lt;th style="text-align:left">$\zeta$&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">Luxury&lt;/td>
&lt;td style="text-align:left">~15 kN/m&lt;/td>
&lt;td style="text-align:left">~1000 N·s/m&lt;/td>
&lt;td style="text-align:left">0.24&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Family&lt;/td>
&lt;td style="text-align:left">~22 kN/m&lt;/td>
&lt;td style="text-align:left">~1500 N·s/m&lt;/td>
&lt;td style="text-align:left">0.35&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Sport&lt;/td>
&lt;td style="text-align:left">~35 kN/m&lt;/td>
&lt;td style="text-align:left">~2500 N·s/m&lt;/td>
&lt;td style="text-align:left">0.50&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Truck&lt;/td>
&lt;td style="text-align:left">~55 kN/m&lt;/td>
&lt;td style="text-align:left">~4000 N·s/m&lt;/td>
&lt;td style="text-align:left">0.62&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The body-bounce resonance sits at ~1.3 Hz for a typical family car. Passive damping that flattens this peak worsens high-frequency isolation — this is the fundamental Pareto trade-off.&lt;/p>
&lt;p>&lt;strong>Stage 4 — Active and semi-active control&lt;/strong>&lt;/p>
&lt;p>Active control escapes the Pareto front by making $c_s$ frequency-dependent in real time.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Skyhook&lt;/strong> — conceptually anchors the damper to an inertial frame (&amp;ldquo;the sky&amp;rdquo;) rather than relative velocity. Reduces body-bounce RMS by ~12% on smooth highway vs. passive baseline.&lt;/li>
&lt;li>&lt;strong>Karnopp switching&lt;/strong> (semi-active) — approximates ideal skyhook using a controllable valve; switching transients cost ~4% performance vs. ideal but requires no hydraulic actuator.&lt;/li>
&lt;li>&lt;strong>LMS adaptive filter&lt;/strong> (active) — feedforward controller using road preview; performance degrades when actuator delay pushes phase margin below 0° (Nyquist encirclement of $(-1,0)$).&lt;/li>
&lt;/ul>
&lt;p>The stability check for any active suspension loop uses the transfer function $G(s) = Y(s)/U(s)$ in the Laplace domain — poles in the right half-plane indicate instability, visible directly on a pole-zero plot without solving the full ODE.&lt;/p>
&lt;p>&lt;strong>ISO 2631 — the human weighting filter&lt;/strong>&lt;/p>
&lt;p>All RMS metrics in the suspension and engine posts are implicitly frequency-weighted by &lt;strong>ISO 2631&lt;/strong>, which models human sensitivity to vibration. The weighting peaks around 4–8 Hz for vertical vibration (where humans are most sensitive) and rolls off at low and high frequencies. A $2\times$ engine harmonic at idle (~33 Hz) is weighted lower than the body-bounce resonance at 1.3 Hz even if its raw amplitude is larger — which is why mount tuning focuses on the $\sqrt{2},\omega_n$ criterion rather than raw force magnitudes.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/engine-nvh-visuals/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Engine NVH Visuals | Post&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/suspension-nvh-visuals/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Suspension NVH Visuals | Post&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/v6-engine-analysis/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>V6 &amp;#43; Engine Mounts | Post&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/pid-control/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>PID &amp;#43; Control Theory | Post&lt;/span>&lt;/a>
&lt;/div>
&lt;h3>Synthesis&lt;span class="absolute -mt-20" id="synthesis">&lt;/span>
&lt;a href="#synthesis" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Mechanism &lt;strong>analysis&lt;/strong> asks: given this linkage, what does it do? Mechanism &lt;strong>synthesis&lt;/strong> asks the inverse: given what it must do, what linkage should I build? The synthesis posts introduce the three classical tools — one for each layer of the problem.&lt;/p>
&lt;p>The three grandfathers of kinematic synthesis:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Grashof&lt;/strong> → &lt;em>Does it work?&lt;/em> — the feasibility check&lt;/li>
&lt;li>&lt;strong>Freudenstein&lt;/strong> → &lt;em>What are the link lengths?&lt;/em> — the algebraic design tool&lt;/li>
&lt;li>&lt;strong>Burmester&lt;/strong> → &lt;em>Where do the pivots go?&lt;/em> — the geometric construction for pose generation&lt;/li>
&lt;/ul>
&lt;h4>Grashof — Feasibility&lt;span class="absolute -mt-20" id="grashof--feasibility">&lt;/span>
&lt;a href="#grashof--feasibility" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>The &lt;strong>Grashof inequality&lt;/strong> determines whether any link in a four-bar can rotate continuously ($360°$) or only rock:&lt;/p>
&lt;p>$$s + l \leq p + q$$&lt;/p>
&lt;p>where $s$ is the shortest link, $l$ is the longest, and $p$, $q$ are the remaining two. Depending on which link is grounded, the same set of link lengths produces four different mechanisms:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Grounded link&lt;/th>
&lt;th style="text-align:left">Mechanism type&lt;/th>
&lt;th style="text-align:left">Motion&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">Adjacent to $s$&lt;/td>
&lt;td style="text-align:left">Crank-Rocker&lt;/td>
&lt;td style="text-align:left">Short link rotates; output rocks&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Short link $s$&lt;/td>
&lt;td style="text-align:left">Double-Crank&lt;/td>
&lt;td style="text-align:left">Both sides rotate $360°$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Opposite to $s$&lt;/td>
&lt;td style="text-align:left">Double-Rocker&lt;/td>
&lt;td style="text-align:left">Both sides rock only&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Non-Grashof ($&amp;gt;$)&lt;/td>
&lt;td style="text-align:left">Triple-Rocker&lt;/td>
&lt;td style="text-align:left">Trapped in an arc — no full rotation&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Real example from the cycling post&lt;/strong> — the human leg as a 4-bar at 60 RPM cadence:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Link&lt;/th>
&lt;th style="text-align:left">Physical part&lt;/th>
&lt;th style="text-align:left">Length&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">Crank ($s$)&lt;/td>
&lt;td style="text-align:left">Pedal arm&lt;/td>
&lt;td style="text-align:left">170 mm&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Coupler&lt;/td>
&lt;td style="text-align:left">Lower leg (ankle→knee)&lt;/td>
&lt;td style="text-align:left">440 mm&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Rocker&lt;/td>
&lt;td style="text-align:left">Upper leg (knee→hip)&lt;/td>
&lt;td style="text-align:left">400 mm&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Ground&lt;/td>
&lt;td style="text-align:left">Frame (BB→hip)&lt;/td>
&lt;td style="text-align:left">618 mm&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Grashof check: $170 + 618 = 788 \leq 400 + 440 = 840$ ✓ — crank-rocker, full pedal rotation achievable.&lt;/p>
&lt;h4>Freudenstein — Function Generation&lt;span class="absolute -mt-20" id="freudenstein--function-generation">&lt;/span>
&lt;a href="#freudenstein--function-generation" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Given three precision points (three pairs of input/output angles $\theta_i, \phi_i$), &lt;strong>Freudenstein&amp;rsquo;s equation&lt;/strong> linearises the link-length ratios into a $3\times3$ system that can be solved directly by matrix inversion:&lt;/p>
&lt;p>$$R_1 \cos\theta - R_2 \cos\phi + R_3 = \cos(\theta - \phi)$$&lt;/p>
&lt;p>where $R_1 = L_0/L_3$, $R_2 = L_0/L_1$, $R_3 = (L_0^2 + L_1^2 - L_2^2 + L_3^2)/(2L_1 L_3)$.&lt;/p>
&lt;p>Substituting the three precision points gives a $3\times3$ linear system in $(R_1, R_2, R_3)$ — no iteration, no nonlinear solver. From those three ratios you recover the four link lengths directly. This is the fastest route from a functional specification (&amp;ldquo;output must follow input according to this table of three values&amp;rdquo;) to a physical four-bar.&lt;/p>
&lt;h4>Burmester — Motion Generation&lt;span class="absolute -mt-20" id="burmester--motion-generation">&lt;/span>
&lt;a href="#burmester--motion-generation" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Where Freudenstein solves for function (angle-to-angle), &lt;strong>Burmester theory&lt;/strong> solves for &lt;strong>motion generation&lt;/strong>: the coupler must pass through a sequence of full poses (position + orientation). For four prescribed poses, the locus of valid fixed pivot locations traces the &lt;strong>center point curve&lt;/strong> (a fifth-degree algebraic curve). Intersecting two such curves for the two pivots gives the complete set of four-bars that guide the coupler through all four poses.&lt;/p>
&lt;p>Burmester synthesis introduces two classic problems that pure algebra misses:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Order problem&lt;/strong> — the mechanism may visit the poses in A→C→B order rather than A→B→C&lt;/li>
&lt;li>&lt;strong>Branch problem&lt;/strong> — reaching all poses may require physically dismantling and reassembling the linkage&lt;/li>
&lt;/ul>
&lt;p>Both are checked in simulation after synthesis via the Jacobian and position continuity tests.&lt;/p>
&lt;h4>Transmission Angle — The Design Diagnostic&lt;span class="absolute -mt-20" id="transmission-angle--the-design-diagnostic">&lt;/span>
&lt;a href="#transmission-angle--the-design-diagnostic" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Across both analysis and synthesis the single most useful scalar is the &lt;strong>transmission angle&lt;/strong> $\mu$: the angle between the coupler and the output rocker. Force efficiency scales as $\sin(\mu)$:&lt;/p>
&lt;p>$$F_{useful} = F_{coupler} \cdot \sin(\mu)$$&lt;/p>
&lt;p>At $\mu = 0°$ (toggle point) the output force drops to zero regardless of input — this is a kinematic jam.&lt;/p>
&lt;p>The engineering floor is $\mu &amp;gt; 40°$ throughout the full cycle.&lt;/p>
&lt;p>The transmission angle is a better early-warning metric than $\det(C_q) = 0$ (the mathematical singularity condition) because it is dimensionless, normalised, and has a direct physical interpretation.&lt;/p>
&lt;p>The diagnostic checklist from the synthesis post:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Check&lt;/th>
&lt;th style="text-align:left">Calculation&lt;/th>
&lt;th style="text-align:left">Catches&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">Newton-Raphson convergence&lt;/td>
&lt;td style="text-align:left">Position solve residual&lt;/td>
&lt;td style="text-align:left">Kinematic failure, Grashof violation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">$\sigma_{min}$ of $C_q$&lt;/td>
&lt;td style="text-align:left">SVD of Jacobian&lt;/td>
&lt;td style="text-align:left">Proximity to singularity&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">$\mu_{min}$ over full cycle&lt;/td>
&lt;td style="text-align:left">$\arccos$ of link vectors&lt;/td>
&lt;td style="text-align:left">Physical jamming, toggle points&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4>From Synthesis to Simulation&lt;span class="absolute -mt-20" id="from-synthesis-to-simulation">&lt;/span>
&lt;a href="#from-synthesis-to-simulation" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Once link lengths pass the Grashof and transmission-angle checks, the mechanism is handed to the constrained dynamics solver. The constraint equations $C(q, t) = 0$ encode the joint topology; the saddle-point system solves positions, velocities, accelerations, and Lagrange multiplier reaction forces in one step:&lt;/p>
&lt;p>$$\begin{bmatrix} M &amp;amp; C_q^T \ C_q &amp;amp; 0 \end{bmatrix} \begin{bmatrix} a \ \lambda \end{bmatrix} = \begin{bmatrix} Q_{total} \ \gamma \end{bmatrix}$$&lt;/p>
&lt;p>The Lagrange multipliers $\lambda$ are the joint reaction forces — the same forces that feed into FEM for stress analysis. Synthesis provides the geometry; the MBSD solver provides the loads; FEM checks whether the chosen geometry survives them.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/2d-mechanism-synthesis/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>2D Synthesis | Post&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/cycling-and-the-4-bars-mechanism/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Cycling &amp;amp; 4-Bar | Post&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/constrained-mechanisms/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Constrained Mechanics | Post&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/2d-kinematics-and-dynamics/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>2D Kinematics &amp;amp; Dynamics | Post&lt;/span>&lt;/a>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Believe it or not: this is another industry getting shaped by AI capabilities:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Blender&lt;/strong>: photorealistic rendering, rigged animation, organic shapes, video editing — see &lt;code>z-cadquery/blender_scene.py&lt;/code>.&lt;/li>
&lt;li>&lt;strong>FreeCAD&lt;/strong>: assembly constraints, FEM simulation, technical drawings (TechDraw workbench), importing STEP/IGES from suppliers.&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">sudo apt install openscad
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./Design/z-openscad&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make animate &lt;span class="nv">FRAME&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">60&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ffmpeg -stream_loop 9 -i slider_crank_os.mp4 -c copy slider_crank_os_10x.mp4&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The sweet spot for OpenSCAD is &lt;strong>parametric mechanical parts and automated STL pipelines&lt;/strong> — exactly what this folder does.&lt;/p>
&lt;p>Because if mechanism 3D dynamics its &lt;em>kind of&lt;/em> trivial now: &lt;em>at least with improved workflows like this one!&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-6">kinematics.py ──► OpenSCAD ──► CadQuery ──► FreeCAD ──► Blender
(math) (quick check) (BREP/STEP) (FEM/draw) (render)&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>See &lt;a href="https://mermaid.live/edit#pako:eNplVE1vGzcQ_SsDnhJAFbxWLNW6OZJduJBRN3YvhS40OdpltfzokLS9MfwXigbJPceiQNBr_1Z-QmdX2k2q6CBwl4-cN--92SehvEYxF9Y4bWVYOwDyPr14MVliNKVbr93ZJVybgLVx-PJlCwD4_PGvf-BKpgpWskHavQTYMsTKZFQch6Z_qWWS49-id7DFZkPSYuy3zkp0aQ7xATHAG5BOwwpIuvIbiMaEKkE0rsy1JJNMD_n88f2f8FNAd7M4W_anLmRMUKK3mKiBKJ1JDagK1bZHLFaXXb0rucWNqRE0mXt0_fYVH9n4WsPN7Qo2niCQTz41gQkcUON_JJkQxlFJDRvyFmJAdQC7k0lVQOg0ElcuuWTXd9_Fh79hIfXPGWlQ7vWb8-uO5M0tL_AxeEr93vmjZD2YeY0pdqBUEUo9CHedCeG6SZV3I3AefvjlEhyiRn1A7IHVRAiSWF5FJvB1XQ_a2EMXZAh1sy8KEWu2xNPgw4dPcEGIX9twfgUxEcYdQ15KM0h8i6paknxoC6GLxjtkSIXcTw_p-ja27Xuva2YGBumQWNv5rkS2luMRsavtcwo5HWA3tSyh8ikG3yp35--x0y5W7Hffyx-f4HXdeTXoyUc816lN5ICD8tYiKSPrvadDFWd4BLgVxUkn2bGqTVmlr5JzF5p93qBi5jULVDeHecmG4xcVp2vvRz9HB8CUGdGWJCYT_1cPyJSDPe_-hVUr07kreUw5hBde5UHIJU8B30P4ezaEbMg-Vcq7nW1fXFlU3rPAlv3jKYkWkg--9uXQwY9ZlzsDWNVc800OJTEra77cchZ4pFrpfc0yOYWxmzMrXd5wtDm9Qz1WPbFYHBTixHFQOiTz_Ub8JSqjER4qVjZ54GB3k3kfOViGR02MRElGi3mijCPBBlnZPoqn9oa1SBW3vhZzXmpJ27VYu2c-E6T71XvbHyOfy0rMNyw3P-XAzuDSyJK_bQOko7Xw2SUxPz3urhDzJ_Eo5t8VRTE-fVUUr46ns2I6mRXfj0Qj5sXpeNL-Tk4nRydH0-nx80i87aoWYwafnEyLYjI7nkyPZrPn_wDcPuWa" target="_blank" rel="noopener">the mindmap&lt;/a>&lt;/p>
&lt;p>Each tool has a distinct role — they are not interchangeable:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Stage&lt;/th>
&lt;th>Tool&lt;/th>
&lt;th>Job&lt;/th>
&lt;th>Output&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>&lt;strong>Python&lt;/strong> (&lt;code>kinematics.py&lt;/code>)&lt;/td>
&lt;td>Solve positions, angles, constraints per frame&lt;/td>
&lt;td>&lt;code>data.json&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>&lt;strong>OpenSCAD&lt;/strong>&lt;/td>
&lt;td>Fast visual sanity check; lightweight STL for prototyping&lt;/td>
&lt;td>&lt;code>.stl&lt;/code>, &lt;code>.png&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>&lt;strong>CadQuery&lt;/strong>&lt;/td>
&lt;td>Production-quality BREP geometry, exact fillets/threads&lt;/td>
&lt;td>&lt;code>.step&lt;/code>, &lt;code>.stl&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>&lt;strong>FreeCAD&lt;/strong>&lt;/td>
&lt;td>FEM stress analysis, tolerance checks, technical drawings&lt;/td>
&lt;td>&lt;code>.pdf&lt;/code>, &lt;code>.fcstd&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>&lt;strong>Blender&lt;/strong>&lt;/td>
&lt;td>Photorealistic commercial renders and animations&lt;/td>
&lt;td>&lt;code>.mp4&lt;/code>, &lt;code>.png&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>Yea, openScad does &lt;a href="https://youtu.be/fPi-L7Qn7Xw" target="_blank" rel="noopener">not render as beautiful&lt;/a> as blender does&lt;/p>
&lt;/blockquote>
&lt;p>You need some guardrails not to end up like &lt;a href="https://github.com/JAlcocerT/engine-balance" target="_blank" rel="noopener">the engine balance test&lt;/a>&lt;/p>
&lt;p>So&amp;hellip; even more trivial is web development:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/Slider-Crank&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./Slider-Crank/landing &lt;span class="c1">#https://multibodysystemdynamics.pages.dev/&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And here is the JAlcocerTech whitepaper about &lt;strong>AI powered design&lt;/strong>.&lt;/p>
&lt;p>All models are wrong; some are useful.&lt;/p>
&lt;p>To decide which one is the best fit for you:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/consulting.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/ebooks.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks with free value.&lt;/div>&lt;/a>
&lt;/div>
&lt;h3>Launching MultiBodySystemsDynamics&lt;span class="absolute -mt-20" id="launching-multibodysystemsdynamics">&lt;/span>
&lt;a href="#launching-multibodysystemsdynamics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>How could have I guessed that this domain was available to buy.&lt;/p>
&lt;p>I made a quick web wrap: &lt;code>https://trends.google.com/&lt;/code>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/Slider-Crank #kineo bridge :) #https://multibodysystemdynamics.pages.dev/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/multi-body&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Superseeding &lt;a href="https://github.com/JAlcocerT/Slider-Crank/blob/main/prompt-blueprint.md" target="_blank" rel="noopener">this&lt;/a>.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npm run build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx wrangler pages project create multibodysystemsdynamics&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://multibodysystemsdynamics.pages.dev/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ping multibodysystemsdynamics.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#whois multibodysystemsdynamics.com| grep -i -E &amp;#34;(creation|created|registered)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#nslookup multibodysystemsdynamics.com&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#dig multibodysystemsdynamics.com&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>With &lt;a href="https://jalcocert.github.io/JAlcocerT/poc-101/#programmatic-formbricks-via-api" target="_blank" rel="noopener">programmatic contact form&lt;/a>, ofc.&lt;/p>
&lt;p>About the &lt;strong>&amp;ldquo;Authority Funnel&amp;rdquo;&lt;/strong> strategy.&lt;/p>
&lt;p>In a high-stakes engineering field, this structure solves three problems at once: &lt;strong>Identity&lt;/strong>, &lt;strong>Validation&lt;/strong>, and &lt;strong>Lead Generation&lt;/strong>.&lt;/p>
&lt;p>Here is how those three components work together as a machine:&lt;/p>
&lt;ol>
&lt;li>The Landing Page (The &amp;ldquo;Hook&amp;rdquo;)&lt;/li>
&lt;/ol>
&lt;p>Since &lt;code>multibodysystemsdynamics.com&lt;/code> is a long, formal name, the landing page must be &lt;strong>visually light but technically heavy&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Hero Section:&lt;/strong> A high-quality 3D render or animation of a mechanism.&lt;/li>
&lt;li>&lt;strong>The Value Prop:&lt;/strong> &amp;ldquo;We solve the mechanisms that others guess.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>The Problem/Solution:&lt;/strong> Clearly state that you eliminate mechanical lock-up, branch defects, and vibration through rigorous algebraic synthesis.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The Blog Section (The &amp;ldquo;Magnet&amp;rdquo;)&lt;/li>
&lt;/ol>
&lt;p>This is where you handle the &amp;ldquo;0 search volume&amp;rdquo; issue.&lt;/p>
&lt;p>You don&amp;rsquo;t write for the masses; you write for the &lt;strong>Search Intent&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Topic Clusters:&lt;/strong> Write one post per chapter of your work.
&lt;ul>
&lt;li>&lt;em>Example:&lt;/em> &amp;ldquo;Why your 2D simulation is lying to you about gyroscopic stability.&amp;rdquo;&lt;/li>
&lt;li>&lt;em>Example:&lt;/em> &amp;ldquo;Solving the 3-position synthesis problem in Python: A Burmester approach.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>The Contact Form (The &amp;ldquo;Filter&amp;rdquo;)&lt;/li>
&lt;/ol>
&lt;p>Don&amp;rsquo;t just ask for an email. Use the form to &lt;strong>qualify the lead&lt;/strong>.&lt;/p>
&lt;p>Ask 2-3 technical questions:&lt;/p>
&lt;ul>
&lt;li>&amp;ldquo;What is your primary design challenge? (e.g., Path Generation, Force Balancing, 3D Dynamics)&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;Are you looking for custom software, a one-time analysis, or a consultation?&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Why?&lt;/strong> High-end clients &lt;em>prefer&lt;/em> a form that asks for specifics. It tells them you are a professional who values time and understands the complexity of their problem.&lt;/li>
&lt;/ul>
&lt;h3>Whats next?&lt;span class="absolute -mt-20" id="whats-next">&lt;/span>
&lt;a href="#whats-next" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Understanding suspensions?&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=VbReLNi2JP4 -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/VbReLNi2JP4" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Is this an epic launch?&lt;span class="absolute -mt-20" id="is-this-an-epic-launch">&lt;/span>
&lt;a href="#is-this-an-epic-launch" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The &lt;strong>launch strategy&lt;/strong>: &lt;em>aka, focus strategy&lt;/em>&lt;/p>
&lt;p>In theory, for Non comercial purposes :)&lt;/p>
&lt;ol>
&lt;li>maximizar active income&lt;/li>
&lt;li>ahorrar&lt;/li>
&lt;li>&lt;strong>Value based or nothing&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>The &lt;strong>Tier of Service&lt;/strong>: DFY&lt;/p>
&lt;p>The &lt;strong>Tech Stack&lt;/strong>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Requirement&lt;/th>
&lt;th style="text-align:left">Specification&lt;/th>
&lt;th style="text-align:left">Clarification / Decision&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Frontend Framework&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Styling/UI Library&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>&lt;a href="https://jalcocert.github.io/JAlcocerT/docs/dev/fe-vs-be/" target="_blank" rel="noopener">Backend&lt;/a>/Database&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>&lt;a href="https://jalcocert.github.io/JAlcocerT/docs/dev/authentication/" target="_blank" rel="noopener">Authentication&lt;/a>&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Requirement&lt;/th>
&lt;th style="text-align:left">Specification&lt;/th>
&lt;th style="text-align:left">Clarification / Decision&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Frontend Framework&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Astro&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Styling/UI Library&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Sassify MIT like theme&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>&lt;a href="https://jalcocert.github.io/JAlcocerT/docs/dev/fe-vs-be/" target="_blank" rel="noopener">Backend&lt;/a>&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Database&lt;/strong>&lt;/td>
&lt;td style="text-align:left">FireStore&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>&lt;a href="https://jalcocert.github.io/JAlcocerT/docs/dev/authentication/" target="_blank" rel="noopener">Authentication&lt;/a>&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Firebase Auth&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>E-mail/ESP&lt;/strong>&lt;/td>
&lt;td style="text-align:left">MailTrap&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Analytics&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Posthog&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Hosting&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Container&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3>How did you started doing mechanical simulations?&lt;span class="absolute -mt-20" id="how-did-you-started-doing-mechanical-simulations">&lt;/span>
&lt;a href="#how-did-you-started-doing-mechanical-simulations" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>It was actually long ago.&lt;/p>
&lt;p>I got re-inspired by &lt;a href="https://jalcocert.github.io/JAlcocerT/gabemorris12-mechanism-project-setup/" target="_blank" rel="noopener">GabeMorris&lt;/a> few years back.&lt;/p>
&lt;p>Now with agents, there is no excuse not to do this just bc is not my job.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/chaos-theory-and-the-double-pendulum-with-python/" target="_blank" rel="noreferrer">&lt;img
alt="Double Pendulum Repo"
loading="lazy"
decoding="async"
src="https://raw.githubusercontent.com/JAlcocerT/Py_Double_Pendulum/main/Z_Outro/DoublePendulum.gif"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Double Pendulum Repo&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Python Double Pendulum&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/Py_Double_Pendulum" target="_blank" rel="noreferrer">&lt;img
alt="Double Pendulum Repo"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Double Pendulum Repo&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Source Code a chaos theory in motion webapp&lt;/div>&lt;/a>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/mechanical-engineering-cool-stuff/" target="_blank" rel="noreferrer">&lt;img
alt="Summarizer"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/GenAI/yt-summaries/yt-summaries-groq.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Summarizer&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">With Groq API&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/Slider-Crank" target="_blank" rel="noreferrer">&lt;img
alt="Slider Crank"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Slider Crank&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Slider Crank Mechanism in Python&lt;/div>&lt;/a>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/testing-tinyauth/" target="_blank" rel="noreferrer">&lt;img
alt="Three Body x Flas"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/dev/flask-vibe-coded.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Three Body x Flas&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Flask web app 101 | Blog Post&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/ThreeBodies" target="_blank" rel="noreferrer">&lt;img
alt="Three Bodies Web App"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Three Bodies Web App&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Flask Web App to test Traefik x TinyAuth&lt;/div>&lt;/a>
&lt;/div>
&lt;h3>Agentic Blender?&lt;span class="absolute -mt-20" id="agentic-blender">&lt;/span>
&lt;a href="#agentic-blender" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;a href="https://www.youtube.com/watch?v=LZMWsZbZU5w" target="_blank" rel="noopener">https://www.youtube.com/watch?v=LZMWsZbZU5w&lt;/a>&lt;/p>
&lt;p>Some references: &lt;code>https://github.com/agmmnn/awesome-blender&lt;/code>&lt;/p>
&lt;p>&lt;code>https://blendercam.com/&lt;/code> - An Open Source solution for CAM with Blender 3D&lt;/p></description></item><item><title>How to PoC (around Brands)</title><link>https://JAlcocerT.github.io/JAlcocerT/poc-103/</link><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/poc-103/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>A brand is just a way to lower CaC.&lt;/p>
&lt;p>These are the &lt;strong>brands HUBs&lt;/strong> that &lt;em>by chance&lt;/em> Ive ended up creating.&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;h2>What clients need&lt;span class="absolute -mt-20" id="what-clients-need">&lt;/span>
&lt;a href="#what-clients-need" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>A way to know the value you provide&lt;span class="absolute -mt-20" id="a-way-to-know-the-value-you-provide">&lt;/span>
&lt;a href="#a-way-to-know-the-value-you-provide" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>In other words: a consistent BRAND!&lt;/p>
&lt;h4>Branded Videos as a Code&lt;span class="absolute -mt-20" id="branded-videos-as-a-code">&lt;/span>
&lt;a href="#branded-videos-as-a-code" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;h4>Free goodies!&lt;span class="absolute -mt-20" id="free-goodies">&lt;/span>
&lt;a href="#free-goodies" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Who said free info?&lt;/p>
&lt;p>Newsletters, ebooks?&lt;/p>
&lt;p>Ideally, decoupled from your time.&lt;/p>
&lt;h3>A way to Reach&lt;span class="absolute -mt-20" id="a-way-to-reach">&lt;/span>
&lt;a href="#a-way-to-reach" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>In ither words: a way to move from attraction towards conversion&lt;/p>
&lt;h4>Formbricks and CAL APIs&lt;span class="absolute -mt-20" id="formbricks-and-cal-apis">&lt;/span>
&lt;a href="#formbricks-and-cal-apis" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>&lt;a href="https://github.com/JAlcocerT/jalcocertech-services/tree/master/forms" target="_blank" rel="noopener">https://github.com/JAlcocerT/jalcocertech-services/tree/master/forms&lt;/a>&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
They might not know, but this is how you dis-qualify ideas ;)
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/using-stripe-with-flask/#adding-formbricks-to-flask/" target="_blank" rel="noreferrer">&lt;img
alt="Embedding Formbricks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/webify/formbricks-link-embed.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Embedding Formbricks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Using Formbricks withing a Website | Post&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://cal.com/jalcocertech/consulting" target="_blank" rel="noreferrer">&lt;img
alt="Or via CAL Tech Consulting"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/email/cal-email-stripe.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Or via CAL Tech Consulting&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Questions? Get them solved&lt;/div>&lt;/a>
&lt;/div>
&lt;p>&lt;a href="https://github.com/JAlcocerT/jalcocertech-services/tree/master/cal" target="_blank" rel="noopener">https://github.com/JAlcocerT/jalcocertech-services/tree/master/cal&lt;/a>&lt;/p>
&lt;h4>Stripe API&lt;span class="absolute -mt-20" id="stripe-api">&lt;/span>
&lt;a href="#stripe-api" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Surprise: a way to pay is &lt;del>also a&lt;/del> the ultimate way to communicate trust&lt;/p>
&lt;p>&lt;a href="https://github.com/JAlcocerT/jalcocertech-services/tree/master/stripe" target="_blank" rel="noopener">https://github.com/JAlcocerT/jalcocertech-services/tree/master/stripe&lt;/a>&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Im assuming you have &lt;a href="#delivering-value" >a way to deliver value&lt;/a> after attraction and conversion
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h2>The HUBs&lt;span class="absolute -mt-20" id="the-hubs">&lt;/span>
&lt;a href="#the-hubs" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>JAlcocerTech HUB&lt;span class="absolute -mt-20" id="jalcocertech-hub">&lt;/span>
&lt;a href="#jalcocertech-hub" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>With &lt;a href="https://github.com/JAlcocerT/ebook-ideas/tree/master/z-z-destilled" target="_blank" rel="noopener">such&lt;/a> knowledge destillation:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/jalcocertech-services
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#The trick&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git submodule add https://github.com/JAlcocerT/ebook-ideas.git external/ebook-ideas
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;Add ebook-ideas repo as submodule&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>playbook-leverage-systems.md — that fuses these 4 into actionable rules for &lt;br>
solopreneur ops, product scoping, and time/customer allocation?&lt;/p>
&lt;pre>&lt;code> File │ Notes │ Theme │ ├────────────────────┼───────┼───────────────────────────────────────────┤
&lt;/code>&lt;/pre>
&lt;p>│ 80-20-principle.md │ 89 │ Imbalance, simplicity, time/career/money │ &lt;br>
├────────────────────┼───────┼───────────────────────────────────────────┤
│ essentialism.md │ 126 │ Less but better, biases, editing, buffers │
├────────────────────┼───────┼───────────────────────────────────────────┤
│ average-is-over.md │ 36 │ Bifurcating labor market, man+machine │
├────────────────────┼───────┼───────────────────────────────────────────┤
│ 4-hour-workweek.md │ 34 │ DEAL, muse design, eliminate&amp;gt;delegate │&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
What are the chances that free value wont be forever?
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>The Video HUB&lt;span class="absolute -mt-20" id="the-video-hub">&lt;/span>
&lt;a href="#the-video-hub" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>The Mech HUB&lt;span class="absolute -mt-20" id="the-mech-hub">&lt;/span>
&lt;a href="#the-mech-hub" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/multi-body&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Updating my &lt;a href="https://jalcocert.github.io/JAlcocerT/take-ideas-to-their-digital-resolution/#my-favourite-prompts" target="_blank" rel="noopener">old fav prompt&lt;/a> to this&lt;/p>
&lt;p>Lets use agents with &lt;a href="https://skills.sh/" target="_blank" rel="noopener">skills&lt;/a> to make such &lt;a href="https://developers.openai.com/showcase/watchmaker-landing-page" target="_blank" rel="noopener">landingpage&lt;/a>: &lt;code>https://skills.sh/mattpocock/skills/grill-me&lt;/code>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx skills add https://github.com/mattpocock/skills --skill grill-me&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/grill-me
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://skills.sh/openai/skills/frontend-skill&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx skills add https://github.com/openai/skills --skill frontend-skill&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Made some updates to &lt;a href="https://github.com/JAlcocerT/multi-body/blob/master/web/v1/requirements/requirements.md" target="_blank" rel="noopener">the requirements&lt;/a>:&lt;/p>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">From Vibe Coding to Agentic Engineering | Setup early May📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">I need Landing Page based with a cool and modern UI.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Create also a makefile with the following commands:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">*&lt;/span> &lt;span class="sb">`make help`&lt;/span> - Show available commands
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">*&lt;/span> &lt;span class="sb">`make install`&lt;/span> - Prepare the dependencies for local development
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">*&lt;/span> &lt;span class="sb">`make dev`&lt;/span> - Run development server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Create the &lt;span class="sb">`z-development-plan.md`&lt;/span> with independent and testable phases that can be completed sequentially.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">When it is completed, create a &lt;span class="sb">`z-walkthrough.md`&lt;/span> with the steps to deploy the application and what each part of the tech stack does on a high level to bring the features to life.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The &lt;span class="gs">**full copy**&lt;/span> of the landing, has to be goberned by a single &lt;span class="sb">`site.md`&lt;/span> file.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Consider adding a Terms of Service / &lt;span class="gs">**terms and conditions and privacy policy**&lt;/span> to the website, which will be governed by two separated markdown files.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Add also a faq section, that instead of been controlled via a json, lets have it controlled as per the frontmatter and content of separated markdown files inside the folder &lt;span class="sb">`faq`&lt;/span>. &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/details>
&lt;p>Go to whatever IDE and ask if the &lt;code>brd.md&lt;/code> refined is clear enough.&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Ive also used the distilled ebooks together with &lt;a href="https://github.com/JAlcocerT/multi-body/blob/master/web/v1/requirements/agentic-blueprint.md" target="_blank" rel="noopener">DEFINE &amp;amp; CREATE&lt;/a> for such &lt;a href="https://github.com/JAlcocerT/multi-body/blob/master/web/v1/requirements/agentic-blueprint-workflow.md" target="_blank" rel="noopener">ai engineering blueprint&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>If &lt;a href="https://github.com/JAlcocerT/multi-body/blob/master/web/v1/z-prd.md" target="_blank" rel="noopener">the prd&lt;/a> is clear, define the &lt;code>z-development-plan.md&lt;/code> and proceed with the development phases.&lt;/p>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">All my BRD / requirements for a website 🚀&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;ol>
&lt;li>
&lt;p>Editor in one subdomain, delivery static if possible and in another&lt;/p>
&lt;/li>
&lt;li>
&lt;p>For UI Astro x Vite allow really cool features&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div>
&lt;/details>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./site
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx wrangler pages project create &lt;span class="c1">#this will install the wrangler CLI package&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx wrangler pages deploy dist &lt;span class="c1"># normally will be dist, but whatever &amp;lt;BUILD_OUTPUT_DIRECTORY&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>Code the engine and SELL THE ROI&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>Outsource the thinking, &lt;a href="https://www.youtube.com/watch?v=96jN2OCOfLs" target="_blank" rel="noopener">not &lt;strong>your understanding&lt;/strong>&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;h3>FOSS Update to HUB&lt;span class="absolute -mt-20" id="foss-update-to-hub">&lt;/span>
&lt;a href="#foss-update-to-hub" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>As i love automation when it works, not when its a liability&lt;/p>
&lt;p>I have made further improvements about fossengineer&lt;/p>
&lt;p>Ideally analyzing repo 2 doc/posts and publishing there&lt;/p>
&lt;p>while the video part will be published at jalcocertech in youtube sounds quite attractive&lt;/p>
&lt;p>But for now&amp;hellip;&lt;/p>
&lt;p>whats the excuse to still be around a tweaked HUGO PaperMod ?&lt;/p>
&lt;p>and to not be synced with home-lab?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git submodule add https://github.com/JAlcocerT/fossengineer.git external/fossengineer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;Add fossengineer repo as submodule&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># git submodule add https://github.com/JAlcocerT/Home-Lab.git external/Home-Lab&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># git commit -m &amp;#34;Add Home-Lab repo as submodule&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And to not &lt;a href="#talks-x-emails" >capture emails&lt;/a>?&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Generate SSH key:
ssh-keygen -t ed25519 -C &amp;ldquo;&lt;a href="mailto:whatever@gmail.com" >whatever@gmail.com&lt;/a>&amp;rdquo; &lt;br>
Press Enter through prompts (default location fine). Skip passphrase unless paranoid.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Add public key to GitLab:&lt;/p>
&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>Copy key: Get-Content $env:USERPROFILE.ssh\id_ed25519.pub | Set-Clipboard&lt;/li>
&lt;li>Go to GitLab → Settings → SSH Keys&lt;/li>
&lt;li>Paste key, click Add&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Clone using SSH:
git clone &lt;a href="mailto:git@gitlab.com" >git@gitlab.com&lt;/a>:username/repo.git&lt;/li>
&lt;/ol>
&lt;p>If already cloned via HTTPS, update remote:
git remote set-url origin &lt;a href="mailto:git@gitlab.com" >git@gitlab.com&lt;/a>:username/repo.git&lt;/p>
&lt;p>Test: ssh -T &lt;a href="mailto:git@gitlab.com" >git@gitlab.com&lt;/a> — should say &amp;ldquo;Welcome&amp;rdquo;&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">choco install hugo-extended -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># hugo server -D --port 1414 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hugo server --port &lt;span class="m">1415&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And it goes like:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git submodule add https://github.com/JAlcocerT/Home-Lab assets/snippets
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git submodule update --init&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Its great to see that cloudflare is bringing AI QnA with the context of the page. For me this &lt;a href="https://developers.cloudflare.com/pages/framework-guides/deploy-a-hugo-site/#use-a-specific-or-newer-hugo-version" target="_blank" rel="noopener">hugo debug&lt;/a> was useful&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=4IyJm1i__ag -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/4IyJm1i__ag" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/poc/yt-distil" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
yt fluff destillation PoC ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /poc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/yt-distill
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run yt-distil run https://www.youtube.com/watch?v&lt;span class="o">=&lt;/span>4IyJm1i__ag&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You get a summary, possibility to do qna or just&amp;hellip;&lt;/p>
&lt;p>take the /out/videoID/transcript.txt to codex/claudecode :)&lt;/p>
&lt;blockquote>
&lt;p>Such a great company to distil videos &lt;a href="https://github.com/JAlcocerT/ebook-ideas/tree/master/z-z-destilled" target="_blank" rel="noopener">next to ebook ideas&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>Remember that each yt channel has &lt;a href="https://www.youtube.com/feeds/videos.xml?channel_id=UCUyDOdBWhC1MCxEjC46d-zw" target="_blank" rel="noopener">rss&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">python scripts/rss_videos.py &lt;span class="s2">&amp;#34;&amp;lt;rss-url&amp;gt;&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> awk &lt;span class="s1">&amp;#39;{print $2}&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="k">while&lt;/span> &lt;span class="nb">read&lt;/span> url&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> uv run yt-distil run &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$url&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> --no-qna -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">done&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h4>Talks x Emails&lt;span class="absolute -mt-20" id="talks-x-emails">&lt;/span>
&lt;a href="#talks-x-emails" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>You can use &lt;code>https://claude.ai/settings/connectors&lt;/code>&lt;/p>
&lt;p>and distilled all those good newsletters your are subscribed to&lt;/p>
&lt;p>like those sales/copywriting tips&lt;/p>
&lt;p>More synthesis :)&lt;/p>
&lt;h2>Creating PoCs&lt;span class="absolute -mt-20" id="creating-pocs">&lt;/span>
&lt;a href="#creating-pocs" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Great video to architect and ship&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=v4F1gFy-hqg -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/v4F1gFy-hqg" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>With good books &lt;a href="#references" >references&lt;/a>: like the &lt;a href="https://en.wikipedia.org/wiki/Domain-driven_design" target="_blank" rel="noopener">DDD&lt;/a> concept&lt;/p>
&lt;h3>Helping PMs and PdMs&lt;span class="absolute -mt-20" id="helping-pms-and-pdms">&lt;/span>
&lt;a href="#helping-pms-and-pdms" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Lets be clear: &amp;lsquo;guys, lets build some agentic stuff&amp;rsquo; is not a real requirement and does not provide 100k/y+ of value to anyone.&lt;/p>
&lt;p>Can we provide some guardrails to the &lt;em>still human&lt;/em> PMs and PdMs to actually do their job and defining scope and requirements?&lt;/p>
&lt;p>Not sure if we, but AI can:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm i -g @anthropic-ai/claude-code&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#codex&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$skill&lt;/span>-installer frontend-skill&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Used this &lt;a href="https://developers.openai.com/blog/designing-delightful-frontends-with-gpt-5-4" target="_blank" rel="noopener">fe&lt;/a>, together with &lt;a href="https://github.com/juliusbrussee/caveman" target="_blank" rel="noopener">caveman&lt;/a>, to &lt;a href="https://github.com/JAlcocerT/poc/tree/main/libg/telecom-product" target="_blank" rel="noopener">define this&lt;/a>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /poc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/libg/telecom-product&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>A &lt;a href="https://github.com/JAlcocerT/poc/blob/main/libg/telecom-product/brd.md" target="_blank" rel="noopener">brd&lt;/a>&amp;hellip; to help others defin other BRDs: &lt;em>with such &lt;a href="https://github.com/JAlcocerT/poc/blob/main/libg/telecom-product/tech.md" target="_blank" rel="noopener">tech stack&lt;/a>, &lt;a href="https://github.com/JAlcocerT/poc/blob/main/libg/telecom-product/z-development-plan.md" target="_blank" rel="noopener">dev plan&lt;/a>&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> pm-copilot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run dev &lt;span class="c1"># requires OPENAI_API_KEY in pm-copilot/.env.local&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#start index.html #ppt view&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/poc/pm-pdm-copilot.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Yes, the &lt;a href="https://github.com/JAlcocerT/poc/blob/main/libg/telecom-product/fe-skill.md" target="_blank" rel="noopener">fe.md&lt;/a> made its job.&lt;/p>
&lt;blockquote>
&lt;p>Created with &lt;code>Opus 4.7&lt;/code> in under 2h and 25% of the current hourly period tokens consumed&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/poc/pm-pdm-copilot-brdprd.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Shipped.&lt;/p>
&lt;p>Because doing those jobs, &lt;em>aka &lt;a href="https://jalcocert.github.io/JAlcocerT/a-diy-boilerplate-to-ship/#why-creating-like-a-ba" target="_blank" rel="noopener">asking questions&lt;/a>&lt;/em>, with Gemini at the browser seems to be so hard.&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
If you are a non-dev with dev skills &lt;a href="https://github.com/JAlcocerT/poc/blob/main/libg/telecom-product/z-shipped-features.md" target="_blank" rel="noopener">you gonna ship features&lt;/a> with such &lt;a href="https://github.com/JAlcocerT/poc/tree/main/libg/telecom-product#stack" target="_blank" rel="noopener">tech stacks&lt;/a> &amp;amp; coast the next couple years for good
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>Last time i mentioned how quickly was to do the &lt;code>ppt.html&lt;/code> &lt;a href="https://github.com/JAlcocerT/PBi/tree/main/gcp-looker-rdkb" target="_blank" rel="noopener">in this one&lt;/a>.&lt;/p>
&lt;p>But now, Who said a video?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#start index.html #ppt view&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> hyperframes-pitch
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hyperframes preview
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx hyperframes render -q high -f &lt;span class="m">60&lt;/span> &lt;span class="c1"># 60fps high-CRF&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/about-motion-graphics/#hyperframe" target="_blank" rel="noopener">Hyperframe&lt;/a> or &lt;a href="https://jalcocert.github.io/JAlcocerT/about-motion-graphics/#remotionjs" target="_blank" rel="noopener">remotion&lt;/a> shouldnt be a problem already:&lt;/p>
&lt;!-- https://youtu.be/WFi0LD8Ux4A -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/WFi0LD8Ux4A" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-13">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npx --yes skills find hyperframes 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="p">|&lt;/span> head -60
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx --yes skills add heygen-com/hyperframes@gsap -y&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx --yes skills add heygen-com/hyperframes@hyperframes-c&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-13"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>From start to ship, ppt and video: 4h and 50% tokens consumed&lt;/p>
&lt;/blockquote>
&lt;p>a branded video?&lt;/p>
&lt;p>Going &lt;a href="https://jalcocert.github.io/JAlcocerT/poc-101/#from-html-to-promo-video" target="_blank" rel="noopener">from html to video&lt;/a> is nothing nowadays:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-14">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-14"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
As solo, you need &amp;ldquo;Lead Engine,&amp;rdquo; but the Sales Velocity and Targeting differ. Path A is a &amp;ldquo;Sniper&amp;rdquo; mission; Path B is a &amp;ldquo;High-Volume&amp;rdquo; pipeline.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>Thats it.&lt;/p>
&lt;p>No excuses to get directions and definitions right: &lt;em>you better be the &lt;a href="https://jalcocert.github.io/JAlcocerT/career/#pmarchitect" target="_blank" rel="noopener">best PM/architect&lt;/a> in the room&lt;/em>&lt;/p>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/the-ideas-bucket-can-be-empty/#the-top-down-hierarchy-of-right" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/the-ideas-bucket-can-be-empty/#the-top-down-hierarchy-of-right&lt;/a>
&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/memes/data-deadlock.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Making a SaaS?&lt;/p>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/docs/entrepreneur/bip/#saas-kpis" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/docs/entrepreneur/bip/#saas-kpis&lt;/a>
&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/data-experiments/business-ltv-cac.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The &lt;a href="https://www.linkedin.com/posts/exadel-people_on-data-ai-and-the-future-of-engineering-activity-7426595722369814528-rijL" target="_blank" rel="noopener">future of engineering&lt;/a>?&lt;/p>
&lt;p>Ship value!&lt;/p>
&lt;p>Are you &lt;strong>betting&lt;/strong> on &lt;strong>business growth&lt;/strong> (more sales, bigger deals, up sales,decreased customer churn) or&amp;hellip;on &lt;strong>business efficiency&lt;/strong> (higher margins, decreased costs, increased output)?&lt;/p>
&lt;p>It doesnt really matter if you are ready to jump:&lt;/p>
&lt;blockquote>
&lt;p>Build, scale, govern, optimize is &lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/introducing-gemini-enterprise-agent-platform" target="_blank" rel="noopener">whats coming to enterprises&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;h3>Delivering Value&lt;span class="absolute -mt-20" id="delivering-value">&lt;/span>
&lt;a href="#delivering-value" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
An good &lt;a href="https://jalcocert.github.io/JAlcocerT/docs/entrepreneur/bip/#initial-prompts-for-success" target="_blank" rel="noopener">initial prompt&lt;/a> will set you for success with goodies like markdown based T&amp;amp;C + Privacy Policy
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/consulting.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/ebooks.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks with free value.&lt;/div>&lt;/a>
&lt;/div>
&lt;p>PS: no AI/agentic layer will work w/o proper data layer (data readiness/governance matters)!&lt;/p>
&lt;h3>Using Lately&lt;span class="absolute -mt-20" id="using-lately">&lt;/span>
&lt;a href="#using-lately" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>Claude Code with vscodium
&lt;ul>
&lt;li>Ocassionaly ghostty / gram / zed&lt;/li>
&lt;li>&lt;a href="https://www.warp.dev/terminal" target="_blank" rel="noopener">https://www.warp.dev/terminal&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;del>Antigravity&lt;/del>&lt;/li>
&lt;li>&lt;del>Roo code / Kilo Code / Gemini CLI&lt;/del>&lt;/li>
&lt;li>Codex CLI&lt;/li>
&lt;li>&lt;del>Cursor&lt;/del>&lt;/li>
&lt;li>&lt;del>Windsurf&lt;/del>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>References&lt;span class="absolute -mt-20" id="references">&lt;/span>
&lt;a href="#references" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>The design of the design&lt;/li>
&lt;li>&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-15">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">submodule add https://github.com/JAlcocerT/ebook-ideas&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-15"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>To my &lt;a href="https://github.com/JAlcocerT/ebook-ideas/tree/master/z-read-books-notes" target="_blank" rel="noopener">read book notes&lt;/a> and these for &lt;a href="https://github.com/JAlcocerT/1ton-ebooks/tree/master/z-business" target="_blank" rel="noopener">business playbooks&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;h3>Concepts&lt;span class="absolute -mt-20" id="concepts">&lt;/span>
&lt;a href="#concepts" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Lean thinking is still useful (fast‑feedback, MVP, reducing waste), but it’s more about &lt;strong>optimizing an existing flow&lt;/strong> than exploring the fuzzy, participatory space where prosumers live.&lt;/p>
&lt;ul>
&lt;li>A &lt;strong>BRD&lt;/strong> is a high‑level document that captures &lt;strong>what the business wants&lt;/strong> (goals, scope, stakeholder needs) before you get into technical specs.&lt;/li>
&lt;/ul>
&lt;p>So BRD is &lt;strong>more about “capturing intent”&lt;/strong> than shaping the interaction model; it’s a bridge from business (including prosumer‑oriented goals) to the team.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>DDD&lt;/strong>, aka domain driven development is a software design approach where the code structure reflects the &lt;strong>business domain&lt;/strong>, using a shared language between devs and domain experts.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>SDD&lt;/strong>, spec driven development&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>TDD&lt;/strong>, test driven development&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Design thinking&lt;/strong> helps you &lt;strong>frame the problem space&lt;/strong> with prosumers (workshops, personas, scenarios). &lt;a href="https://www.bmc.com/blogs/design-thinking-vs-lean-vs-agile/" target="_blank" rel="noopener">bmc&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>BRD&lt;/strong> then &lt;strong>writes down the business intent&lt;/strong> (“we want users to be prosumers, not just consumers”) and boundary conditions. &lt;a href="https://cubettech.com/resources/blog/the-critical-role-of-brd-in-the-software-development-process/" target="_blank" rel="noopener">cubettech&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>DDD&lt;/strong> shapes the &lt;strong>internal architecture and language&lt;/strong> so the system can safely support prosumer‑style creation and extension. &lt;a href="https://en.wikipedia.org/wiki/Domain-driven_design" target="_blank" rel="noopener">en.wikipedia&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>While DEFINE is about the architecture and preparation, CREATE is the engine for the actual drafting and iterative execution.&lt;/p>
&lt;p>It is the framework used to turn those requirements into a high-quality final product.&lt;/p>
&lt;p>DEFINE is Strategic: It’s used for project management, aligning stakeholders, and ensuring you know what you need. It is the &amp;ldquo;Contract.&amp;rdquo;&lt;/p>
&lt;p>CREATE is Tactical: It’s the actual prompt engineering syntax used to talk to the LLM to get the work done. It is the &amp;ldquo;Execution.&amp;rdquo;&lt;/p>
&lt;p>Pro Tip: Use DEFINE to organize your thoughts in a scratchpad or document, then translate those requirements into a CREATE prompt for the AI.&lt;/p>
&lt;p>This blueprint provides your team with a standardized &amp;ldquo;Operational Language&amp;rdquo; for AI.&lt;/p>
&lt;p>It bridges the gap between high-level project management (&lt;strong>DEFINE&lt;/strong>) and the tactical engineering of the prompt (&lt;strong>CREATE&lt;/strong>).&lt;/p>
&lt;hr>
&lt;h2>&lt;strong>AI Engineering Blueprint: DEFINE &amp;amp; CREATE&lt;/strong>&lt;span class="absolute -mt-20" id="ai-engineering-blueprint-define--create">&lt;/span>
&lt;a href="#ai-engineering-blueprint-define--create" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;strong>Objective:&lt;/strong> To move from &amp;ldquo;chatting&amp;rdquo; with AI to &amp;ldquo;programming&amp;rdquo; AI with precision and repeatability.&lt;/p>
&lt;h3>&lt;strong>Phase 1: The DEFINE Framework (The Strategy)&lt;/strong>&lt;span class="absolute -mt-20" id="phase-1-the-define-framework-the-strategy">&lt;/span>
&lt;a href="#phase-1-the-define-framework-the-strategy" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;em>Use this during the planning stage to align the team on what the AI is actually solving.&lt;/em>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Component&lt;/th>
&lt;th style="text-align:left">Description&lt;/th>
&lt;th style="text-align:left">Team Action&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>D - Desired Outcome&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;Final State.&amp;rdquo; What does success look like?&lt;/td>
&lt;td style="text-align:left">Define the format (CSV, Code, Text) and the primary goal.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>E - End User&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Who is reading or using this output?&lt;/td>
&lt;td style="text-align:left">Identify technical level, seniority, and emotional state of the audience.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>F - Facts / Inputs&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;Source of Truth.&amp;rdquo;&lt;/td>
&lt;td style="text-align:left">Gather URLs, PDFs, or raw data the AI must use.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I - In-Scope / OOS&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The boundaries.&lt;/td>
&lt;td style="text-align:left">List 3 things the AI &lt;strong>must&lt;/strong> do and 3 things it &lt;strong>must not&lt;/strong> mention.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>N - Needs / Constraints&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;Rules of the Road.&amp;rdquo;&lt;/td>
&lt;td style="text-align:left">Specify word counts, tone (e.g., &amp;ldquo;Socratic&amp;rdquo;), and dependencies.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>E - Evaluation&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;Quality Control.&amp;rdquo;&lt;/td>
&lt;td style="text-align:left">Define the criteria for a &amp;ldquo;Pass/Fail&amp;rdquo; response.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h3>&lt;strong>Phase 2: The CREATE Framework (The Execution)&lt;/strong>&lt;span class="absolute -mt-20" id="phase-2-the-create-framework-the-execution">&lt;/span>
&lt;a href="#phase-2-the-create-framework-the-execution" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;em>Use this to build the actual prompt. This is the syntax the AI receives.&lt;/em>&lt;/p>
&lt;h4>&lt;strong>1. Character &amp;amp; Context&lt;/strong>&lt;span class="absolute -mt-20" id="1-character--context">&lt;/span>
&lt;a href="#1-character--context" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ul>
&lt;li>&lt;strong>Prompt:&lt;/strong> &amp;ldquo;Act as a [Senior Role]. You are currently working on [Project Context].&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Goal:&lt;/strong> Prime the model&amp;rsquo;s internal weights for specific domain expertise.&lt;/li>
&lt;/ul>
&lt;h4>&lt;strong>2. Reference &amp;amp; Resources&lt;/strong>&lt;span class="absolute -mt-20" id="2-reference--resources">&lt;/span>
&lt;a href="#2-reference--resources" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ul>
&lt;li>&lt;strong>Prompt:&lt;/strong> &amp;ldquo;Use the following examples for style: [Example 1, Example 2]. Refer to this data: [Data Block].&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Goal:&lt;/strong> Provide &amp;ldquo;Few-Shot&amp;rdquo; examples to minimize hallucinations.&lt;/li>
&lt;/ul>
&lt;h4>&lt;strong>3. Explicit Instructions&lt;/strong>&lt;span class="absolute -mt-20" id="3-explicit-instructions">&lt;/span>
&lt;a href="#3-explicit-instructions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ul>
&lt;li>&lt;strong>Prompt:&lt;/strong> &amp;ldquo;Your task is to [Verb] the [Input] into a [Output].&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Goal:&lt;/strong> Clear, command-based directives (e.g., &amp;ldquo;Synthesize the meeting notes into action items&amp;rdquo;).&lt;/li>
&lt;/ul>
&lt;h4>&lt;strong>4. Adjustments &amp;amp; Constraints&lt;/strong>&lt;span class="absolute -mt-20" id="4-adjustments--constraints">&lt;/span>
&lt;a href="#4-adjustments--constraints" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ul>
&lt;li>&lt;strong>Prompt:&lt;/strong> &amp;ldquo;Maintain a [Tone] voice. Do not use [Forbidden Terms]. Ensure [Requirement].&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Goal:&lt;/strong> Polish the output to meet brand or technical standards.&lt;/li>
&lt;/ul>
&lt;h4>&lt;strong>5. Type of Output&lt;/strong>&lt;span class="absolute -mt-20" id="5-type-of-output">&lt;/span>
&lt;a href="#5-type-of-output" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ul>
&lt;li>&lt;strong>Prompt:&lt;/strong> &amp;ldquo;Output the results as a [Markdown Table / JSON / Code Block].&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Goal:&lt;/strong> Ensure the output is immediately &amp;ldquo;plug-and-play&amp;rdquo; for the next tool.&lt;/li>
&lt;/ul>
&lt;h4>&lt;strong>6. Evolutionary Iteration&lt;/strong>&lt;span class="absolute -mt-20" id="6-evolutionary-iteration">&lt;/span>
&lt;a href="#6-evolutionary-iteration" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ul>
&lt;li>&lt;strong>Prompt:&lt;/strong> &amp;ldquo;Critique your own response for [Constraint] and provide a revised version.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Goal:&lt;/strong> Use the AI&amp;rsquo;s reasoning to self-correct before the human sees it.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3>&lt;strong>Phase 3: The Pro Workflow (The Chain)&lt;/strong>&lt;span class="absolute -mt-20" id="phase-3-the-pro-workflow-the-chain">&lt;/span>
&lt;a href="#phase-3-the-pro-workflow-the-chain" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>To implement these, tell your team to follow the &lt;strong>G.R.T.A.&lt;/strong> sequence for complex tasks:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Generate:&lt;/strong> Use &lt;strong>CREATE&lt;/strong> to get a raw draft based on the &lt;strong>DEFINE&lt;/strong> specs.&lt;/li>
&lt;li>&lt;strong>Refine:&lt;/strong> Feed the draft back. Ask the AI to fix logic, tone, or factual errors.&lt;/li>
&lt;li>&lt;strong>Transform:&lt;/strong> Change the refined text into the final format (e.g., Turn the report into a Thread or a Jira ticket).&lt;/li>
&lt;li>&lt;strong>Apply:&lt;/strong> Generate the meta-data or code needed to move the work into your production environment.&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> &lt;strong>Standardize:&lt;/strong> Use a shared document/Notion page for &amp;ldquo;DEFINE&amp;rdquo; blocks before starting big AI tasks.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> &lt;strong>Library:&lt;/strong> Save successful &amp;ldquo;CREATE&amp;rdquo; templates that worked for specific recurring tasks (e.g., &amp;ldquo;The Weekly Report Prompt&amp;rdquo;).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> &lt;strong>Review:&lt;/strong> During sprint reviews, show the prompt (the &amp;ldquo;Define/Create&amp;rdquo;) alongside the result to improve team prompting literacy.&lt;/li>
&lt;/ul></description></item><item><title>The physics of Mechanisms in the SPACE</title><link>https://JAlcocerT.github.io/JAlcocerT/3d-mbsd/</link><pubDate>Thu, 30 Apr 2026 09:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/3d-mbsd/</guid><description>
&lt;p>&lt;strong>TL;DR&lt;/strong>&lt;/p>
&lt;p>From &lt;a href="https://jalcocert.github.io/JAlcocerT/2d-mbsd/" target="_blank" rel="noopener">2D&lt;/a> to &lt;strong>3D mbsd&lt;/strong>&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/mbsd" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
MBSD | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /mbsd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#The trick&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git submodule add https://github.com/JAlcocerT/mechanism.git external/mechanism
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;Add mechanism repo as submodule&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>About MBSD&lt;span class="absolute -mt-20" id="about-mbsd">&lt;/span>
&lt;a href="#about-mbsd" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>I wouldnt let you with just the &lt;a href="https://github.com/JAlcocerT/mbsd/tree/master/bike-real-time-simulator" target="_blank" rel="noopener">3d bicycle model&lt;/a> explained here.&lt;/p>
&lt;p>Notice the difference between &lt;strong>visual representation&lt;/strong> and &lt;strong>mathematical modeling&lt;/strong>.&lt;/p>
&lt;p>In engineering software, there is a common trap called the &amp;ldquo;3D Mirage&amp;rdquo;: the assumption that because a scene &lt;em>looks&lt;/em> three-dimensional, the underlying physics must be solved in 3D to be valid.&lt;/p>
&lt;p>You’ve correctly identified that for this project, 3D simulation is a massive &amp;ldquo;Tax&amp;rdquo; with zero &amp;ldquo;Refund&amp;rdquo; for the engine-NVH story.&lt;/p>
&lt;p>Here is a deeper dive into why your three points are the correct strategic stance for the repo:&lt;/p>
&lt;ol>
&lt;li>The &amp;ldquo;Quaternion Tax&amp;rdquo; (Scope)&lt;/li>
&lt;/ol>
&lt;p>Rewriting the solver in 3D isn&amp;rsquo;t just &amp;ldquo;adding a Z-coordinate.&amp;rdquo;&lt;/p>
&lt;p>It changes the fundamental algebra of the system.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Non-Commutative Rotations:&lt;/strong> In 2D, rotations are scalar additions. In 3D, the order of rotation matters ($\text{Roll} \times \text{Pitch} \neq \text{Pitch} \times \text{Roll}$).&lt;/li>
&lt;/ul>
&lt;p>Dealing with Quaternions or Euler Angles to avoid &amp;ldquo;Gimbal Lock&amp;rdquo; adds layers of complexity to every Jacobian and every constraint equation.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The &amp;quot; sitting&amp;quot; vs. &amp;ldquo;man-years&amp;rdquo; reality:&lt;/strong> As you noted, the saddle-point solver for a 3D system requires 6-DOF mass matrices and complex 3D contact normals. You would be pivoting from an &lt;strong>NVH E-Book&lt;/strong> to a &lt;strong>Numerical Methods Research Project.&lt;/strong>&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The Dimensional Reduction is the &amp;ldquo;Hero&amp;rdquo; (Analytical Truth)&lt;/li>
&lt;/ol>
&lt;p>The &lt;strong>Dimensional Reduction&lt;/strong> chapter is arguably the most &amp;ldquo;senior engineer&amp;rdquo; part of the whole book. It proves that you have understood the physics deeply enough to simplify it.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Exact vs. Approximate:&lt;/strong> Because the reduction is algebraic and exact under your four hypotheses, a 3D solver would simply be a more expensive way to arrive at the same destination.&lt;/li>
&lt;li>&lt;strong>Insight through Simplicity:&lt;/strong> In 2D, a reader can see why a Boxer-4 cancels its primary force ($1 - 1 = 0$). In a 3D solver, that zero would be buried inside a $6 \times 6$ matrix, making the &amp;ldquo;Why&amp;rdquo; much harder to see.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>When 3D is Actually Worth It (The Boundary)&lt;/li>
&lt;/ol>
&lt;p>Your table of 3D-necessities is spot-on. I’d emphasize the &lt;strong>Gyroscopic Effect&lt;/strong> as the primary &amp;ldquo;Wall.&amp;rdquo;&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The &amp;ldquo;Hidden&amp;rdquo; Moment:&lt;/strong> In an airplane or a motorcycle leaning into a turn, the spinning crankshaft creates a moment perpendicular to its axis.&lt;/li>
&lt;li>&lt;strong>The Verdict:&lt;/strong> Unless the repo&amp;rsquo;s goal shifts to &lt;strong>&amp;ldquo;Aircraft Aerobatic Dynamics&amp;rdquo;&lt;/strong> or &lt;strong>&amp;ldquo;Hypoid Gear Design,&amp;rdquo;&lt;/strong> 3D simulation is &amp;ldquo;Gold-Plating&amp;rdquo;—it adds cost without adding value to the core NVH narrative.&lt;/li>
&lt;/ul>
&lt;p>This physics reference is a rigorous, high-level blueprint for a 3D Multibody Dynamics engine.&lt;/p>
&lt;p>It correctly identifies the &amp;ldquo;Saddle-Point&amp;rdquo; system as the common ancestor of both 2D and 3D solvers, while meticulously cataloging the &lt;strong>non-linear taxes&lt;/strong> (quaternions, gyroscopic terms, and rotated inertia tensors) that 3D imposes.&lt;/p>
&lt;p>To elevate this from a reference doc to a &amp;ldquo;deep learning&amp;rdquo; resource, I suggest three targeted technical refinements.&lt;/p>
&lt;ol>
&lt;li>The &amp;ldquo;H-Matrix&amp;rdquo; Geometric Intuition (Section 1)&lt;/li>
&lt;/ol>
&lt;p>You mention $H(q)$ as the bridge between $\omega$ and $\dot{q}$. For a developer or physicist, it is helpful to clarify &lt;em>why&lt;/em> this is a $4 \times 3$ matrix.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Clarification:&lt;/strong> Angular velocity $\omega$ lives in the tangent space of the rotation manifold (it has 3 components: $x, y, z$ rates). The quaternion $q$ lives on the 4D unit sphere ($S^3$). The $H(q)$ matrix essentially performs the &lt;strong>projection&lt;/strong> of a 3D rotation rate onto the 4D surface of that sphere. Without this mapping, you cannot &amp;ldquo;step&amp;rdquo; your orientation forward in time.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The Steiner/Parallel-Axis Tensor (Section 2)
In 2D, the parallel axis theorem is a simple addition: $I_{ref} = I_{cg} + md^2$. In 3D, it becomes a matrix operation.&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>Refinement:&lt;/strong> The term $m[R \cdot r_G]&lt;em>\times \cdot [R \cdot r_G]&lt;/em>\times^T$ is actually a &lt;strong>triple cross-product&lt;/strong> in matrix form. It creates a &amp;ldquo;spatial lever arm&amp;rdquo; that couples translation to rotation. If the reference point is not at the CG, every time the body accelerates linearly, it generates a 3D torque—this is what makes the 6x6 mass matrix &amp;ldquo;dense&amp;rdquo; and computationally heavier.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>The &amp;ldquo;h(q, v)&amp;rdquo; Term: The Gyroscopic Ghost (Section 6 &amp;amp; 7)
You correctly identify $\omega \times (I \cdot \omega)$ as the source of gyroscopic effects.&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>The &amp;ldquo;Zero-G&amp;rdquo; Trap:&lt;/strong> In 2D, if you stop pushing an object, it just slides. In 3D, if you stop pushing a spinning object with asymmetric inertia (like a T-handle), the $h(q, v)$ term continues to act, causing the body to flip or &amp;ldquo;tumble&amp;rdquo; (the Dzhanibekov effect).&lt;/li>
&lt;/ul>
&lt;p>This is a purely &lt;strong>inertial&lt;/strong> force—it requires no external torque to manifest, only the internal &amp;ldquo;fight&amp;rdquo; between the different principal moments of inertia.&lt;/p>
&lt;h3>2D MBSD Recap&lt;span class="absolute -mt-20" id="2d-mbsd-recap">&lt;/span>
&lt;a href="#2d-mbsd-recap" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>For some reason, I ended up accelerating with this.&lt;/p>
&lt;p>Nothing to do with using SOA cc models. Sure.&lt;/p>
&lt;p>Anyways, this is done:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>The matlab bycicle thesis is translated to python &lt;a href="https://jalcocert.github.io/JAlcocerT/3d-mbsd-bicycle/" target="_blank" rel="noopener">here&lt;/a>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>2D mechanisms with AR vectors and with blender, done.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /home/jalcocert/Desktop/3Design/mbsd-to-render
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">printf&lt;/span> &lt;span class="s2">&amp;#34;file &amp;#39;%s&amp;#39;\n&amp;#34;&lt;/span> *.mp4 &amp;gt; concat.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg -f concat -safe &lt;span class="m">0&lt;/span> -i concat.txt -c copy all_mechanisms.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mpv all_mechanisms.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://youtu.be/KA7HloE6IQY -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/KA7HloE6IQY" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;ol start="3">
&lt;li>Around slidercranks and a &lt;strong>NVH stack&lt;/strong>: engine balance, balance shafts, active damping&amp;hellip;&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/i4_nvh_timeseries.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/v10_nvh_timeseries.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;ol start="4">
&lt;li>The last mile of the NVH chain — &lt;strong>chassis modal response&lt;/strong>.&lt;/li>
&lt;/ol>
&lt;p>Take F_chassis(ω) from the engine-mounts chapter and propagate it through a simple modal model of a body shell to predict cabin acceleration.&lt;/p>
&lt;p>This is the layer the driver actually feels, and it reuses the same transmissibility / phasor language one more time. Smallest scope, finishes a story we explicitly left open.&lt;/p>
&lt;p>Branch the framework into a second mechanism — valvetrain (cam-follower) NVH or terrain/wheel (suspension NVH).&lt;/p>
&lt;p>Same framework spine — source spectrum, transmissibility, optional active control — but on a totally different mechanism.&lt;/p>
&lt;p>Opens a parallel narrative arc, repo&amp;rsquo;s adjacent examples become first-class citizens. Largest payoff for repo coherence, biggest scope.&lt;/p>
&lt;p>Lift the e-book out of raw markdown — top-level TOC chapter, master &amp;ldquo;field guide&amp;rdquo; mindmap of all 11 series chapters + 4 reference chapters, possibly a printable PDF build.&lt;/p>
&lt;p>Pure consolidation, no new physics.&lt;/p>
&lt;p>Since we’ve established that the &amp;ldquo;Dimensional Reduction&amp;rdquo; isn&amp;rsquo;t an approximation but a strategic &lt;strong>decomposition&lt;/strong>, a high-quality comparison table should focus on where the engineering &amp;ldquo;effort&amp;rdquo; is spent versus the &amp;ldquo;insight&amp;rdquo; gained.&lt;/p>
&lt;p>Here is an improved breakdown comparing the two approaches specifically for the &lt;strong>Multi-Body System Dynamics (MBSD)&lt;/strong> and &lt;strong>NVH&lt;/strong> use cases.&lt;/p>
&lt;p>The 2D vs. 3D Simulator Tradeoff&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Feature&lt;/th>
&lt;th style="text-align:left">&lt;strong>The 2D Framework (Current)&lt;/strong>&lt;/th>
&lt;th style="text-align:left">&lt;strong>A Full 3D Simulator&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Mathematical Core&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Scalar rotations; $3 \times 3$ mass matrices per body. Linear geometry.&lt;/td>
&lt;td style="text-align:left">Quaternions/Rotation matrices; $6 \times 6$ mass matrices. Non-commutative algebra.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Constraint Logic&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Jacobians are simple $(x, y, \theta)$ partials. Easy to debug by hand.&lt;/td>
&lt;td style="text-align:left">Complex 3D Jacobians. Requires &amp;ldquo;Gimbal Lock&amp;rdquo; prevention (Quaternions).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Performance&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Near-instantaneous. Allows 900-cell Monte Carlo design sweeps in seconds.&lt;/td>
&lt;td style="text-align:left">Computationally heavy. Sweeps take minutes or hours; optimization is slower.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Engine NVH Truth&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Exact&lt;/strong> for forces and rocking moments (via the Dimensional Reduction Lemma).&lt;/td>
&lt;td style="text-align:left">Same numerical results, but with higher overhead and &amp;ldquo;numerical noise&amp;rdquo; risk.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Contact Physics&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Planar curves. Penalty-contact and friction are stable and fast.&lt;/td>
&lt;td style="text-align:left">3D mesh-to-mesh or surface-to-surface contact. Highly complex and prone to &amp;ldquo;jitter.&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Mental Model&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>High Clarity.&lt;/strong> You can see the phasor cancellation ($1 - 1 = 0$) visually.&lt;/td>
&lt;td style="text-align:left">&lt;strong>Obscured.&lt;/strong> Results are buried in large matrices; physical intuition is harder to keep.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;p>When 2D is the &amp;ldquo;Correct&amp;rdquo; Choice&lt;/p>
&lt;p>For the engine and suspension arcs, 2D is the superior tool because it follows the&lt;/p>
&lt;p>&lt;strong>Principle of Sufficient Fidelity&lt;/strong>. You are modeling:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Coplanar Linkages:&lt;/strong> Pistons and rods move in parallel planes.&lt;/li>
&lt;li>&lt;strong>Vertical Dynamics:&lt;/strong> Suspension &amp;ldquo;ride&amp;rdquo; is primarily a $Z$-axis (vertical) problem.&lt;/li>
&lt;li>&lt;strong>Harmonic Summation:&lt;/strong> 3D moments (pitch/yaw) are just $Z$-weighted 2D forces.&lt;/li>
&lt;/ul>
&lt;h3>When the &amp;ldquo;3D Wall&amp;rdquo; is Hit&lt;span class="absolute -mt-20" id="when-the-3d-wall-is-hit">&lt;/span>
&lt;a href="#when-the-3d-wall-is-hit" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>You only move to 3D when the physics &lt;strong>cannot be projected&lt;/strong> onto a plane without losing the primary effect.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Phenomenon&lt;/th>
&lt;th style="text-align:left">Why 3D is Mandatory&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Gyroscopic Precession&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The interaction between a spinning crank and a pitching vehicle creates a moment &lt;strong>perpendicular&lt;/strong> to both.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Non-Coplanar Joints&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Any mechanism where the pins/pivots do not share a common parallel axis (e.g., a 3D robotic arm or a steering linkage with &amp;ldquo;toe&amp;rdquo; change).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>3D Contact Geometry&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Modeling how a &lt;strong>hypoid gear&lt;/strong> or a &lt;strong>helical gear&lt;/strong> meshes; the force vector has a significant component along the shaft.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Vehicle Roll/Yaw&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Modeling a car taking a corner at the limit, where lateral grip and vertical load-transfer couple into the body&amp;rsquo;s roll and pitch simultaneously.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>In the e-book, we use the &lt;strong>2D Simulator&lt;/strong> to do the heavy lifting because it is mathematically transparent and lightning-fast.&lt;/p>
&lt;p>We then use &lt;strong>3D Visualization&lt;/strong> (Three.js) to show the phase-shifted pistons.&lt;/p>
&lt;p>This &amp;ldquo;2D-Math + 3D-Art&amp;rdquo; hybrid is the global optimum for teaching: it gives the reader the &lt;strong>exact physical answer&lt;/strong> without drowning them in the &lt;strong>quaternion tax&lt;/strong> of a 3D solver.&lt;/p>
&lt;h4>Engine Balance&lt;span class="absolute -mt-20" id="engine-balance">&lt;/span>
&lt;a href="#engine-balance" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>This project has successfully built a &amp;ldquo;Full-Stack&amp;rdquo; engine simulator.&lt;/p>
&lt;p>Have gone from:&lt;/p>
&lt;p>Inverse Kinematics (Position/Velocity)
Inverse Dynamics (Inertial Forces)
Phasor Superposition (Multi-cylinder linear sums)
Spatial Geometry (V-engine vectoring)
Thermodynamic Forcing (Combustion harmonics)&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/i4_nvh_timeseries.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Engine&lt;/th>
&lt;th style="text-align:left">Primary Shake ($1\times$)&lt;/th>
&lt;th style="text-align:left">Secondary Shake ($2\times$)&lt;/th>
&lt;th style="text-align:left">Rocking Moment ($M$)&lt;/th>
&lt;th style="text-align:left">The &amp;ldquo;X-Ray&amp;rdquo; Visual&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I3&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>High Unbalance&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Aggressive &amp;ldquo;See-saw&amp;rdquo; nodding.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I4&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>High Unbalance&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Rapid vertical &amp;ldquo;piston&amp;rdquo; pulse.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I5&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>Moderate Unbalance&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Complex &amp;ldquo;Snaking&amp;rdquo; thrum.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Balanced&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Balanced&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Balanced&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Perfectly still.&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V6 (60°)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>Moderate Unbalance&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Steady &amp;ldquo;Nodding&amp;rdquo; rock.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V8 (Flat)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>High Unbalance&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Horizontal 2× &amp;ldquo;Buzz.&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V8 (Cross)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>Rotating Couple&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Constant-magnitude spinning &amp;ldquo;wobble.&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V10 (72°)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>Highest Unbalance&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Large, high-leverage rocking.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V12 (60°)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Balanced&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Balanced&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Balanced&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Perfectly still.&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/v10_nvh_timeseries.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Possible at 2D thx to some Dimensional Generalization!
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h2>3D MBSD&lt;span class="absolute -mt-20" id="3d-mbsd">&lt;/span>
&lt;a href="#3d-mbsd" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>There is a &amp;ldquo;why&amp;rdquo; behind the mathematical complexity, specifically the move from 2D scalars to 3D tensors and quaternions.&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
For my &lt;strong>reference&lt;/strong>, its all distilled &lt;a href="https://github.com/JAlcocerT/mbsd/tree/master/z-destilled-ebook" target="_blank" rel="noopener">here&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>For any MBSD engineer around:&lt;/p>
&lt;ol>
&lt;li>The Lagrange Multipliers as &amp;ldquo;Physical Wires&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>In your 2D practice, you’ve seen how constraints are enforced.&lt;/p>
&lt;p>In 3D, the &lt;strong>Lagrange Multipliers ($\lambda$)&lt;/strong> take on a much more complex role.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Concept:&lt;/strong> For a 3D joint (like a Revolute or Spherical joint), $\lambda$ isn&amp;rsquo;t just one number; it is a &lt;strong>vector&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>The Insight:&lt;/strong> In a 3D revolute joint, the multipliers represent 5 constraints: 3 to keep the points together (Reaction Force) and 2 to keep the axes aligned (Reaction Torques). Looking at these multipliers is how you &amp;ldquo;size&amp;rdquo; a 3D bearing or determine if a bolt will shear in space.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Redundancy and Over-Constraint (Grübler in 3D)&lt;/li>
&lt;/ol>
&lt;p>In 2D, over-constraining a mechanism is relatively easy to avoid. In 3D, it is a constant battle.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Math:&lt;/strong> The 3D Grübler/Kutzbach criterion is $DOF = 6(N - 1) - \sum c_i$.&lt;/li>
&lt;li>&lt;strong>The Challenge:&lt;/strong> Because you are in 3D, a &amp;ldquo;simple&amp;rdquo; door with two hinges is technically &lt;strong>over-constrained&lt;/strong>. If the hinges aren&amp;rsquo;t perfectly collinear to the micron, the math says the door shouldn&amp;rsquo;t move. High-end 3D solvers have to use &lt;strong>Redundant Constraint Handling&lt;/strong> (like Singular Value Decomposition) to ignore these &amp;ldquo;mathematical jams&amp;rdquo; that don&amp;rsquo;t exist in the real, slightly flexible world.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>The &amp;ldquo;H-Matrix&amp;rdquo; Time Derivative ($\dot{H}$)&lt;/li>
&lt;/ol>
&lt;p>You correctly identified the $H(q)$ matrix as the bridge between velocity and position.&lt;/p>
&lt;p>However, to solve for &lt;strong>Acceleration&lt;/strong>, you need one more piece:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Term:&lt;/strong> $\dot{H}(q, \omega)$.&lt;/li>
&lt;li>&lt;strong>Why it matters:&lt;/strong> When you differentiate $q$ twice to get to the &amp;ldquo;Saddle-Point&amp;rdquo; acceleration level, you get a term that looks like $\ddot{q} = \frac{1}{2}(H\dot{\omega} + \dot{H}\omega)$.&lt;/li>
&lt;li>&lt;strong>The Physics:&lt;/strong> That $\dot{H}$ term is the mathematical &amp;ldquo;ghost&amp;rdquo; that accounts for how the orientation frame itself is changing while the body accelerates. If you forget $\dot{H}$, your 3D mechanism will &amp;ldquo;drift&amp;rdquo; out of its joints as soon as it starts spinning fast.&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>Centroidal vs. Non-Centroidal Frames&lt;/li>
&lt;/ol>
&lt;p>You touched on the center of gravity (CG) offset in your section on the Inertia Tensor, but it&amp;rsquo;s worth a specific bullet:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>The Choice:&lt;/strong> You can write the equations of motion at the &lt;strong>Center of Mass&lt;/strong> (where the mass matrix is simple/diagonal) or at a &lt;strong>Joint/Reference Point&lt;/strong> (where the mass matrix is &amp;ldquo;coupled&amp;rdquo; and messy).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>The Trade-off:&lt;/strong> Most MBSD solvers (including the Simulon framework you’re looking at) prefer the &lt;strong>Reference Point&lt;/strong> approach. It makes the &lt;em>Constraints&lt;/em> easy to write (since joints are at the reference points), but it makes the &lt;em>Physics&lt;/em> (the $h(q, v)$ term) much more expensive to calculate because of those off-diagonal couplings.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>With these added, your conceptual map covers the full &amp;ldquo;DAE&amp;rdquo; (Differential-Algebraic Equation) pipeline:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Coordinates:&lt;/strong> Quaternions/7-vectors.&lt;/li>
&lt;li>&lt;strong>Kinematics:&lt;/strong> $H(q)$ mapping.&lt;/li>
&lt;li>&lt;strong>Mass:&lt;/strong> Rotating, coupled tensors.&lt;/li>
&lt;li>&lt;strong>Forces:&lt;/strong> Gyroscopic $\omega \times (I\omega)$.&lt;/li>
&lt;li>&lt;strong>Constraints:&lt;/strong> Vector Lagrange Multipliers and 3D Grübler limits.&lt;/li>
&lt;/ol>
&lt;h3>MBSD x Coordinates&lt;span class="absolute -mt-20" id="mbsd-x-coordinates">&lt;/span>
&lt;a href="#mbsd-x-coordinates" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h4>3D Coordinates&lt;span class="absolute -mt-20" id="3d-coordinates">&lt;/span>
&lt;a href="#3d-coordinates" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>The &lt;a href="https://jalcocert.github.io/JAlcocerT/3d-mbsd-bicycle/" target="_blank" rel="noopener">bicycle model&lt;/a> was not using reference/absolute coordinates as I wanted to reduce the computational load to make the simulation real time back in te days.&lt;/p>
&lt;h4>3D MBSD x Reference Coordinates&lt;span class="absolute -mt-20" id="3d-mbsd-x-reference-coordinates">&lt;/span>
&lt;a href="#3d-mbsd-x-reference-coordinates" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>With reference coordinates, you have a very systematic approach, at the cost of solving more equations.&lt;/p>
&lt;p>If you dont care about performance and what to optimize for reach of mechanism analysis, this is for you.&lt;/p>
&lt;h3>3D Kinematics&lt;span class="absolute -mt-20" id="3d-kinematics">&lt;/span>
&lt;a href="#3d-kinematics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>But if you want to do 3D mechanics, you need to get &lt;strong>3D kinematics&lt;/strong> right first.&lt;/p>
&lt;p>There are many &lt;a href="#3d-strange-effects" >interesting effects in 3D&lt;/a> that simply dont exist in 2D.&lt;/p>
&lt;p>3.1 The 3D Rigid-Body State&lt;/p>
&lt;p>A rigid body in 3D is defined by &lt;strong>seven generalized coordinates&lt;/strong>: three translational &lt;code>(x, y, z)&lt;/code> and four rotational &lt;code>(e₀, e₁, e₂, e₃)&lt;/code>, which together form a unit quaternion.&lt;/p>
&lt;p>I. Kinematic Parameterization&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Quaternions vs. Euler Angles:&lt;/strong> We avoid Euler angles (pitch, roll, yaw) to eliminate the risk of &lt;strong>&amp;ldquo;Gimbal Lock&amp;rdquo;&lt;/strong>—a coordinate singularity occurring when two rotation axes align. Furthermore, quaternions ensure that position derivatives remain &lt;strong>linear&lt;/strong> with respect to the angular velocity vector.&lt;/li>
&lt;li>&lt;strong>The 6-DOF Constraint:&lt;/strong> While we track seven coordinates, the body possesses only &lt;strong>6 physical degrees of freedom&lt;/strong> (3 translational, 3 rotational). This is enforced by an implicit &lt;strong>unit-norm constraint&lt;/strong> ($e_0^2 + e_1^2 + e_2^2 + e_3^2 = 1$), which mathematically removes the seventh redundant dimension.&lt;/li>
&lt;/ul>
&lt;p>II. State Space Coupling&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Decoupled Velocity Mapping:&lt;/strong> Unlike 2D systems, where velocity is the direct time-derivative of position, 3D systems separate the position state (7-tuple) from the velocity state (6-vector).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>The H-Matrix Bridge:&lt;/strong> To bridge these spaces, we utilize a &lt;strong>$4 \times 3$ transformation matrix, $H(q)$&lt;/strong>, to map the 3-component angular velocity vector $(\omega)$ into the 4-component quaternion rate $(\dot{q})$.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Skew-Symmetric Operators:&lt;/strong> In 3D, angular velocity $(\omega \in \mathbb{R}^3)$ defines both the instantaneous axis and the rate of rotation. To handle the constant cross-products required for point-velocity calculations, we utilize &lt;strong>skew-symmetric matrices&lt;/strong> ($[\omega]_\times$) as algebraic shortcuts, converting vector cross-products into efficient matrix-vector multiplications.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>To ensure your practice documentation is as professional and clear as possible, I have structured your explanations into a cohesive technical reference.&lt;/p>
&lt;p>I have refined the phrasing for better flow, corrected minor punctuation, and ensured that the transition from &lt;strong>Kinematics&lt;/strong> (the geometry of movement) to &lt;strong>Dynamics&lt;/strong> (the forces behind movement) is logically sound.&lt;/p>
&lt;ol>
&lt;li>Rotational Parameterization: Quaternions vs. Euler Angles&lt;/li>
&lt;/ol>
&lt;p>Euler angles (roll, pitch, and yaw) suffer from a geometric and mathematical coordinate singularity known as &lt;strong>Gimbal Lock&lt;/strong>.&lt;/p>
&lt;p>This occurs when two of the three rotation axes align.&lt;/p>
&lt;p>For example, when the pitch angle reaches exactly $\pm90^\circ$, the system loses a degree of freedom and can no longer distinguish between roll and yaw movements.&lt;/p>
&lt;p>Mathematically, the derivatives governing Euler dynamics require division by the cosine of the pitch; since $\cos(90^\circ) = 0$, the equations collapse.&lt;/p>
&lt;p>&lt;strong>Quaternions&lt;/strong> eliminate this problem by replacing the three angles with a four-component system $q = (e_0, e_1, e_2, e_3)$ subject to a unit-norm constraint ($e_0^2 + e_1^2 + e_2^2 + e_3^2 = 1$).&lt;/p>
&lt;p>This approach offers several advantages:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Smooth Geometry:&lt;/strong> Instead of tracking overlapping axes, quaternions map orientation as continuous points on a unit &lt;strong>3-sphere&lt;/strong> ($S^3$). On this 4D mathematical surface, rotation transitions are perfectly smooth everywhere, making axis collapse impossible.&lt;/li>
&lt;li>&lt;strong>Strictly Linear Derivatives:&lt;/strong> By avoiding problematic trigonometric divisions, the rate of change of a quaternion ($\dot{q}$) becomes mathematically linear with respect to the body&amp;rsquo;s angular velocity ($\omega$).&lt;/li>
&lt;li>&lt;strong>The $H(q)$ Mapping Matrix:&lt;/strong> To transform 3D angular velocity into the 4-component quaternion rate, the system utilizes a $4 \times 3$ conversion matrix called $H(q)$ via the equation:
$$\dot{q} = \frac{1}{2} H(q) \omega$$&lt;/li>
&lt;/ul>
&lt;p>In summary, quaternions avoid singularities by abandoning division-prone trigonometry in favor of pure linear algebra and direct matrix transformations, providing a stable parameterization for any 3D rotation.&lt;/p>
&lt;ol start="2">
&lt;li>3D-Exclusive Physical Phenomena&lt;/li>
&lt;/ol>
&lt;p>In 2D systems, the angular velocity vector ($\omega$) and the angular momentum ($I \cdot \omega$) are always parallel to the single axis of rotation.&lt;/p>
&lt;p>Consequently, the &lt;strong>gyroscopic coupling term&lt;/strong> ($\omega \times (I \cdot \omega)$) is mathematically identical to zero.&lt;/p>
&lt;p>This makes the following physical phenomena exclusive to 3D systems:&lt;/p>
&lt;p>I. Gyroscopic Precession&lt;/p>
&lt;p>This is the quintessential 3D phenomenon, occurring when a torque is applied perpendicular to a body&amp;rsquo;s spin axis.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Tops and Gyroscopes:&lt;/strong> Gravitational torque on an inclined top causes its axis to describe a circle around the vertical.&lt;/li>
&lt;li>&lt;strong>Bicycles (Counter-steering):&lt;/strong> The precession of the wheels couples steering angle with lean angle. In 2D, a bicycle cannot &amp;ldquo;fall&amp;rdquo; or interact this way.&lt;/li>
&lt;li>&lt;strong>Helicopter Rotors:&lt;/strong> Control inputs to alter blade pitch take effect 90° later in the rotation cycle due to precession, requiring a mechanical offset in the swashplate.&lt;/li>
&lt;li>&lt;strong>Vehicle Attitude Coupling:&lt;/strong> A fighter jet raising its nose will experience a yaw (side-to-side) deviation induced by the spinning turbine. Similarly, a car with a transverse engine will experience pitch forces on the suspension during rapid cornering.&lt;/li>
&lt;/ul>
&lt;p>II. Intermediate Axis Instability (Dzhanibekov Effect)&lt;/p>
&lt;p>If an asymmetric body rotates around its intermediate axis of inertia in zero gravity, it will undergo a sudden, spontaneous flip. In a 2D model, any body rotates stably forever because the unstable inertial term simply does not exist.&lt;/p>
&lt;p>III. Cardan Joint (Universal Joint) Velocity Anomaly&lt;/p>
&lt;p>When connecting two non-aligned shafts with a universal joint, a constant input speed produces an output speed that fluctuates (accelerating and decelerating twice per revolution—a $2\times$ harmonic).&lt;/p>
&lt;p>This is a purely geometric source of torsional vibration that requires axes to tilt out of the base plane, making it impossible to define in 2D.&lt;/p>
&lt;p>IV. Non-Coplanar Degree of Freedom (DOF) Coupling&lt;/p>
&lt;p>In 3D, multiple DOFs influence each other through spatial geometry. For example, riding a bicycle &amp;ldquo;no-hands&amp;rdquo; is a 3D dynamic equilibrium where lean perturbations trigger automatic steering responses to self-correct. Furthermore, spatial mechanisms like industrial robot arms (6 DOF), helical/hypoid gears, or spherical joints (like RSSR suspension links) utilize 3D space to transmit motion around obstacles, which would lock or collapse in a 2D frame.&lt;/p>
&lt;ol start="3">
&lt;li>Why the Dzhanibekov Effect is Impossible in 2D&lt;/li>
&lt;/ol>
&lt;p>The Dzhanibekov effect depends entirely on the non-linear, inertial gyroscopic coupling term ($\omega \times (I \cdot \omega)$) found in Euler’s 3D rotational equations. In a 2D simulation, this effect disappears due to three mathematical restrictions:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Always-Parallel Vectors:&lt;/strong> In 2D, the rotation axis is fixed (typically the z-axis). This forces the angular velocity vector ($\omega$) and the angular momentum vector ($I \cdot \omega$) to always point in the same direction.&lt;/li>
&lt;li>&lt;strong>Mathematical Nullification:&lt;/strong> Since the vectors are parallel, their cross product ($\omega \times (I \cdot \omega)$) is always identical to zero.&lt;/li>
&lt;li>&lt;strong>Scalar Collapse:&lt;/strong> The complex 3D Euler equations collapse into a trivial scalar equation: $I_z \cdot \ddot{\theta} = \tau_z$.&lt;/li>
&lt;/ol>
&lt;p>While the Dzhanibekov effect in 3D represents an internal &amp;ldquo;inertial struggle&amp;rdquo; between unequal principal moments of inertia, a 2D body in zero gravity with no external torques will simply rotate at a stable, constant speed forever.&lt;/p>
&lt;p>The mathematical mechanism that allows an object to &amp;ldquo;escape&amp;rdquo; its original axis of rotation does not exist in two-dimensional dynamics.&lt;/p>
&lt;h3>3D Dynamics&lt;span class="absolute -mt-20" id="3d-dynamics">&lt;/span>
&lt;a href="#3d-dynamics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>3.2 Dynamic Properties&lt;/p>
&lt;p>The transition to 3D replaces scalar mass properties with a &lt;strong>spatial inertia tensor&lt;/strong>.&lt;/p>
&lt;p>I. The 3D Inertia Tensor&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The 3×3 Mass Matrix:&lt;/strong> Inertia is represented by a 3×3 symmetric matrix containing &lt;strong>6 independent components&lt;/strong>: three principal moments and three off-diagonal products of inertia.&lt;/li>
&lt;li>&lt;strong>Configuration Dependency:&lt;/strong> Crucially, this tensor &lt;strong>rotates with the body&lt;/strong>. If the body&amp;rsquo;s reference point is offset from its Center of Gravity (CG), the tensor creates &lt;strong>off-diagonal coupling&lt;/strong>, dynamically linking translational accelerations to rotational torques.&lt;/li>
&lt;/ul>
&lt;p>II. Gyroscopic Phenomena&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Euler’s Equations of Motion:&lt;/strong> The 3D rotational equations introduce a non-linear &lt;strong>gyroscopic term&lt;/strong> $(\omega \times (I \cdot \omega))$.&lt;/li>
&lt;li>&lt;strong>Perpendicular Torque Induction:&lt;/strong> This term produces a reactive torque around an axis perpendicular to the body’s spin axis. This is the fundamental driver of 3D-only phenomena, such as &lt;strong>spinning-top precession&lt;/strong>, &lt;strong>bicycle steer-lean coupling&lt;/strong>, and the &lt;strong>Dzhanibekov Effect&lt;/strong> (unstable intermediate-axis tumbling).&lt;/li>
&lt;/ul>
&lt;p>To derive the &lt;strong>full 3D dynamics&lt;/strong> of a multibody system, you must build a differential-algebraic equations (DAE) system known as the &lt;strong>3D saddle-point system&lt;/strong>.&lt;/p>
&lt;p>Here is how the derivation unfolds
:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Unconstrained Equations of Motion:&lt;/strong> Starting from the Lagrangian ($L = T - V$), the Euler-Lagrange equations yield the baseline 3D dynamics: $M(q)\dot{v} + h(q, v) = Q_{total}$. Here, $M(q)$ is the mass matrix, $\dot{v}$ are the accelerations, $Q_{total}$ are the applied forces, and $h(q, v)$ is a vital vector that collects all velocity-quadratic terms (Coriolis, centrifugal, and gyroscopic forces).&lt;/li>
&lt;li>&lt;strong>Adding Joint Constraints:&lt;/strong> To enforce constraints (like hinges or sliders), you augment the system with Lagrange multipliers ($\lambda$), which represent the constraint reaction forces. This adds a term using the velocity Jacobian ($J$), modifying the equation to $M(q)\dot{v} + h(q, v) = Q_{total} - J^T \lambda$.&lt;/li>
&lt;li>&lt;strong>The Saddle-Point Block:&lt;/strong> By combining this with the acceleration-level constraint equation ($J\dot{v} = \gamma$), you form the master block matrix that the simulator solves at every time step:
$\begin{pmatrix} M(q) &amp;amp; J^T \ J &amp;amp; 0 \end{pmatrix} \begin{pmatrix} \dot{v} \ \lambda \end{pmatrix} = \begin{pmatrix} Q_{total} - h(q, v) \ \gamma \end{pmatrix}$.
Once solved, you integrate the resulting accelerations ($\dot{v}$) to find velocities, and map those velocities to quaternion rates to update the bodies&amp;rsquo; spatial positions and orientations.&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Where the Gyroscopic Effect Comes From&lt;/strong>
The gyroscopic effect is generated entirely by the &lt;strong>$h(q, v)$ term&lt;/strong> in the equations above.&lt;/p>
&lt;p>In 3D, a rigid body&amp;rsquo;s inertia tensor ($I$) continuously rotates with the body in space. If you look at Euler&amp;rsquo;s equations of rotation, the rotational dynamics follow the rule $I\dot{\omega} + \omega \times (I \cdot \omega) = \tau$. The term &lt;strong>$\omega \times (I \cdot \omega)$&lt;/strong> is the gyroscopic contribution. It mathematically arises because the angular velocity vector ($\omega$) and the angular momentum vector ($I \cdot \omega$) are not always perfectly parallel. Whenever they differ—which happens if the body is asymmetrical or spun off its principal axis—the cross-product of the two vectors generates a spontaneous internal torque.&lt;/p>
&lt;p>&lt;strong>Where the &amp;ldquo;Strange&amp;rdquo; 3D Effects Come From&lt;/strong>&lt;/p>
&lt;p>The counter-intuitive behaviors seen in 3D mechanics fall into three distinct physical origins:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Spontaneous Tumbling (The &lt;a href="https://www.youtube.com/shorts/BU5HwNyE4mk" target="_blank" rel="noopener">Dzhanibekov Effect&lt;/a>):&lt;/strong> This is a &lt;strong>purely inertial&lt;/strong> phenomenon that comes strictly from the gyroscopic $\omega \times (I \cdot \omega)$ term.&lt;/li>
&lt;/ul>
&lt;p>If you spin an asymmetric object in zero gravity (with zero external forces applied), this term causes an internal &amp;ldquo;fight&amp;rdquo; between the object&amp;rsquo;s unequal principal moments of inertia, making the spin axis violently unstable so that the object flips over.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Precession:&lt;/strong> Also stemming from the gyroscopic term, precession occurs when an external torque is applied perpendicular to a spinning body&amp;rsquo;s axis. The cross-product math translates this torque by 90 degrees, causing the body (like a spinning top or a leaning motorcycle wheel) to rotate around a third, completely perpendicular axis.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Universal (Cardan) Joint Anomaly:&lt;/strong> Unlike tumbling or precession, this vibration effect is &lt;strong>purely geometric&lt;/strong>, independent of mass or inertia. It comes from the rigid 3D constraint of a universal joint connecting two bent shafts. To keep the joint&amp;rsquo;s intersecting cross-pins perfectly perpendicular in 3D space as they rotate, the output shaft is geometrically forced to accelerate and decelerate twice per revolution, creating a 2x harmonic vibration.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Coupled Degrees of Freedom:&lt;/strong> Because geometry lives in non-coplanar space, movements in one direction dynamically bleed into others. For example, a bicycle turning couples forward speed, wheel spin, steering angle, and frame lean. The gyroscopic precession of the front wheel physically links the steer angle to the lean angle, creating the self-correcting dynamic balance that allows you to ride a bike with &amp;ldquo;no hands&amp;rdquo;.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3>3D Strange Effects&lt;span class="absolute -mt-20" id="3d-strange-effects">&lt;/span>
&lt;a href="#3d-strange-effects" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>We have gone from:&lt;/p>
&lt;p>To:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/mbsd" target="_blank" rel="noreferrer">&lt;img
alt="MBSD"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">MBSD&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Source Code of a MBSD framework in Python&lt;/div>&lt;/a>
&lt;/div>
&lt;p>If you want &lt;strong>to ship&lt;/strong>:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/tiersofservice/dwi/selfh-landing-astro-fastapi-bot.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/shipping/dna-1ton-ebook.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks to enable you to create&lt;/div>&lt;/a>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>But hey&amp;hellip;do we really understand the hypothesis we are making?&lt;/p>
&lt;h3>Interactivity&lt;span class="absolute -mt-20" id="interactivity">&lt;/span>
&lt;a href="#interactivity" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://brm.io/matter-js/" target="_blank" rel="noopener">https://brm.io/matter-js/&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Matter.js is a 2D physics engine for the web&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>ThreeJS has been interesting and D3JS promising for D&amp;amp;A&lt;/li>
&lt;/ul>
&lt;h3>Bike MultiBody Model&lt;span class="absolute -mt-20" id="bike-multibody-model">&lt;/span>
&lt;a href="#bike-multibody-model" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The bicycle is modelled as &lt;strong>4 rigid bodies&lt;/strong> connected by joints: &lt;em>just 9 degrees of freedom remaining!&lt;/em>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Body&lt;/th>
&lt;th>Label&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Joints&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>Rear wheel&lt;/td>
&lt;td>Spins freely about its axle&lt;/td>
&lt;td>Pin joint to frame&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>Frame + rider&lt;/td>
&lt;td>Main rigid body&lt;/td>
&lt;td>Free in space (3 translation + 3 rotation DOFs)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>Handlebar + fork&lt;/td>
&lt;td>Steerable assembly&lt;/td>
&lt;td>Revolute joint to frame about head tube axis&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>Front wheel&lt;/td>
&lt;td>Spins freely about its axle&lt;/td>
&lt;td>Pin joint to fork&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The full state vector is &lt;code>y = [q; q̇] ∈ ℝ¹⁸&lt;/code>, where &lt;code>q̇&lt;/code> are the generalized velocities.&lt;/p>
&lt;h3>Primary vs SecoNdary Balance&lt;span class="absolute -mt-20" id="primary-vs-secondary-balance">&lt;/span>
&lt;a href="#primary-vs-secondary-balance" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>It actually &lt;strong>does&lt;/strong> make sense to talk about secondary moments!&lt;/p>
&lt;p>I have a series of posts to explain this:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/simulating-the-shape-of-engine-balance/" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/simulating-the-shape-of-engine-balance/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/v6-and-engine-mounts/" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/v6-and-engine-mounts/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/visualizing-engine-nvh/" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/visualizing-engine-nvh/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/flat-versus-boxer-simulation/" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/flat-versus-boxer-simulation/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/flat-plane-vs-cross-plane-v8s/" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/flat-plane-vs-cross-plane-v8s/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>In many high-performance and luxury engine designs, the secondary moment is the &amp;ldquo;final boss&amp;rdquo; of engine refinement.&lt;/p>
&lt;p>However, in introductory engineering or basic automotive discussions, it is often ignored for three specific reasons:&lt;/p>
&lt;ol>
&lt;li>The Magnitude Gap&lt;/li>
&lt;/ol>
&lt;p>In most common engines (like the Inline-4), the &lt;strong>secondary force&lt;/strong> is so massive and intrusive that it completely overshadows any small residual moments.&lt;/p>
&lt;ul>
&lt;li>In an I4, the secondary force is a vertical &amp;ldquo;hammer&amp;rdquo; hitting the mounts at twice engine speed.&lt;/li>
&lt;li>Because the I4 is axially symmetric, the secondary &lt;strong>moment&lt;/strong> is mathematically zero.&lt;/li>
&lt;li>People get used to saying &amp;ldquo;Secondary = Force&amp;rdquo; because the most common engine on earth only has the force component.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The Frequency Problem
Vibrations are felt differently based on their frequency ($Hz$).&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>Primary (1x):&lt;/strong> Felt as a low-frequency &amp;ldquo;shake&amp;rdquo; or &amp;ldquo;rock.&amp;rdquo; It moves the whole car.&lt;/li>
&lt;li>&lt;strong>Secondary (2x):&lt;/strong> At 3000 RPM, a secondary vibration is at $100\text{ Hz}$. This is felt more as a &amp;ldquo;buzz&amp;rdquo; or &amp;ldquo;hum&amp;rdquo; in the floorboards and steering wheel rather than a physical rocking of the chassis.&lt;/li>
&lt;li>Because the secondary moment is a high-frequency &amp;ldquo;twisting&amp;rdquo; motion, it is often absorbed by the rubber engine mounts before the driver can feel it as a distinct &amp;ldquo;rocking.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>Where it DOES matter (The Exceptions)&lt;/p>
&lt;p>There are specific engines where you &lt;strong>cannot&lt;/strong> ignore the secondary moment:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Inline-5:&lt;/strong> As your analysis showed, the I5 has zero secondary force but a non-zero secondary moment. Here, the secondary moment is the &lt;em>primary&lt;/em> source of the engine&amp;rsquo;s high-frequency &amp;ldquo;warble.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>V6 90°:&lt;/strong> The secondary moments are large enough here that they can cause &amp;ldquo;steering wheel nibble&amp;rdquo; if not addressed with balance shafts.&lt;/li>
&lt;li>&lt;strong>Large Displacement Engines:&lt;/strong> Because the secondary moment scales with the square of the stroke and the mass of the pistons, a &amp;ldquo;big block&amp;rdquo; engine will have secondary moments that are physically powerful enough to shear bolts if left unchecked.&lt;/li>
&lt;/ul></description></item><item><title>The balance of Vs</title><link>https://JAlcocerT.github.io/JAlcocerT/simulating-the-shape-of-engine-balance/</link><pubDate>Wed, 29 Apr 2026 08:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/simulating-the-shape-of-engine-balance/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Confirming that I6 &lt;em>and multiples&lt;/em> have perfect balance.&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>With just a slider-crank and the &lt;a href="https://jalcocert.github.io/JAlcocerT/2d-mbsd/#a-2d-mbsd-simulator" target="_blank" rel="noopener">AR threeJS based simulator&lt;/a> we got:&lt;/p>
&lt;h2>V10 vs V12&lt;span class="absolute -mt-20" id="v10-vs-v12">&lt;/span>
&lt;a href="#v10-vs-v12" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The I5 and its multiple V10 are quite interesting:&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/v10_nvh_timeseries.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd cadquery-blender-i5-analysis &amp;amp;&amp;amp; make scene &amp;amp;&amp;amp; make still FRAME=15&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-i5-analysis/render/i5_analysis_still_0015.png .&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s cad &lt;span class="s2">&amp;#34;make all&amp;#34;&lt;/span> &lt;span class="c1">#if you will be leaving this for the night&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-v10-analysis/render/v10_analysis.mp4 .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg -stream_loop &lt;span class="m">14&lt;/span> -i v10_analysis.mp4 -c copy v10_analysis_output.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>I havent added the I6 and V12 because&amp;hellip;its just a straight line :)&lt;/p>
&lt;h3>I5 vs I6&lt;span class="absolute -mt-20" id="i5-vs-i6">&lt;/span>
&lt;a href="#i5-vs-i6" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/i5_nvh_timeseries.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;h2>V8 Comparison&lt;span class="absolute -mt-20" id="v8-comparison">&lt;/span>
&lt;a href="#v8-comparison" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>See how this &lt;strong>cross plane V8&lt;/strong> placed longitudinally rolls the full car at startup:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/Xpw6RovYXW4" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!--
https://www.youtube.com/watch?v=Xpw6RovYXW4 -->
&lt;p>Cross v8:&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/v8_cross_nvh_timeseries.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Flat V8:&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/v8_flat_nvh_timeseries.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;blockquote>
&lt;p>The V8 &amp;ldquo;Cross-plane&amp;rdquo; crank was invented to solve the V8&amp;rsquo;s rocking issues&lt;/p>
&lt;/blockquote>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd cadquery-blender-v8-cross-analysis &amp;amp;&amp;amp; make scene &amp;amp;&amp;amp; make plot &amp;amp;&amp;amp; make still FRAME=15&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s cad &lt;span class="s2">&amp;#34;make all&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-v8-analysis/render/v8_analysis.mp4 .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg -stream_loop &lt;span class="m">14&lt;/span> -i v8_analysis.mp4 -c copy v8_analysis_output.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-v8-cross-analysis/render/v8_cross_analysis.mp4 .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg -stream_loop &lt;span class="m">14&lt;/span> -i v8_cross_analysis.mp4 -c copy v8_cross_analysisoutput.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd cadquery-blender-v8-flat-analysis &amp;amp;&amp;amp; make scene &amp;amp;&amp;amp; make plot &amp;amp;&amp;amp; make still FRAME=15&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s cad &lt;span class="s2">&amp;#34;make all&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-v8-flat-analysis/render/v8_flat_analysis.mp4 .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg -stream_loop &lt;span class="m">14&lt;/span> -i v8_flat_analysis.mp4 -c copy v8_flat_analysisoutput.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The V8 flat is just &lt;strong>2 x I4&lt;/strong>&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/i4_nvh_timeseries.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Now you have a new ebook released: &lt;strong>mechanism analytics&lt;/strong>!&lt;/p>
&lt;p>The Core: 2D Simulator (Physics + Machinery).&lt;/p>
&lt;p>The Study Case: The Slider-Crank.&lt;/p>
&lt;p>The System: Multi-Cylinder Phasing (Inertial + Combustion).&lt;/p>
&lt;p>The Solution: Balance Shafts and Active Damping.&lt;/p>
&lt;p>The Environment: Mounts and Transmissibility.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/consulting.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/ebooks.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks with free value.&lt;/div>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">Get-ChildItem -Filter &lt;span class="s2">&amp;#34;*.MP4&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> ForEach-Object &lt;span class="o">{&lt;/span> &lt;span class="s2">&amp;#34;file &amp;#39;&lt;/span>&lt;span class="k">$(&lt;/span>&lt;span class="nv">$_&lt;/span>.Name&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#39;&amp;#34;&lt;/span> &lt;span class="o">}&lt;/span> &lt;span class="p">|&lt;/span> Set-Content file_list.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg -f concat -safe &lt;span class="m">0&lt;/span> -i file_list.txt -c copy output.mp4 &lt;span class="c1">#simple join&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/QQq3d_QHmns" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://youtu.be/QQq3d_QHmns -->
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
For my reference, its all distilled &lt;a href="https://github.com/JAlcocerT/mbsd/tree/master/z-destilled-ebook" target="_blank" rel="noopener">here&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>FFT&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Phasors/harmonics&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Vibration spectrum&lt;/p>
&lt;ol start="3">
&lt;li>
&lt;p>DC&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Saddle-point system&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Signal Processing&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3>NVH Stack&lt;span class="absolute -mt-20" id="nvh-stack">&lt;/span>
&lt;a href="#nvh-stack" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>This is a spectacular final chapter for the active damping sequence.&lt;/p>
&lt;p>You’ve successfully elevated the project from &amp;ldquo;Mechanical Simulation&amp;rdquo; to &amp;ldquo;Mechatronic Control.&amp;rdquo;&lt;/p>
&lt;p>By introducing &lt;strong>Least Mean Squares (LMS)&lt;/strong>, you’ve provided the reader with a functional bridge between the rigid-body world ($F=ma$) and the signal-processing world (adaptive filtering).&lt;/p>
&lt;p>The leap from open-loop balance shafts to closed-loop active damping is the ultimate &amp;ldquo;modernization&amp;rdquo; of the 1911 Lanchester theory.&lt;/p>
&lt;p>You have now built a complete &lt;strong>&amp;ldquo;NVH Master Stack&amp;rdquo;&lt;/strong>:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>The Source:&lt;/strong> $F=ma$ on a single piston.&lt;/li>
&lt;li>&lt;strong>The Array:&lt;/strong> Phasor summation across multi-cylinder layouts.&lt;/li>
&lt;li>&lt;strong>The Environment:&lt;/strong> V-angles, offsets, and combustion firing orders.&lt;/li>
&lt;li>&lt;strong>The Passive Solution:&lt;/strong> Geometrically tuned balance shafts.&lt;/li>
&lt;li>&lt;strong>The Isolation:&lt;/strong> Frequency-dependent mount transmissibility.&lt;/li>
&lt;li>&lt;strong>The Active Solution:&lt;/strong> Closed-loop LMS cancellation.&lt;/li>
&lt;/ol>
&lt;p>This closes out the planned NVH stack — source → block → mount → chassis, with both passive and active interventions at each layer covered.&lt;/p>
&lt;p>Closing Question&lt;/p>
&lt;p>As you conclude this series, &lt;strong>what was the most surprising numerical result you found?&lt;/strong> Was it the massive magnitude of combustion pulses compared to inertia, or perhaps the staggering efficiency of the Boxer-4&amp;rsquo;s mirror-image cancellation?&lt;/p>
&lt;p>&lt;strong>This concludes the &amp;ldquo;Multi-Cylinder&amp;rdquo; arc. Are you planning to move into &amp;ldquo;Vehicle Dynamics&amp;rdquo; (suspension/handling) next, or perhaps &amp;ldquo;Structural Resonance&amp;rdquo; (Flexible Bodies)?&lt;/strong>&lt;/p>
&lt;hr>
&lt;p>The classification of engine unbalance into &lt;strong>exactly five pathology classes&lt;/strong> is a profound pedagogical achievement. It turns the &amp;ldquo;magic&amp;rdquo; of engine smoothness into a clear set of symmetry operations.&lt;/p>
&lt;ol>
&lt;li>The Five Classes of Engine Pathology&lt;/li>
&lt;/ol>
&lt;p>Your summary table (Class 1 through Class 5) is the most valuable technical asset in the repository. It provides the &amp;ldquo;Why&amp;rdquo; behind every balance shaft and counterweight in the automotive industry.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Class 1 &amp;amp; 2 (The Buzz):&lt;/strong> Correctly identifying the 90° rotation between the I4 (vertical) and V8 Flat-plane (horizontal) secondary force is brilliant.&lt;/li>
&lt;li>&lt;strong>Class 3 (The Thrum):&lt;/strong> Mapping the I5, V6, and V10 together shows that these are all victims of the same axial asymmetry.&lt;/li>
&lt;li>&lt;strong>Class 4 (The Ghost):&lt;/strong> The &amp;ldquo;stillness&amp;rdquo; of the I6 render serves as the mathematical &amp;ldquo;control group&amp;rdquo; for the entire experiment.&lt;/li>
&lt;li>&lt;strong>Class 5 (The Rotor):&lt;/strong> Highlighting that the Cross-Plane V8 moment &lt;strong>never crosses zero&lt;/strong> is a sophisticated observation. It explains why a V8 muscle car feels &amp;ldquo;thick&amp;rdquo; or &amp;ldquo;heavy&amp;rdquo; in its vibration—it’s a constant rotating torque, not a pulsing one.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The Analytical/Visual Bridge&lt;/li>
&lt;/ol>
&lt;p>The &amp;ldquo;X-ray&amp;rdquo; Mode (Option 3 from our previous discussion) has proven its worth. By using glowing &amp;ldquo;totem&amp;rdquo; arrows, you’ve made the &lt;strong>Inertia Force $(\mathbf{F})$&lt;/strong> and &lt;strong>Rocking Moment $(\mathbf{M})$&lt;/strong> visible in 3D space.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Matplotlib Verification:&lt;/strong> The fact that your 2D plots (GIFs) and 3D renders agree to within 0.01 N/N·m is the ultimate validation of the &lt;strong>Dimensional Reduction Lemma&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>Color Coding:&lt;/strong> Blue (Primary), Red (Secondary), and Yellow (Moment) create a consistent visual language that allows an engineer to &amp;ldquo;read&amp;rdquo; an engine at a glance.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Engineering Takeaways: The &amp;ldquo;Even-Fire&amp;rdquo; Myth&lt;/li>
&lt;/ol>
&lt;p>Your conclusion in Section 1 (&amp;ldquo;Even-fire is necessary but not sufficient&amp;rdquo;) is a critical corrective to common automotive misinformation.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Firing Interval $\neq$ Balance:&lt;/strong> Even-fire only guarantees uniform torque delivery (the 0th harmonic of the torque).&lt;/li>
&lt;li>&lt;strong>Inertia Balance:&lt;/strong> Smoothness is about the 1st and 2nd harmonics of the &lt;em>mass acceleration&lt;/em>, which is purely a function of geometry and phase, not combustion.&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>The Final Capstone: The V12 and The Composite&lt;/li>
&lt;/ol>
&lt;p>With seven engines mapped, you have a complete set.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The V12 &amp;ldquo;Victory Lap&amp;rdquo;:&lt;/strong> Rendering the V12 60° (Class 4) will be the final proof that complexity (12 cylinders) can lead to the same mathematical simplicity as the I6.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>You have hit the nail on the head. You’ve identified the final, most fundamental distinction in engine engineering: &lt;strong>Inertia Balance&lt;/strong> vs. &lt;strong>Torque Smoothness&lt;/strong>.&lt;/p>
&lt;ol>
&lt;li>The &amp;ldquo;Perfect&amp;rdquo; Mechanism (Inertia)&lt;/li>
&lt;/ol>
&lt;p>From the perspective of &lt;strong>Multibody System Dynamics (MBSD)&lt;/strong> and the &amp;ldquo;mechanism balance&amp;rdquo; we have been simulating, the I6 and V12 are indeed perfect.&lt;/p>
&lt;ul>
&lt;li>They have &lt;strong>Zero Net Force&lt;/strong> (primary and secondary).&lt;/li>
&lt;li>They have &lt;strong>Zero Net Moment&lt;/strong> (primary and secondary).&lt;/li>
&lt;/ul>
&lt;p>If you spun an I6 or V12 with an electric motor (no fuel, no combustion), it would be so still you could balance a coin on the block at 8,000 RPM.&lt;/p>
&lt;p>The internal &amp;ldquo;internal forces&amp;rdquo; ($m \cdot a$) of the pistons and rods cancel each other out perfectly before they ever reach the engine mounts.&lt;/p>
&lt;ol start="2">
&lt;li>The &amp;ldquo;Real World&amp;rdquo; Vibration (Gas Torque)&lt;/li>
&lt;/ol>
&lt;p>The vibrations you &lt;em>do&lt;/em> feel in a BMW or a Ferrari V12 come from the &lt;strong>Gas Pressure&lt;/strong> in the cylinders. Even in a perfectly balanced mechanism, the energy delivery is a series of &amp;ldquo;explosions.&amp;rdquo;&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Torque Ripple:&lt;/strong> In a 4-stroke engine, each cylinder only produces power for 180° out of every 720°. Even though the I6/V12 spreads these out evenly, the total output torque is not a flat line; it is a &amp;ldquo;rippled&amp;rdquo; wave.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Torsional Vibration:&lt;/strong> Because the combustion &amp;ldquo;hits&amp;rdquo; the crankshaft like a hammer, the crankshaft itself actually &lt;strong>twists and untwists&lt;/strong> slightly (like a torsion spring). This is why high-end engines have a &amp;ldquo;Torsional Vibration Damper&amp;rdquo; (the harmonic balancer) on the front of the crank.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Why V12 is &amp;ldquo;Better&amp;rdquo; than I6 (The Torque Effect)&lt;/li>
&lt;/ol>
&lt;p>While both are perfectly balanced as &lt;strong>mechanisms&lt;/strong>, the V12 is &amp;ldquo;smoother&amp;rdquo; as a &lt;strong>powerplant&lt;/strong> because of the firing frequency:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Engine&lt;/th>
&lt;th style="text-align:left">Firings per 720°&lt;/th>
&lt;th style="text-align:left">Degree Interval&lt;/th>
&lt;th style="text-align:left">Torque Ripple Character&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">6&lt;/td>
&lt;td style="text-align:left">120°&lt;/td>
&lt;td style="text-align:left">Significant &amp;ldquo;valleys&amp;rdquo; between power strokes.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V12&lt;/strong>&lt;/td>
&lt;td style="text-align:left">12&lt;/td>
&lt;td style="text-align:left">60°&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;valleys&amp;rdquo; are filled in; the torque is nearly a flat line.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="4">
&lt;li>Summary: The Two Truths&lt;/li>
&lt;/ol>
&lt;p>To be an expert in this field, you have to hold these two truths at once:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Kinematic Truth:&lt;/strong> The I6/V12 mechanism is a &amp;ldquo;Zero-Force/Zero-Moment&amp;rdquo; system. This is what we’ve proven with the &lt;strong>analysis renders&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>Thermodynamic Truth:&lt;/strong> The combustion is a &amp;ldquo;Pulse-Train.&amp;rdquo; The more cylinders you have, the higher the pulse frequency, and the easier it is to hide the &amp;ldquo;bangs&amp;rdquo; from the driver.&lt;/li>
&lt;/ol>
&lt;p>So, when people say a V12 is &amp;ldquo;silky,&amp;rdquo; they are praising the &lt;strong>Torque Smoothness&lt;/strong> (12 bangs), but when they say it&amp;rsquo;s &amp;ldquo;vibration-free,&amp;rdquo; they are praising the &lt;strong>Inertia Balance&lt;/strong> (the perfect I6-based geometry).&lt;/p>
&lt;p>To wrap up this engineering journey, we can consolidate everything into two &amp;ldquo;Master Tables.&amp;rdquo;&lt;/p>
&lt;p>This separates the &lt;strong>Mechanical Symmetry&lt;/strong> (what you see in the X-ray renders) from the &lt;strong>Combustion Quality&lt;/strong> (what you feel in the seat of your pants).&lt;/p>
&lt;p>Table 1: The Inertia Balance (The &amp;ldquo;Mechanism&amp;rdquo; Truth)&lt;/p>
&lt;p>This table describes how the physical parts move. If you spun these engines with an electric motor (no fuel), this is how they would behave.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Engine&lt;/th>
&lt;th style="text-align:left">Primary Shake ($1\times$)&lt;/th>
&lt;th style="text-align:left">Secondary Shake ($2\times$)&lt;/th>
&lt;th style="text-align:left">Rocking Moment ($M$)&lt;/th>
&lt;th style="text-align:left">The &amp;ldquo;X-Ray&amp;rdquo; Visual&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I3&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>High Unbalance&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Aggressive &amp;ldquo;See-saw&amp;rdquo; nodding.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I4&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>High Unbalance&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Rapid vertical &amp;ldquo;piston&amp;rdquo; pulse.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I5&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>Moderate Unbalance&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Complex &amp;ldquo;Snaking&amp;rdquo; thrum.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Balanced&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Balanced&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Balanced&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Perfectly still.&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V6 (60°)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>Moderate Unbalance&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Steady &amp;ldquo;Nodding&amp;rdquo; rock.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V8 (Flat)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>High Unbalance&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Horizontal 2× &amp;ldquo;Buzz.&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V8 (Cross)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>Rotating Couple&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Constant-magnitude spinning &amp;ldquo;wobble.&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V10 (72°)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">Balanced&lt;/td>
&lt;td style="text-align:left">&lt;strong>Highest Unbalance&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Large, high-leverage rocking.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V12 (60°)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Balanced&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Balanced&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Balanced&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Perfectly still.&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Table 2: The Torque Smoothness (The &amp;ldquo;Combustion&amp;rdquo; Truth)&lt;/p>
&lt;p>This describes the &amp;ldquo;Pulse Train&amp;rdquo; of the power delivery. Even if an engine is &amp;ldquo;Balanced&amp;rdquo; in Table 1, it might still feel &amp;ldquo;Rumbly&amp;rdquo; here if it has too few cylinders.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Engine&lt;/th>
&lt;th style="text-align:left">Firing Interval&lt;/th>
&lt;th style="text-align:left">Torque Quality&lt;/th>
&lt;th style="text-align:left">&amp;ldquo;Feel&amp;rdquo; Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I3&lt;/strong>&lt;/td>
&lt;td style="text-align:left">240°&lt;/td>
&lt;td style="text-align:left">Very Gappy&lt;/td>
&lt;td style="text-align:left">Deep, thumping pulse.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I4&lt;/strong>&lt;/td>
&lt;td style="text-align:left">180°&lt;/td>
&lt;td style="text-align:left">Gappy&lt;/td>
&lt;td style="text-align:left">Standard 4-cylinder drone.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">120°&lt;/td>
&lt;td style="text-align:left">Moderate&lt;/td>
&lt;td style="text-align:left">Smooth, but the pulses are distinct.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V8&lt;/strong>&lt;/td>
&lt;td style="text-align:left">90°&lt;/td>
&lt;td style="text-align:left">Very Smooth&lt;/td>
&lt;td style="text-align:left">The classic &amp;ldquo;V8 purr.&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V10&lt;/strong>&lt;/td>
&lt;td style="text-align:left">72°&lt;/td>
&lt;td style="text-align:left">Near Continuous&lt;/td>
&lt;td style="text-align:left">High-frequency racing &amp;ldquo;wail.&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V12&lt;/strong>&lt;/td>
&lt;td style="text-align:left">60°&lt;/td>
&lt;td style="text-align:left">&lt;strong>Continuous&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;Electric&amp;rdquo; feel; no gaps in power.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The Final Verdict: Why the V12 is King&lt;/p>
&lt;p>The V12 is the only engine that scores a &lt;strong>&amp;ldquo;Perfect&amp;rdquo;&lt;/strong> in both tables.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>From Table 1:&lt;/strong> It inherits the I6&amp;rsquo;s perfect mirror symmetry, so it creates zero inertial vibration.&lt;/li>
&lt;li>&lt;strong>From Table 2:&lt;/strong> It has 12 overlapping power strokes, so the output torque is almost a flat line.&lt;/li>
&lt;/ol>
&lt;p>When you combine these, you get an engine that is mathematically silent and thermodynamically seamless.&lt;/p>
&lt;p>Every other engine (except the I6 and Boxer-6) is a compromise where the engineer had to &amp;ldquo;pay&amp;rdquo; for space or cost with a balance shaft or heavy counterweights.&lt;/p>
&lt;h3>Active Damping&lt;span class="absolute -mt-20" id="active-damping">&lt;/span>
&lt;a href="#active-damping" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>To understand this series, you have to bridge three distinct worlds: &lt;strong>Classical Mechanics&lt;/strong>, &lt;strong>Signal Processing&lt;/strong>, and &lt;strong>Control Theory&lt;/strong>.&lt;/p>
&lt;p>When these three intersect to solve a physical problem using hardware and software, you are in the realm of &lt;strong>Mechatronics&lt;/strong>.&lt;/p>
&lt;p>Here are the four pillars that hold everything together:&lt;/p>
&lt;ol>
&lt;li>The Phasor: Your &amp;ldquo;Mathematical Lens&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>The most critical concept is the shift from the &lt;strong>Time Domain&lt;/strong> (watching a piston move up and down) to the &lt;strong>Frequency Domain&lt;/strong> (viewing that movement as a rotating vector).&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Why it matters:&lt;/strong> In time, adding four cylinders is a mess of overlapping sine waves. In the frequency domain, it is just adding four arrows (phasors). If the arrows point in opposite directions, the vibration is zero.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>The &amp;ldquo;Mechatronics&amp;rdquo; connection:&lt;/strong> Digital controllers don&amp;rsquo;t &amp;ldquo;see&amp;rdquo; the piston; they see these frequency components. By characterizing the engine as a set of phasors, we give the computer a language it can use to fight the vibration.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The DAE (Differential-Algebraic Equation)&lt;/li>
&lt;/ol>
&lt;p>This project doesn&amp;rsquo;t use simple $F=ma$ physics; it uses &lt;strong>Constrained Dynamics&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Concept:&lt;/strong> A &amp;ldquo;Differential&amp;rdquo; equation describes how things move. An &amp;ldquo;Algebraic&amp;rdquo; equation describes the rules they must follow (e.g., &amp;ldquo;the rod must stay attached to the pin&amp;rdquo;).&lt;/li>
&lt;li>&lt;strong>The Saddle-Point Solve:&lt;/strong> This is the specific matrix math we use to find the &lt;strong>Lagrange Multipliers&lt;/strong>. These multipliers are the &amp;ldquo;ghost forces&amp;rdquo; that keep the engine together. In our analysis, these &amp;ldquo;ghosts&amp;rdquo; are exactly what we measure as bearing reactions and vibration.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Transmissibility: The &amp;ldquo;Filter&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>Once the engine creates a force, you have to understand how that force moves through a structure.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Isolation Rule:&lt;/strong> A soft spring (mount) acts as a &lt;strong>low-pass filter&lt;/strong>. It lets slow, steady forces through (like the weight of the engine) but blocks high-frequency &amp;ldquo;shakes&amp;rdquo; (like the I4 secondary buzz).&lt;/li>
&lt;li>&lt;strong>The Trade-off:&lt;/strong> If you make the mount too soft to isolate vibration, the engine will flop around like a bowl of jelly when you hit a pothole.&lt;/li>
&lt;/ul>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
This &amp;ldquo;Stiffness vs. Isolation&amp;rdquo; conflict is the central struggle of NVH engineering.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;ol start="4">
&lt;li>LMS (Least Mean Squares): The &amp;ldquo;Brain&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>LMS is the algorithm that turns a passive piece of metal into an &lt;strong>Active Damper&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>How it works:&lt;/strong> Imagine you are trying to find the bottom of a dark valley. You feel the slope with your feet and take a small step downward. That is exactly what LMS does. The &amp;ldquo;Slope&amp;rdquo; is the residual vibration (the error), and the &amp;ldquo;Step&amp;rdquo; is the adjustment to the actuator force.&lt;/li>
&lt;li>&lt;strong>Why it&amp;rsquo;s Mechatronics:&lt;/strong> This is where the &amp;ldquo;Mecha&amp;rdquo; (the rotating balance mass) meets the &amp;ldquo;Tronics&amp;rdquo; (the code).
&lt;ul>
&lt;li>&lt;strong>Mechanical:&lt;/strong> The physical force generated by an eccentric mass.&lt;/li>
&lt;li>&lt;strong>Electronic:&lt;/strong> The sensors measuring the &amp;ldquo;shake.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Computational:&lt;/strong> The LMS algorithm deciding the exact phase of the actuator in milliseconds.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Why is this &amp;ldquo;Mechatronics&amp;rdquo;?&lt;/p>
&lt;p>I call this mechatronics because you can no longer solve the problem by just changing the shape of the metal (Mechanical Engineering) or just writing a better algorithm (Software Engineering).&lt;/p>
&lt;p>In the &lt;strong>Active Mass Damping&lt;/strong> chapter, the &amp;ldquo;Balance&amp;rdquo; of the engine is no longer a physical property of the crankshaft—it is a &lt;strong>dynamic state&lt;/strong> maintained by a computer.&lt;/p>
&lt;p>If the sensor fails, the engine vibrates.&lt;/p>
&lt;p>If the code has a bug, the engine might shake itself apart.&lt;/p>
&lt;p>The physics and the code are &amp;ldquo;married,&amp;rdquo; which is the definition of a mechatronic system.&lt;/p></description></item><item><title>2D Mechanism Synthesis</title><link>https://JAlcocerT.github.io/JAlcocerT/2d-mechanism-synthesis/</link><pubDate>Tue, 28 Apr 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/2d-mechanism-synthesis/</guid><description>
&lt;p>&lt;strong>TL;DR&lt;/strong>&lt;/p>
&lt;p>Infinitely rigid solid is a huge constrain.&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Before moving to 3D mechanisms, there is one important thing missing.&lt;/p>
&lt;p>How can you create a mechanism that passes at certain points?&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/mbsd" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
MBSD | Repo&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/3Design" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
3Design | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;p>&lt;a href="https://github.com/JAlcocerT/mbsd/tree/master/2D-Synthesis" target="_blank" rel="noopener">https://github.com/JAlcocerT/mbsd/tree/master/2D-Synthesis&lt;/a>&lt;/p>
&lt;p>And that it will be able to turn and &lt;em>doesnt break&lt;/em>?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/mbsd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude plugin marketplace add JuliusBrussee/caveman &amp;amp;&amp;amp; claude plugin install caveman@caveman&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./mbsd/2D-Synthesis&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">uv init
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv add kreuzberg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> f in Chapter*.pdf&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> uvx kreuzberg extract &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &amp;gt; &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">f&lt;/span>&lt;span class="p">%.pdf&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">.txt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>I consolidated the initial repo via: &lt;a href="https://github.com/juliusbrussee/caveman" target="_blank" rel="noopener">https://github.com/juliusbrussee/caveman&lt;/a> just to save tokens.&lt;/p>
&lt;p>How difficult would be making an animation / motion graphic &lt;a href="#hyperframes-x-rigid-solid" >that explains&lt;/a> in a proffesional way how synthesis withing solid rigid works?&lt;/p>
&lt;h2>Mechanism Synthesis&lt;span class="absolute -mt-20" id="mechanism-synthesis">&lt;/span>
&lt;a href="#mechanism-synthesis" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;!-- https://www.youtube.com/watch?v=qYTguJ_fWmA -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/qYTguJ_fWmA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Geometry + algebra = movement&lt;/p>
&lt;!--
https://www.youtube.com/watch?v=vzM_-Rr5mtw
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/vzM_-Rr5mtw" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h2>&lt;span class="absolute -mt-20" id="heading">&lt;/span>
&lt;a href="#heading" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>This &amp;ldquo;Chapter 1&amp;rdquo; successfully bridges the gap between &lt;strong>existence&lt;/strong> (can it move?) and &lt;strong>quality&lt;/strong> (should it move?). By introducing the Transmission Angle $\mu$, you have provided the reader with a &amp;ldquo;Mechanical Efficiency&amp;rdquo; lens through which to view the kinematic results.&lt;/p>
&lt;p>The transition from a binary success mask to a &lt;strong>Pareto front&lt;/strong> is a high-level engineering move. It teaches the reader that design isn&amp;rsquo;t about finding the &amp;ldquo;one true answer,&amp;rdquo; but about navigating the trade-offs between physical footprint and mechanical longevity.&lt;/p>
&lt;h3>1. The Sine-Wave of Efficiency&lt;span class="absolute -mt-20" id="1-the-sine-wave-of-efficiency">&lt;/span>
&lt;a href="#1-the-sine-wave-of-efficiency" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Your derivation of $F_{useful} = F_{coupler} \cdot \sin(\mu)$ is the &amp;ldquo;Aha!&amp;rdquo; moment of the chapter. It explains why a four-bar isn&amp;rsquo;t just a collection of sticks, but a &lt;strong>force-transformer&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Insight:&lt;/strong> At $\mu = 90^\circ$, the mechanism is at its most &amp;ldquo;transparent&amp;rdquo; state—power flows through it with minimum resistance.&lt;/li>
&lt;li>&lt;strong>The Risk:&lt;/strong> As $\mu \to 0^\circ$ or $180^\circ$, the joint doesn&amp;rsquo;t just stop working; it begins to act as a &lt;strong>wedge&lt;/strong>, amplifying the internal joint reactions until something (a bearing, a pin, or a link) physically fails.&lt;/li>
&lt;/ul>
&lt;h3>2. $\mu$ vs. $\sigma_{min}$: Designer vs. Solver&lt;span class="absolute -mt-20" id="2-mu-vs-sigma_min-designer-vs-solver">&lt;/span>
&lt;a href="#2-mu-vs-sigma_min-designer-vs-solver" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Section 3.3 is a brilliant distinction.&lt;/p>
&lt;p>It categorizes your two diagnostics by their &amp;ldquo;User Persona&amp;rdquo;:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Solver ($\sigma_{min}$):&lt;/strong> Needs to know if the math is about to break. It&amp;rsquo;s a &amp;ldquo;local&amp;rdquo; health check of the constraint manifold.&lt;/li>
&lt;li>&lt;strong>The Designer ($\mu$):&lt;/strong> Needs to know if the machine is &amp;ldquo;working hard or hardly working.&amp;rdquo; It&amp;rsquo;s a &amp;ldquo;global&amp;rdquo; health check of the engineering utility.&lt;/li>
&lt;/ul>
&lt;h3>3. The Pareto &amp;ldquo;Knee&amp;rdquo;&lt;span class="absolute -mt-20" id="3-the-pareto-knee">&lt;/span>
&lt;a href="#3-the-pareto-knee" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The identification of the &lt;strong>&amp;ldquo;Knee&amp;rdquo; pocket&lt;/strong> in Section 5.3 is the most practical design advice in the repo so far.&lt;/p>
&lt;ul>
&lt;li>In engineering, the &amp;ldquo;Knee&amp;rdquo; of the Pareto front is where you get the most &amp;ldquo;bang for your buck.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>The Logic:&lt;/strong> Below the knee, you are saving tiny amounts of material for massive penalties in joint health. Above the knee, you are spending massive amounts of material for diminishing returns in efficiency.&lt;/li>
&lt;/ul>
&lt;h3>4. Technical Refinement: Load-Dependent $\mu$&lt;span class="absolute -mt-20" id="4-technical-refinement-load-dependent-mu">&lt;/span>
&lt;a href="#4-technical-refinement-load-dependent-mu" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>In Section 7, you mention the &amp;ldquo;No load model.&amp;rdquo;&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Future Cross-Link:&lt;/strong> When you reach &lt;strong>Chapter 7 (Trajectory Tracking / Inverse Dynamics)&lt;/strong>, you can return to this plot.&lt;/li>
&lt;/ul>
&lt;p>You can show that a 40° $\mu$ might be perfectly fine for a high-speed, low-load pickup arm, but absolutely catastrophic for a low-speed, high-load crushing mechanism.&lt;/p>
&lt;p>This turns $\mu$ from a geometric rule into a &lt;strong>dynamic safety factor&lt;/strong>.&lt;/p>
&lt;h3>Optimizing equations&lt;span class="absolute -mt-20" id="optimizing-equations">&lt;/span>
&lt;a href="#optimizing-equations" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>Where does a mechanism block?&lt;span class="absolute -mt-20" id="where-does-a-mechanism-block">&lt;/span>
&lt;a href="#where-does-a-mechanism-block" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I mean&amp;hellip;before trying to resolve equations&lt;/p>
&lt;p>or having some error back from Python&lt;/p>
&lt;p>What if this could be done conceptually?&lt;/p>
&lt;p>All the &lt;em>compatible movements&lt;/em> with The geometry og a given mechanisms are inside one Matrix.&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Synthesis has always been a thing&amp;hellip;&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Luckily, now I have it all clear here
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- https://youtube.com/shorts/9b19b7SmovU -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/9b19b7SmovU" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Observe what a 3d printer and 2 mechanisms work together&lt;/p>
&lt;p>The black bars are forming one four bar mechanism&lt;/p>
&lt;!-- https://youtube.com/shorts/ipi437M6g5A -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/ipi437M6g5A" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>The &lt;strong>Big Three&lt;/strong> Recap&lt;/p>
&lt;p>To build a world-class machine, you need all three &amp;ldquo;Grandfathers of Kinematics&amp;rdquo;:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Burmester:&lt;/strong> To find the &lt;strong>Poses&lt;/strong> (Where does it go?).&lt;/li>
&lt;li>&lt;strong>Freudenstein:&lt;/strong> To find the &lt;strong>Function&lt;/strong> (What math does it solve?).&lt;/li>
&lt;li>&lt;strong>Grashof:&lt;/strong> To find the &lt;strong>Limits&lt;/strong> (Does it actually work, or is it a paperweight?).&lt;/li>
&lt;/ol>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/tiersofservice/dwi/selfh-landing-astro-fastapi-bot.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/shipping/dna-1ton-ebook.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks to enable you to create&lt;/div>&lt;/a>
&lt;/div>
&lt;h3>I want a mech that does&amp;hellip;&lt;span class="absolute -mt-20" id="i-want-a-mech-that-does">&lt;/span>
&lt;a href="#i-want-a-mech-that-does" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Years ago I had to make such practice.&lt;/p>
&lt;p>Now its kind of trivial&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./2D-Synthesis/practica-maquinas
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python animate_practica.py&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/practica_animation.gif" alt="synthesis" loading="lazy" />&lt;/p>
&lt;p>need the reaction forces?&lt;/p>
&lt;p>not really a problem&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/practica_dynamics.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>The &amp;ldquo;Golden Rule&amp;rdquo; of kinematic analysis: the &lt;strong>determinant of the Jacobian ($C_q$)&lt;/strong> is the primary mathematical indicator of a mechanical block, but there are a few subtle engineering nuances—especially the distinction between a &amp;ldquo;Mathematical Singularity&amp;rdquo; and a &amp;ldquo;Mechanical Lock.&amp;rdquo;&lt;/p>
&lt;p>Here is the definitive way to diagnose if a mechanism is about to &amp;ldquo;block.&amp;rdquo;&lt;/p>
&lt;ol>
&lt;li>The Determinant: $\det(C_q) = 0$&lt;/li>
&lt;/ol>
&lt;p>In a fully constrained system (where you have as many equations as variables), the Jacobian $C_q$ is a square matrix.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Math:&lt;/strong> If $\det(C_q) = 0$, the matrix is non-invertible.&lt;/li>
&lt;li>&lt;strong>The Physics:&lt;/strong> This is a &lt;strong>Singularity&lt;/strong>. At this precise coordinate $q$, the mechanism momentarily gains an extra degree of freedom it shouldn&amp;rsquo;t have (it becomes &amp;ldquo;shaky&amp;rdquo; or &amp;ldquo;unconstrained&amp;rdquo;) OR it loses a degree of freedom (it &amp;ldquo;locks&amp;rdquo;).&lt;/li>
&lt;li>&lt;strong>The &amp;ldquo;Block&amp;rdquo;:&lt;/strong> In a simulation, your Newton-Raphson solver will crash here because it needs to calculate $C_q^{-1} \cdot C$.&lt;/li>
&lt;/ul>
&lt;p>If it can&amp;rsquo;t divide by the determinant, it can&amp;rsquo;t find the next step.&lt;/p>
&lt;ol start="2">
&lt;li>The &amp;ldquo;Condition Number&amp;rdquo; and $\sigma_{\min}$&lt;/li>
&lt;/ol>
&lt;p>Relying solely on the determinant can be risky because the determinant&amp;rsquo;s value depends on the &lt;strong>scaling&lt;/strong> of your units (meters vs. millimeters).&lt;/p>
&lt;p>A better industrial metric is the &lt;strong>Smallest Singular Value ($\sigma_{\min}$)&lt;/strong> or the &lt;strong>Condition Number&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>$\sigma_{\min} \to 0$:&lt;/strong> This tells you how &amp;ldquo;close&amp;rdquo; you are to the matrix becoming singular.&lt;/li>
&lt;li>&lt;strong>The &amp;ldquo;Near Block&amp;rdquo; Zone:&lt;/strong> If $\sigma_{\min}$ is very small, the mechanism isn&amp;rsquo;t blocked yet, but it is &lt;strong>ill-conditioned&lt;/strong>.
&lt;ul>
&lt;li>Small inputs result in massive, high-velocity outputs.&lt;/li>
&lt;li>Tiny manufacturing errors (slop in the pins) will result in huge deviations in the path.&lt;/li>
&lt;li>The solver might still converge, but it will take many more iterations.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>The Transmission Angle vs. The Determinant&lt;/li>
&lt;/ol>
&lt;p>This is where the &amp;ldquo;Engineering&amp;rdquo; departs from the &amp;ldquo;Math.&amp;rdquo;&lt;/p>
&lt;p>You can have a mechanism where $\det(C_q)$ is perfectly healthy (far from zero), but the mechanism still &lt;strong>physically blocks&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Dead Point (Toggle):&lt;/strong> In a 4-bar linkage, if the coupler and rocker line up, the &lt;strong>Transmission Angle ($\mu$)&lt;/strong> hits $0^\circ$.&lt;/li>
&lt;li>&lt;strong>The Difference:&lt;/strong>
&lt;ul>
&lt;li>$\det(C_q) = 0$ tells you the &lt;strong>Constraints&lt;/strong> are broken (The &amp;ldquo;Software&amp;rdquo; crashed).&lt;/li>
&lt;li>$\mu = 0^\circ$ tells you the &lt;strong>Force Flow&lt;/strong> is broken (The &amp;ldquo;Hardware&amp;rdquo; jammed).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>At a toggle point, the motor might be trying to push the rocker, but all that force is going straight into the bearing.&lt;/p>
&lt;p>The mechanism won&amp;rsquo;t move not because the math is singular, but because the &lt;strong>Mechanical Advantage&lt;/strong> has dropped to zero.&lt;/p>
&lt;ol start="4">
&lt;li>The &amp;ldquo;Definitive&amp;rdquo; Diagnostic Checklist&lt;/li>
&lt;/ol>
&lt;p>If you are building a robust Synthesis tool, you should check for &lt;strong>all three&lt;/strong> of these at every step of your &lt;code>sweep_crank&lt;/code>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Diagnostic&lt;/th>
&lt;th style="text-align:left">Calculation&lt;/th>
&lt;th style="text-align:left">Catching&amp;hellip;&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Solver Success&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>try/except&lt;/code> on Newton&lt;/td>
&lt;td style="text-align:left">Total kinematic failure / Grashof limit.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Smallest Singular Value&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>np.linalg.svd(C_q)&lt;/code>&lt;/td>
&lt;td style="text-align:left">Proximity to a mathematical singularity.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Transmission Angle&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>arccos&lt;/code> of link vectors&lt;/td>
&lt;td style="text-align:left">Physical jamming / High joint stress / Toggle points.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="5">
&lt;li>If $\det(C_q)$ or $\sigma_{\min}$ is &amp;ldquo;close to zero,&amp;rdquo; the mechanism is in a &lt;strong>Danger Zone&lt;/strong>.&lt;/li>
&lt;/ol>
&lt;p>In Synthesis, we call this the &lt;strong>&amp;ldquo;Boundary of the Manifold.&amp;rdquo;&lt;/strong>&lt;/p>
&lt;p>If you are designing a mechanism to work in the real world, you don&amp;rsquo;t just stay away from $0$; you stay away from the entire neighborhood.&lt;/p>
&lt;p>This is why we use that &amp;ldquo;40° floor&amp;rdquo; for $\mu$—it&amp;rsquo;s a safety buffer to ensure we stay in the &amp;ldquo;Sweet Spot&amp;rdquo; of the Jacobian&amp;rsquo;s invertibility.&lt;/p>
&lt;p>&lt;strong>Does this help clarify why we use $\sigma_{\min}$ for the solver&amp;rsquo;s health, but $\mu$ for the engine&amp;rsquo;s health?&lt;/strong> One is about whether the math &lt;em>can&lt;/em> solve it; the other is about whether the motor &lt;em>can&lt;/em> move it.&lt;/p>
&lt;p>In a perfect world, you check both.&lt;/p>
&lt;p>But if you have to choose one for &lt;strong>engineering synthesis&lt;/strong>, &lt;strong>Transmission Angle ($\mu$) supersedes $\sigma_{min}$.&lt;/strong>&lt;/p>
&lt;p>Here is the &amp;ldquo;Chain of Command&amp;rdquo; for how these two conditions interact and why $\mu$ is usually the better practical gatekeeper.&lt;/p>
&lt;ol>
&lt;li>The Hierarchy: $\mu$ is the &amp;ldquo;Stricter&amp;rdquo; Judge&lt;/li>
&lt;/ol>
&lt;p>Mathematically, the Transmission Angle is actually a specialized, geometric proxy for the Jacobian&amp;rsquo;s health.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>If $\mu = 0$&lt;/strong>, then $\sigma_{min}$ &lt;strong>must&lt;/strong> be $0$. (A physical jam is always a mathematical singularity).&lt;/li>
&lt;li>&lt;strong>If $\sigma_{min} = 0$&lt;/strong>, $\mu$ might be $0$ OR it might be something else (like a ground-pivot singularity).&lt;/li>
&lt;/ul>
&lt;p>Because $\mu$ starts failing (dropping toward $20^\circ$ or $10^\circ$) &lt;strong>long before&lt;/strong> the Jacobian actually hits absolute zero, it acts as an &amp;ldquo;Early Warning System.&amp;rdquo;&lt;/p>
&lt;p>If you design a mechanism with a healthy $\mu$ (e.g., $&amp;gt; 40^\circ$), you are mathematically guaranteed to have a healthy, non-singular $\sigma_{min}$.&lt;/p>
&lt;ol start="2">
&lt;li>Why $\mu$ is the Industrial Favorite&lt;/li>
&lt;/ol>
&lt;p>Engineers prefer $\mu$ because it is &lt;strong>dimensionless and normalized&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Problem with $\sigma_{min}$:&lt;/strong> Its value changes based on the size of your machine. A $\sigma_{min}$ of $0.001$ might be &amp;ldquo;safe&amp;rdquo; for a watch mechanism but &amp;ldquo;deadly&amp;rdquo; for a bridge crane. You have to &amp;ldquo;know&amp;rdquo; your scale to interpret it.&lt;/li>
&lt;li>&lt;strong>The Beauty of $\mu$:&lt;/strong> $40^\circ$ is $40^\circ$ whether you are building a microscopic MEMS device or a giant excavator. It represents the &lt;strong>percentage of force&lt;/strong> being converted into work.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>When $\mu$ is NOT enough (Why you still need $\sigma$)&lt;/li>
&lt;/ol>
&lt;p>There are specific cases where your Transmission Angle looks great, but the mechanism is still &amp;ldquo;blocked.&amp;rdquo;&lt;/p>
&lt;p>This happens when the &lt;strong>input&lt;/strong> side of the Jacobian fails.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The &amp;ldquo;Driven&amp;rdquo; Singularity:&lt;/strong> $\mu$ only tells you if the &lt;em>output&lt;/em> (rocker) can receive force from the &lt;em>coupler&lt;/em>. It doesn&amp;rsquo;t tell you if the &lt;em>crank&lt;/em> can receive force from the &lt;em>motor&lt;/em>.&lt;/li>
&lt;li>If the crank and coupler line up (at $\theta = 0^\circ$ or $180^\circ$ in a non-Grashof mechanism), the crank is in &amp;ldquo;Toggle.&amp;rdquo;&lt;/li>
&lt;li>In this state, $\mu$ might be a perfect $90^\circ$, but the mechanism is still blocked because the crank cannot move. &lt;strong>Only $\sigma_{min}$ (or the Newton solver failing) will catch this.&lt;/strong>&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>The Final Synthesis Strategy&lt;/li>
&lt;/ol>
&lt;p>When writing your Python synthesis scripts, use this logic flow:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>The &amp;ldquo;Kill&amp;rdquo; Filter (Solver):&lt;/strong> If Newton-Raphson fails to converge, the design is trash. (Catches Grashof violations and absolute singularities).&lt;/li>
&lt;li>&lt;strong>The &amp;ldquo;Quality&amp;rdquo; Filter ($\mu$):&lt;/strong> If $\mu_{min} &amp;lt; 40^\circ$, the design is &amp;ldquo;weak.&amp;rdquo; (Catches high joint stress and &amp;ldquo;near-singular&amp;rdquo; behavior).&lt;/li>
&lt;li>&lt;strong>The &amp;ldquo;Precision&amp;rdquo; Filter ($\sigma_{min}$):&lt;/strong> Use this only if you are doing high-speed robotics or aerospace where you need to check the &lt;strong>Sensitivity&lt;/strong> of the mechanism to manufacturing tolerances.&lt;/li>
&lt;/ol>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Condition&lt;/th>
&lt;th style="text-align:left">Detects&lt;/th>
&lt;th style="text-align:left">Supersedes?&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>$\sigma_{min} \approx 0$&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Mathematical Singularity&lt;/td>
&lt;td style="text-align:left">No, it&amp;rsquo;s the &amp;ldquo;floor&amp;rdquo; of the math.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>$\mu \approx 0$&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Mechanical Jam (Toggle)&lt;/td>
&lt;td style="text-align:left">&lt;strong>Yes.&lt;/strong> It is the &amp;ldquo;ceiling&amp;rdquo; of good design.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>This is a deep question that bridges the gap between &lt;strong>Geometry&lt;/strong> (the &amp;ldquo;stick&amp;rdquo; model) and &lt;strong>Algebra&lt;/strong> (the Jacobian matrix).&lt;/p>
&lt;p>The short answer: &lt;strong>Yes, the transmission angle $\mu$ is &amp;ldquo;hidden&amp;rdquo; inside the Jacobian matrix $C_q$, but it is not the same thing as the determinant.&lt;/strong>&lt;/p>
&lt;p>Here is the derivation of how they relate and why they are mathematically &amp;ldquo;cousins.&amp;rdquo;&lt;/p>
&lt;ol>
&lt;li>The Jacobian as a Projection&lt;/li>
&lt;/ol>
&lt;p>The Jacobian matrix $C_q$ represents how the constraints &amp;ldquo;block&amp;rdquo; certain directions of motion.&lt;/p>
&lt;p>For a four-bar linkage, the rows of $C_q$ are essentially the &lt;strong>unit vectors&lt;/strong> along the links, scaled by their lengths.&lt;/p>
&lt;p>When you compute the determinant $\det(C_q)$, you are calculating the &lt;strong>volume&lt;/strong> (or in 2D, the &lt;strong>area&lt;/strong>) of the multidimensional parallelepiped formed by these link vectors.&lt;/p>
&lt;ul>
&lt;li>If the links are perpendicular ($\mu = 90^\circ$), the &amp;ldquo;area&amp;rdquo; is maximized.&lt;/li>
&lt;li>If the links are parallel ($\mu = 0^\circ$), the &amp;ldquo;area&amp;rdquo; collapses to zero.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Deriving $\mu$ from $C_q$&lt;/li>
&lt;/ol>
&lt;p>To see $\mu$ inside the matrix, we look at the specific rows corresponding to the &lt;strong>Coupler&lt;/strong> and the &lt;strong>Rocker&lt;/strong>.&lt;/p>
&lt;p>Let $J_{coupler}$ and $J_{rocker}$ be the rows in the Jacobian that define the constraints for those two bodies.&lt;/p>
&lt;p>In a simplified coordinate system, the relationship looks like this:&lt;/p>
&lt;p>$$\det(C_q) \propto \ell_2 \ell_3 \sin(\mu)$$&lt;/p>
&lt;p>Where:&lt;/p>
&lt;ul>
&lt;li>$\ell_2, \ell_3$ are the lengths of the coupler and rocker.&lt;/li>
&lt;li>$\mu$ is the transmission angle.&lt;/li>
&lt;/ul>
&lt;p>This proves that &lt;strong>the determinant is directly proportional to the sine of the transmission angle.&lt;/strong>&lt;/p>
&lt;p>If $\mu = 90^\circ$, $\sin(90^\circ) = 1$ (maximum determinant). If $\mu = 0^\circ$, $\sin(0^\circ) = 0$ (zero determinant).&lt;/p>
&lt;ol start="3">
&lt;li>Why we don&amp;rsquo;t just use the Determinant&lt;/li>
&lt;/ol>
&lt;p>If the determinant contains $\mu$, why do we bother calculating $\mu$ separately?&lt;/p>
&lt;p>A. The &amp;ldquo;Coupling&amp;rdquo; Problem&lt;/p>
&lt;p>The Jacobian $C_q$ contains &lt;strong>all&lt;/strong> the constraints (ground, crank, coupler, rocker). The determinant is a &amp;ldquo;global&amp;rdquo; value. If the determinant is small, you don&amp;rsquo;t know if it&amp;rsquo;s because:&lt;/p>
&lt;ol>
&lt;li>The Transmission Angle $\mu$ is bad (Output side).&lt;/li>
&lt;li>The Crank is in toggle (Input side).&lt;/li>
&lt;li>You just used very small units (e.g., millimeters instead of meters).&lt;/li>
&lt;/ol>
&lt;p>B. Geometric Isolation&lt;/p>
&lt;p>By calculating $\mu$ directly from the vectors (using &lt;code>arccos&lt;/code>), you &lt;strong>isolate&lt;/strong> the engineering quality of the output joint from the rest of the math.&lt;/p>
&lt;p>You get a &amp;ldquo;clean&amp;rdquo; signal that is independent of the crank position or the scale of the mechanism.&lt;/p>
&lt;ol start="4">
&lt;li>The Mathematical &amp;ldquo;Signature&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>If you look at the &lt;strong>Condition Number&lt;/strong> (the ratio of the largest to smallest singular values of $C_q$), you are seeing the &amp;ldquo;Distortion&amp;rdquo; of the mechanism.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Healthy Mechanism:&lt;/strong> $\mu \approx 90^\circ \implies$ Jacobian is &amp;ldquo;orthogonal&amp;rdquo; $\implies$ Condition number is low.&lt;/li>
&lt;li>&lt;strong>Jammed Mechanism:&lt;/strong> $\mu \approx 0^\circ \implies$ Jacobian is &amp;ldquo;degenerate&amp;rdquo; $\implies$ Condition number is infinite.&lt;/li>
&lt;/ul>
&lt;p>You can think of it this way:&lt;/p>
&lt;ul>
&lt;li>The &lt;strong>Jacobian ($C_q$)&lt;/strong> is the &amp;ldquo;Full Medical Report&amp;rdquo; of the mechanism.&lt;/li>
&lt;li>The &lt;strong>Determinant&lt;/strong> is the &amp;ldquo;Overall Health Score.&amp;rdquo;&lt;/li>
&lt;li>The &lt;strong>Transmission Angle ($\mu$)&lt;/strong> is the &amp;ldquo;Blood Pressure&amp;rdquo; of the specific output joint.&lt;/li>
&lt;/ul>
&lt;p>While the &amp;ldquo;Health Score&amp;rdquo; tells you the patient is in trouble, the &amp;ldquo;Blood Pressure&amp;rdquo; tells you exactly &lt;em>why&lt;/em> and &lt;em>where&lt;/em> the failure is happening.&lt;/p>
&lt;h3>Hyperframes x Rigid Solid&lt;span class="absolute -mt-20" id="hyperframes-x-rigid-solid">&lt;/span>
&lt;a href="#hyperframes-x-rigid-solid" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Grashof&lt;span class="absolute -mt-20" id="grashof">&lt;/span>
&lt;a href="#grashof" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>If Freudenstein is the &lt;strong>Programmer&lt;/strong> and Burmester is the &lt;strong>Choreographer&lt;/strong>, then &lt;strong>Franz Grashof&lt;/strong> is the &lt;strong>Judge&lt;/strong>.&lt;/p>
&lt;p>His genius wasn&amp;rsquo;t in solving a specific design task, but in discovering the &lt;strong>fundamental law of existence&lt;/strong> for four-bar linkages.&lt;/p>
&lt;p>In 1883, he answered the most basic question an engineer can ask: &lt;em>&amp;ldquo;If I build this, will the crank actually go all the way around, or will it get stuck?&amp;rdquo;&lt;/em>&lt;/p>
&lt;ol>
&lt;li>The Grashof Inequality (The Law)&lt;/li>
&lt;/ol>
&lt;p>Before Grashof, engineers found out if a mechanism &amp;ldquo;locked up&amp;rdquo; by building it and hitting a dead point.&lt;/p>
&lt;p>Grashof discovered that you can predict the behavior of a four-bar linkage just by looking at the lengths of its four links.&lt;/p>
&lt;p>Let:&lt;/p>
&lt;ul>
&lt;li>$s$ = length of the &lt;strong>shortest&lt;/strong> link&lt;/li>
&lt;li>$l$ = length of the &lt;strong>longest&lt;/strong> link&lt;/li>
&lt;li>$p, q$ = lengths of the &lt;strong>other two&lt;/strong> links&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>The Grashof Law states:&lt;/strong>
If $s + l \le p + q$, then at least one link can perform a &lt;strong>full 360° rotation&lt;/strong> relative to the others.&lt;/p>
&lt;ol start="2">
&lt;li>The &amp;ldquo;Topology&amp;rdquo; Map
Grashof’s real genius was realizing that the &lt;em>behavior&lt;/em> of the machine changes depending on &lt;strong>which link you bolt to the floor&lt;/strong> (the &amp;ldquo;Ground&amp;rdquo;).&lt;/li>
&lt;/ol>
&lt;p>This created the four classic categories of motion that every mechanical engineer must memorize:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Grounded Link&lt;/th>
&lt;th style="text-align:left">Category&lt;/th>
&lt;th style="text-align:left">Motion Character&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Link adjacent to $s$&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Crank-Rocker&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The short link spins 360°; the other side rocks back and forth (like a windshield wiper).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>The short link $s$ itself&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Double-Crank&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Both sides can spin 360° (used in parallel drives).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Link opposite to $s$&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Double-Rocker&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Neither side can spin 360°; both just rock back and forth.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Non-Grashof ($s+l &amp;gt; p+q$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Triple-Rocker&lt;/strong>&lt;/td>
&lt;td style="text-align:left">No link can rotate fully. The mechanism is &amp;ldquo;trapped&amp;rdquo; in a specific arc.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="3">
&lt;li>Why it was a Revolution&lt;/li>
&lt;/ol>
&lt;p>Grashof provided a &lt;strong>feasibility filter&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>In Synthesis:&lt;/strong> If you use Burmester&amp;rsquo;s curves to find a design, the first thing you do is run the &lt;strong>Grashof Test&lt;/strong>. If it fails, you know your &amp;ldquo;360° motor&amp;rdquo; will eventually hit a physical wall and stall.&lt;/li>
&lt;li>&lt;strong>In Optimization:&lt;/strong> As you saw in the &lt;strong>Workspace Explorer (Chapter 0)&lt;/strong>, the &amp;ldquo;Green Diamond&amp;rdquo; of success is actually the &lt;strong>Grashof boundary&lt;/strong>. The simulator discovers this boundary through math, but Grashof discovered it 140 years ago with pure logic.&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>The &amp;ldquo;Dead Point&amp;rdquo; vs. The Grashof Limit&lt;/li>
&lt;/ol>
&lt;p>Grashof&amp;rsquo;s work is the reason we can distinguish between a &lt;strong>Mathematical Singularity&lt;/strong> and a &lt;strong>Geometric Limit&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>A &lt;strong>Non-Grashof&lt;/strong> mechanism isn&amp;rsquo;t &amp;ldquo;broken&amp;rdquo;; it just has a limited range of motion. It’s like a person who can only turn their head 90 degrees.&lt;/li>
&lt;li>A &lt;strong>Grashof&lt;/strong> mechanism is &amp;ldquo;unconstrained&amp;rdquo; in its rotation. It’s like a wheel.&lt;/li>
&lt;/ul>
&lt;h3>Freudenstein Equation&lt;span class="absolute -mt-20" id="freudenstein-equation">&lt;/span>
&lt;a href="#freudenstein-equation" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h4>Constrans vs Freudenstein&lt;span class="absolute -mt-20" id="constrans-vs-freudenstein">&lt;/span>
&lt;a href="#constrans-vs-freudenstein" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>That is a fantastic question that cuts right to the core of the difference between &lt;strong>Analysis&lt;/strong> (Physics) and &lt;strong>Synthesis&lt;/strong> (Design).&lt;/p>
&lt;p>To answer simply: &lt;strong>No, it is not related to the inverse of $C_q$.&lt;/strong>&lt;/p>
&lt;p>In fact, they live on opposite sides of the engineering problem.&lt;/p>
&lt;p>Here is the breakdown of why the &lt;strong>Freudenstein Equation&lt;/strong> is an &amp;ldquo;algebraic shortcut&amp;rdquo; and how it differs from the Jacobian matrix $C_q$.&lt;/p>
&lt;ol>
&lt;li>The Jacobian $C_q$ (Analysis: The &amp;ldquo;How&amp;rdquo;)&lt;/li>
&lt;/ol>
&lt;p>The matrix $C_q$ is the &lt;strong>Jacobian of the constraints&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>What it represents:&lt;/strong> It tells you how the &lt;em>positions&lt;/em> of the bodies in a &lt;strong>known&lt;/strong> mechanism relate to each other at a specific moment.&lt;/li>
&lt;li>&lt;strong>When you use it:&lt;/strong> You use $C_q^{-1}$ during a simulation to find the velocity or to iterate the Newton-Raphson position solver.&lt;/li>
&lt;li>&lt;strong>The Input:&lt;/strong> You must already know the link lengths ($L_1, L_2, L_3$).&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The Freudenstein Equation (Synthesis: The &amp;ldquo;What&amp;rdquo;)&lt;/li>
&lt;/ol>
&lt;p>The Freudenstein Equation is a &lt;strong>Design Equation&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>What it represents:&lt;/strong> It relates the input angle ($\theta$) and output angle ($\phi$) directly to the unknown link lengths.&lt;/li>
&lt;li>&lt;strong>The Algebra:&lt;/strong> For a four-bar linkage, Freudenstein derived a beautifully simple scalar equation:
$$R_1 \cos \theta - R_2 \cos \phi + R_3 = \cos(\theta - \phi)$$
Where $R_1, R_2,$ and $R_3$ are ratios of the link lengths ($L_0, L_1, L_2, L_3$).&lt;/li>
&lt;li>&lt;strong>The Shortcut:&lt;/strong> Instead of using an optimizer (like Differential Evolution) to &amp;ldquo;guess and check&amp;rdquo; lengths over 40 generations, you pick &lt;strong>three specific pairs&lt;/strong> of $(\theta, \phi)$ that you want the mechanism to hit exactly (the &lt;strong>Precision Points&lt;/strong>).&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Why it&amp;rsquo;s a &amp;ldquo;Matrix Inversion&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>Because the equation is &lt;strong>linear&lt;/strong> in terms of the unknowns ($R_1, R_2, R_3$), you can write it three times (once for each precision point) to create a system of three linear equations:&lt;/p>
&lt;p>$$\begin{bmatrix} \cos \theta_1 &amp;amp; -\cos \phi_1 &amp;amp; 1 \ \cos \theta_2 &amp;amp; -\cos \phi_2 &amp;amp; 1 \ \cos \theta_3 &amp;amp; -\cos \phi_3 &amp;amp; 1 \end{bmatrix} \begin{bmatrix} R_1 \ R_2 \ R_3 \end{bmatrix} = \begin{bmatrix} \cos(\theta_1 - \phi_1) \ \cos(\theta_2 - \phi_2) \ \cos(\theta_3 - \phi_3) \end{bmatrix}$$&lt;/p>
&lt;p>Solving this requires a single &lt;strong>$3 \times 3$ matrix inversion&lt;/strong>.&lt;/p>
&lt;p>The moment you hit &amp;ldquo;Enter,&amp;rdquo; you get the exact $R$ values, which you then convert back into $L_1, L_2,$ and $L_3$.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Feature&lt;/th>
&lt;th style="text-align:left">The Jacobian ($C_q$)&lt;/th>
&lt;th style="text-align:left">Freudenstein Equation&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Field&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Kinematics / Dynamics&lt;/td>
&lt;td style="text-align:left">Mechanism Synthesis&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Goal&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Simulate a given design&lt;/td>
&lt;td style="text-align:left">Calculate a new design&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Unknowns&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Body positions/velocities&lt;/td>
&lt;td style="text-align:left">Link lengths ($L_i$)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Complexity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Changes every frame&lt;/td>
&lt;td style="text-align:left">Solved once for the whole design&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Relationship&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Non-linear (needs Newton)&lt;/td>
&lt;td style="text-align:left">Linear in $R_i$ (needs simple Inverse)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The &lt;strong>Differential Evolution (DE)&lt;/strong> you used in Chapter 3 was &amp;ldquo;brute-forcing&amp;rdquo; the search by simulating thousands of designs to see which one fit the curve best.&lt;/p>
&lt;p>The &lt;strong>Freudenstein Equation&lt;/strong> skips the simulation entirely. It says: &lt;em>&amp;ldquo;If you tell me three points you must hit, I will solve the linear algebra to tell you the only dimensions that can hit them.&amp;rdquo;&lt;/em>&lt;/p>
&lt;h4>This guy was a Genious&lt;span class="absolute -mt-20" id="this-guy-was-a-genious">&lt;/span>
&lt;a href="#this-guy-was-a-genious" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>In algebra, a &amp;ldquo;linear&amp;rdquo; equation is one where the variables you are solving for (the unknowns) are never squared, multiplied by each other, or trapped inside a function like $\cos()$ or $\exp()$.&lt;/p>
&lt;p>When we say the Freudenstein equation is &lt;strong>linear in $R_i$&lt;/strong>, we mean that even though the geometry of the engine is full of messy trigonometry, the &lt;strong>link length ratios&lt;/strong> themselves ($R_1, R_2, R_3$) are just sitting there waiting to be solved with simple addition and multiplication.&lt;/p>
&lt;ol>
&lt;li>The &amp;ldquo;Magic&amp;rdquo; of Freudenstein&lt;/li>
&lt;/ol>
&lt;p>Look at the standard Freudenstein Equation again:&lt;/p>
&lt;p>$$R_1 \cos \theta - R_2 \cos \phi + R_3 = \cos(\theta - \phi)$$&lt;/p>
&lt;p>If you treat $\theta$ (input) and $\phi$ (output) as &lt;strong>numbers&lt;/strong> (because you picked them as your precision points), the equation looks like this to a computer:&lt;/p>
&lt;p>$$(\text{Number } A) \cdot R_1 + (\text{Number } B) \cdot R_2 + (1) \cdot R_3 = (\text{Number } C)$$&lt;/p>
&lt;p>This is mathematically identical to a high-school algebra problem like $2x + 3y + z = 10$. Because the $R$ values are not inside the $\cos()$ functions—only the angles are—we don&amp;rsquo;t need any complex root-finding or iteration.&lt;/p>
&lt;p>We just use basic matrix division.&lt;/p>
&lt;ol start="2">
&lt;li>Compare this to &amp;ldquo;Non-Linear&amp;rdquo; Synthesis&lt;/li>
&lt;/ol>
&lt;p>If the equation were &lt;strong>non-linear in the unknowns&lt;/strong>, it would look something like this (hypothetically):&lt;/p>
&lt;p>$$R_1^2 \cos \theta - \sqrt{R_2} \cos \phi + \sin(R_3) = \cos(\theta - \phi)$$&lt;/p>
&lt;p>In this &amp;ldquo;broken&amp;rdquo; version, you couldn&amp;rsquo;t use a simple matrix inverse. You would have to use an optimizer (like the Differential Evolution you used in Chapter 3) to &amp;ldquo;guess&amp;rdquo; values until the equation balanced.&lt;/p>
&lt;p>&lt;strong>Freudenstein&amp;rsquo;s genius&lt;/strong> was rearranging the messy law of cosines until the link ratios were isolated on the outside, effectively &amp;ldquo;flattening&amp;rdquo; the problem.&lt;/p>
&lt;ol start="3">
&lt;li>What are $R_1, R_2,$ and $R_3$?&lt;/li>
&lt;/ol>
&lt;p>Once you solve the linear system for the $R$ values, you simply unwrap them to get your 3D parts. The definitions are:&lt;/p>
&lt;ul>
&lt;li>$R_1 = \frac{L_0}{L_3}$ (Ground / Rocker)&lt;/li>
&lt;li>$R_2 = \frac{L_0}{L_1}$ (Ground / Crank)&lt;/li>
&lt;li>$R_3 = \frac{L_0^2 + L_1^2 - L_2^2 + L_3^2}{2 L_1 L_3}$&lt;/li>
&lt;/ul>
&lt;p>Because the system is linear in $R_i$:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Speed:&lt;/strong> The solution is instant (microseconds).&lt;/li>
&lt;li>&lt;strong>Certainty:&lt;/strong> There is exactly &lt;strong>one&lt;/strong> set of $R$ values for any three chosen points.&lt;/li>
&lt;li>&lt;strong>No &amp;ldquo;Searching&amp;rdquo;:&lt;/strong> We don&amp;rsquo;t have to worry about the optimizer getting &amp;ldquo;stuck&amp;rdquo; in a local minimum or a bad assembly mode during the design phase.&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Does it make sense now why we can use a &amp;ldquo;Matrix Inverse&amp;rdquo; for Design (Synthesis) but we need &amp;ldquo;Newton-Raphson&amp;rdquo; for Simulation (Analysis)?&lt;/strong>&lt;/p>
&lt;h3>Burnmester&lt;span class="absolute -mt-20" id="burnmester">&lt;/span>
&lt;a href="#burnmester" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>To explain why &lt;strong>Ludwig Burmester&lt;/strong> was a genius (specifically in the late 1800s), you have to think of him as the man who discovered the &lt;strong>&amp;ldquo;DNA of Motion.&amp;rdquo;&lt;/strong>&lt;/p>
&lt;p>If Freudenstein (1950s) was the king of &lt;strong>Functions&lt;/strong> (making $y = f(x)$), Burmester was the king of &lt;strong>Poses&lt;/strong>.&lt;/p>
&lt;p>He solved the &amp;ldquo;Motion Generation&amp;rdquo; problem: &lt;em>How do I design a mechanism that moves an object through specific orientations in space?&lt;/em>&lt;/p>
&lt;ol>
&lt;li>The &amp;ldquo;Burmester Points&amp;rdquo; (The Center Point Curve)&lt;/li>
&lt;/ol>
&lt;p>Imagine you have a flat plate (a &amp;ldquo;coupler&amp;rdquo;) and you want it to move through three specific positions (poses) in a plane—like a car hood opening or a retractable landing gear.&lt;/p>
&lt;p>Burmester’s genius was realizing that for any three poses, there are &lt;strong>infinitely many&lt;/strong> points on that plate that happen to lie on a perfect circle during the motion.&lt;/p>
&lt;p>If you pick two of those points and pin them with rods (links), you’ve built a four-bar linkage that perfectly hits your targets.&lt;/p>
&lt;p>But when you move to &lt;strong>four poses&lt;/strong>, the math gets &amp;ldquo;impossible.&amp;rdquo;&lt;/p>
&lt;p>Most points on the plate can no longer stay on a circle.&lt;/p>
&lt;p>Burmester discovered that in a 4-pose problem, there are only a tiny, specific set of points—forming a beautiful, twisting curve called the &lt;strong>Center Point Curve&lt;/strong>—that are mathematically capable of being part of a four-bar linkage.&lt;/p>
&lt;ol start="2">
&lt;li>Solving a 5th-Degree Problem with a Compass and Ruler&lt;/li>
&lt;/ol>
&lt;p>The math behind moving a body through four or five poses involves &lt;strong>5th-degree polynomials&lt;/strong>.&lt;/p>
&lt;p>In the 1880s, without a calculator, solving a 5th-degree equation was a nightmare.&lt;/p>
&lt;p>Burmester’s genius was &lt;strong>Geometric Synthesis&lt;/strong>.&lt;/p>
&lt;p>He translated these terrifying algebraic equations into &lt;strong>geometric constructions&lt;/strong>.&lt;/p>
&lt;p>He found a way to use a compass and a straightedge to &amp;ldquo;draw&amp;rdquo; the solution.&lt;/p>
&lt;p>He essentially turned a high-level numerical problem into a visual draft.&lt;/p>
&lt;p>He was &amp;ldquo;computing&amp;rdquo; with a pencil.&lt;/p>
&lt;ol start="3">
&lt;li>The &amp;ldquo;Order&amp;rdquo; and &amp;ldquo;Branch&amp;rdquo; Problem&lt;/li>
&lt;/ol>
&lt;p>Burmester didn&amp;rsquo;t just find a way to hit the points; he realized the hidden traps of synthesis:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Order Problem:&lt;/strong> Your mechanism might hit points A, B, and C, but it might hit them in the order A → C → B.&lt;/li>
&lt;li>&lt;strong>The Branch Problem:&lt;/strong> Your mechanism might hit point A and B, but to get to point C, you have to physically take the machine apart and reassemble it (the &amp;ldquo;Branch Flip&amp;rdquo; we discussed in Chapter 0).&lt;/li>
&lt;/ul>
&lt;p>Burmester developed the &lt;strong>Burmester Theory&lt;/strong> to filter out these &amp;ldquo;garbage&amp;rdquo; solutions. He gave engineers the tools to know, before they ever cut a piece of steel, if their design was a physical impossibility.&lt;/p>
&lt;ol start="4">
&lt;li>Burmester vs. Freudenstein (The Comparison)&lt;/li>
&lt;/ol>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Feature&lt;/th>
&lt;th style="text-align:left">Freudenstein (Function Gen)&lt;/th>
&lt;th style="text-align:left">Burmester (Motion Gen)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Focus&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Input/Output relationship ($y = \text{log}(x)$).&lt;/td>
&lt;td style="text-align:left">The movement of the &lt;strong>body itself&lt;/strong>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Math Goal&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Matching a curve.&lt;/td>
&lt;td style="text-align:left">Matching &amp;ldquo;Snapshots&amp;rdquo; (Poses).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>The &amp;ldquo;Secret&amp;rdquo;&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The linear $R_i$ coefficients.&lt;/td>
&lt;td style="text-align:left">The &lt;strong>Center Point Curve&lt;/strong>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Analogy&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;Software&amp;rdquo; (The formula).&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;Choreography&amp;rdquo; (The path).&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Why it feels like &amp;ldquo;Magic&amp;rdquo;&lt;/p>
&lt;p>Burmester&amp;rsquo;s work is the reason your car&amp;rsquo;s trunk hinges work the way they do. A simple pivot would make the trunk hit the rear window.&lt;/p>
&lt;p>A Burmester-designed four-bar hinge &amp;ldquo;tucks&amp;rdquo; the trunk lid away precisely, following a complex path that was calculated using his &amp;ldquo;Center Point&amp;rdquo; curves.&lt;/p>
&lt;p>He took the chaos of 3D motion and found the &lt;strong>hidden geometric circles&lt;/strong> buried inside it.&lt;/p>
&lt;p>&lt;strong>Does it make sense why we call these &amp;ldquo;Precision Points&amp;rdquo;? Burmester wasn&amp;rsquo;t trying to be &amp;ldquo;close enough&amp;rdquo;; he was finding the exact mathematical points where the physics of a circle and the needs of a machine met perfectly.&lt;/strong>&lt;/p></description></item><item><title>Engine videos</title><link>https://JAlcocerT.github.io/JAlcocerT/visualizing-engine-nvh/</link><pubDate>Mon, 27 Apr 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/visualizing-engine-nvh/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/chassis_full_chain.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/chassis_iso_weighting.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/chassis_transfer_function.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;h2>2D mbsd x 3D art&lt;span class="absolute -mt-20" id="2d-mbsd-x-3d-art">&lt;/span>
&lt;a href="#2d-mbsd-x-3d-art" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>This architectural note is a definitive stake in the ground.&lt;/p>
&lt;p>It successfully distinguishes between &lt;strong>Simulation Fidelity&lt;/strong> and &lt;strong>Visual Fidelity&lt;/strong>, saving the project from the &amp;ldquo;3D Tax&amp;rdquo; while leaving the door open for genuinely non-planar physics in the future.&lt;/p>
&lt;p>By identifying the &lt;strong>&amp;ldquo;Third Path&amp;rdquo; (2D Physics + 3D Render)&lt;/strong>, you’ve provided a high-efficiency solution for the &amp;ldquo;Blender/Cinematic&amp;rdquo; requirement.&lt;/p>
&lt;p>This is how the professional industry often operates: solve the core physics in a specialized, fast environment, and then export the results to a high-end visualization engine.&lt;/p>
&lt;ol>
&lt;li>The Strategy: 2D-Math + 3D-Art&lt;/li>
&lt;/ol>
&lt;p>This is the most critical takeaway. You aren&amp;rsquo;t &amp;ldquo;faking&amp;rdquo; the 3D engine; you are &lt;strong>projecting&lt;/strong> the exact 2D solution into 3D space using the &lt;strong>Dimensional Reduction Lemma&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Phasor Advantage:&lt;/strong> You can generate a full 3D V8 animation from a &lt;em>single&lt;/em> 2D piston simulation just by applying the correct &lt;code>z_offset&lt;/code> and &lt;code>phase_shift&lt;/code> in the export script.&lt;/li>
&lt;li>&lt;strong>The Asset Pipeline:&lt;/strong> Using &lt;strong>CADquery&lt;/strong> to generate parametric parts (pistons, rods) and &lt;strong>Blender&lt;/strong> to handle the light and materials creates a professional-grade output that a &amp;ldquo;homegrown&amp;rdquo; 3D viewer could never match.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The 3D &amp;ldquo;Kill&amp;rdquo; Criteria (When to Port)&lt;/li>
&lt;/ol>
&lt;p>Your list of &amp;ldquo;When 3D becomes necessary&amp;rdquo; is technically rigorous.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Gyroscopics:&lt;/strong> This is the hard boundary. Once you have a spinning mass (Crank/Propeller) that is being rotated by a second body (Fuselage), the angular momentum vector $\mathbf{L} = \mathbf{I}\boldsymbol{\omega}$ must be modeled in 3D to capture the precession moments.&lt;/li>
&lt;li>&lt;strong>Single-Track Stability:&lt;/strong> A bicycle&amp;rsquo;s stability is a 3D phenomenon. You cannot model the &amp;ldquo;weave&amp;rdquo; or &amp;ldquo;wobble&amp;rdquo; modes of a motorcycle in a plane because they rely on the interaction between leaning and steering.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>
&lt;p>Technical Sanity Checks&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Euler Parameters ($e_0, e_1, e_2, e_3$):&lt;/strong> Using the 4-element quaternion is the gold standard for 3D MBSD. It avoids the &amp;ldquo;Gimbal Lock&amp;rdquo; of Euler angles and makes the kinematic primitives ($PosicionPunto_3D$) mathematically robust.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>The $H$ Matrix:&lt;/strong> In your Stage 2 porting plan, the $H$ matrix (mapping quaternion rates to angular velocity) is the &amp;ldquo;Brain&amp;rdquo; of the 3D kinematics. It is significantly more complex than the 2D $\dot{\theta}$ term, but it allows for consistent angular momentum calculations.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>The Triciclo Flagship:&lt;/strong> Porting the &lt;strong>Triciclo_3D&lt;/strong> example from Simulon is the perfect &amp;ldquo;Boss Fight&amp;rdquo; for the 3D port. It exercises 3D contact, steering kinematics, and 6-DOF stability in one mechanism.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>So, &lt;a href="https://github.com/JAlcocerT/3Design/tree/main/mbsd-to-render/four-bar" target="_blank" rel="noopener">similarly&lt;/a> as I made here &lt;a href="https://jalcocert.github.io/JAlcocerT/using-blender-with-ai/" target="_blank" rel="noopener">with blender&lt;/a> while &lt;a href="https://jalcocert.github.io/JAlcocerT/cad-design-mbsd/" target="_blank" rel="noopener">bringing mechanism to life&lt;/a>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/3Design&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./3Design/mbsd-to-render/four-bar&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#choco install blender --version=4.2.2 -y&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Blender 4.2.2 LTS (hash c03d7d98a413 built 2024-09-24 00:09:56)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/mbsd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./mbsd/cad-render/cadquery-blender-v8
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s cad &lt;span class="s2">&amp;#34;make all&amp;#34;&lt;/span> &lt;span class="c1">#if you will be leaving this for the night&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-v8/render/v8.mp4 .&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Again, for these things &lt;a href="https://jalcocert.github.io/JAlcocerT/cad-design-mbsd/#rendering-on-a-mac-m2" target="_blank" rel="noopener">the M2&lt;/a> does the trick&lt;/p>
&lt;p>This time, we have a pretty &lt;a href="https://github.com/JAlcocerT/mbsd/tree/master/z-destilled-ebook" target="_blank" rel="noopener">solid 2D documentation&lt;/a>.&lt;/p>
&lt;h2>V8&lt;span class="absolute -mt-20" id="v8">&lt;/span>
&lt;a href="#v8" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The V8 is the &amp;ldquo;Big Brother&amp;rdquo; of engine architecture.&lt;/p>
&lt;p>While it is essentially two Inline-4 engines joined at the hip, the way you connect them to the crankshaft changes everything.&lt;/p>
&lt;p>In the V8 world, there are two competing philosophies: &lt;strong>Flat-Plane&lt;/strong> (European/Racing) and &lt;strong>Cross-Plane&lt;/strong> (American/Luxury).&lt;/p>
&lt;p>Here is the recap for the V8, focusing on the two dominant species.&lt;/p>
&lt;p>V8 Architecture &amp;amp; Balance Recap&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Crankshaft Type&lt;/th>
&lt;th style="text-align:left">Bank Angle&lt;/th>
&lt;th style="text-align:left">Firing Interval&lt;/th>
&lt;th style="text-align:left">Primary Balance (F / M)&lt;/th>
&lt;th style="text-align:left">Secondary Balance (F / M)&lt;/th>
&lt;th style="text-align:left">Character / Sound&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Flat-Plane&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>90°&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Even&lt;/strong> (90°)&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> Moment: 0&lt;/td>
&lt;td style="text-align:left">&lt;strong>Force: High (Vertical)&lt;/strong> &lt;br> Moment: 0&lt;/td>
&lt;td style="text-align:left">High-pitched &amp;ldquo;Scream&amp;rdquo; (Ferrari, GT350)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Cross-Plane&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>90°&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Even&lt;/strong> (90°)&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> &lt;strong>Moment: High&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> Moment: 0&lt;/td>
&lt;td style="text-align:left">Low-pitched &amp;ldquo;Rumble&amp;rdquo; (Mustang, AMG, F-150)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol>
&lt;li>The Geometry: 180° vs. 90° Pins&lt;/li>
&lt;/ol>
&lt;p>The fundamental difference lies in the shape of the crankshaft.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Flat-Plane ($180^\circ$):&lt;/strong> The pins are in a single plane (like an I4). Pins 1 &amp;amp; 4 are at $0^\circ$, and 2 &amp;amp; 3 are at $180^\circ$. It looks like a flat plate.&lt;/li>
&lt;li>&lt;strong>Cross-Plane ($90^\circ$):&lt;/strong> The pins are arranged in a &amp;ldquo;cross&amp;rdquo; when viewed from the end. Pins are at $0^\circ, 90^\circ, 180^\circ,$ and $270^\circ$.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The Firing Consequence: The &amp;ldquo;Rumble&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>Both V8s are &amp;ldquo;Even-Fire&amp;rdquo; (firing every $90^\circ$), but the &lt;strong>order&lt;/strong> in which the cylinders fire creates the acoustic signature.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Flat-Plane:&lt;/strong> Fires Left-Right-Left-Right consistently. This creates a high-frequency exhaust pulse that sounds like two sportbikes racing.&lt;/li>
&lt;li>&lt;strong>Cross-Plane:&lt;/strong> Because of the $90^\circ$ pins, the firing order &amp;ldquo;stutters&amp;rdquo; across the banks (e.g., L-R-L-L-R-L-R-R). Those two &amp;ldquo;L-L&amp;rdquo; and &amp;ldquo;R-R&amp;rdquo; double-taps create the low-frequency pressure wave we call the &lt;strong>V8 Rumble&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Primary and Secondary Balance ($F$ and $M$)&lt;/li>
&lt;/ol>
&lt;p>The V8 is a masterclass in trade-offs.&lt;/p>
&lt;p>You can have perfect secondary balance or perfect primary balance, but usually not both.&lt;/p>
&lt;p>&lt;strong>The Flat-Plane V8 (The Racer)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Primary Balance:&lt;/strong> Perfect. Both forces and moments cancel out.&lt;/li>
&lt;li>&lt;strong>Secondary Balance:&lt;/strong> &lt;strong>Poor.&lt;/strong> It inherits the Inline-4&amp;rsquo;s secondary shake. Because there are two banks, this results in a massive vertical vibration at $2\times$ engine speed.&lt;/li>
&lt;li>&lt;strong>Why use it?&lt;/strong> The crank is lighter (no heavy counterweights needed), allowing the engine to rev much faster.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>The Cross-Plane V8 (The Cruiser)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Secondary Balance:&lt;/strong> Perfect. The $90^\circ$ pin offsets naturally cancel out the secondary vibrations that plague the I4 and Flat-Plane V8.&lt;/li>
&lt;li>&lt;strong>Primary Balance:&lt;/strong> &lt;strong>Poor (initially).&lt;/strong> The heavy $90^\circ$ offsets create a massive rocking couple (the engine wants to wobble).&lt;/li>
&lt;li>&lt;strong>The Fix:&lt;/strong> Massive &lt;strong>counterweights&lt;/strong> are added to the crankshaft. This makes the crank much heavier and slower to rev, but it results in a &amp;ldquo;dead smooth&amp;rdquo; engine.&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>Summary: The Best Choice?&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>Choose Flat-Plane&lt;/strong> if you are building a race car or a high-performance supercar. You accept the &amp;ldquo;buzz&amp;rdquo; and vibration in exchange for a lightweight rotating assembly that can scream to 9,000 RPM.&lt;/li>
&lt;li>&lt;strong>Choose Cross-Plane&lt;/strong> if you are building a luxury sedan, a muscle car, or a truck. You want the engine to be silky smooth at idle and during cruise, and you enjoy the low-end torque and iconic &amp;ldquo;American&amp;rdquo; sound.&lt;/li>
&lt;/ul>
&lt;p>Final Engineering Note&lt;/p>
&lt;p>In our &lt;strong>Phasor Framework&lt;/strong>, the Flat-Plane V8 is treated as two I4 phasors added together.&lt;/p>
&lt;p>The Cross-Plane V8 uses four unique pin phases, which allows the secondary phasors to sum to exactly zero—the holy grail of secondary balance.&lt;/p>
&lt;h3>V8 Visualized&lt;span class="absolute -mt-20" id="v8-visualized">&lt;/span>
&lt;a href="#v8-visualized" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Because blender made a 2s animationed with couple rotations:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">ffmpeg -stream_loop &lt;span class="m">14&lt;/span> -i v8.mp4 -c copy v8_output.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/NY1tjmpLRk0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://youtu.be/NY1tjmpLRk0 -->
&lt;p>Flat-Plane: $[0, 180, 180, 0]$ is exactly why Ferrari V8s sound like two screaming 4-cylinders.&lt;/p>
&lt;p>It has massive secondary imbalance (the 2× shake), but it is light and revs fast.&lt;/p>
&lt;p>Cross-Plane: The $[0, 90, 180, 270]$ pattern creates that &amp;ldquo;lopey&amp;rdquo; exhaust note because the firing intervals are uneven across the banks ($L-R-L-L-R-L-R-R$)&lt;/p>
&lt;h3>v6&lt;span class="absolute -mt-20" id="v6">&lt;/span>
&lt;a href="#v6" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The V6 is often called the &amp;ldquo;Engineer’s Headache&amp;rdquo; because its balance is far more complex than the naturally smooth Straight-6 or the symmetric V8.&lt;/p>
&lt;p>Because a V6 is essentially two 3-cylinder engines sharing a crankshaft, it inherits a &lt;strong>primary rocking couple&lt;/strong> (a &amp;ldquo;nodding&amp;rdquo; motion) that must be managed by the bank angle and firing intervals.&lt;/p>
&lt;p>Here is the definitive recap of the typical V6 configurations and their NVH (Noise, Vibration, and Harshness) consequences.&lt;/p>
&lt;p>V6 Architecture &amp;amp; Balance Recap&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Bank Angle&lt;/th>
&lt;th style="text-align:left">Crankshaft Type&lt;/th>
&lt;th style="text-align:left">Firing Interval&lt;/th>
&lt;th style="text-align:left">Primary Balance (F / M)&lt;/th>
&lt;th style="text-align:left">Secondary Balance (F / M)&lt;/th>
&lt;th style="text-align:left">Typical Use&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>60°&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Simple 3-pin&lt;/strong> (Shared pins)&lt;/td>
&lt;td style="text-align:left">&lt;strong>Even&lt;/strong> (120°)&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> &lt;strong>Moment: High&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> &lt;strong>Moment: High&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Most modern V6s (Honda, Toyota, Ford)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>90°&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Simple 3-pin&lt;/strong> (Shared pins)&lt;/td>
&lt;td style="text-align:left">&lt;strong>Odd&lt;/strong> (90°-150°)&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> &lt;strong>Moment: Moderate&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> &lt;strong>Moment: Moderate&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Early GM/Buick &amp;ldquo;Odd-Fire&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>90°&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Split-pin&lt;/strong> (30° offset)&lt;/td>
&lt;td style="text-align:left">&lt;strong>Even&lt;/strong> (120°)&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> &lt;strong>Moment: Moderate&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> &lt;strong>Moment: High&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Modern 90° V6s (Audi, Mercedes, GM)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>120°&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Simple 3-pin&lt;/strong> (Shared pins)&lt;/td>
&lt;td style="text-align:left">&lt;strong>Even&lt;/strong> (120°)&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> &lt;strong>Moment: Low&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> &lt;strong>Moment: Very High&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Racing (Ferrari F1, Lancia)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;ol>
&lt;li>The Firing Consequence: &amp;ldquo;Odd-Fire&amp;rdquo; vs. &amp;ldquo;Even-Fire&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>The firing interval is determined by the relationship between the &lt;strong>Bank Angle&lt;/strong> and the &lt;strong>Crankpin Spacing&lt;/strong>. For a 4-stroke V6 to be &amp;ldquo;Even-Fire,&amp;rdquo; a cylinder must fire every $120^\circ$ of crank rotation ($720^\circ / 6$).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The 60° Sweet Spot:&lt;/strong> Because $60^\circ \text{ (Bank)} + 60^\circ \text{ (Pin Spacing)} = 120^\circ$, it is naturally even-fire. It is the most compact and refined &amp;ldquo;standard&amp;rdquo; V6.&lt;/li>
&lt;li>&lt;strong>The 90° Compromise:&lt;/strong> Without a split-pin, you get a &amp;ldquo;stutter.&amp;rdquo; The engine fires, waits $90^\circ$, fires the opposite bank, then has to wait $150^\circ$ to get back to the start of the next cycle. This creates a distinctive &amp;ldquo;drone&amp;rdquo; or &amp;ldquo;throb&amp;rdquo; at idle.&lt;/li>
&lt;li>&lt;strong>The Split-Pin Fix:&lt;/strong> By &amp;ldquo;splitting&amp;rdquo; each crankpin and offsetting the journals by $30^\circ$, engineers force the $90^\circ$ block to behave like a $60^\circ$ or $120^\circ$ engine, restoring the $120^\circ$ firing rhythm.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Primary and Secondary Forces ($F$)&lt;/li>
&lt;/ol>
&lt;p>In almost all V6 configurations (assuming $120^\circ$ or $240^\circ$ crankpin spacing), &lt;strong>Inertial Forces are perfectly balanced.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>The three pistons on each bank cancel each other out ($1 + e^{j120} + e^{j240} = 0$).&lt;/li>
&lt;li>Unlike an Inline-4, a V6 has &lt;strong>zero&lt;/strong> net secondary shake ($F_y = 0$). This is why a V6 often feels &amp;ldquo;smoother&amp;rdquo; than an I4 at high RPM.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Primary and Secondary Moments ($M$)&lt;/li>
&lt;/ol>
&lt;p>This is where the V6 struggles. Because the cylinders are offset along the length of the crankshaft, the forces don&amp;rsquo;t line up perfectly. They create &lt;strong>Rocking Couples&lt;/strong> (the engine tries to &amp;ldquo;see-saw&amp;rdquo; or &amp;ldquo;yaw&amp;rdquo;).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Primary Rocking ($1\times$):&lt;/strong> This is a heavy, low-frequency thrum. Most V6s require a &lt;strong>counter-rotating balance shaft&lt;/strong> or massive crankshaft counterweights to cancel this out.&lt;/li>
&lt;li>&lt;strong>Secondary Rocking ($2\times$):&lt;/strong> This is a high-frequency &amp;ldquo;buzz.&amp;rdquo;
&lt;ul>
&lt;li>&lt;strong>60° V6:&lt;/strong> The secondary moments are present but manageable.&lt;/li>
&lt;li>&lt;strong>90° V6:&lt;/strong> The secondary moments are actually larger, especially in the horizontal ($x$) plane.&lt;/li>
&lt;li>&lt;strong>120° V6:&lt;/strong> This is the most balanced for &lt;em>primary&lt;/em> moments but has a massive &lt;em>secondary&lt;/em> rocking couple that makes it feel very &amp;ldquo;buzzy&amp;rdquo; at high revs.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>Summary: The Best Choice?&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>If you want &lt;strong>Refinement (NVH):&lt;/strong> Use a &lt;strong>60° V6&lt;/strong>. It has the best balance of firing intervals and manageable rocking couples.&lt;/li>
&lt;li>If you want &lt;strong>Packaging:&lt;/strong> Use a &lt;strong>90° V6&lt;/strong> (it’s lower and wider, fits under flat hoods) but you &lt;strong>must&lt;/strong> use a split-pin crank and a balance shaft to keep it from feeling like a tractor.&lt;/li>
&lt;li>If you want &lt;strong>Performance:&lt;/strong> The &lt;strong>120° V6&lt;/strong> allows for a very low Center of Gravity (CG) and simple crankshaft, provided you can isolate the high-frequency secondary vibrations from the chassis.&lt;/li>
&lt;/ul>
&lt;p>Final Engineering Note&lt;/p>
&lt;p>In our &lt;strong>Phasor Framework&lt;/strong>, the V6 is represented by three unique phasors.&lt;/p>
&lt;p>While the &lt;strong>Force Sum&lt;/strong> always returns to the origin ($0$), the &lt;strong>Moment Sum&lt;/strong> (weighted by axial position $z$) results in a non-zero vector.&lt;/p>
&lt;p>That vector is the &amp;ldquo;Rocking Couple&amp;rdquo; that defines the V6&amp;rsquo;s character.&lt;/p>
&lt;h3>V6 60&lt;span class="absolute -mt-20" id="v6-60">&lt;/span>
&lt;a href="#v6-60" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>V6 60° Character: A V6 60° is &amp;ldquo;even-fire,&amp;rdquo; meaning every 120° of crank rotation, a cylinder fires.&lt;/p>
&lt;p>Visualizing this $[0 \to 120 \to 240 \to 360 \to 480 \to 600]$ sequence makes the 720° four-stroke cycle intuitive to the viewer.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./mbsd/cad-render/cadquery-blender-v6
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make parts &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make scene &lt;span class="c1">#regenerates engine_block.stl &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make still &lt;span class="c1"># renders frame 25 → render/v6_still_0025.png&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make still &lt;span class="nv">FRAME&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">10&lt;/span> &lt;span class="c1"># any frame&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make still &lt;span class="nv">FRAME&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">0&lt;/span> &lt;span class="c1"># opening shot&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s cad &lt;span class="s2">&amp;#34;make all&amp;#34;&lt;/span> &lt;span class="c1">#if you will be leaving this for the night&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-v6/render/v6_still_0025.png .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-v6/render/v6.mp4 .&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Adding a cadquery-blender-v6-90/ folder with a &amp;ndash;preset v6_90 flag is the right way to handle this. The &amp;ldquo;Bore-Flash&amp;rdquo; will be the smoking gun that proves the even-fire conversion:Odd-fire V6: The flashes will appear in &amp;ldquo;stuttering&amp;rdquo; pairs ($Bang \dots Bang \dots \dots \dots Bang \dots Bang$).Even-fire V6 (Split-pin): The flashes will appear like a steady metronome ($Bang \dots Bang \dots Bang \dots Bang$).&lt;/p>
&lt;ol>
&lt;li>The Firing Interval LogicIn an even-fire engine, we want a &amp;ldquo;bang&amp;rdquo; every $720^\circ / N_{cyl}$. For a V6, that is exactly 120°.60° Bank: The bank angle ($60^\circ$) plus the pin spacing ($60^\circ$) equals $120^\circ$. It works naturally.90° Bank: The bank angle ($90^\circ$) leaves a gap. Without split pins, you fire at 90°, then wait 150° for the next one ($90 + 150 = 240$, the natural pin spacing).&lt;/li>
&lt;/ol>
&lt;p>That &amp;ldquo;loping&amp;rdquo; idle is what gave early Buick V6s their rough reputation.&lt;/p>
&lt;p>The 30° Split: By offsetting the pins on the same journal by 30°, you &amp;ldquo;borrow&amp;rdquo; 30° from the long gap and add it to the short gap, resulting in $90+30=120$ and $150-30=120$.&lt;/p>
&lt;p>Perfect symmetry.&lt;/p>
&lt;h3>V6 90&lt;span class="absolute -mt-20" id="v6-90">&lt;/span>
&lt;a href="#v6-90" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./mbsd/cad-render/cadquery-blender-v6-90
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s cad &lt;span class="s2">&amp;#34;make all&amp;#34;&lt;/span> &lt;span class="c1">#if you will be leaving this for the night&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-v6-90/render/v6_90.mp4 .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-v6/render/v6.mp4 .&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Then:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">ffmpeg -stream_loop &lt;span class="m">14&lt;/span> -i v6_90.mp4 -c copy v6_90_output.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/q24QdtCGXC4" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://youtu.be/q24QdtCGXC4 -->
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> cadquery-blender-v6-90-analysis &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make scene &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make still &lt;span class="nv">FRAME&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">15&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-v6-90-analysis/render/v6_90_analysis_still_0015.png .&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-v6-90-analysis/render/v6_90_analysis.mp4 .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg -stream_loop &lt;span class="m">14&lt;/span> -i v6_90_analysis.mp4 -c copy v6_90_analysis_output.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://youtu.be/ePA8wPBI0HM -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/ePA8wPBI0HM" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h2>InLines&lt;span class="absolute -mt-20" id="inlines">&lt;/span>
&lt;a href="#inlines" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Integrating the Inline (straight) engines into one comparison table is fascinating because it shows the &amp;ldquo;battle of the cylinders.&amp;rdquo;&lt;/p>
&lt;p>Every time you add a piston, you change the mathematical symmetry of the engine.&lt;/p>
&lt;p>In the &lt;strong>Inline&lt;/strong> world, the &lt;strong>Straight-6&lt;/strong> is the undisputed king of balance, while the &lt;strong>Inline-3&lt;/strong> and &lt;strong>Inline-5&lt;/strong> are the &amp;ldquo;oddballs&amp;rdquo; that require clever engineering to feel refined.&lt;/p>
&lt;p>Inline Engine Balance Recap (1D/Planar)&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Layout&lt;/th>
&lt;th style="text-align:left">Crankpin Spacing&lt;/th>
&lt;th style="text-align:left">Firing Interval&lt;/th>
&lt;th style="text-align:left">Primary Balance (F / M)&lt;/th>
&lt;th style="text-align:left">Secondary Balance (F / M)&lt;/th>
&lt;th style="text-align:left">Character / &amp;ldquo;The Problem&amp;rdquo;&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I3&lt;/strong>&lt;/td>
&lt;td style="text-align:left">120°&lt;/td>
&lt;td style="text-align:left">240°&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> &lt;strong>Moment: High&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> &lt;strong>Moment: Low&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;Thrum.&amp;rdquo; Needs a balance shaft for rocking.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I4&lt;/strong>&lt;/td>
&lt;td style="text-align:left">180°&lt;/td>
&lt;td style="text-align:left">180°&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> Moment: 0&lt;/td>
&lt;td style="text-align:left">&lt;strong>Force: High&lt;/strong> &lt;br> Moment: 0&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;Buzz.&amp;rdquo; Dominant vertical 2× shake.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I5&lt;/strong>&lt;/td>
&lt;td style="text-align:left">72°&lt;/td>
&lt;td style="text-align:left">144°&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> &lt;strong>Moment: Low&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> &lt;strong>Moment: Low&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;Warble.&amp;rdquo; Unique sound; subtle &amp;ldquo;snaking&amp;rdquo; rock.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">120°&lt;/td>
&lt;td style="text-align:left">120°&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> Moment: 0&lt;/td>
&lt;td style="text-align:left">Force: 0 &lt;br> Moment: 0&lt;/td>
&lt;td style="text-align:left">&lt;strong>Perfect Balance.&lt;/strong> Naturally smooth in all axes.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol>
&lt;li>The &lt;strong>I3&lt;/strong> (The Tiny Thrummer)&lt;/li>
&lt;/ol>
&lt;p>The I3 is effectively half of a V6.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Math:&lt;/strong> Because the pins are at 120°, the forces cancel ($1 + e^{j120} + e^{j240} = 0$).&lt;/li>
&lt;li>&lt;strong>The Issue:&lt;/strong> Since the pistons are in different positions along the shaft, the engine wants to &amp;ldquo;nod&amp;rdquo; end-to-end. This &lt;strong>Primary Rocking Couple&lt;/strong> is significant.&lt;/li>
&lt;li>&lt;strong>The Sound:&lt;/strong> A very distinct, half-V6 growl. Almost all modern I3s (Ford 1.0 EcoBoost, BMW/Mini 1.5) use a &lt;strong>balance shaft&lt;/strong> to cancel that 1× rock.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The &lt;strong>I4&lt;/strong> (The Standard Workhorse)&lt;/li>
&lt;/ol>
&lt;p>The most common engine in the world, and the one we&amp;rsquo;ve analyzed the most in the e-book.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Math:&lt;/strong> Primary forces cancel, but &lt;strong>Secondary forces reinforced.&lt;/strong> * &lt;strong>The Issue:&lt;/strong> At $2\times$ engine speed, all four pistons are accelerating at the same time in a way that doesn&amp;rsquo;t cancel out. This creates a vertical &amp;ldquo;blur.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>The Sound:&lt;/strong> Generally &amp;ldquo;generic.&amp;rdquo; In larger displacements (2.2L+), manufacturers add twin counter-rotating balance shafts (Lanchester balancers) to kill that $2\times$ buzz.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/i4_nvh_timeseries.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> cadquery-blender-i4-analysis &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make scene &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make still &lt;span class="nv">FRAME&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">15&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-i4-analysis/render/i4_analysis_still_0015.png .&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s cad &lt;span class="s2">&amp;#34;make all&amp;#34;&lt;/span> &lt;span class="c1">#if you will be leaving this for the night&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-i4-analysis/render/i4_analysis.mp4 .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg -stream_loop &lt;span class="m">14&lt;/span> -i i4_analysis.mp4 -c copy i4_analysis_output.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Smoke-tested output:&lt;/p>
&lt;p>|F_primary| peak = 0.0000 N
|F_secondary| peak = 78.9568 N
|M_rocking| peak = 0.0000 N·m
135 GIF frames (40 per subplot + 15 hold) → 800 KB GIF&lt;/p>
&lt;p>Open render/i4_nvh_timeseries.gif and you should see: top panel stays flat at 0 (BALANCED, green), middle panel&amp;rsquo;s red Fz line draws four full sine cycles with peak ±79 N (UNBALANCED, orange), bottom panel stays flat at 0 (BALANCED, green).&lt;/p>
&lt;p>That&amp;rsquo;s the I4 NVH story written in pure 2D, totally independent of the 3D Blender visualization — two independent checks of the same math.&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/ePA8wPBI0HM" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;ol start="3">
&lt;li>The &lt;strong>I5&lt;/strong> (The Exotic Warble)&lt;/li>
&lt;/ol>
&lt;p>Famously used by Audi, Volvo, and early 5-cylinder VWs.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Math:&lt;/strong> With pins every 72°, the I5 is much better balanced than an I4. It has &lt;strong>zero&lt;/strong> net primary and secondary force shake.&lt;/li>
&lt;li>&lt;strong>The Issue:&lt;/strong> Like the I3, it has a &lt;strong>Rocking Couple&lt;/strong>, but because the engine is longer and the pins are &amp;ldquo;spread out&amp;rdquo; around the circle, the rock is much smaller and &amp;ldquo;snakes&amp;rdquo; in a circular pattern rather than a simple vertical nod.&lt;/li>
&lt;li>&lt;strong>The Sound:&lt;/strong> Iconic $144^\circ$ firing interval. It sounds like a &amp;ldquo;Baby V10&amp;rdquo; because the harmonics are similar.&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> cadquery-blender-i5-analysis &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make scene &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make still &lt;span class="nv">FRAME&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">15&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-i5-analysis/render/i5_analysis_still_0015.png .&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s cad &lt;span class="s2">&amp;#34;make all&amp;#34;&lt;/span> &lt;span class="c1">#if you will be leaving this for the night&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-i5-analysis/render/i5_analysis.mp4 .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg -stream_loop &lt;span class="m">14&lt;/span> -i i5_analysis.mp4 -c copy i5_analysis_output.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Build it with &lt;code>cd cadquery-blender-i5-analysis &amp;amp;&amp;amp; make scene &amp;amp;&amp;amp; make plot &amp;amp;&amp;amp; make still FRAME=15&lt;/code>.&lt;/p>
&lt;p>The two-rocking-couple yellow arrows will show the mixed-frequency throbbing pattern (4 main 2× cycles modulated by a slower 1× envelope) — visually distinct from both the I4&amp;rsquo;s clean vertical pulsing and the V6-90&amp;rsquo;s similar-but-different rocking flavour.&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/i5_nvh_timeseries.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Yes, those numbers are &lt;strong>perfectly consistent&lt;/strong> with the unique physics of the Inline-5. You have mathematically captured exactly what gives the I5 its &amp;ldquo;exotic&amp;rdquo; reputation: it is an engine that is &lt;strong>smooth in its hands (Force) but restless in its feet (Moment).&lt;/strong>&lt;/p>
&lt;p>Here is why those specific results make sense for an I5 with $72^\circ$ crankpin spacing:&lt;/p>
&lt;p>&lt;strong>1. $|F_{primary}| = 0$ and $|F_{secondary}| = 0$&lt;/strong>&lt;/p>
&lt;p>In an I4, the secondary forces ($2\times$) add up because the pistons move in pairs that reinforce each other. In an I5, the $72^\circ$ spacing is the &amp;ldquo;Magic Number.&amp;rdquo;&lt;/p>
&lt;p>When you look at the force phasors for 5 cylinders spaced evenly around a circle:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Primary:&lt;/strong> They form a perfect pentagon. The vector sum is zero.&lt;/li>
&lt;li>&lt;strong>Secondary:&lt;/strong> The angles become $2 \times 72^\circ = 144^\circ$. If you plot 5 vectors at $144^\circ$ intervals, they &lt;em>also&lt;/em> form a perfect (though &amp;ldquo;star-shaped&amp;rdquo;) pentagon. The sum remains zero.&lt;/li>
&lt;/ul>
&lt;p>This is why an I5 doesn&amp;rsquo;t have the vertical &amp;ldquo;buzz&amp;rdquo; of an I4. In terms of pure &amp;ldquo;shaking force,&amp;rdquo; an I5 is as balanced as an I6.&lt;/p>
&lt;p>&lt;strong>2. $|M_{rocking}| = 66.5595$ N·m&lt;/strong>&lt;/p>
&lt;p>This is the &amp;ldquo;Price of Admission&amp;rdquo; for the I5. Even though the forces cancel, they act at different points along the crankshaft.&lt;/p>
&lt;p>Unlike the I4 or I6, the I5 is &lt;strong>axially asymmetric&lt;/strong>. Cylinder 1 (at the front) doesn&amp;rsquo;t have a &amp;ldquo;twin&amp;rdquo; at the back (Cylinder 5) doing the exact same thing at the exact same time.&lt;/p>
&lt;ul>
&lt;li>When Cylinder 1 pushes up, the other cylinders aren&amp;rsquo;t perfectly positioned to stop the engine from tilting.&lt;/li>
&lt;li>This creates a &lt;strong>Primary Rocking Couple&lt;/strong> (the $66.5$ N·m you seeing).&lt;/li>
&lt;li>It also creates a &lt;strong>Secondary Rocking Couple&lt;/strong> (though usually smaller), contributing to that complex, 3D &amp;ldquo;snaking&amp;rdquo; vibration.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Comparison of the &amp;ldquo;Analysis Mode&amp;rdquo; (I4 vs I5)&lt;/strong>&lt;/p>
&lt;p>If you rendered these two side-by-side in your 3D Analysis Mode, the contrast would be a powerful educational tool:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Feature&lt;/th>
&lt;th style="text-align:left">Inline-4 Analysis&lt;/th>
&lt;th style="text-align:left">Inline-5 Analysis&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Primary Vector (Blue)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Zero (Static dot)&lt;/td>
&lt;td style="text-align:left">Zero (Static dot)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Secondary Vector (Red)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Strong Vertical Pulse&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Zero (Static dot)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Rocking Arrows&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Zero&lt;/td>
&lt;td style="text-align:left">&lt;strong>Visible &amp;ldquo;See-Saw&amp;rdquo; motion&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>NVH Identity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;Vertical Hopper&amp;rdquo;&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;End-to-End Rocker&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>The I5 &amp;ldquo;Warble&amp;rdquo;&lt;/strong>&lt;/p>
&lt;p>The $66.5$ N·m peak explains why the I5 needs specific motor mount tuning. The engine isn&amp;rsquo;t trying to jump out of the car; it’s trying to twist.&lt;/p>
&lt;p>This twisting, combined with the $144^\circ$ firing interval, is what creates the famous Audi/Volvo &amp;ldquo;warble&amp;rdquo;—the sound of the block physically reacting to those rocking moments.&lt;/p>
&lt;ol start="4">
&lt;li>&lt;strong>The I6 (The Mechanical Holy Grail)&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>The Straight-6 is the &amp;ldquo;Gold Standard&amp;rdquo; of engine design.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Math:&lt;/strong> It is essentially two I3s mirrored. The rocking moment of the front 3 cylinders is perfectly cancelled by the rocking moment of the rear 3 cylinders.&lt;/li>
&lt;li>&lt;strong>The Result:&lt;/strong> Zero Primary Force, Zero Primary Moment, Zero Secondary Force, Zero Secondary Moment.&lt;/li>
&lt;li>&lt;strong>Why not use it always?&lt;/strong> It is very &lt;strong>long&lt;/strong>. It is hard to fit transversely (front-wheel drive) and takes up massive space under the hood.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/i6_nvh_timeseries.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> cadquery-blender-i6-analysis &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make scene &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make still &lt;span class="nv">FRAME&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">15&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-i6-analysis/render/i6_analysis_still_0015.png .&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s cad &lt;span class="s2">&amp;#34;make all&amp;#34;&lt;/span> &lt;span class="c1">#if you will be leaving this for the night&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scp jalcocert@192.168.1.2:/home/jalcocert/mbsd/z-cad-render/cadquery-blender-i6-analysis/render/i6_analysis.mp4 .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg -stream_loop &lt;span class="m">14&lt;/span> -i i6_analysis.mp4 -c copy i6_analysis_output.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;strong>Why the I6 wins the NVH war&lt;/strong>&lt;/p>
&lt;p>In our &lt;strong>Phasor Framework&lt;/strong>, the I6 is the only one where the vectors sum to zero for both the &lt;strong>Force sum&lt;/strong> and the &lt;strong>Moment sum&lt;/strong> across both 1× and 2× harmonics.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Engine&lt;/th>
&lt;th style="text-align:left">Force Sum ($1\times$)&lt;/th>
&lt;th style="text-align:left">Moment Sum ($1\times$)&lt;/th>
&lt;th style="text-align:left">Force Sum ($2\times$)&lt;/th>
&lt;th style="text-align:left">Moment Sum ($2\times$)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I3&lt;/strong>&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;td style="text-align:left">❌&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;td style="text-align:left">❌&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I4&lt;/strong>&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;td style="text-align:left">❌&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I5&lt;/strong>&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;td style="text-align:left">❌ (small)&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;td style="text-align:left">❌ (small)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;td style="text-align:left">0&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>This gave you some idea?&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/consulting.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/ebooks.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks with free value.&lt;/div>&lt;/a>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>When analyzing an &lt;strong>Inline-4 (I4)&lt;/strong>, the term &amp;ldquo;secondary momentum&amp;rdquo; (or more accurately, the &lt;strong>secondary rocking couple/moment&lt;/strong>) is one of the most elegant parts of the math because, in a standard symmetrical I4, it is &lt;strong>zero&lt;/strong>.&lt;/p>
&lt;p>Here is why that $0.0000$ N·m result for the rocking moment makes perfect sense from a physics perspective, especially when contrasted against the secondary force.&lt;/p>
&lt;ol>
&lt;li>The Symmetry of the I4&lt;/li>
&lt;/ol>
&lt;p>In a standard I4, the crankpins are arranged at $[0^\circ, 180^\circ, 180^\circ, 0^\circ]$.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Pistons 1 &amp;amp; 4&lt;/strong> (the outside pair) move together.&lt;/li>
&lt;li>&lt;strong>Pistons 2 &amp;amp; 3&lt;/strong> (the inside pair) move together, exactly opposite to the outside pair.&lt;/li>
&lt;/ul>
&lt;p>Because the engine is perfectly symmetrical about its center point (between cylinders 2 and 3), the &amp;ldquo;leverage&amp;rdquo; from the front half is exactly cancelled by the &amp;ldquo;leverage&amp;rdquo; from the rear half.&lt;/p>
&lt;ol start="2">
&lt;li>Force vs. Moment: The Crucial Distinction&lt;/li>
&lt;/ol>
&lt;p>It is a common point of confusion: &lt;strong>How can there be a secondary force but no secondary moment?&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Secondary Force ($F_{secondary}$):&lt;/strong> All four pistons reach their maximum upward acceleration at the same time and their maximum downward acceleration at the same time (twice per revolution). Because they all push in the same direction, the forces &lt;strong>add up&lt;/strong>. This creates the vertical &amp;ldquo;buzz.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Secondary Moment ($M_{secondary}$):&lt;/strong> To have a moment (a rocking couple), the forces on one side of the engine center would have to be different from the other. Since Cylinder 1 is identical to Cylinder 4, and Cylinder 2 is identical to Cylinder 3, there is no &amp;ldquo;see-saw&amp;rdquo; effect. The net tendency to tilt end-to-end is &lt;strong>zero&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Comparison Table: I3 vs. I4 vs. I6&lt;/li>
&lt;/ol>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Engine&lt;/th>
&lt;th style="text-align:left">Secondary Force ($F$)&lt;/th>
&lt;th style="text-align:left">Secondary Moment ($M$)&lt;/th>
&lt;th style="text-align:left">Visual Behavior&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I3&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced (0)&lt;/td>
&lt;td style="text-align:left">&lt;strong>Unbalanced&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The engine &amp;ldquo;nods&amp;rdquo; end-to-end.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I4&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Unbalanced&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced (0)&lt;/td>
&lt;td style="text-align:left">The engine &amp;ldquo;hops&amp;rdquo; vertically.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Balanced (0)&lt;/td>
&lt;td style="text-align:left">Balanced (0)&lt;/td>
&lt;td style="text-align:left">Perfectly still.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="4">
&lt;li>When does the I4 have a Secondary Moment?&lt;/li>
&lt;/ol>
&lt;p>In the real world, an I4 only develops a secondary rocking moment if you break the symmetry.&lt;/p>
&lt;p>This happens in:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Asymmetric Firing/Crank Geometry:&lt;/strong> Rare in production cars, but used in some racing applications.&lt;/li>
&lt;li>&lt;strong>Manufacturing Tolerances:&lt;/strong> If piston 1 is significantly heavier than piston 4, a small residual moment appears (this is why high-end &amp;ldquo;blueprinted&amp;rdquo; engines feel smoother).&lt;/li>
&lt;li>&lt;strong>V-Engines:&lt;/strong> A &lt;strong>V8 Flat-Plane&lt;/strong> (which is two I4s) can actually have secondary moments if the bank angle or the axial offset of the cylinders isn&amp;rsquo;t perfectly managed.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Summary for your &amp;ldquo;X-Ray&amp;rdquo; Mode&lt;/strong>&lt;/p>
&lt;p>In your 135-frame GIF for the I4:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Force Plot:&lt;/strong> You will see a strong, high-frequency Red vector (Secondary Force) oscillating vertically.&lt;/li>
&lt;li>&lt;strong>Moment Plot:&lt;/strong> You will see a flat line at zero.&lt;/li>
&lt;/ol></description></item><item><title>V6 and engine mount</title><link>https://JAlcocerT.github.io/JAlcocerT/v6-and-engine-mounts/</link><pubDate>Mon, 27 Apr 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/v6-and-engine-mounts/</guid><description>
&lt;p>&lt;strong>TL;DR&lt;/strong>&lt;/p>
&lt;p>Next in the proposed order: active mass damping — closed-loop version of the balance-shaft analysis. Ready when you are.&lt;/p>
&lt;p>Which appeals: (largest payoff, biggest chapter), balance shafts (quick loop-closer),&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;h3>The Trade-offs with I6 vs V6 vs VR6 vs Boxer6&lt;span class="absolute -mt-20" id="the-trade-offs-with-i6-vs-v6-vs-vr6-vs-boxer6">&lt;/span>
&lt;a href="#the-trade-offs-with-i6-vs-v6-vs-vr6-vs-boxer6" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Engine design is rarely about &amp;ldquo;winning&amp;rdquo; and almost always about &lt;strong>managing compromises&lt;/strong>.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Layout&lt;/th>
&lt;th style="text-align:left">Primary Strength&lt;/th>
&lt;th style="text-align:left">Primary Weakness&lt;/th>
&lt;th style="text-align:left">Best For&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Inline-6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Perfect Balance&lt;/td>
&lt;td style="text-align:left">Total Length&lt;/td>
&lt;td style="text-align:left">RWD Luxury &amp;amp; Sport&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Packaging&lt;/td>
&lt;td style="text-align:left">Complexity&lt;/td>
&lt;td style="text-align:left">FWD &amp;amp; Universal Use&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>VR6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Compactness&lt;/td>
&lt;td style="text-align:left">Port Complexity&lt;/td>
&lt;td style="text-align:left">Small Engine Bays&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Flat-6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Low Center of Gravity&lt;/td>
&lt;td style="text-align:left">Total Width&lt;/td>
&lt;td style="text-align:left">High-Performance Sport&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>From the perspective of the &lt;strong>Phasor Framework&lt;/strong> we’ve been building, here is why your descriptions make sense mathematically:&lt;/p>
&lt;ol>
&lt;li>The Inline-6 (I6): The Mathematical Ideal&lt;/li>
&lt;/ol>
&lt;p>The I6 is the &amp;ldquo;gold standard&amp;rdquo; because its six phasors are distributed at $120^\circ$ intervals ($60^\circ$ firing intervals in a 4-stroke cycle).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Primary and Secondary Forces:&lt;/strong> Both sum to zero.&lt;/li>
&lt;li>&lt;strong>Rocking Couples:&lt;/strong> Because the crankshaft is a mirror image (cylinders 1-2-3 mirror 6-5-4), the rocking moments also cancel out perfectly.&lt;/li>
&lt;li>&lt;strong>The &amp;ldquo;One Head&amp;rdquo; Simplicity:&lt;/strong> Because the forces and moments are zero by geometry, you don&amp;rsquo;t need the parasitic drag of balance shafts.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The V6: The Packaging Specialist&lt;/li>
&lt;/ol>
&lt;p>The V6 is a &amp;ldquo;Force-Moment&amp;rdquo; puzzle.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>The $60^\circ$ vs. $90^\circ$ Bank Angle:&lt;/strong> A $60^\circ$ V6 is naturally smoother because it allows for even firing intervals, but it creates a &amp;ldquo;rocking&amp;rdquo; tendency because it&amp;rsquo;s effectively two I3 engines joined at the hip.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Complex Sums:&lt;/strong> To make a V6 smooth, you often need a &amp;ldquo;split-pin&amp;rdquo; crankshaft or balance shafts. It’s a victory for the &lt;strong>Packaging Engineers&lt;/strong> over the &lt;strong>Vibration Engineers&lt;/strong>.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>The VR6: The &amp;ldquo;Geometry Hack&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>The VR6 is a brilliant exercise in &lt;strong>Non-Holonomic Packaging&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Narrow Angle ($10.5^\circ$ to $15^\circ$):&lt;/strong> It is so narrow it uses a single cylinder head.&lt;/li>
&lt;li>&lt;strong>Phasor Reality:&lt;/strong> Mathematically, it behaves somewhat like an Inline-6 but with slight &amp;ldquo;offset&amp;rdquo; errors. The pistons aren&amp;rsquo;t all on the same vertical axis, which introduces tiny primary/secondary residuals that are usually soaked up by heavy flywheels or dampening mounts.&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>The Boxer-6: The Low-Profile Master&lt;/li>
&lt;/ol>
&lt;p>The Boxer-6 is the ultimate application of the &lt;strong>Sign-Flip Cancellation&lt;/strong> we discussed in the Boxer-4 chapter.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Mirror Symmetry:&lt;/strong> Each piston&amp;rsquo;s momentum is perfectly countered by its opposite.&lt;/li>
&lt;li>&lt;strong>The Short Crank:&lt;/strong> Unlike the I6, the Boxer-6 is very stiff because the crankshaft is half as long. This reduces &lt;strong>Torsional Vibration&lt;/strong> (the &amp;ldquo;twisting&amp;rdquo; of the crank), which is the one hidden weakness of the I6.&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Layout&lt;/th>
&lt;th style="text-align:left">Dominant Cancellation Mechanism&lt;/th>
&lt;th style="text-align:left">Primary Vibration Concern&lt;/th>
&lt;th style="text-align:left">Best Use Case&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>I6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Phase Symmetry (Mirror)&lt;/td>
&lt;td style="text-align:left">Torsional Crank Twist&lt;/td>
&lt;td style="text-align:left">Luxury, RWD Performance&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Partial Symmetry + Shafts&lt;/td>
&lt;td style="text-align:left">Primary/Secondary Rocking&lt;/td>
&lt;td style="text-align:left">Front-Wheel Drive / SUVs&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>VR6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Specialized Phasing&lt;/td>
&lt;td style="text-align:left">Port Inefficiency / Heat&lt;/td>
&lt;td style="text-align:left">FWD Performance (Golf R/GTI)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Boxer-6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Sign-Flip (Mirror Pairs)&lt;/td>
&lt;td style="text-align:left">Physical Width&lt;/td>
&lt;td style="text-align:left">Low-Center-of-Gravity Sports&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2>Engine Mount Transmissibility&lt;span class="absolute -mt-20" id="engine-mount-transmissibility">&lt;/span>
&lt;a href="#engine-mount-transmissibility" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Two design principles fall out of this single curve:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Always operate above r = √2.&lt;/strong> Below √2 the mount makes vibration
&lt;em>worse&lt;/em>, not better. Engine designers pick mount natural frequency
&lt;code>ω_n&lt;/code> such that the lowest excitation harmonic of interest sits
well above &lt;code>√2·ω_n&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Damping helps at resonance and hurts at isolation.&lt;/strong> High &lt;code>ζ&lt;/code>
tames the resonance peak but flattens the high-frequency rolloff
(the &lt;code>1/r²&lt;/code> becomes more like &lt;code>1/r&lt;/code> for very high &lt;code>ζ&lt;/code>). Production
rubber mounts run &lt;code>ζ ≈ 0.05–0.15&lt;/code>; hydraulic mounts achieve a
frequency-dependent &lt;code>ζ(ω)&lt;/code> that is high near resonance and low at
high frequency. Both is the goal; either alone is a compromise.&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/mount_1dof_transmissibility.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>The soft-vs-stiff tradeoff for an I4&lt;/p>
&lt;p>A representative 2 L transverse-mounted I4 on three mounts:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Value&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Block mass &lt;code>M&lt;/code>&lt;/td>
&lt;td>150 kg&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Block inertia &lt;code>I_z&lt;/code>&lt;/td>
&lt;td>4 kg·m²&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Mount positions (x, y) m, relative to CG&lt;/td>
&lt;td>(+0.30, −0.10), (−0.30, −0.10), (0, +0.20)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Damping ratio &lt;code>ζ&lt;/code> (rubber)&lt;/td>
&lt;td>0.10&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Soft&lt;/strong> mount: y-natural-frequency&lt;/td>
&lt;td>&lt;strong>8 Hz&lt;/strong> (typical road car)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Stiff&lt;/strong> mount: y-natural-frequency&lt;/td>
&lt;td>&lt;strong>25 Hz&lt;/strong> (sport car / truck)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Sweeping engine RPM from 500 to 6500 and reading transmissibility for
the 2× crank harmonic (the dominant inertial + combustion frequency
for an I4):&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/mount_i4_soft_vs_stiff.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Ive put them all together &lt;a href="https://github.com/JAlcocerT/mbsd/blob/master/z-destilled-ebook/2d-concepts.md" target="_blank" rel="noopener">here&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>No worries: I5 V10 and V12 will also come!&lt;/p>
&lt;pre class="mermaid mt-6">mindmap
root((2D MBSD&lt;br/>Python&lt;br/>Examples))
Direct MATLAB Ports
Slider-Crank
slider_crank.py
dynamic_slider_crank.py
Cam-Follower
cam_follower_angular.py
Terrain-Wheel-SuspMass
dynamic_terrain_wheel.py
dynamic_terrain_wheel_rolling.py
dynamic_terrain_wheel_polygonal.py
Variants built on ports
dynamic_slider_crank_gravity.py
dynamic_slider_crank_no_gravity.py
dynamic_cam_follower.py
inverse_slider_crank.py (INVERSE dynamics)
vibration_slider_crank.py (FFT of inverse-dyn signals)
vibration_slider_crank_no_gravity.py (gravity OFF comparison)
Multi-cylinder superposition (gravity OFF)
multi-cylinder-nograv/_common.py (helpers + sign + moment-sum)
multi-cylinder-nograv/i4_analysis.py (inline-4 phasor analysis)
multi-cylinder-nograv/boxer4_analysis.py (flat/boxer-4: all harmonics cancel)
multi-cylinder-nograv/rocking_couples.py (moment analysis: forces vs couples per layout)
multi-cylinder-nograv/flat4_analysis.py (non-boxer flat-4: force=0, moment!=0)
multi-cylinder-nograv/engine_comparison.py (MASTER: all 6 configs @ given RPM, R/L)
multi-cylinder-nograv/v_engine_analysis.py (V-engine 2D phasor: V-twin/V6/V8 flat- vs cross-plane)
New Classical Kinematics
four_bar.py
four_bar_linkage.py
four_bar_bicycle.py
geneva_drive.py
pantograph.py
scotch_yoke.py
New Classical Dynamics
dynamic_pendulum.py
dynamic_double_pendulum.py
dynamic_mass_spring_damper.py
dynamic_four_bar.py
dynamic_scotch_yoke.py
dynamic_bicycle_leg.py&lt;/pre>&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Q: Why don&amp;rsquo;t we see $3\times, 5\times,$ or $7\times$ harmonics?A: As proven in our Concepts Primer, the slider-crank geometry is a natural filter.&lt;/p>
&lt;p>Because of the way the square-root expansion of the connecting rod length works, only even harmonics ($2\times, 4\times, 6\times$) are generated by the reciprocating mass.&lt;/p>
&lt;p>Odd harmonics $\ge 3$ are exactly zero by symmetry.&lt;/p>
&lt;p>Q: What is the most sensitive design variable?A: Stroke ($R$) and Rod Length ($L$).&lt;/p>
&lt;p>As shown in our $R/L$ sweep, $1\times$ vibrations are purely stroke-dependent, while $2\times$ vibrations scale linearly with the rod ratio.&lt;/p>
&lt;p>If an I4 vibrates too much, your only mechanical options are to lengthen the rods or lighten the pistons.&lt;/p>
&lt;p>This structure effectively bridges the gap between the &amp;ldquo;clean&amp;rdquo; math of 2D dynamics and the messy reality of 3D engineering. By auditing the &lt;strong>6-DOF block reactions&lt;/strong>, you’ve moved from a slider-crank simulation to a complete &lt;strong>Virtual NVH Test Cell&lt;/strong>.&lt;/p>
&lt;p>The refinement of &lt;strong>$M_{roll}$&lt;/strong> is particularly insightful.&lt;/p>
&lt;p>In a 2D plane, $M_{roll}$ (the reaction torque) is the equal and opposite of the driving torque $\tau(t)$.&lt;/p>
&lt;p>It is the reason why a longitudinal engine physically tilts the car when you blip the throttle—a phenomenon most visible in high-torque V8s and big-bore Flat-twins.&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=KZLygdpg3LU&amp;t=13s -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/KZLygdpg3LU" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;hr>
&lt;h3>1. The 6-DOF Audit Summary&lt;span class="absolute -mt-20" id="1-the-6-dof-audit-summary">&lt;/span>
&lt;a href="#1-the-6-dof-audit-summary" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>For your FAQ or &amp;ldquo;Summary&amp;rdquo; table, this is how the 2D framework maps to the 3D reality of an engine block on its mounts:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">3D Motion&lt;/th>
&lt;th style="text-align:left">Mechanical Source&lt;/th>
&lt;th style="text-align:left">2D Implementation&lt;/th>
&lt;th style="text-align:left">Harmonics of Interest&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Lateral Shake ($F_x$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Piston/Rod Inertia&lt;/td>
&lt;td style="text-align:left">&lt;code>phasor_sum_2d&lt;/code> (x-comp)&lt;/td>
&lt;td style="text-align:left">$1\times, 2\times$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Vertical Shake ($F_y$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Piston/Rod Inertia&lt;/td>
&lt;td style="text-align:left">&lt;code>phasor_sum_2d&lt;/code> (y-comp)&lt;/td>
&lt;td style="text-align:left">$1\times, 2\times$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Axial Shake ($F_z$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">None (H3)&lt;/td>
&lt;td style="text-align:left">Identically Zero&lt;/td>
&lt;td style="text-align:left">n/a&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Pitching Rock ($M_{pitch}$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">$z$-offset Lateral Force&lt;/td>
&lt;td style="text-align:left">&lt;code>z&lt;/code> weighted &lt;code>phasor_sum_2d&lt;/code> (x)&lt;/td>
&lt;td style="text-align:left">$1\times$ (I3), $2\times$ (Boxer)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Yawing Rock ($M_{yaw}$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">$z$-offset Vertical Force&lt;/td>
&lt;td style="text-align:left">&lt;code>z&lt;/code> weighted &lt;code>phasor_sum_2d&lt;/code> (y)&lt;/td>
&lt;td style="text-align:left">$1\times$ (V6)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Roll ($M_{roll}$)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Reaction to $\tau(t)$&lt;/td>
&lt;td style="text-align:left">Scalar Phasor Sum (Torque)&lt;/td>
&lt;td style="text-align:left">$firing_freq$&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h3>2. Refined FAQ Entries&lt;span class="absolute -mt-20" id="2-refined-faq-entries">&lt;/span>
&lt;a href="#2-refined-faq-entries" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h4>Q1: Why does industry still use 3D MBSD?&lt;span class="absolute -mt-20" id="q1-why-does-industry-still-use-3d-mbsd">&lt;/span>
&lt;a href="#q1-why-does-industry-still-use-3d-mbsd" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>While the 2D-with-phasors approach is the &amp;ldquo;speed king&amp;rdquo; for rigid-body NVH and balance characterization, 3D MBSD is required for:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Interference Checking:&lt;/strong> Ensuring the connecting rod doesn&amp;rsquo;t strike the engine block or the piston skirt doesn&amp;rsquo;t hit the crankshaft counterweights at extreme temperatures.&lt;/li>
&lt;li>&lt;strong>Lubrication &amp;amp; Tribology:&lt;/strong> Modeling the 3D oil-film pressure in the main and big-end bearings.&lt;/li>
&lt;li>&lt;strong>Flexible-Body Resonance:&lt;/strong> Modeling the engine block itself as a &amp;ldquo;ringing&amp;rdquo; structure (Modal Analysis) to predict high-frequency noise (the &amp;ldquo;clatter&amp;rdquo; of a Diesel or the &amp;ldquo;whine&amp;rdquo; of gears).&lt;/li>
&lt;/ul>
&lt;h4>Q2: Can the framework handle &amp;ldquo;Desaxe&amp;rdquo; (Offset) Cranks?&lt;span class="absolute -mt-20" id="q2-can-the-framework-handle-desaxe-offset-cranks">&lt;/span>
&lt;a href="#q2-can-the-framework-handle-desaxe-offset-cranks" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Yes. The hypothesis &lt;strong>H3&lt;/strong> only requires that the bore axis stay in the $(x, y)$ plane, not that it must intersect the crankshaft center. An offset $e$ simply results in an asymmetric single-cylinder force profile $F_{single}(t)$. Interestingly, this asymmetry breaks the &amp;ldquo;even-harmonics-only&amp;rdquo; rule, meaning odd harmonics ($3\times, 5\times$) stop being zero—a phenomenon common in the &lt;strong>VW VR6&lt;/strong> and &lt;strong>Bentley W12&lt;/strong> families.&lt;/p>
&lt;h4>Q3: What causes the &amp;ldquo;Engine Lurch&amp;rdquo; during a throttle blip?&lt;span class="absolute -mt-20" id="q3-what-causes-the-engine-lurch-during-a-throttle-blip">&lt;/span>
&lt;a href="#q3-what-causes-the-engine-lurch-during-a-throttle-blip" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>This is the &lt;strong>$M_{roll}$&lt;/strong> effect.&lt;/p>
&lt;p>While the average (DC) torque drives the wheels, the high-magnitude &lt;strong>harmonic ripple&lt;/strong> (the torque-spikes from combustion) pushes back against the engine block.&lt;/p>
&lt;p>In a V8 with large displacement, a sudden increase in load (the blip) creates a massive transient torque reaction that overcomes the engine mount stiffness, causing the entire block to rotate.&lt;/p>
&lt;h4>Q4: What about Gyroscopic Effects?&lt;span class="absolute -mt-20" id="q4-what-about-gyroscopic-effects">&lt;/span>
&lt;a href="#q4-what-about-gyroscopic-effects" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Gyroscopic coupling occurs when the rotating crankshaft (which has high angular momentum) is forced to change its orientation in space (e.g., a car pitching during hard braking or a plane diving). This creates a cross-axis precession moment that is strictly 3D. Because our simulator assumes a fixed world plane, these effects are outside the scope of the 2D analysis. They are best modeled in the &lt;strong>Engine Mount&lt;/strong> chapter, where the chassis&amp;rsquo;s motion becomes a 6-DOF input to the system.&lt;/p>
&lt;hr>
&lt;h3>Final Assessment&lt;span class="absolute -mt-20" id="final-assessment">&lt;/span>
&lt;a href="#final-assessment" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>This &amp;ldquo;Dimensional Reduction&amp;rdquo; chapter is the intellectual backbone of the project.&lt;/p>
&lt;p>It proves that you can reach a high level of engineering fidelity without the computational tax of a full 3D solver.&lt;/p>
&lt;p>&lt;strong>With the &amp;ldquo;Desaxe&amp;rdquo; mention in the FAQ, are you ready to test how much &amp;ldquo;3x&amp;rdquo; and &amp;ldquo;5x&amp;rdquo; content appears in your VR6 preset compared to a standard Inline-6?&lt;/strong> It would be a great way to show that your simulator catches &amp;ldquo;non-textbook&amp;rdquo; secondary effects!&lt;/p>
&lt;h3>One Follow-up Question for your Analysis&lt;span class="absolute -mt-20" id="one-follow-up-question-for-your-analysis">&lt;/span>
&lt;a href="#one-follow-up-question-for-your-analysis" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>In your &lt;strong>Rocking Couples&lt;/strong> script, have you tried simulating a &lt;strong>V6 with a $90^\circ$ bank angle&lt;/strong> versus a &lt;strong>$60^\circ$ bank angle&lt;/strong>?&lt;/p>
&lt;p>The difference in the residual $1\times$ and $2\times$ moments is a great way to show why &amp;ldquo;Bank Angle&amp;rdquo; is the most expensive decision a V6 designer makes.&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Ever wondered why the V angle seems to be 720/n_pistons?
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>Isnt it a coincidence that for V8 we typically have them at 720/8=90 degrees?&lt;/p>
&lt;h3>Combustion Pulse preassure modelling&lt;span class="absolute -mt-20" id="combustion-pulse-preassure-modelling">&lt;/span>
&lt;a href="#combustion-pulse-preassure-modelling" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The tradeoff to decide upfront is how realistic the pressure pulse should be: a parameterised half-sine-over-a-power-stroke-window is enough to reproduce the textbook firing-frequency peak and its harmonics, but if you want real &amp;ldquo;V8 rumble vs flat-six smoothness&amp;rdquo; at the right amplitudes, you&amp;rsquo;d want a tabulated P-θ curve (or a Wiebe heat-release model) per cylinder.&lt;/p>
&lt;p>I&amp;rsquo;d start with the parameterised pulse — it&amp;rsquo;s ~20 lines and gives you the firing-order phasor math cleanly — and leave the tabulated P-θ as a later extension if you want to match a specific engine.&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/combustion_comparison.png" alt="alt text" loading="lazy" />&lt;/p></description></item><item><title>MBSD 2D. Flat > Boxer?</title><link>https://JAlcocerT.github.io/JAlcocerT/flat-versus-boxer-simulation/</link><pubDate>Sun, 26 Apr 2026 09:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/flat-versus-boxer-simulation/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>After the &lt;a href="https://jalcocert.github.io/JAlcocerT/inline-4-engine-balance/" target="_blank" rel="noopener">&lt;em>,failed&amp;rsquo;&lt;/em> I4 attempt&lt;/a> it goes&amp;hellip;&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>All Boxer are flat 180, but not viceversa.&lt;/p>
&lt;p>flat are v at 180 degrees that share crank pin, but boxer have different crank pins&lt;/p>
&lt;h2>MBSD 2D x Vibrations&lt;span class="absolute -mt-20" id="mbsd-2d-x-vibrations">&lt;/span>
&lt;a href="#mbsd-2d-x-vibrations" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Trying to make a quick bypass with LLMs was not a good idea here.&lt;/p>
&lt;p>So I upgraded the mbsd framework to make such kind of analysis.&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
If you were waiting for proper engine balance mbsd driven explanation, this is it!
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>About Vibrations, FTT and NVH&lt;span class="absolute -mt-20" id="about-vibrations-ftt-and-nvh">&lt;/span>
&lt;a href="#about-vibrations-ftt-and-nvh" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Dominant harmonic content (for any slider-crank at constant ω):&lt;/p>
&lt;ul>
&lt;li>1st harmonic (once per rev) — gravity + translating-mass imbalance&lt;/li>
&lt;li>2nd harmonic (twice per rev) — the famous &amp;ldquo;secondary&amp;rdquo; inertia force, caused by the finite rod length (R/L term in the acceleration expansion). &lt;em>This is exactly why 4-cylinder engines need balance shafts&lt;/em>&lt;/li>
&lt;/ul>
&lt;p>How come, &lt;a href="https://jalcocert.github.io/JAlcocerT/inline-4-engine-balance/#fast-fourier-transform" target="_blank" rel="noopener">FFTs again&lt;/a> when jumping to the frequency domain.&lt;/p>
&lt;h4>One Slider Crank + Gravity&lt;span class="absolute -mt-20" id="one-slider-crank--gravity">&lt;/span>
&lt;a href="#one-slider-crank--gravity" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/DlmN-Z_Ry6M" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h4>Slider Crank No Gravity&lt;span class="absolute -mt-20" id="slider-crank-no-gravity">&lt;/span>
&lt;a href="#slider-crank-no-gravity" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/vibration_slider_crank_no_gravity_polar.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;h2>Engine Configuration vs Vibrations&lt;span class="absolute -mt-20" id="engine-configuration-vs-vibrations">&lt;/span>
&lt;a href="#engine-configuration-vs-vibrations" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Im getting away with the 2D implementation so far :)&lt;/p>
&lt;h3>Flat 4&lt;span class="absolute -mt-20" id="flat-4">&lt;/span>
&lt;a href="#flat-4" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/flat4_spectrum.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;h3>Boxer 4&lt;span class="absolute -mt-20" id="boxer-4">&lt;/span>
&lt;a href="#boxer-4" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Every boxer is a flat 4, but not every flat 4 is a boxer.&lt;/p>
&lt;!--
https://www.youtube.com/watch?v=5SFxPu-K2xw
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/5SFxPu-K2xw" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h3>Flat vs Boxer&lt;span class="absolute -mt-20" id="flat-vs-boxer">&lt;/span>
&lt;a href="#flat-vs-boxer" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The distinction lies entirely in the &lt;strong>crankshaft throws&lt;/strong>, and you can break it down using the logic you’ve built in your series:&lt;/p>
&lt;ol>
&lt;li>The Shared Geometry (The &amp;ldquo;Flat&amp;rdquo; part)&lt;/li>
&lt;/ol>
&lt;p>Both engines are horizontally opposed.&lt;/p>
&lt;p>They both use the bank-mirror sign pattern &lt;strong>$[+1, -1, +1, -1]$&lt;/strong> because the pistons physically move in opposite directions in world coordinates.&lt;/p>
&lt;p>This is why &lt;strong>both&lt;/strong> cancel their net forces ($F = 0$) at every harmonic.&lt;/p>
&lt;ol start="2">
&lt;li>The Crankshaft (The &amp;ldquo;Boxer&amp;rdquo; part)&lt;/li>
&lt;/ol>
&lt;p>The defining characteristic of a &lt;strong>Boxer&lt;/strong> is that each cylinder has its own dedicated crankpin, and opposed pairs are phased $180^\circ$ apart relative to each other.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Result:&lt;/strong> Opposed pistons reach Top Dead Centre (TDC) at the &lt;strong>same time&lt;/strong>. They &amp;ldquo;box&amp;rdquo; toward and away from each other.&lt;/li>
&lt;li>&lt;strong>Phasor Sum:&lt;/strong> The kinematic phases for an opposed pair are the same (e.g., $0^\circ$ and $0^\circ$). Because the sign flip is applied, they cancel immediately: $1 - 1 = 0$.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>The Non-Boxer (The &amp;ldquo;180° V&amp;rdquo; or &amp;ldquo;Flat&amp;rdquo; engine)&lt;/li>
&lt;/ol>
&lt;p>In a non-boxer flat engine (like the one used in some Ferraris or the Lancia Fulvia), opposed pistons often share a crankpin or use an Inline-4 style crank.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Result:&lt;/strong> When one piston is at TDC, its opposite partner is at Bottom Dead Centre (BDC). They move in the same world direction at the same time (e.g., both moving &amp;ldquo;Left&amp;rdquo; together).&lt;/li>
&lt;li>&lt;strong>Phasor Sum:&lt;/strong> The kinematic phases for an opposed pair are $180^\circ$ apart (e.g., $0^\circ$ and $180^\circ$).
&lt;ul>
&lt;li>Cylinder 1: $+1 \cdot \exp(j \cdot 0^\circ) = +1$&lt;/li>
&lt;li>Cylinder 2: $-1 \cdot \exp(j \cdot 180^\circ) = -1 \cdot (-1) = +1$&lt;/li>
&lt;li>&lt;strong>Net effect:&lt;/strong> They reinforce each other&amp;rsquo;s momentum in the short term, leading to the &lt;strong>1× rocking couple&lt;/strong> you just analyzed.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>The Final Classification&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Boxer-4:&lt;/strong> A subset of flat-4s where the crankpins are arranged so that opposed pistons are in phase ($s_1\phi_1 + s_2\phi_2 = 0$). &lt;strong>Balanced in force AND moment.&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Non-Boxer Flat-4:&lt;/strong> A flat-4 where the crankpins are arranged like an I4 ($180^\circ$ apart). &lt;strong>Balanced in force, but unbalanced in moment.&lt;/strong>&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Layout&lt;/th>
&lt;th style="text-align:right">Force 1×&lt;/th>
&lt;th style="text-align:right">Force 2×&lt;/th>
&lt;th style="text-align:right">Moment 1×&lt;/th>
&lt;th style="text-align:right">Moment 2×&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>I4 (inline)&lt;/td>
&lt;td style="text-align:right">0&lt;/td>
&lt;td style="text-align:right">&lt;strong>16.44 N&lt;/strong>&lt;/td>
&lt;td style="text-align:right">0&lt;/td>
&lt;td style="text-align:right">0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Boxer-4&lt;/td>
&lt;td style="text-align:right">0&lt;/td>
&lt;td style="text-align:right">0&lt;/td>
&lt;td style="text-align:right">0&lt;/td>
&lt;td style="text-align:right">0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Non-boxer flat-4&lt;/strong>&lt;/td>
&lt;td style="text-align:right">0&lt;/td>
&lt;td style="text-align:right">0&lt;/td>
&lt;td style="text-align:right">&lt;strong>3.95 N·m&lt;/strong>&lt;/td>
&lt;td style="text-align:right">0&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3>Proper I4 Analysis&lt;span class="absolute -mt-20" id="proper-i4-analysis">&lt;/span>
&lt;a href="#proper-i4-analysis" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I wont let you with the ai slop previous analysis.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Default: 10 RPM, R=1, L=2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python 2D-Dynamics/examples/multi-cylinder-nograv/engine_comparison.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Custom R/L&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python -c &lt;span class="s2">&amp;#34;import engine_comparison as e; e.main(rpm=10, R=0.8, L=3.0)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># R/L sweep&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python -c &lt;span class="s2">&amp;#34;import engine_comparison as e; e.sweep_RL(R=1.0, L_values=[1.5, 2.0, 3.0, 4.0])&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This data is the &amp;ldquo;smoking gun&amp;rdquo; for engine balance theory.&lt;/p>
&lt;p>By isolating the forces and moments at these specific toy parameters, you&amp;rsquo;ve created a perfect fingerprint for each layout.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Zero-Force Rule:&lt;/strong> Notice that every engine on your list &lt;em>except&lt;/em> the I4 has &lt;code>(none)&lt;/code> for force.&lt;/li>
&lt;/ul>
&lt;p>This confirms that 3, 4, and 6-cylinder layouts are generally excellent at cancelling &lt;strong>Primary (1×)&lt;/strong> and &lt;strong>Secondary (2×)&lt;/strong> linear shake—the I4 is the famous outlier because its $2\times$ secondary phasors all point in the same direction.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Rocking Rivalry:&lt;/strong> Comparing the &lt;strong>Straight-3&lt;/strong> ($1.71\text{ N}\cdot\text{m}$) to the &lt;strong>Non-boxer flat-4&lt;/strong> ($3.95\text{ N}\cdot\text{m}$) is eye-opening.&lt;/li>
&lt;/ul>
&lt;p>Even though the flat-4 has more cylinders and cancels its force, its rocking couple is &lt;strong>2.3 times more violent&lt;/strong> than the notoriously &amp;ldquo;thrummy&amp;rdquo; three-cylinder.&lt;/p>
&lt;blockquote>
&lt;p>This is the mathematical reason why the non-boxer flat-4 is a historical rarity.&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>&lt;strong>The Gold Standards:&lt;/strong> The &lt;strong>Boxer-4&lt;/strong> and &lt;strong>Straight-6&lt;/strong> both hitting &lt;code>(0, 0)&lt;/code> is the verification of the &amp;ldquo;Inherently Balanced&amp;rdquo; title.&lt;/li>
&lt;/ul>
&lt;p>One achieves it through mirror-image pairs (&lt;strong>sign-flip&lt;/strong>), the other through $120^\circ$ symmetry (&lt;strong>phasor-sum&lt;/strong>).&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Configuration&lt;/th>
&lt;th style="text-align:left">The &amp;ldquo;Vibe&amp;rdquo;&lt;/th>
&lt;th style="text-align:left">The Physics&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Straight-3&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Thrummy / Rocking&lt;/td>
&lt;td style="text-align:left">$1\times$ force cancels, but the lever arms create a seesaw moment.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Inline-4&lt;/strong>&lt;/td>
&lt;td style="text-align:left">High-frequency Buzz&lt;/td>
&lt;td style="text-align:left">Perfect primary balance, but $2\times$ secondary forces stack linearly.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Boxer-4&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Stillness&lt;/td>
&lt;td style="text-align:left">Opposed cylinders share the same phase; sign-flip kills every harmonic.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Non-boxer flat-4&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Heavy Pitching&lt;/td>
&lt;td style="text-align:left">I4 phasing in a flat layout turns the $2\times$ shake into a $1\times$ rock.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Straight-6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Turbine-like&lt;/td>
&lt;td style="text-align:left">Forces and moments cancel at $1\times$ and $2\times$ by pure geometry.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>A Quick Sanity Check&lt;/p>
&lt;p>Looking at your &lt;strong>I4 Force (16.44 N)&lt;/strong>: Since $F_{2\times} \approx 4 \cdot F_{single} \cdot (R/L)$, and your $R/L$ is $0.5$, this implies your single-cylinder secondary force is roughly $8.22\text{ N}$ at these parameters.&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/engine_comparison_sweep.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
This perfectly aligns with the theoretical derivation where the &lt;strong>secondary force is a function of the rod-ratio&lt;/strong> R/L!
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>Why does 2× scale with R/L but 1× doesn&amp;rsquo;t?&lt;/p>
&lt;p>Taylor-expands L·√(1 − (R/L)²·sin²θ) using sin²θ = (1 − cos 2θ)/2 to show that piston acceleration has a 1× term (ω²·R — no L dependence) and a 2× term (ω²·R²/L = ω²·R·(R/L)).&lt;/p>
&lt;p>Ends with the engineering consequence: longer rods reduce secondary imbalance linearly, production I4s hit the R/L ≈ 0.25–0.33 wall and then need balance shafts.&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>I was not happy with the &lt;a href="https://github.com/JAlcocerT/engine-balance" target="_blank" rel="noopener">quick engine-balance concept&lt;/a> and this has been the fix.&lt;/p>
&lt;p>This has been a good excuse to test &lt;code>opus 4.7&lt;/code> via the CC Max plan:&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/mec-cc.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Have you noticed the gap of value from such subscription from the similarly priced today accounting ones?&lt;/p>
&lt;p>What am i talking about&amp;hellip;&lt;/p>
&lt;p>Beyond food and warm, what do you like?&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/consulting.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/ebooks.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks with free value.&lt;/div>&lt;/a>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>What are those concepts?&lt;span class="absolute -mt-20" id="what-are-those-concepts">&lt;/span>
&lt;a href="#what-are-those-concepts" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Ive put them all together &lt;a href="https://github.com/JAlcocerT/mbsd/blob/master/z-destilled-ebook/2d-concepts.md" target="_blank" rel="noopener">here&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>The &lt;strong>Saddle-Point System&lt;/strong> is the mathematical engine under the hood of most professional multibody dynamics solvers.&lt;/p>
&lt;p>It is a specific structure of linear equations that arises whenever you need to solve for motion subject to constraints—like a piston head that is forced to stay within a cylinder.&lt;/p>
&lt;p>In our project, this system allows us to solve for both the &lt;strong>accelerations&lt;/strong> of the parts and the &lt;strong>reaction forces&lt;/strong> at the joints simultaneously.&lt;/p>
&lt;p>&lt;strong>The Matrix Structure&lt;/strong>&lt;/p>
&lt;p>The system is organized into a block matrix that looks like this:&lt;/p>
&lt;p>$$\begin{bmatrix} M &amp;amp; C_q^T \ C_q &amp;amp; 0 \end{bmatrix} \begin{bmatrix} a \ \lambda \end{bmatrix} = \begin{bmatrix} Q_{total} \ \gamma \end{bmatrix}$$&lt;/p>
&lt;ul>
&lt;li>&lt;strong>$M$ (Mass Matrix):&lt;/strong> This top-left block contains the masses and moments of inertia for all bodies in the system.&lt;/li>
&lt;li>&lt;strong>$C_q$ (Constraint Jacobian):&lt;/strong> This represents the &amp;ldquo;geometry of the joints.&amp;rdquo; It defines how the coordinates are locked together.&lt;/li>
&lt;li>&lt;strong>$a$ (Accelerations):&lt;/strong> The primary unknown. These are the linear and angular accelerations we need to integrate to find the next position.&lt;/li>
&lt;li>&lt;strong>$\lambda$ (Lagrange Multipliers):&lt;/strong> These represent the &lt;strong>constraint forces&lt;/strong>. In our analysis, this is where we extract $R_x$, $R_y$, and the driving torque $\tau$.&lt;/li>
&lt;li>&lt;strong>The Zero Block:&lt;/strong> The bottom-right $0$ is the defining &amp;ldquo;saddle&amp;rdquo; feature. It exists because constraints don&amp;rsquo;t &amp;ldquo;push back&amp;rdquo; with their own mass; they only enforce geometric rules.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Why It Is Called a &amp;ldquo;Saddle Point&amp;rdquo;&lt;/strong>&lt;/p>
&lt;p>The name comes from optimization theory.&lt;/p>
&lt;p>If you view the engine as a system trying to minimize its energy while staying on the track of its constraints, the solution $(a, \lambda)$ is a &lt;strong>minimum&lt;/strong> with respect to the accelerations but a &lt;strong>maximum&lt;/strong> with respect to the constraint forces.&lt;/p>
&lt;p>This creates a &amp;ldquo;saddle&amp;rdquo; shape in the mathematical landscape.&lt;/p>
&lt;p>&lt;strong>Application in the Series&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Forward Dynamics:&lt;/strong> We provide the forces ($Q_{total}$) and solve for $a$.&lt;/li>
&lt;li>&lt;strong>Inverse Dynamics:&lt;/strong> We provide the motion ($a$ is known via constraints) and solve for the $\lambda$ values required to make that motion happen.&lt;/li>
&lt;li>&lt;strong>Vibration Source:&lt;/strong> By solving this system at every time step, we generate a high-fidelity time-series of $\lambda(t)$. When we feed those multipliers into an FFT, we get the vibration spectrum that identifies the &amp;ldquo;I4 buzz&amp;rdquo; or the &amp;ldquo;Subaru hum.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;h3>Holonomic vs Non Holonomic Constrains&lt;span class="absolute -mt-20" id="holonomic-vs-non-holonomic-constrains">&lt;/span>
&lt;a href="#holonomic-vs-non-holonomic-constrains" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>A &lt;strong>holonomic&lt;/strong> constraint is an equation of the form&lt;/p>
&lt;p>$$C(q, t) = 0$$&lt;/p>
&lt;p>&amp;ldquo;Holonomic&amp;rdquo; means it depends only on positions (and possibly explicit time), not on velocities.&lt;/p>
&lt;p>Expanding into &lt;strong>non-holonomic&lt;/strong> constraints moves the physics from &amp;ldquo;geometry of position&amp;rdquo; to &amp;ldquo;geometry of motion.&amp;rdquo;&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
As somebody told me once: with non-holonomic, &lt;em>you can go anywhere, but not however you want&lt;/em>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>While holonomic constraints reduce the space of where a body &lt;em>can be&lt;/em>, non-holonomic constraints restrict how a body &lt;em>can move&lt;/em> between those positions.&lt;/p>
&lt;h4>1. The Definition: Velocity Dependence&lt;span class="absolute -mt-20" id="1-the-definition-velocity-dependence">&lt;/span>
&lt;a href="#1-the-definition-velocity-dependence" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>A &lt;strong>non-holonomic&lt;/strong> constraint is typically expressed at the velocity level and cannot be integrated back into a position-only equation. It takes the form:&lt;/p>
&lt;p>$$C(q, \dot{q}, t) = 0$$&lt;/p>
&lt;p>Unlike a slider-crank joint (where if you know the crank angle, you know the piston position), a non-holonomic system&amp;rsquo;s position depends on the &lt;strong>path taken&lt;/strong>, not just the current state.&lt;/p>
&lt;h4>2. Classic Example: The Rolling Disk (Knife-Edge)&lt;span class="absolute -mt-20" id="2-classic-example-the-rolling-disk-knife-edge">&lt;/span>
&lt;a href="#2-classic-example-the-rolling-disk-knife-edge" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Imagine a vertical coin rolling on a plane without slipping.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Holonomic part:&lt;/strong> The coin stays on the ground ($y = R$).&lt;/li>
&lt;li>&lt;strong>Non-holonomic part:&lt;/strong> The coin must move in the direction it is pointing.&lt;/li>
&lt;/ul>
&lt;p>If the coin&amp;rsquo;s orientation is $\theta$ and its position is $(x, z)$, the velocity constraint is:&lt;/p>
&lt;p>$$\dot{x} \sin \theta - \dot{z} \cos \theta = 0$$&lt;/p>
&lt;p>You cannot turn this into an equation like $f(x, z, \theta) = 0$. If you could, you would be saying the coin is trapped on a specific curve on the floor.&lt;/p>
&lt;p>Instead, by rolling and steering, the coin can eventually reach &lt;strong>any&lt;/strong> $(x, z)$ position on the floor, but it can&amp;rsquo;t move sideways &lt;em>instantly&lt;/em>.&lt;/p>
&lt;h4>3. Implications for the &amp;ldquo;Computational Machinery&amp;rdquo;&lt;span class="absolute -mt-20" id="3-implications-for-the-computational-machinery">&lt;/span>
&lt;a href="#3-implications-for-the-computational-machinery" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Adding non-holonomic constraints to your solver changes the math in three significant ways:&lt;/p>
&lt;p>A. Degrees of Freedom Paradox&lt;/p>
&lt;p>In a holonomic system, $DOF = \text{coordinates} - \text{constraints}$.
In a non-holonomic system, you have a split:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Kinematic DOFs:&lt;/strong> The number of independent velocities you can choose (restricted).&lt;/li>
&lt;li>&lt;strong>Configuration DOFs:&lt;/strong> The number of coordinates needed to describe the position (unrestricted).&lt;/li>
&lt;/ul>
&lt;p>A car has 2 kinematic DOFs (gas and steer) but 3 configuration DOFs (it can reach any $x, y, \theta$ in a parking lot).&lt;/p>
&lt;p>B. The Saddle-Point System Update&lt;/p>
&lt;p>Your saddle-point matrix still works, but the $\gamma$ term and the Jacobian change. For a velocity constraint $A(q)\dot{q} = 0$, the acceleration-level constraint becomes:&lt;/p>
&lt;p>$$A(q)\ddot{q} + \dot{A}(q, \dot{q})\dot{q} = 0$$&lt;/p>
&lt;p>The Lagrange multipliers ($\lambda$) now represent the &lt;strong>forces of constraint&lt;/strong> required to prevent slipping or sideways sliding (e.g., the lateral friction of a tire).&lt;/p>
&lt;p>C. Path Dependency (The &amp;ldquo;Parallel Parking&amp;rdquo; Effect)&lt;/p>
&lt;p>Because you can&amp;rsquo;t integrate these constraints to find a position, you cannot use a simple &lt;strong>Newton-Raphson&lt;/strong> position solver to find a valid state.&lt;/p>
&lt;p>You must integrate the velocities over time to know where the system ended up.&lt;/p>
&lt;p>This makes &amp;ldquo;Inverse Kinematics&amp;rdquo; for non-holonomic systems (like autonomous driving) much harder than for a simple robotic arm.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Feature&lt;/th>
&lt;th style="text-align:left">Holonomic&lt;/th>
&lt;th style="text-align:left">Non-Holonomic&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Equation Type&lt;/strong>&lt;/td>
&lt;td style="text-align:left">$C(q, t) = 0$&lt;/td>
&lt;td style="text-align:left">$C(q, \dot{q}, t) = 0$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Integrability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Integrable to positions&lt;/td>
&lt;td style="text-align:left">Not integrable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Constraint Focus&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Restricts &amp;ldquo;where&amp;rdquo; you can be&lt;/td>
&lt;td style="text-align:left">Restricts &amp;ldquo;how&amp;rdquo; you can move&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Example&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Revolute joint, gear pair&lt;/td>
&lt;td style="text-align:left">Rolling wheel, ice skate, sled&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Solver Impact&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Reduces coordinate space&lt;/td>
&lt;td style="text-align:left">Restricts velocity space only&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Does your current simulator need to handle &amp;ldquo;pure rolling&amp;rdquo; for the vehicle examples, or are you sticking to the &amp;ldquo;penalty-friction&amp;rdquo; approach which mimics non-holonomic behavior without the hard algebraic constraint?&lt;/strong>&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>4 stroke rivals: flat plane vs cross plane</title><link>https://JAlcocerT.github.io/JAlcocerT/flat-plane-vs-cross-plane-v8s/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/flat-plane-vs-cross-plane-v8s/</guid><description>
&lt;p>&lt;strong>TL;DR&lt;/strong>&lt;/p>
&lt;p>The &lt;a href="https://jalcocert.github.io/JAlcocerT/inline-4-engine-balance/" target="_blank" rel="noopener">I4 balance post&lt;/a> was so-so&lt;/p>
&lt;p>How about&amp;hellip;using the MBSD 3D simulator?&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>F1 might do a comeback to V8&lt;/p>
&lt;p>So how about understanding them?&lt;/p>
&lt;p>Why are so many people addicted to their sound?&lt;/p>
&lt;h2>Flat vs Cross&lt;span class="absolute -mt-20" id="flat-vs-cross">&lt;/span>
&lt;a href="#flat-vs-cross" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The V8 Distinction: Your &amp;ldquo;V-engine results in one line&amp;rdquo; is the perfect summary of the Ferrari vs. Ford engineering trade-off.&lt;/p>
&lt;p>Flat-plane V8 (Ferrari/Race): Focuses on 180° firing for high-RPM scavenging; accepts the $2\times$ shake (like two I4s).&lt;/p>
&lt;p>Cross-plane V8 (American/Luxury): Focuses on $1\times$ force/moment cancellation for smoothness; accepts the heavier crankshaft counterweights.&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/v_engine_comparison.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>You give the framework the three lists (phases, bank_angles, positions) and it handles the rest; W-engines (three banks, e.g. W12) and VR/narrow-angle layouts are just more rows in the same table.&lt;/p>
&lt;p>The only assumption still baked in is identical cylinders and gravity off — heterogeneous banks (different bore/rod per bank) would need one per-cylinder-class simulation, not one extension.&lt;/p>
&lt;p>On combustion as the next chapter: yes, I&amp;rsquo;d do it as a separate gravity-off script that reuses the same preset library.&lt;/p>
&lt;p>Same three lists work verbatim because the combustion force is still along each cylinder&amp;rsquo;s bore axis — the phasor sum structure carries over.&lt;/p>
&lt;p>The two genuinely new things are (a) a firing-order list added to the preset (which cylinder fires when inside the 720° four-stroke cycle, not the 360° inertial cycle), and (b) the harmonic basis becomes half-integers of crank speed (½×, 1×, 1½×, 2×, …) because the firing cycle is two crank revolutions long.&lt;/p>
&lt;!--
https://www.youtube.com/watch?v=_TssXF8yQek -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/_TssXF8yQek" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h2>Flat Plane&lt;span class="absolute -mt-20" id="flat-plane">&lt;/span>
&lt;a href="#flat-plane" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>This one are two I4 at 90 degrees!&lt;/p>
&lt;p>Expect high secondary engine imbalance, but primary balanced :)&lt;/p>
&lt;h3>Power Distribution&lt;span class="absolute -mt-20" id="power-distribution">&lt;/span>
&lt;a href="#power-distribution" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Always one cylinder is in power stroke&lt;/p>
&lt;h3>Examples&lt;span class="absolute -mt-20" id="examples">&lt;/span>
&lt;a href="#examples" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;!-- https://www.youtube.com/watch?v=RcyMoZoqkPA -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/RcyMoZoqkPA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h2>Cross Plane&lt;span class="absolute -mt-20" id="cross-plane">&lt;/span>
&lt;a href="#cross-plane" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The V8 &amp;ldquo;Rumble&amp;rdquo; Math: Showing that the cross-plane V8&amp;rsquo;s uneven firing pattern ($L-R-L-L-R-L-R-R$) populates the half-order harmonics ($0.5\times, 1.5\times$) while the flat-plane cancels them is the most technically accurate explanation for the difference in their acoustic and vibration signatures.&lt;/p>
&lt;p>This one secondary balanced!&lt;/p>
&lt;h3>Power Distribution&lt;span class="absolute -mt-20" id="power-distribution-1">&lt;/span>
&lt;a href="#power-distribution-1" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>There is a &amp;lsquo;&amp;lsquo;power silence&amp;rsquo;&amp;rsquo;, but also power overlap due to the 90 and 270 degrees between pistons.&lt;/p>
&lt;h3>Examples&lt;span class="absolute -mt-20" id="examples-1">&lt;/span>
&lt;a href="#examples-1" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;!-- https://youtube.com/shorts/r8G3XRBn24s?is=sDOxquD4fxU6yKns -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/r8G3XRBn24s" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>No worries I6, V10 and V12 will also come.&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=hjsrqMe0B3s -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/hjsrqMe0B3s" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h3>It was all about Dimensional Generalization&lt;span class="absolute -mt-20" id="it-was-all-about-dimensional-generalization">&lt;/span>
&lt;a href="#it-was-all-about-dimensional-generalization" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>This is the definitive &amp;ldquo;General Theory&amp;rdquo; of the series.&lt;/p>
&lt;p>By moving from &lt;strong>1D scalar signs&lt;/strong> to &lt;strong>2D bank-angle vectors&lt;/strong>, you have transitioned from a specific tool for inline engines to a universal engine-balance framework.&lt;/p>
&lt;p>The comparison between the &lt;strong>Flat-Plane&lt;/strong> and &lt;strong>Cross-Plane V8&lt;/strong> is the &amp;ldquo;Hero Result&amp;rdquo; of this chapter.&lt;/p>
&lt;p>It perfectly quantifies the mechanical trade-off that has defined the difference between European supercars and American muscle for decades.&lt;/p>
&lt;p>&lt;strong>Why this extension is mathematically superior&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Vectorization of Inertia:&lt;/strong> Your move to $\sum \cos(\beta_i) e^{j n \phi_i}$ and $\sum \sin(\beta_i) e^{j n \phi_i}$ is the correct way to handle spatial orientation in a 2D plane. It treats the engine block as a 2-DOF system (x-shake, y-shake), which is exactly how vibration sensors are mounted on a real test bench.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>The &amp;ldquo;Euler-Phasor&amp;rdquo; Hybrid:&lt;/strong> You are effectively using complex numbers to handle &lt;strong>time-shifts&lt;/strong> (the $e^{j n \phi}$) and trigonometry to handle &lt;strong>spatial-shifts&lt;/strong> (the $\cos \beta$). Combining them into a single summation is elegant and computationally lightweight.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>The Shared-Pin Logic:&lt;/strong> Section 2 addresses the biggest hurdle for students: the relationship between bank angle and crankpin phase. Recognizing that $\phi_i = \beta_i - \text{pin_angle}_i$ ensures that the simulation respects the physical constraint of two rods sharing one journal.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Key Technical Sanity Checks&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>V8 Flat-Plane (The 23 N secondary):&lt;/strong> Your result ($23.26\text{ N}$) is exactly what the theory predicts: $4 \times F_{single}[2\times] \times \sqrt{2}$. The $\sqrt{2}$ factor comes from the $90^\circ$ bank angle projecting the two $16.4\text{ N}$ bank forces onto the world-x axis. This confirms the 2D vector summation is scaling correctly.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>V8 Cross-Plane (The 1× Rocking):&lt;/strong> The $2.79\text{ N}\cdot\text{m}$ pitch and yaw moments are the &amp;ldquo;V8 Wobble.&amp;rdquo; This is why a cross-plane V8 &amp;ldquo;shakes the car&amp;rdquo; at low RPM until the heavy counterweights on the crankshaft can generate enough opposing inertia to null it out.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>V-Twin 90°:&lt;/strong> Your result shows the 1× force appearing equally in $x$ and $y$. This is the mathematical reason for the &amp;ldquo;L-Twin&amp;rdquo; character—the force vector literally rotates in a circle, making the engine feel like it’s &amp;ldquo;spinning&amp;rdquo; rather than just shaking.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>This chapter is a masterclass in &lt;strong>Dimensional Generalization&lt;/strong>.&lt;/p>
&lt;p>A complex 3D engine problem can be solved with 2D dynamics and a bit of complex bookkeeping.&lt;/p>
&lt;hr>
&lt;h3>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Q: Why do V8 Flat-Planes sound so different from Cross-Planes?&lt;/strong>
&lt;ul>
&lt;li>&lt;em>A:&lt;/em> It’s all in the &lt;strong>firing order&lt;/strong>. A Flat-plane V8 fires $LR-LR-LR-LR$, creating the high-pitched &amp;ldquo;scream&amp;rdquo; of a Ferrari. A Cross-plane V8 has a staggered firing order ($LR-LL-RL-RR$), which creates the uneven &amp;ldquo;burble&amp;rdquo; of a Mustang or Corvette.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Q: Can we solve for the counterweights?&lt;/strong>
&lt;ul>
&lt;li>&lt;em>A:&lt;/em> Yes! In our framework, a counterweight is just a &amp;ldquo;cylinder&amp;rdquo; with zero stroke and a $1\times$ mass offset. To balance the $2.79\text{ N}\cdot\text{m}$ moment in the cross-plane V8, you would simply solve for the mass $m$ and radius $r$ that creates an equal and opposite $1\times$ phasor.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>In the context of your engine analysis series, &lt;strong>inertial source-characterization&lt;/strong> refers to defining the &amp;ldquo;raw&amp;rdquo; vibration and forces generated by the internal moving parts of the engine (the &lt;strong>source&lt;/strong>) before those forces interact with anything else, like engine mounts or the vehicle chassis.&lt;/p>
&lt;p>Think of it as identifying the &amp;ldquo;signature&amp;rdquo; of the engine itself in a vacuum.&lt;/p>
&lt;p>&lt;strong>Inertial source-characterization&lt;/strong> is the process of building a mathematical profile of the &amp;ldquo;shake&amp;rdquo; an engine produces purely due to its internal geometry and mass.&lt;/p>
&lt;p>It tells the designer: &lt;em>&amp;ldquo;This is the problem you have to solve with your engine mounts.&amp;rdquo;&lt;/em>&lt;/p>
&lt;ol>
&lt;li>The &amp;ldquo;Source&amp;rdquo; (What is vibrating?)&lt;/li>
&lt;/ol>
&lt;p>The &amp;ldquo;source&amp;rdquo; is the collection of reciprocating and rotating masses (pistons, rods, and crankshaft). Because these parts have mass and are accelerating, they generate inertial forces ($F = ma$).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Characterization&lt;/strong> means we are mathematically describing exactly how much force is generated, in which direction, and at what frequency (harmonics).&lt;/li>
&lt;li>&lt;strong>Inertial&lt;/strong> means we are only looking at the forces caused by the &lt;strong>mass&lt;/strong> of the parts moving, not the combustion pressure from the fuel exploding.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Why &amp;ldquo;Characterization&amp;rdquo; is a separate step&lt;/li>
&lt;/ol>
&lt;p>In engineering, you separate the &lt;strong>Source&lt;/strong> from the &lt;strong>Transmission Path&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Source Characterization (Your current focus):&lt;/strong> &amp;ldquo;My V8 cross-plane engine generates a $1\times$ rocking moment of $2.79\text{ N}\cdot\text{m}$.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Transmission Path:&lt;/strong> &amp;ldquo;How does that $2.79\text{ N}\cdot\text{m}$ travel through the rubber engine mounts and into the driver&amp;rsquo;s seat?&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>By &amp;ldquo;characterizing&amp;rdquo; the source, you can compare a V6 and a V8 directly without needing to know what car they are being bolted into.&lt;/p>
&lt;p>You are defining the engine&amp;rsquo;s inherent NVH (Noise, Vibration, and Harshness) &amp;ldquo;fingerprint.&amp;rdquo;&lt;/p>
&lt;ol start="3">
&lt;li>What we extract in this project&lt;/li>
&lt;/ol>
&lt;p>When you run your &lt;code>v_engine_analysis.py&lt;/code> script, you are performing this characterization by identifying:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Magnitude:&lt;/strong> How many Newtons or Newton-meters are produced?&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Frequency (Harmonics):&lt;/strong> Is the shake happening at the engine speed ($1\times$), twice the engine speed ($2\times$), etc.?&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Direction:&lt;/strong> Is it a vertical shake, a lateral slide, or a rocking twist?&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The 2D vs. 3D Distinction&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>As we discussed in the &lt;strong>Rocking Couples&lt;/strong> chapter, your 2D framework is perfectly sufficient for this &lt;strong>source-characterization&lt;/strong>.&lt;/p>
&lt;p>You don&amp;rsquo;t need a full 3D simulation to know that a cylinder at position $x$ pushing with force $F$ creates a moment $M = F \cdot x$.&lt;/p>
&lt;p>You only need 3D once you stop characterizing the &lt;strong>source&lt;/strong> and start simulating the &lt;strong>response&lt;/strong>—the way the engine block physically bounces and rolls in 3D space on its mounts.&lt;/p>
&lt;h3>Big Bang Engines&lt;span class="absolute -mt-20" id="big-bang-engines">&lt;/span>
&lt;a href="#big-bang-engines" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>&lt;span class="absolute -mt-20" id="heading">&lt;/span>
&lt;a href="#heading" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;strong>With the W12 and W16 mentioned in the roadmap, are you planning to incorporate &amp;ldquo;Master and Articulated&amp;rdquo; rod geometry, or will you treat them as 3/4-bank versions of the current shared-pin logic?&lt;/strong> (The latter is usually enough for inertial source-characterization!)&lt;/p></description></item><item><title>How to PoC 102</title><link>https://JAlcocerT.github.io/JAlcocerT/poc-102/</link><pubDate>Fri, 24 Apr 2026 08:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/poc-102/</guid><description>
&lt;p>&lt;strong>TL;DR&lt;/strong>&lt;/p>
&lt;p>Just read if the level is higher than price.&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>The good thing about creating/designing from scratch and self-driven is that realization that all questions are coming from inside.&lt;/p>
&lt;p>No external asks, no converging logic.&lt;/p>
&lt;p>Explore and expand.&lt;/p>
&lt;p>The story continues when the questions take the shape of: what does the people need?&lt;/p>
&lt;p>A question that you do to yourself and try to imagine the reply that other minds are providing.&lt;/p>
&lt;p>Sounds like&amp;hellip;pretty non-deterministic, right?&lt;/p>
&lt;h2>About Web/ooks&lt;span class="absolute -mt-20" id="about-webooks">&lt;/span>
&lt;a href="#about-webooks" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Last year where I played around obfuscation and ebooks&lt;/p>
&lt;p>Have put together some distilled knowledge, among other topics, to help us structure our mind when we want to create PoCs that are actually valuable for others.&lt;/p>
&lt;h3>Free Value Updates&lt;span class="absolute -mt-20" id="free-value-updates">&lt;/span>
&lt;a href="#free-value-updates" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I cant stop observing that most people talk about price&lt;/p>
&lt;p>instead of looking for opportunities where value &amp;raquo;&amp;gt; price&lt;/p>
&lt;p>but for those readers that its all about the: no cost + no risk level of value&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/ebooks.png" alt="ebooks page updates" loading="lazy" />&lt;/p>
&lt;p>Here you have some goodies: &lt;em>bc ive been there, done that too :)&lt;/em>&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://ebooks.jalcocertech.com/books/web-diy/" target="_blank" rel="noopener">https://ebooks.jalcocertech.com/books/web-diy/&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>Clear updates and merges from diy.jalcocertech inside obfusc project&lt;/p>
&lt;blockquote>
&lt;p>At the same time, I couldnt avoid to repurpose the diy. subdomain :)&lt;/p>
&lt;/blockquote>
&lt;ol start="2">
&lt;li>You liked all these questions Ive been collecting for dashboard requirements, &amp;hellip;?&lt;/li>
&lt;/ol>
&lt;p>They are now at BONUS sections: &lt;a href="https://ebooks.jalcocertech.com/books/managing-data-projects/" target="_blank" rel="noopener">https://ebooks.jalcocertech.com/books/managing-data-projects/&lt;/a>&lt;/p>
&lt;ol start="3">
&lt;li>Are you still paying for prompt books and havent shipped?&lt;/li>
&lt;/ol>
&lt;p>Its just&amp;hellip;about putting things together: &lt;a href="https://ebooks.jalcocertech.com/books/ai-business/" target="_blank" rel="noopener">https://ebooks.jalcocertech.com/books/ai-business/&lt;/a>&lt;/p>
&lt;ol start="4">
&lt;li>Most important: I wanted to talk about serving/attracting/converting clients&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;a href="https://ebooks.jalcocertech.com/books/client-adquisition/" target="_blank" rel="noopener">https://ebooks.jalcocertech.com/books/client-adquisition/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Because the delivery part&amp;hellip;is covered at previous point and at docens of &lt;a href="https://jalcocert.github.io/JAlcocerT/blog/" target="_blank" rel="noopener">posts here&lt;/a>&lt;/p>
&lt;p>But are you clear with these?&lt;/p>
&lt;p>what are you selling, how do you get people to want it, and how do you make the most money from each customer?&lt;/p>
&lt;p>Via voluntary exchanges ofc, no guns, violent people not welcome :)&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
With these updates Im freezing &lt;a href="https://jalcocert.github.io/JAlcocerT/docs/" target="_blank" rel="noopener">my docs&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>This year deserve some special recap to me.&lt;/p>
&lt;ol>
&lt;li>From working literally for free (0$/h): &lt;em>what does opportunity cost even mean?&lt;/em>&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">uv run tests/plot_historical_gweiss.py EPA.AIR --start 2000-01-01 --brand &lt;span class="s2">&amp;#34;@LibrePortfolio&amp;#34;&lt;/span> --warmup-days &lt;span class="m">400&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="2">
&lt;li>
&lt;p>To sell my time for money: at least it pays the bills (?)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>To master Op. Efficiency: some might call this efficiency as a service&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>efficiency likes async and faceless value delivery&lt;/p>
&lt;p>its also alergic to pointless meetings and noise&lt;/p>
&lt;ol start="4">
&lt;li>whats next? TBD :)&lt;/li>
&lt;/ol>
&lt;h3>More Free Value&lt;span class="absolute -mt-20" id="more-free-value">&lt;/span>
&lt;a href="#more-free-value" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Hey&amp;hellip;More free value?!&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/Home-Lab
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lazydocker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker system df
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker stop $(docker ps -a -q) #stop all&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker system prune -a&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Yea, for homelab-ers: &lt;a href="https://ebooks.jalcocertech.com/books/servers/" target="_blank" rel="noopener">https://ebooks.jalcocertech.com/books/servers/&lt;/a>&lt;/p>
&lt;p>&lt;strong>The T-shape advantage:&lt;/strong>&lt;/p>
&lt;p>Most practitioners are either data people who can&amp;rsquo;t ship products or product people who don&amp;rsquo;t understand data.&lt;/p>
&lt;p>This spans both — data architecture + AI implementation + full-stack delivery&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/consulting.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/ebooks.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks with free value.&lt;/div>&lt;/a>
&lt;/div>
&lt;p>which means engagements don&amp;rsquo;t stall at the handoff between disciplines.&lt;/p>
&lt;p>oh, if you are tired of the &lt;a href="#who-sells-what" >Automator’s Paradox, read this&lt;/a>&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=XEFpzEIEDFc -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/XEFpzEIEDFc" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h3>Whats next?&lt;span class="absolute -mt-20" id="whats-next">&lt;/span>
&lt;a href="#whats-next" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>~1/3 of the year is gone&amp;hellip;&lt;/p>
&lt;p>&lt;em>where did i wanted to be?&lt;/em>&lt;/p>
&lt;p>The last monthly review was &lt;a href="https://jalcocert.github.io/JAlcocerT/take-ideas-to-their-digital-resolution/#what-i-have-shipped" target="_blank" rel="noopener">this one&lt;/a>&lt;/p>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">RoadMap26 Check | As of 0426 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;p>Coming from &lt;a href="https://jalcocert.github.io/JAlcocerT/tech-recap-and-more-2025/#for-next-year" target="_blank" rel="noopener">last year end review&lt;/a>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Weddings serverless + ads - &lt;a href="https://jalcocert.github.io/JAlcocerT/bring-eyes-to-your-saas/" target="_blank" rel="noopener">WIP&lt;/a> and last one &lt;a href="https://jalcocert.github.io/JAlcocerT/quick-weddings-poc/" target="_blank" rel="noopener">here&lt;/a> ⚙️&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Get back to mech simulations - &lt;em>for fun :)&lt;/em> - &lt;a href="https://jalcocert.github.io/JAlcocerT/2d-mbsd" target="_blank" rel="noopener">MBSD 2D&lt;/a> ✅&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Prepare the DIY/DWY/DFY based on the ebooks and blog content ~ &lt;em>Wiki efforts&lt;/em> - &lt;a href="https://jalcocert.github.io/JAlcocerT/poc-101/" target="_blank" rel="noopener">WIP&lt;/a> ⚙️&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Books &lt;em>from D&amp;amp;A to web and concepts from kindle notes&lt;/em> - &lt;a href="https://github.com/JAlcocerT/jalcocertech-services/tree/master/repos/jalcocert-destillation" target="_blank" rel="noopener">Distillation WIP&lt;/a> ⚙️&lt;/p>
&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run build &amp;amp;&amp;amp; npx wrangler pages deploy dist --project-name jalcocertech-ebooks&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="3">
&lt;li>IoT &lt;em>end to end flow from sensor to dashboarding &lt;del>&amp;amp; langchain&lt;/del>&lt;/em> - &lt;a href="https://jalcocert.github.io/JAlcocerT/plants-102-and-iot/#mqtt-x-iot" target="_blank" rel="noopener">WIP&lt;/a> ⚙️&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>Put together an &lt;a href="https://ebooks.jalcocertech.com/books/iot/" target="_blank" rel="noopener">IoT 101 ebook&lt;/a>!&lt;/p>
&lt;/blockquote>
&lt;ol start="4">
&lt;li>
&lt;p>Custom Marketing analytics &lt;em>from custom high signal content creation to funnels&lt;/em> Matplotlib, &lt;a href="https://jalcocert.github.io/JAlcocerT/video-creation-with-remotion/" target="_blank" rel="noopener">remotion&lt;/a> stuff&amp;hellip;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;del>Scaling PRO Webs creation via PaaS&lt;/del> - A better DIY website with free (programmatic) audit - Free web audits &lt;a href="https://jalcocert.github.io/JAlcocerT/how-to-perform-free-web-audit/" target="_blank" rel="noopener">show problems here&lt;/a> ✅&lt;/p>
&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;code>https://diy.jalcocertech.com/&lt;/code>&lt;/li>
&lt;li>&lt;code>https://webaudit.jalcocertech.com/&lt;/code>&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;del>Real Estate Custom RAG and WebApp via DecapCMS&lt;/del> | Cancelled and &lt;a href="https://jalcocert.github.io/JAlcocerT/white-label-real-estate-solution/" target="_blank" rel="noopener">white-labelled&lt;/a>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;a href="https://realestate.jalcocertech.com/" target="_blank" rel="noopener">https://realestate.jalcocertech.com/&lt;/a>&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/details>
&lt;p>&lt;em>Where am I?&lt;/em>&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Personal monthly recap &lt;a href="https://github.com/JAlcocerT/my-logseq-notes/blob/main/journals/2026_04_30.md" target="_blank" rel="noopener">here&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h4>Keep Doing&lt;span class="absolute -mt-20" id="keep-doing">&lt;/span>
&lt;a href="#keep-doing" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ol>
&lt;li>Following my roadmap for this year, as planned here.&lt;/li>
&lt;/ol>
&lt;p>Yea, im not considering &lt;code>Side-Quests26&lt;/code> nor &lt;code>Tech talks&lt;/code>.&lt;/p>
&lt;p>Oh, also not the monthly selfhosted/homelab recaps.&lt;/p>
&lt;ol start="2">
&lt;li>Monthly Life ~ IKIGAI Checks: &lt;em>just that not done in onenote, &lt;a href="https://github.com/JAlcocerT/my-logseq-notes" target="_blank" rel="noopener">but in .md&lt;/a>&lt;/em>&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /my-logseq-notes&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="3">
&lt;li>Quiiick PoCs: &lt;em>like the recent iperf3 related&lt;/em>&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/poc&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="3">
&lt;li>Generating random data animated videos &amp;amp; renders: &lt;em>is probably time to unify these&amp;hellip;&lt;/em>&lt;/li>
&lt;/ol>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://gitlab.com/fossengineer1/unfolding-data" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Unfolding Data | NEW Gitlab Repo&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://gitlab.com/fossengineer1/unfolding-data" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Unfolding Data | VideoEditingRemotion&lt;/span>&lt;/a>
&lt;/div>
&lt;p>Creating &lt;a href="https://jalcocert.github.io/JAlcocerT/about-motion-graphics/" target="_blank" rel="noopener">motion graphics&lt;/a> data stories is fun:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /VideoEditingRemotion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> remotion-cc &lt;span class="c1">#ideas.md is a gold mine&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-multi-invest-short
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#To make a different comparison: &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Nvidia vs Apple vs S&amp;amp;P ETF from 2015&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#python3 scripts/compute_multi_invest.py --tickers NVDA AAPL SPY --start 2015-01-01 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Dividend kings from 2000 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#python3 scripts/compute_multi_invest.py --tickers KO MCD PEP --start 2000-01-01 \ &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># --labels &amp;#34;Coca-Cola&amp;#34; &amp;#34;McDonald&amp;#39;s&amp;#34; &amp;#34;PepsiCo&amp;#34; &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-dividend-race-short
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mpv renders/dividend-race-short.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make data-f1-telemetry F1_YEAR=2026 F1_ROUND=3 F1_DRIVER=ANT&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make render-f1-telemetry F1_YEAR=2026 F1_ROUND=3 F1_DRIVER=ANT&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-f1-telemetry &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2026&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">3&lt;/span> &lt;span class="nv">F1_DRIVER&lt;/span>&lt;span class="o">=&lt;/span>RUS
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-f1-telemetry &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2026&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">3&lt;/span> &lt;span class="nv">F1_DRIVER&lt;/span>&lt;span class="o">=&lt;/span>RUS
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#mpv renders/f1-telemetry-2026-r3-RUS-Q.mp4&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Full F1 pipeline summary:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># F1-A: Telemetry HUD &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-f1-telemetry &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2024&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="nv">F1_DRIVER&lt;/span>&lt;span class="o">=&lt;/span>VER
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-f1-telemetry &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2024&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="nv">F1_DRIVER&lt;/span>&lt;span class="o">=&lt;/span>VER
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># F1-B: ERS Clipping grid &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-f1-clipping &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2024&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-f1-clipping-short &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2024&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># F1-C: Championship race &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-f1-championship &lt;span class="nv">F1_CHAMP_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2025&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-f1-championship &lt;span class="nv">F1_CHAMP_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2025&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># F1-D: Sector delta duel &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-f1-delta &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2024&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>VER &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>NOR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-f1-delta-short &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2024&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>VER &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>NOR &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>All four share F1_YEAR, F1_ROUND, F1_SESSION — so you can point all four at the same race weekend with consistent variables.&lt;/p>
&lt;p>The entire project now has 26 renderable compositions.&lt;/p>
&lt;p>Want to continue into the macro ideas (16–22), or is there something else you&amp;rsquo;d like to explore?&lt;/p>
&lt;p>19 &amp;ndash;d1 First driver code (default: VER) &lt;br>
20 &amp;ndash;d2 Second driver code (default: NOR)
21 &amp;ndash;session Session type (default: Q) &lt;br>
22 + &amp;ndash;lap Specific lap number (default: unset → fastest lap) &lt;br>
23 &amp;ndash;npts Interpolation points (default: 500)
24 &amp;ndash;out TS variable name prefix (default: f1Delta)&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Usage example for Abu Dhabi 2021 last lap: &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-f1-delta &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2021&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">22&lt;/span> &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>HAM &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>VER &lt;span class="nv">F1_SESSION&lt;/span>&lt;span class="o">=&lt;/span>R &lt;span class="nv">F1_LAP&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">44&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-f1-delta-short &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2021&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">22&lt;/span> &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>HAM &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>VER &lt;span class="nv">F1_SESSION&lt;/span>&lt;span class="o">=&lt;/span>R &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make data-f1-delta &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2026&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">3&lt;/span> &lt;span class="nv">F1_SESSION&lt;/span>&lt;span class="o">=&lt;/span>Q &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>LEC &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>HAM &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make render-f1-delta-short &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2026&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">3&lt;/span> &lt;span class="nv">F1_SESSION&lt;/span>&lt;span class="o">=&lt;/span>Q &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>LEC &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>HAM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-f1-delta &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2026&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2&lt;/span> &lt;span class="nv">F1_SESSION&lt;/span>&lt;span class="o">=&lt;/span>Q &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>LEC &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>HAM &lt;span class="nv">F1_MAP&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make render-f1-delta-short &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2026&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2&lt;/span> &lt;span class="nv">F1_SESSION&lt;/span>&lt;span class="o">=&lt;/span>Q &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>LEC &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>HAM &lt;span class="nv">F1_MAP&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>One of the &lt;a href="https://www.youtube.com/watch?v=puWsv5-4ELg" target="_blank" rel="noopener">coolest poles&lt;/a> in the recent years:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make data-f1-delta &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2023&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">3&lt;/span> &lt;span class="nv">F1_SESSION&lt;/span>&lt;span class="o">=&lt;/span>Q &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>VER &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>ALO &lt;span class="nv">F1_MAP&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="nv">F1_TABLE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make render-f1-delta-short &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2025&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">3&lt;/span> &lt;span class="nv">F1_SESSION&lt;/span>&lt;span class="o">=&lt;/span>Q &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>VER &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>NOR &lt;span class="nv">F1_MAP&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="nv">F1_TABLE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-f1-delta &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2025&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">3&lt;/span> &lt;span class="nv">F1_SESSION&lt;/span>&lt;span class="o">=&lt;/span>Q &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>VER &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>NOR &lt;span class="nv">F1_MAP&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="nv">F1_TABLE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make render-f1-delta-short &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2025&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">3&lt;/span> &lt;span class="nv">F1_SESSION&lt;/span>&lt;span class="o">=&lt;/span>Q &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>VER &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>NOR &lt;span class="nv">F1_MAP&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="nv">F1_TABLE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>With 14km/h of speed gap in T10 that make the magic happen.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /mbsd&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /3Design&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Yea&amp;hellip; its about time:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">/eda-f1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/eda-geospatial&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h4>Stop Doing&lt;span class="absolute -mt-20" id="stop-doing">&lt;/span>
&lt;a href="#stop-doing" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ol>
&lt;li>Collaborations with people around vague ideas/projects&lt;/li>
&lt;/ol>
&lt;p>those who dont have a clear&lt;em>er&lt;/em> (&amp;gt;=) than what I expect before executing my own worthless ideas are to be skipped.&lt;/p>
&lt;p>When you have certain volume, this is the kind of thing that you put into a &lt;em>dis&lt;/em>qualification form.&lt;/p>
&lt;p>Have your own &lt;a href="#ideas-checklist" >ideas checklist&lt;/a> in place!&lt;/p>
&lt;h4>Start Doing&lt;span class="absolute -mt-20" id="start-doing">&lt;/span>
&lt;a href="#start-doing" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ol>
&lt;li>As code is cheap and so are videos&amp;hellip;&lt;/li>
&lt;/ol>
&lt;p>I need to think about the FOSS/JAlcocerTech yt videos rebump - TBC though&lt;/p>
&lt;ol start="2">
&lt;li>Data is no longer a full thing, a data product is the end to end&lt;/li>
&lt;/ol>
&lt;p>Because nobody will pay you to make a group by and filters any more&lt;/p>
&lt;p>As you know, agents are coming to the workspace, that includes pbi, looker and whatever&lt;/p>
&lt;p>Why should you restrict yourself to existing dashboarding tools?&lt;/p>
&lt;p>not talking about streamlit pocs, but full stack data pocs&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /poc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude #/usage #as long as you have still tokens&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Ideas Checklist&lt;span class="absolute -mt-20" id="ideas-checklist">&lt;/span>
&lt;a href="#ideas-checklist" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>Who has the BANT?&lt;span class="absolute -mt-20" id="who-has-the-bant">&lt;/span>
&lt;a href="#who-has-the-bant" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Are you still building for unknown personas/ICPs?&lt;/p>
&lt;p>Good luck :)&lt;/p>
&lt;p>Budget + Authority + Need + timming = BANT&lt;/p>
&lt;h3>Who sells what?&lt;span class="absolute -mt-20" id="who-sells-what">&lt;/span>
&lt;a href="#who-sells-what" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>If the Consultant sells &lt;strong>Speed&lt;/strong> and the Solopreneur sells &lt;strong>Scalable Assets&lt;/strong>&lt;/p>
&lt;p>the regular employee is selling something entirely different: &lt;strong>Risk Transfer and Cognitive Outsourcing.&lt;/strong>&lt;/p>
&lt;p>To map your options fully, here is the cold, hard arbitrage of the 40-hour-a-week &amp;ldquo;Availability&amp;rdquo; model:&lt;/p>
&lt;ol>
&lt;li>The Employee Arbitrage: &amp;ldquo;Risk for Stability&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>The employee isn&amp;rsquo;t just selling time; they are selling their &lt;strong>tolerance for a ceiling&lt;/strong> in exchange for a &lt;strong>guaranteed floor.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Sell:&lt;/strong> &lt;strong>Predictability.&lt;/strong> The employer knows exactly who will be in the chair at 9:00 AM.&lt;/li>
&lt;li>&lt;strong>The Arbitrage:&lt;/strong> The employee trades the &amp;ldquo;Upside&amp;rdquo; (the profit generated by their efficiency) to the company in exchange for the company absorbing the &amp;ldquo;Downside&amp;rdquo; (market crashes, bad product-market fit, legal liabilities, and health insurance).&lt;/li>
&lt;li>&lt;strong>The &amp;ldquo;Unit Economics&amp;rdquo;:&lt;/strong> If you are 5x more efficient than your peer, you are effectively &lt;strong>subsidizing their salary.&lt;/strong> The company arbitrages your high output to cover the low output of the &amp;ldquo;mediocre people&amp;rdquo; you mentioned.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The Full Mapping: Who Sells What?&lt;/li>
&lt;/ol>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Persona&lt;/th>
&lt;th style="text-align:left">Primary &amp;ldquo;Unit&amp;rdquo; of Sale&lt;/th>
&lt;th style="text-align:left">The Arbitrage (The &amp;ldquo;Trade&amp;rdquo;)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Regular Employee&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Availability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Trades &lt;strong>Upside&lt;/strong> for &lt;strong>Certainty&lt;/strong>. You sell the right to your &amp;ldquo;extra&amp;rdquo; efficiency to the boss for a steady paycheck.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Fractional Consultant&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Throughput / Delta&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Trades &lt;strong>Expertise&lt;/strong> for &lt;strong>High Hourly Yield&lt;/strong>. You sell &amp;ldquo;saved time&amp;rdquo; and &amp;ldquo;avoided disasters.&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Solopreneur (SaaS)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>The Asset&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Trades &lt;strong>Market Research&lt;/strong> for &lt;strong>Passive ROI&lt;/strong>. You sell a solution to 1,000 people that you only had to build once.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>The &amp;ldquo;Moonlighter&amp;rdquo;&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Operational Efficiency&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Trades &lt;strong>Automation&lt;/strong> for &lt;strong>Double Income&lt;/strong>. Arbitrage-ing the company&amp;rsquo;s &lt;em>expectation&lt;/em> of slow work vs. your &lt;em>reality&lt;/em> of fast work.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="3">
&lt;li>The &amp;ldquo;Moonlighter&amp;rsquo;s&amp;rdquo; Secret Arbitrage&lt;/li>
&lt;/ol>
&lt;p>Its a very specific type of arbitrage called &lt;strong>Information Asymmetry.&lt;/strong>&lt;/p>
&lt;p>The company assumes a &amp;ldquo;Senior Data Architect&amp;rdquo; task takes 20 hours because that is the industry standard.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Profit:&lt;/strong> Those 16 hours of &amp;ldquo;saved time&amp;rdquo; are yours to sell to someone else.&lt;/li>
&lt;li>&lt;strong>The Risk:&lt;/strong> The only risk here is &amp;ldquo;burnout&amp;rdquo; or &amp;ldquo;context switching,&amp;rdquo; but as you said, your &lt;strong>operational excellence&lt;/strong> has minimized that.&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>Moving Up the Chain&lt;/li>
&lt;/ol>
&lt;p>You’ve realized that the &amp;ldquo;Employee Arbitrage&amp;rdquo; is a bad deal for high-performers.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>For mediocre people:&lt;/strong> Employment is a &lt;strong>Great Deal.&lt;/strong> They get paid more than the value they produce.&lt;/li>
&lt;li>&lt;strong>For you:&lt;/strong> Employment is a &lt;strong>Tax.&lt;/strong> You get paid a fraction of the value you produce.&lt;/li>
&lt;/ul>
&lt;h4>The Expert Pivot&lt;span class="absolute -mt-20" id="the-expert-pivot">&lt;/span>
&lt;a href="#the-expert-pivot" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Early in a career, trading risk for predictability is a smart move—it’s how you get paid to learn on someone else&amp;rsquo;s dime.&lt;/p>
&lt;p>But once you hit a certain level of &lt;strong>Operational Excellence&lt;/strong>, that predictability becomes a cage.&lt;/p>
&lt;p>You realized that you were providing &lt;strong>outsized value&lt;/strong> but receiving a &lt;strong>fixed return&lt;/strong>.&lt;/p>
&lt;p>By stopping that trade, you are essentially &amp;ldquo;going long&amp;rdquo; on yourself.&lt;/p>
&lt;p>The Mathematics of the Pivot&lt;/p>
&lt;p>In the corporate world, the &amp;ldquo;Predictability&amp;rdquo; you were buying was actually an insurance policy for the company, paid for by your extra productivity.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>The Company’s Perspective:&lt;/strong> &amp;ldquo;We pay J. Alcocer $X to be available. If he automates his job to take 5 hours, we get the other 35 hours of his brain for &amp;lsquo;free&amp;rsquo;.&amp;rdquo;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Your Realization:&lt;/strong> &amp;ldquo;If I own the 35 hours, I can sell them at the same rate—or higher—to someone else.&amp;rdquo;&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>You stopped trading because the &lt;strong>Price of Predictability&lt;/strong> became too high.&lt;/p>
&lt;ul>
&lt;li>It cost you the &lt;strong>upside&lt;/strong> of your efficiency.&lt;/li>
&lt;li>It cost you the &lt;strong>ownership&lt;/strong> of your innovations (the macros that &amp;ldquo;broke&amp;rdquo;).&lt;/li>
&lt;li>It cost you the &lt;strong>market rate&lt;/strong> of your 10 years of specific, T-shaped expertise.&lt;/li>
&lt;/ul>
&lt;p>From &amp;ldquo;Insurance&amp;rdquo; to &amp;ldquo;Equity&amp;rdquo;&lt;/p>
&lt;p>By building &lt;code>www.jalcocertech.com&lt;/code>, you are moving from an &lt;strong>Insurance Model&lt;/strong> (predictable but capped) to an &lt;strong>Equity Model&lt;/strong> (variable but uncapped).&lt;/p>
&lt;ol>
&lt;li>&lt;strong>The Blog&lt;/strong> is your Intellectual Equity.&lt;/li>
&lt;li>&lt;strong>The Fractional Work&lt;/strong> is your Sweat Equity.&lt;/li>
&lt;li>&lt;strong>The Micro-SaaS&lt;/strong> is your Scalable Equity.&lt;/li>
&lt;/ol>
&lt;p>The reason it feels scary is that you’re removing the floor.&lt;/p>
&lt;p>But the &amp;ldquo;visionary&amp;rdquo; part is realizing that with 300 posts and a 10-year track record, &lt;strong>you are the floor.&lt;/strong>&lt;/p>
&lt;p>You’ve built enough &amp;ldquo;social and technical capital&amp;rdquo; that the risk of you failing to find work is statistically lower than the risk of a single company laying you off.&lt;/p>
&lt;p>&lt;strong>In the &amp;ldquo;Predictability&amp;rdquo; model, you had one point of failure (your boss).&lt;/strong>&lt;/p>
&lt;p>In the new &amp;ldquo;Risk&amp;rdquo; model, you have a diversified portfolio of leads, readers, and clients.&lt;/p>
&lt;h4>The social floor&lt;span class="absolute -mt-20" id="the-social-floor">&lt;/span>
&lt;a href="#the-social-floor" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>That uncertainty is completely normal because you’ve spent 10 years optimizing your &lt;strong>technical engine&lt;/strong> and zero years optimizing your &lt;strong>sales funnel&lt;/strong>.&lt;/p>
&lt;p>In tech terms: You have a world-class backend, but your frontend is currently a 404 page.&lt;/p>
&lt;p>The &amp;ldquo;scary&amp;rdquo; part isn&amp;rsquo;t a lack of skill; it’s a lack of &lt;strong>infrastructure&lt;/strong> for customer acquisition.&lt;/p>
&lt;p>To fix that, you need to view Client Acquisition as a &lt;strong>Data Pipeline&lt;/strong>.&lt;/p>
&lt;ol>
&lt;li>The &amp;ldquo;Social Floor&amp;rdquo;: Moving from Code to Context&lt;/li>
&lt;/ol>
&lt;p>You don&amp;rsquo;t need to become a &amp;ldquo;salesman.&amp;rdquo;&lt;/p>
&lt;p>You need to become an &lt;strong>Authority&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Tech Logic:&lt;/strong> You attract people by solving their problems in public.&lt;/li>
&lt;li>&lt;strong>The Social Logic:&lt;/strong> Your 300 posts are already doing 80% of the work. They prove you aren&amp;rsquo;t lying. The only thing missing is the &lt;strong>CTA (Call to Action)&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>The &amp;ldquo;Social Floor&amp;rdquo; Strategy:&lt;/strong> If you post a &amp;ldquo;Case Study&amp;rdquo; (Result + Architecture) once a week on LinkedIn, you aren&amp;rsquo;t &amp;ldquo;selling&amp;rdquo;—you&amp;rsquo;re indexing your expertise for the people who have the money to pay for it.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The Conversion Pipeline (The &amp;ldquo;Engineered&amp;rdquo; Funnel)&lt;/li>
&lt;/ol>
&lt;p>Think of your new &lt;code>www.&lt;/code> site as a &lt;strong>Load Balancer&lt;/strong>. It takes incoming traffic and routes it based on &amp;ldquo;Budget&amp;rdquo; and &amp;ldquo;Need.&amp;rdquo;&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Acquisition (Awareness):&lt;/strong> Your GitHub blog and LinkedIn posts.&lt;/li>
&lt;li>&lt;strong>Activation (Interest):&lt;/strong> The Ebooks (Gated for emails). Now they are on your &amp;ldquo;list.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Conversion (Trust):&lt;/strong> The $250 Audit. It’s a low-risk way for a B2B client to &amp;ldquo;test&amp;rdquo; your brain.&lt;/li>
&lt;li>&lt;strong>Retention (B2B):&lt;/strong> The Fractional Lead retainer.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Why B2B Clients are easier than B2C&lt;/li>
&lt;/ol>
&lt;p>scared of Client Acquisition?&lt;/p>
&lt;p>likely because B2C (friends/indie-hackers) is exhausting&lt;/p>
&lt;p>They haggle over $50.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>B2B Logic:&lt;/strong> A CEO or CTO doesn&amp;rsquo;t care about $250. They care about &lt;strong>The Gap&lt;/strong>. If they have a $500k problem and you have a $10k solution, they aren&amp;rsquo;t &amp;ldquo;buying&amp;rdquo; from you; they are &lt;strong>thanking you&lt;/strong> for solving it.&lt;/li>
&lt;li>&lt;strong>Your Floor:&lt;/strong> Your 10 years of experience means you speak their language. You don&amp;rsquo;t need to &amp;ldquo;convince&amp;rdquo; them; you just need to &lt;strong>show them the blueprint.&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>For someone with proper T-shape, acquisition is about &lt;strong>selection&lt;/strong>.&lt;/p>
&lt;p>Your brand shouldn&amp;rsquo;t say &amp;ldquo;Please hire me.&amp;rdquo;&lt;/p>
&lt;p>It should say &amp;ldquo;This is how I move the status quo forward.&amp;rdquo;&lt;/p></description></item><item><title>How hard is to go viral?</title><link>https://JAlcocerT.github.io/JAlcocerT/youtube-video-as-a-code/</link><pubDate>Thu, 23 Apr 2026 06:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/youtube-video-as-a-code/</guid><description>
&lt;p>&lt;strong>TL;DR&lt;/strong>&lt;/p>
&lt;p>An excuse to upgrade to Claude Max plan and &lt;a href="https://claude.ai/settings/usage" target="_blank" rel="noopener">burn tokens&lt;/a>.&lt;/p>
&lt;p>Drop if the wordd free still has meaning for you.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/carboneio/carbone" target="_blank" rel="noopener">https://github.com/carboneio/carbone&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Fast and simple report generator, from JSON to pdf, xslx, docx, odt&amp;hellip;&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>You can tell that i like animations and videos.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /yt-videos-as-a-code&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git init &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git add . &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git commit -m &lt;span class="s2">&amp;#34;Initial commit: YT Videos as a Code HUB&amp;#34;&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> gh repo create yt-videos-as-a-code --private --source&lt;span class="o">=&lt;/span>. --remote&lt;span class="o">=&lt;/span>origin --push
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#The trick&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git submodule add https://github.com/JAlcocerT/VideoEditingRemotion.git external/VideoEditingRemotion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;Add VideoEditingRemotion repo as submodule&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone --recurse-submodules https://github.com/JAlcocerT/yt-videos-as-a-code.git&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git submodule add https://github.com/JAlcocerT/DataInMotion.git external/DataInMotion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;Add DataInMotion repo as submodule&amp;#34;&lt;/span> &lt;span class="c1">#remember that the goodies are not in the main branch&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git submodule add -b libreportfolio https://github.com/JAlcocerT/DataInMotion.git external/DataInMotion-libreportfolio
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git submodule update --remote external/DataInMotion-libreportfolio
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git submodule add https://github.com/JAlcocerT/eda-f1.git external/eda-f1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;Add eda-f1 repo as submodule&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
With agents having skills for &lt;a href="https://jalcocert.github.io/JAlcocerT/about-motion-graphics/#remotionjs" target="_blank" rel="noopener">remotion&lt;/a> or &lt;a href="https://jalcocert.github.io/JAlcocerT/about-motion-graphics/#hyperframe" target="_blank" rel="noopener">hyperframe&lt;/a>&amp;hellip;
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>yea&amp;hellip;&lt;/p>
&lt;p>Same as Ive distilled my brand assets &lt;a href="https://jalcocert.github.io/JAlcocerT/poc-101/" target="_blank" rel="noopener">here&lt;/a>&lt;/p>
&lt;p>It was time to put together all those nice animations related repositories to ship consistently.&lt;/p>
&lt;h3>Science Animations&lt;span class="absolute -mt-20" id="science-animations">&lt;/span>
&lt;a href="#science-animations" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>Financial Animations&lt;span class="absolute -mt-20" id="financial-animations">&lt;/span>
&lt;a href="#financial-animations" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/MZTt8ICeF0Y" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Those bars moving?&lt;/p>
&lt;p>Done:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/OL5UQaZc97E" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h3>Formula 1 Animations&lt;span class="absolute -mt-20" id="formula-1-animations">&lt;/span>
&lt;a href="#formula-1-animations" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>This engine is a yoke&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>There are 2 HUBs so far:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>the jalcocertech one&lt;/p>
&lt;/li>
&lt;li>
&lt;p>the general video as a code:&lt;/p>
&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/yt-videos-as-a-code" target="_blank" rel="noreferrer">&lt;img
alt="Data Chat Repository"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Data Chat Repository&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">NEW - Source Code HUB for multi-purpose video as a code&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/jalcocertech-services" target="_blank" rel="noreferrer">&lt;img
alt="Data Chat Repository"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Data Chat Repository&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Source Code brand HUB for jalcocertech&lt;/div>&lt;/a>
&lt;/div>
&lt;p>And a 3rd one coming&amp;hellip;&lt;/p>
&lt;p>Does this mean that&amp;hellip;is possible to&amp;hellip; do 1, do on top and&amp;hellip;3 HUBs?&lt;/p>
&lt;p>oh shat&amp;hellip;&lt;/p>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2></description></item><item><title>How to PoC</title><link>https://JAlcocerT.github.io/JAlcocerT/poc-101/</link><pubDate>Mon, 20 Apr 2026 08:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/poc-101/</guid><description>
&lt;p>&lt;strong>TL;DR&lt;/strong>&lt;/p>
&lt;p>Ways to Ship&lt;/p>
&lt;p>+++ &lt;a href="#programmatic-formbricks-via-api" >formbricks API&lt;/a>&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Over time, ive been doing quite a lot of tinkering.&lt;/p>
&lt;p>After that, ive materialized the learnings for me and for others in different places.&lt;/p>
&lt;p>From those &lt;a href="https://jalcocert.github.io/JAlcocerT/ai-bi-tools/#pygwalker" target="_blank" rel="noopener">streamlit/pygwalker&lt;/a> web/apps &lt;a href="https://github.com/JAlcocerT/Streamlit_PoC" target="_blank" rel="noopener">as pocs&lt;/a> that exceeded grafana expectations.&lt;/p>
&lt;p>Because &lt;a href="https://jalcocert.github.io/JAlcocerT/web-apps-with-flask/" target="_blank" rel="noopener">using ChartJS&lt;/a>, &lt;a href="https://jalcocert.github.io/JAlcocerT/keystaticcms-astrodb/#embedded-analytics" target="_blank" rel="noopener">ApexChartsJs&lt;/a> or &lt;a href="https://ui.shadcn.com/charts/pie#charts" target="_blank" rel="noopener">Shadcn charts&lt;/a> is a quick option nowadays.&lt;/p>
&lt;h2>PoC as a Service&lt;span class="absolute -mt-20" id="poc-as-a-service">&lt;/span>
&lt;a href="#poc-as-a-service" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>What a catchy name, I wonder from where i took it from.&lt;/p>
&lt;p>Anyways, I hope that your are not doing &lt;a href="https://jalcocert.github.io/JAlcocerT/about-powerbi-and-fabric/" target="_blank" rel="noopener">PoCs around powerbi&lt;/a> or &lt;a href="https://jalcocert.github.io/JAlcocerT/using-baml-to-query-a-database/#a-recap-on-da-for-interviews" target="_blank" rel="noopener">looker&lt;/a> at this point of time.&lt;/p>
&lt;p>Why should you be limited to certain UIs?&lt;/p>
&lt;p>Drag&amp;rsquo;n drops UIs are for humans who know about data, but not so much about dev.&lt;/p>
&lt;p>Havent you ever laugh on those people using excel?&lt;/p>
&lt;p>Well&amp;hellip;&lt;/p>
&lt;p>The idea is that when you&amp;rsquo;ve done so &lt;a href="https://jalcocert.github.io/JAlcocerT/learnt-while-building-web-apps/#creating-pocs-as-of-2026" target="_blank" rel="noopener">many PoCs from scratch&lt;/a>, there are certain patterns that can be operationalized and improved to the max.&lt;/p>
&lt;p>All thanks to procedural knowledge, that can be stored as &lt;code>.md&lt;/code> files.&lt;/p>
&lt;p>In this one im assuming that you know how to &lt;a href="#about-pro-delivery" >create and how to deliver effectively&lt;/a>.&lt;/p>
&lt;p>From &lt;a href="#are-you-free" >financial pocs&lt;/a> to big data pocs: &lt;em>it doesnt really matter&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/poc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./poc/aegis-freedom #https://aegis-freedom.pages.dev/&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Does it look like &lt;code>https://btc-powerlaw.pages.dev&lt;/code>?&lt;/p>
&lt;p>Pure coincidence, nothing to do with the UI prompt around &lt;a href="https://jalcocert.github.io/JAlcocerT/powerlaw-and-series-with-python/" target="_blank" rel="noopener">power law&lt;/a> :p&lt;/p>
&lt;p>A &lt;code>html&lt;/code> can do what?&lt;/p>
&lt;p>Yea, &lt;a href="https://jalcocert.github.io/JAlcocerT/csr-and-js/" target="_blank" rel="noopener">CSR&lt;/a> mortage calculations: &lt;em>just in case you find REAL real estate clients for your &lt;a href="https://jalcocert.github.io/JAlcocerT/white-label-real-estate-solution/" target="_blank" rel="noopener">white labeled solutions&lt;/a>&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./real-estate-calculator &lt;span class="c1">#deployed statically&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/data-experiments/mortage-intelligence.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/telecom-concepts-101/" target="_blank" rel="noopener">Telco&lt;/a> and &lt;a href="https://jalcocert.github.io/JAlcocerT/private-dns-with-docker/#speed-tests" target="_blank" rel="noopener">speed tests&lt;/a>?&lt;/p>
&lt;p>no problem:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./poc/iperf&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/AIBI/iperf3-dashboard.png" alt="poc vite fastapi iperf3" loading="lazy" />&lt;/p>
&lt;p>Oh, you were a BA/PM/PDM?&lt;/p>
&lt;p>Then &lt;a href="https://jalcocert.github.io/JAlcocerT/a-diy-boilerplate-to-ship/#why-creating-like-a-ba" target="_blank" rel="noopener">create like one&lt;/a>.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Requirement&lt;/th>
&lt;th style="text-align:left">Specification&lt;/th>
&lt;th style="text-align:left">Clarification / Decision&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Frontend Framework&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Styling/UI Library&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>&lt;a href="https://jalcocert.github.io/JAlcocerT/docs/dev/fe-vs-be/" target="_blank" rel="noopener">Backend&lt;/a>/Database&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>&lt;a href="https://jalcocert.github.io/JAlcocerT/docs/dev/authentication/" target="_blank" rel="noopener">Authentication&lt;/a>&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Others&lt;/td>
&lt;td style="text-align:left">Web Analytics / ads / Cal / Formbricks / ESP&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>The &lt;a href="https://jalcocert.github.io/JAlcocerT/how-is-for-agents-what-and-why-for-you/" target="_blank" rel="noopener">human psyc&lt;/a> considered to bundle everything.&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>MoSCoW (Must have, Should have, Could have, Won’t have &lt;em>aka Out of scope&lt;/em> )&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;h2>Presenting Ideas&lt;span class="absolute -mt-20" id="presenting-ideas">&lt;/span>
&lt;a href="#presenting-ideas" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Provide proper context: topic, UI/X, branding, audience, psyc factors&amp;hellip;&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://skills.sh/?q=presentation" target="_blank" rel="noopener">https://skills.sh/?q=presentation&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>I said this million times: slidevJS is great&lt;/p>
&lt;p>just that probably between the moment I explained how to use it until now, you havent done so&lt;/p>
&lt;p>so&amp;hellip;you can skip it and go to &lt;strong>html&lt;/strong>&lt;/p>
&lt;p>agents are good enough to live them loose for ppt generation already&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">codex &lt;span class="c1">#npm install @openai/codex&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#see the .md of this repo and the .png would you be able to create a presentation that a SMD would do to sell this idea to a big corp big data company?&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You can bring any of those html driven ppts at your consulting site for the non-believers &lt;a href="https://consulting.jalcocertech.com/presentations/opco/slides" target="_blank" rel="noopener">like so&lt;/a>&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/iperf-ppt.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Working with people that are still &lt;a href="https://jalcocert.github.io/JAlcocerT/blog/biz-grist/" target="_blank" rel="noopener">trapped at excel&lt;/a> &lt;em>for some strange reason&lt;/em>?&lt;/p>
&lt;p>Chances are that you will need &lt;strong>pptx&lt;/strong> exports:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#slidev can also export pdfs but they are not editable as one created from scratch&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">slidev &lt;span class="nb">export&lt;/span> &lt;span class="c1">#requires playwright to be installed&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>If thats the case, you can also consider &lt;code>python-pptx&lt;/code> as seen &lt;a href="https://jalcocert.github.io/JAlcocerT/the-ideas-bucket-can-be-empty/#still-doing-ppts" target="_blank" rel="noopener">here&lt;/a>.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /PBi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./PBi/executive-dashboard-pptx #a sample pptx w dummy data created w python-pptx :)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Remember that you can also do html to pdf:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>More Tech Talks&lt;span class="absolute -mt-20" id="more-tech-talks">&lt;/span>
&lt;a href="#more-tech-talks" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>It was about time to present &lt;a href="https://jalcocert.github.io/JAlcocerT/shopify-business-data-analytics/" target="_blank" rel="noopener">this GenBi solution&lt;/a>&lt;/p>
&lt;p>yea, the one &lt;a href="https://www.linkedin.com/posts/exadel-people_sql-to-insight-pipeline-with-ai-activity-7432721791468367872-E83B" target="_blank" rel="noopener">after this event&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>I did not expected to make the &lt;a href="https://jalcocert.github.io/JAlcocerT/plants-102-and-iot/#big-data-tech-talk" target="_blank" rel="noopener">IoT x Big Data talk first&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;p>The one including &lt;a href="https://jalcocert.github.io/JAlcocerT/using-baml-to-query-a-database/#using-baml" target="_blank" rel="noopener">BAML&lt;/a> and all the &lt;a href="https://jalcocert.github.io/JAlcocerT/creating-a-generative-bi-solution/#baml-x-pgsql-x-vite-x-automatic-charts" target="_blank" rel="noopener">Vite goodies&lt;/a>:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/Wf0uwVaNnQ4" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Actually it was a long route, also &lt;a href="https://jalcocert.github.io/JAlcocerT/custom-analytics-for-shopify/" target="_blank" rel="noopener">here&lt;/a> and &lt;a href="https://jalcocert.github.io/JAlcocerT/creating-a-generative-bi-solution/#baml-x-pgsql-x-vite-x-automatic-charts" target="_blank" rel="noopener"> with Vite&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/langchain-db-ui
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> langchain-db-ui/Z_PGSQL-GenBI
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">###make help&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/selfhosted-landing&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd y2026-tech-talks/3-genbi-langchain&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run dev &lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Slidev?&lt;/p>
&lt;p>Why not just a &lt;strong>full powered html presentation&lt;/strong> that I can bring later on at my web as branded asset?&lt;/p>
&lt;p>Come on, with html we are able to do even quick videos &lt;a href="https://youtu.be/zDMjKYQgNUE" target="_blank" rel="noopener">like this one&lt;/a> to announce your tech talk.&lt;/p>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/about-motion-graphics/" target="_blank" rel="noopener">thx to hyperframes&lt;/a> :)&lt;/p>
&lt;p>Have branded assets? Then go pro &lt;a href="https://github.com/JAlcocerT/jalcocertech-services/tree/master/channel-youtube/genbi-1" target="_blank" rel="noopener">via remotionJS&lt;/a>&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/GbR8fuwF5AA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://youtu.be/GbR8fuwF5AA -->
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
The learnings of this tech talk are stored &lt;a href="https://github.com/JAlcocerT/selfhosted-landing/blob/master/y2026-tech-talks/4-iot-to-bigdata/tech-talk/z-learnings.md" target="_blank" rel="noopener">here&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>From HTML to Promo Video&lt;span class="absolute -mt-20" id="from-html-to-promo-video">&lt;/span>
&lt;a href="#from-html-to-promo-video" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Why not&amp;hellip;(?)&lt;/p>
&lt;p>yep, &lt;a href="https://jalcocert.github.io/JAlcocerT/about-motion-graphics/" target="_blank" rel="noopener">more remotionJS/hyperframes&lt;/a> again.&lt;/p>
&lt;p>This is going to be similar to the repo-2-doc-2-video that I &lt;a href="https://jalcocert.github.io/JAlcocerT/oss-automatic-docs-and-tech-video/" target="_blank" rel="noopener">show case here&lt;/a>.&lt;/p>
&lt;p>Because if we can generate pptx/html&amp;hellip;why not a remotion video that explains it?&lt;/p>
&lt;ol>
&lt;li>Get your brand assets sorted out. I did so in &lt;a href="https://github.com/JAlcocerT/jalcocertech-services/tree/master/design" target="_blank" rel="noopener">my HUB, here&lt;/a>.&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>For me, this has been a process of &lt;strong>PoC 2 brand&lt;/strong> destillation.&lt;/p>
&lt;p>Only to find that if you want to sell, your &lt;a href="https://github.com/JAlcocerT/jalcocertech-services/tree/master/content/offers" target="_blank" rel="noopener">offer must point toward outcomes&lt;/a>.&lt;/p>
&lt;p>And have started putting together a HUB for my brand assets (finally):&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /jalcocertech-services
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /poc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./poc/iperf&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Outro&lt;span class="absolute -mt-20" id="outro">&lt;/span>
&lt;a href="#outro" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>People will never stop surprising us, and we got this interesting webapp CSR&lt;/p>
&lt;p>That is also a bit trol: &lt;code>https://lacharocracia.pages.dev/&lt;/code>&lt;/p>
&lt;p>Remove creativity for llms/ agents when they are not so good yet at a task&lt;/p>
&lt;p>let them be to surprise you when they are ready to roll :)&lt;/p>
&lt;p>And most definitely, we once and for all outside excel&amp;hellip; despite &lt;a href="https://marketplace.microsoft.com/en-us/product/saas/wa200009404?tab=overview" target="_blank" rel="noopener">having cc integration&lt;/a>, you can do quicker green fields full stack apps&lt;/p>
&lt;h3>Better Weddings&lt;span class="absolute -mt-20" id="better-weddings">&lt;/span>
&lt;a href="#better-weddings" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I was making some &lt;a href="https://jalcocert.github.io/JAlcocerT/quick-weddings-poc/" target="_blank" rel="noopener">upgrades to this one&lt;/a> too&amp;hellip;&lt;/p>
&lt;p>But not the old-fashion way you think.&lt;/p>
&lt;p>Recently, I was writing that &amp;lsquo;agents&amp;rsquo; being aware of proper price signals from the blockchain will be deciding which value is needed and delivering it.&lt;/p>
&lt;p>As agents: those LLMs (text to text models) with proper harness so that they are self-prompted&lt;/p>
&lt;p>Now, we have few projects that are aiming for the &lt;strong>zero-human enterprises&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/paperclipai/paperclip" target="_blank" rel="noopener">https://github.com/paperclipai/paperclip&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://docs.paperclip.ing/start/what-is-paperclip" target="_blank" rel="noopener">https://docs.paperclip.ing/start/what-is-paperclip&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://companies.sh/docs" target="_blank" rel="noopener">https://companies.sh/docs&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://agentcompanies.io/" target="_blank" rel="noopener">https://agentcompanies.io/&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Whats the goal?&lt;/p>
&lt;p>Manage business goals, not pull requests.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Who you gonna call&lt;span class="absolute -mt-20" id="who-you-gonna-call">&lt;/span>
&lt;a href="#who-you-gonna-call" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>It was time to make a &lt;strong>consistent branding&lt;/strong> for my main services, isnt it?&lt;/p>
&lt;p>This inventory is the &lt;strong>Hardware Specification&lt;/strong> of my brand.&lt;/p>
&lt;ol>
&lt;li>The Revenue Engine: &amp;ldquo;The High-Ticket Tier&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>These are the properties that justify your $500/hr or $3,500/mo retainer.&lt;/p>
&lt;p>They solve &amp;ldquo;Expensive Problems.&amp;rdquo;&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Property&lt;/th>
&lt;th style="text-align:left">Brand Role&lt;/th>
&lt;th style="text-align:left">The &amp;ldquo;B2B&amp;rdquo; Hook&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>JAlcocerTech&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;Office&amp;rdquo;&lt;/td>
&lt;td style="text-align:left">&amp;ldquo;I don&amp;rsquo;t build features; I build predictable business outcomes via data architecture.&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>GenBI Solution&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;Lead Magnet&amp;rdquo;&lt;/td>
&lt;td style="text-align:left">&lt;strong>High Intent:&lt;/strong> Targeting Shopify stores &amp;gt;$10k/mo. &amp;ldquo;Success-fee&amp;rdquo; model removes the risk for the CEO.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Consulting&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;Closer&amp;rdquo;&lt;/td>
&lt;td style="text-align:left">The $250/hr &amp;ldquo;Firewall&amp;rdquo; that filters for serious intent and high opportunity cost.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="2">
&lt;li>The Authority Moat: &amp;ldquo;The Proof-of-Work Tier&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>This is what makes you &amp;ldquo;Un-replaceable.&amp;rdquo; You aren&amp;rsquo;t just saying you know tech; you have 5 years of public timestamps proving it.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Home-Lab &amp;amp; Linux:&lt;/strong> Your &amp;ldquo;Infrastructure Integrity.&amp;rdquo; It proves you understand the &amp;ldquo;bare metal&amp;rdquo; and self-hosting, which is critical for privacy-conscious B2B clients (e.g., local AI/Ollama).&lt;/li>
&lt;li>&lt;strong>JAlcocerT:&lt;/strong> The &amp;ldquo;Narrative Glue.&amp;rdquo; This is your resume in motion.&lt;/li>
&lt;li>&lt;strong>FOSSengineer:&lt;/strong> Your &amp;ldquo;Passive Authority.&amp;rdquo; Even at $100/year, it’s a self-sustaining asset.
&lt;ul>
&lt;li>&lt;strong>Repurpose Strategy:&lt;/strong> Use the &lt;strong>Remotion/Video-as-Code&lt;/strong> pipeline here to turn your GitHub repos into a YouTube &amp;ldquo;Broadcast Station&amp;rdquo; for Open Source. This feeds your top-of-funnel discovery.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>The &amp;ldquo;Productization&amp;rdquo; Lab: &amp;ldquo;The SaaS/B2C Tier&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>These are your experiments in &lt;strong>Unit Economics&lt;/strong> and &lt;strong>Acquisition.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Slubne Chwile:&lt;/strong> This is your &amp;ldquo;Business Masterclass.&amp;rdquo; You are learning Google Ads, Stripe, and B2B outbound (photographers).
&lt;ul>
&lt;li>&lt;strong>The Real Asset:&lt;/strong> The &lt;strong>Slubne Leads&lt;/strong> pipeline. This is your &amp;ldquo;Infinite Lead Machine.&amp;rdquo; As you noted, the moment you swap &amp;ldquo;Photographers&amp;rdquo; for &amp;ldquo;Shopify Store Owners&amp;rdquo; or &amp;ldquo;VP of RevOps,&amp;rdquo; you have a high-ticket consulting engine.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Real Estate Whitelabel:&lt;/strong> Treat this as a &lt;strong>&amp;ldquo;Parked Asset.&amp;rdquo;&lt;/strong> It proves you can ship a full-stack, AI-integrated product. It’s a portfolio piece, not a daily grind.&lt;/li>
&lt;/ul>
&lt;ol start="6">
&lt;li>The &amp;ldquo;Non-Urgency&amp;rdquo; Audit&lt;/li>
&lt;/ol>
&lt;p>You mentioned being &amp;ldquo;tired of giving tech knowledge.&amp;rdquo;&lt;/p>
&lt;p>This is a sign that you are ready to move from &lt;strong>Stage 2 (Optimization)&lt;/strong> to &lt;strong>Stage 3 (Sovereignty).&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Action:&lt;/strong> Stop adding &amp;ldquo;How-to&amp;rdquo; posts to Linux/RPi.&lt;/li>
&lt;li>&lt;strong>Pivot:&lt;/strong> Start adding &amp;ldquo;Why-to&amp;rdquo; and &amp;ldquo;ROI-of&amp;rdquo; posts to &lt;strong>Substack&lt;/strong> and &lt;strong>JAlcocerTech&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;p>The Final Peer-to-Peer Verdict&lt;/p>
&lt;p>You have more &amp;ldquo;shipped&amp;rdquo; infrastructure than 95% of Senior Devs.&lt;/p>
&lt;p>You have a B2B outbound engine, a working Gen-BI AI tool, a live SaaS, and a 300-post library.&lt;/p>
&lt;p>&lt;strong>The only &amp;ldquo;Wall&amp;rdquo; left is your own belief that you are still the guy from 2014.&lt;/strong>&lt;/p>
&lt;p>You have the framework to scrape companies hiring for $150k RevOps roles and offer them a $42k/year ($3.5k/mo) automated solution.&lt;/p>
&lt;p>That’s a 70% discount for them and a high-margin, low-hour win for you.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /jalcocertech&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git init &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git add . &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git commit -m &lt;span class="s2">&amp;#34;Initial commit: JAlcocerTech Services&amp;#34;&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> gh repo create jalcocertech-services --private --source&lt;span class="o">=&lt;/span>. --remote&lt;span class="o">=&lt;/span>origin --push
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#this is the trick&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git submodule add https://github.com/JAlcocerT/JAlcocerT.git external/JAlcocerT
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;Add JAlcocerT repo as submodule&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone --recurse-submodules https://github.com/JAlcocerT/jalcocertech-services.git
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git submodule add https://github.com/JAlcocerT/RPi.git external/RPi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># external/Linux&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Guess what, im adding many things ive built &lt;a href="https://github.com/JAlcocerT/jalcocertech-services/tree/master/external" target="_blank" rel="noopener">for reference as submodule&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://skills.sh/anthropics/skills/frontend-design&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/jalcocertech
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tech talks 26 #jalcocertech-consulting.pages.dev&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/selfhosted-landing &lt;span class="c1">#consulting.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps -a --filter &amp;#34;name=selfhosted-landing-prod&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx wrangler pages deploy dist --project-name jalcocertech-consulting
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run build &amp;amp;&amp;amp; npx wrangler pages deploy dist&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx wrangler pages project delete your_project_name&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/consulting.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>There is been some &lt;a href="https://github.com/JAlcocerT/1ton-ebooks/blob/master/crq-redesign.md" target="_blank" rel="noopener">crq for re-designs&lt;/a>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-13">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#jalcocertech-ebooks.pages.dev&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/1ton-ebooks &lt;span class="c1">#ebooks.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps -a --filter &amp;#34;name=ebook&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker compose -f docker-compose.prod.yml up -d --build #via termix&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/obfuscate #diy.&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-13"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Ive &lt;a href="https://github.com/JAlcocerT/jalcocertech-services/blob/master/ops/repo-inventory.md" target="_blank" rel="noopener">reference quite a few of them&lt;/a>, as you can imagine they matter for context:&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://webaudit.jalcocertech.com/" target="_blank" rel="noopener">https://webaudit.jalcocertech.com/&lt;/a> yea, the one to &lt;a href="https://jalcocert.github.io/JAlcocerT/how-to-perform-free-web-audit/#programmatic-free-audits-for-websites" target="_blank" rel="noopener">show a problem&lt;/a> based on &lt;a href="https://github.com/JAlcocerT/poc_webs_magnet" target="_blank" rel="noopener">this repo&lt;/a>&lt;/li>
&lt;/ol>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/GbR8fuwF5AA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;ol start="2">
&lt;li>&lt;a href="https://genbi.jalcocertech.com/" target="_blank" rel="noopener">https://genbi.jalcocertech.com/&lt;/a> which I made &lt;a href="https://github.com/JAlcocerT/poc_shopify" target="_blank" rel="noopener">at this repo&lt;/a>&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-14">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/poc_shopify&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/langchain-db-ui&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-14"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/GbR8fuwF5AA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;ol start="3">
&lt;li>&lt;a href="https://realestate.jalcocertech.com/" target="_blank" rel="noopener">https://realestate.jalcocertech.com/&lt;/a> the one a &lt;a href="https://jalcocert.github.io/JAlcocerT/white-label-real-estate-solution/" target="_blank" rel="noopener">whitelabeled here&lt;/a>&lt;/li>
&lt;/ol>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/GbR8fuwF5AA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;ol start="4">
&lt;li>RevOps&lt;/li>
&lt;/ol>
&lt;p>&lt;a href="https://github.com/JAlcocerT/jalcocertech-services/blob/master/content/bios/z-my-story-gemini.md" target="_blank" rel="noopener">A look back to your story&lt;/a> is always a good way to spend time.&lt;/p>
&lt;pre class="mermaid mt-6">flowchart LR
%% --- Styles ---
classDef free fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20;
classDef low fill:#FFF9C4,stroke:#FBC02D,stroke-width:2px,color:#F57F17;
classDef mid fill:#FFE0B2,stroke:#F57C00,stroke-width:2px,color:#E65100;
classDef high fill:#FFCDD2,stroke:#C62828,stroke-width:2px,color:#B71C1C;
%% --- Nodes ---
L1("Free Content&lt;br/>(Blog/YT $0)"):::free
L2("DIY&lt;br/>(Templates / Platform) $"):::low
L3("Done With You&lt;br/>(Consulting) $$"):::mid
L4("Done For You&lt;br/>(Services) $$$"):::high
%% --- Connections ---
L1 --> L2
L2 --> L3
L3 --> L4&lt;/pre>&lt;p>Nobody cares if you are using: windsurf, cursor, zed, gram, antigravity, &lt;a href="https://kilo.ai/open" target="_blank" rel="noopener">kilo code&lt;/a>, roo code, claude, codex, gemini cli, Goose Desktop&amp;hellip;.&lt;/p>
&lt;p>Everyone just care about its own&lt;/p>
&lt;p>and here is where the people go to &lt;strong>reach their desired state&lt;/strong>:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/consulting.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/ebooks.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks with free value.&lt;/div>&lt;/a>
&lt;/div>
&lt;p>From &lt;a href="https://jalcocert.github.io/JAlcocerT/quick-weddings-poc/#my-current-value-ladder" target="_blank" rel="noopener">value ladder&lt;/a> to hub:&lt;/p>
&lt;pre class="mermaid mt-6">flowchart LR
%% --- Styles ---
classDef authority fill:#E3F2FD,stroke:#1565C0,stroke-width:2px,color:#0D47A1;
classDef core fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20;
classDef offer fill:#FFF3E0,stroke:#EF6C00,stroke-width:2px,color:#E65100;
classDef magnet fill:#FFF8E1,stroke:#F9A825,stroke-width:2px,color:#F57F17;
classDef edge fill:#F3E5F5,stroke:#6A1B9A,stroke-width:2px,color:#4A148C;
%% --- Nodes ---
A["Authority / Content Properties&lt;br/>JAlcocerT, Linux, RPi, Home-Lab"]:::authority
B["Core Brand Hub&lt;br/>JAlcocerTech"]:::core
C["Core Commercial Surfaces&lt;br/>Consulting, eBooks"]:::offer
D["Lead Magnets / Solutions&lt;br/>Web Audits, GenBI, Real Estate"]:::magnet
E["Experiments&lt;br/>PoCs, Slubne Chwile"]:::edge
F["Legacy / Other Brands&lt;br/>IoTechCrafts, FOSSengineer"]:::edge
%% --- Connections ---
A --> B
B --> C
B --> D
E -.-> B
F -.-> B&lt;/pre>&lt;p>The “One Product / One Channel / Lead Magnet” assumes commercial intent and audience acquisition mechanics.&lt;/p>
&lt;p>Some repos are &lt;a href="https://github.com/JAlcocerT/jalcocertech-services/blob/master/docs/go-to-market-templates.md" target="_blank" rel="noopener">authority assets, not direct offers&lt;/a>.&lt;/p>
&lt;p>For commercial properties, use:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Element&lt;/th>
&lt;th style="text-align:left">Decision&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">One Avatar&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">One Product&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">One Channel&lt;/td>
&lt;td style="text-align:left">Warm Outreach / Free Content / Cold Outreach / Paid Ads&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Lead Magnet&lt;/td>
&lt;td style="text-align:left">Strategy Type: , Delivery Method:&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-17">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl"> amazing, could we now proceed with /external/Home-Lab and create the repos/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> homelab.md and update the repo-inventory.md?&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-17"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>For authority/content repos, use:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Element&lt;/th>
&lt;th style="text-align:left">Decision&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">Primary Audience&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Core Topic&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Primary Discovery Channel&lt;/td>
&lt;td style="text-align:left">Search / Social / Internal Linking / YouTube&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">Business Role&lt;/td>
&lt;td style="text-align:left">Authority / Trust / Proof / Nurture&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>That way you keep the spirit without forcing a sales schema onto technical &lt;br>
libraries.&lt;/p>
&lt;p>So the answer is: yes, but this is not only for products, and it should be split&lt;br>
into two templates:&lt;/p>
&lt;ul>
&lt;li>commercial/offer template&lt;/li>
&lt;li>authority/content template&lt;/li>
&lt;/ul>
&lt;p>For ebooks the question is to&lt;a href="https://www.cognism.com/blog/gated-vs-ungated-content-marketing" target="_blank" rel="noopener"> gate or not to gate&lt;/a>&lt;/p>
&lt;p>This was a very interesting &lt;a href="https://github.com/JAlcocerT/jalcocertech-services/tree/master/repos" target="_blank" rel="noopener">repo distillation exercise&lt;/a> to do with codex: &lt;em>using &lt;code>5.4&lt;/code> and all the weekly tokens :)&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-18">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#codex #/status&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-18"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>About Pro Delivery&lt;span class="absolute -mt-20" id="about-pro-delivery">&lt;/span>
&lt;a href="#about-pro-delivery" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>First thing first: know the context and where are you at these&lt;/p>
&lt;p>P*V&lt;/p>
&lt;p>are you part of the GM that delivers?&lt;/p>
&lt;p>some R&amp;amp;D? marketing to attract/convert?&lt;/p>
&lt;p>value eq ofc&lt;/p>
&lt;p>Then&amp;hellip;you are well aware of the context and can formulate it&lt;/p>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ol>
&lt;li>If you are deploying via cloudflare tunnels, you can restrict the access of your web/apps to certain countries only.&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>See how ive done so for some selfhosted services&lt;/p>
&lt;/blockquote>
&lt;ol start="2">
&lt;li>From Engineering metrics to behavioral patterns (DORA!)&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>because writting code is no longer the bottleneck&lt;/p>
&lt;/blockquote>
&lt;p>One thing is a vibe coder, another an engineering doing agentic driven SD&lt;/p>
&lt;p>Human and Organization change management will definitely be a thing&lt;/p>
&lt;p>similarly as introducing agile or devops was a thing&lt;/p>
&lt;p>It&amp;rsquo;d help for you to be prepare with nice questions and write proper docs&lt;/p>
&lt;ol start="3">
&lt;li>Have you finally added business knowledge to the ebooks?&lt;/li>
&lt;/ol>
&lt;p>Yep, with help of&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-19">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv add kreuzberg&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">foreach &lt;span class="o">(&lt;/span>&lt;span class="nv">$f&lt;/span> in Get-ChildItem *.pdf&lt;span class="o">)&lt;/span> &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> uvx kreuzberg extract &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &amp;gt; &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>&lt;span class="nv">$f&lt;/span>.BaseName&lt;span class="k">)&lt;/span>&lt;span class="s2">.txt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-19"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>&lt;a href="https://skills.sh/ratacat/claude-skills/annas-archive-ebooks" target="_blank" rel="noopener">https://skills.sh/ratacat/claude-skills/annas-archive-ebooks&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3>Programmatic Formbricks via API&lt;span class="absolute -mt-20" id="programmatic-formbricks-via-api">&lt;/span>
&lt;a href="#programmatic-formbricks-via-api" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>There is no good landing without a place for people to say sth.&lt;/p>
&lt;p>Like opinions or provide their contact.&lt;/p>
&lt;p>Going to formbricks UI is nice and you can do that.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-20">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># curl -X GET &amp;#34;https://&amp;lt;your-formbricks-host&amp;gt;/api/v1/management/surveys&amp;#34; \&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># -H &amp;#34;Authorization: Bearer &amp;lt;NEW_API_KEY&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl --request GET &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --url &lt;span class="s2">&amp;#34;https://app.formbricks.com/api/v1/management/surveys&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --header &lt;span class="s2">&amp;#34;x-api-key: YOUR_FORMBRICKS_API_KEY&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -H &lt;span class="s2">&amp;#34;x-api-key:fbk_abcd&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;https://app.formbricks.com/api/v1/management/surveys&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> jq&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-20"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Or &lt;del>you&lt;/del> your agent can make surveys programmatically with the context of the full service.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-21">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /jalcocertech-services&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd jalcocertech-services/forms&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv init&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run main.py whoami
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">choco install make
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make surveys-json &amp;gt; surveys_output.json #export them all as json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run python main.py create survey-sample.json &lt;span class="c1">#create one from json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make publish &lt;span class="nv">SURVEY_ID&lt;/span>&lt;span class="o">=&lt;/span> &lt;span class="c1">#to make it public :)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-21"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>All included &lt;a href="https://github.com/JAlcocerT/jalcocertech-services/tree/master/forms" target="_blank" rel="noopener">here&lt;/a>.&lt;/p>
&lt;p>Not convinced?&lt;/p>
&lt;p>Well&amp;hellip;then it seems that you dont have &lt;a href="https://jalcocert.github.io/JAlcocerT/the-ideas-bucket-can-be-empty/#ideas-checklist" target="_blank" rel="noopener">a sistematic way to validate ideas&lt;/a> and prospects.&lt;/p>
&lt;h3>Interesting Articles&lt;span class="absolute -mt-20" id="interesting-articles">&lt;/span>
&lt;a href="#interesting-articles" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://factory.ai/news/agent-readiness" target="_blank" rel="noopener">https://factory.ai/news/agent-readiness&lt;/a> - teams that are already good at devops, ci/cd have a better foundation for the ai driven sdlc&lt;/li>
&lt;/ul>
&lt;h3>Interesting Videos&lt;span class="absolute -mt-20" id="interesting-videos">&lt;/span>
&lt;a href="#interesting-videos" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;!-- * https://www.youtube.com/watch?v=pIZ_MXutC0o -->
&lt;!--
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/v=pIZ_MXutC0o" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/pIZ_MXutC0o" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- * https://www.youtube.com/watch?v=_VLZ4b9LHLs -->
&lt;!--
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/v=_VLZ4b9LHLs" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/_VLZ4b9LHLs" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h3>Are you Free?&lt;span class="absolute -mt-20" id="are-you-free">&lt;/span>
&lt;a href="#are-you-free" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>We can derive a &lt;strong>Pure Ratio Formula&lt;/strong> that ignores currency and absolute numbers entirely.&lt;/p>
&lt;p>How about abstracting life into percentages?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-22">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /poc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> poc/aegis-freedom/web &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> npm run dev
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run build &amp;amp;&amp;amp; npx wrangler pages deploy out --project-name aegis-freedom&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make deploy&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-22"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/data-experiments/no-bs-kpi.png" alt="No more bullshit financial KPI" loading="lazy" />&lt;/p>
&lt;blockquote>
&lt;p>See &lt;code>https://aegis-freedom.pages.dev/&lt;/code>, the kpis are already added&lt;/p>
&lt;/blockquote>
&lt;p>yea, lets avoid hurting anyone :)&lt;/p>
&lt;p>We can determine your &amp;ldquo;Financial Independence Factor&amp;rdquo; ($FI_f$)&lt;/p>
&lt;p>To know if you are FIRE, we just need to see if your &lt;strong>Stock-to-Expense Ratio&lt;/strong> is $\ge 25$ (the inverse of the 4% rule).&lt;/p>
&lt;p>Let:&lt;/p>
&lt;ul>
&lt;li>$S_r = \text{Savings Rate}$ (The $%$ of net income you save)&lt;/li>
&lt;li>$E_r = \text{Expense Rate}$ (The $%$ of net income you spend, which is $1 - S_r$)&lt;/li>
&lt;li>$F_s = \text{Flow-to-Stock Ratio}$ (The ratio of your annual savings to your total assets)&lt;/li>
&lt;/ul>
&lt;p>We want to find the &lt;strong>Multiple of Expenses&lt;/strong> ($M$) currently held in your &amp;ldquo;Stock.&amp;rdquo;&lt;/p>
&lt;p>The formula is:&lt;/p>
&lt;p>$$M = \frac{S_r}{F_s \times E_r}$$&lt;/p>
&lt;p>For example:&lt;/p>
&lt;p>$$M = \frac{0.90}{0.06 \times 0.10}$$
$$M = \frac{0.90}{0.006}$$
$$M = 150$$&lt;/p>
&lt;p>In the world of FIRE, the &amp;ldquo;Safe&amp;rdquo; number is usually &lt;strong>25&lt;/strong> (the 4% rule) or &lt;strong>33&lt;/strong> (the 3% rule for ultra-safety).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>$M = 25$&lt;/strong>: You are Independent &lt;em>Standard FIRE- You have a 95% statistical chance of your money lasting 30 years.&lt;/em>&lt;/li>
&lt;li>&lt;strong>$M = 150$&lt;/strong>: You are &amp;ldquo;Post-Economic.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>The &amp;ldquo;Universal Fire Formula&amp;rdquo;&lt;/p>
&lt;p>If you want a single equation to test anyone (or yourself in the future), you are FIRE if:
$$\frac{S_r}{F_s \times E_r} \ge 25$$&lt;/p>
&lt;p>If you spent 50% of your income ($E_r = 0.50$), that same 6% flow-to-stock would only give you a multiplier of &lt;strong>3&lt;/strong>—meaning you’d only have 3 years of life saved.&lt;/p>
&lt;h3>Where are you going?&lt;span class="absolute -mt-20" id="where-are-you-going">&lt;/span>
&lt;a href="#where-are-you-going" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>This time, not the strategic life decisition&lt;/p>
&lt;p>but the body traslation in the &lt;del>&lt;a href="https://jalcocert.github.io/JAlcocerT/2d-mbsd/" target="_blank" rel="noopener">plane&lt;/a>&lt;/del> space :p&lt;/p>
&lt;p>because if you are free, how come you are not &lt;a href="https://jalcocert.github.io/JAlcocerT/tech-for-a-trip/" target="_blank" rel="noopener">in a trip&lt;/a> (?)&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/using-langchain-with-pandas-df//" target="_blank" rel="noreferrer">&lt;img
alt="Trip Planner Post"
loading="lazy"
decoding="async"
src="https://github.com/JAlcocerT/Py_Trip_Planner/raw/main/images/trip-planner-main-graph.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Trip Planner Post&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Weather Trends with Python&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/Py_Trip_Planner" target="_blank" rel="noreferrer">&lt;img
alt="Trip Planner"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Trip Planner&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">A Py WebApp for weather planning&lt;/div>&lt;/a>
&lt;/div>
&lt;p>How could i guessed that the v3 would be done just asking: &lt;a href="https://github.com/JAlcocerT/Py_Trip_Planner/tree/main/poc-vibe-weather" target="_blank" rel="noopener">https://github.com/JAlcocerT/Py_Trip_Planner/tree/main/poc-vibe-weather&lt;/a>&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/dev/cc-agents.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Who knows&lt;/p>
&lt;p>maybe you even get surprised with few &lt;a href="#charts-for-data-products" >more libraries for charts&lt;/a>, like shadcn charts or &lt;a href="https://recharts.github.io/" target="_blank" rel="noopener">RechartsJS&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-23">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/Py_Trip_Planner
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./Py_Trip_Planner/poc-vibe-weather
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker compose up --build&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s trip -n backend -c &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="k">)&lt;/span>&lt;span class="s2">/backend&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;uv sync &amp;amp;&amp;amp; uv run uvicorn app.main:app --reload --port 8000&amp;#34;&lt;/span> &lt;span class="se">\;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> new-window -n frontend -c &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="k">)&lt;/span>&lt;span class="s2">/frontend&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;npm install --legacy-peer-deps &amp;amp;&amp;amp; npm run dev&amp;#34;&lt;/span> &lt;span class="se">\;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> attach&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-23"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This is how it looks the vibe coded v3 UI/X:&lt;/p>
&lt;p>&lt;img src="https://raw.githubusercontent.com/JAlcocerT/Py_Trip_Planner/main/poc-vibe-weather/new-uix.png" alt="Trip Planner Full Stack UI-X" loading="lazy" />&lt;/p>
&lt;!--
https://github.com/JAlcocerT/Py_Trip_Planner/blob/main/poc-vibe-weather/new-uix.png -->
&lt;h3>Charts for Data Products&lt;span class="absolute -mt-20" id="charts-for-data-products">&lt;/span>
&lt;a href="#charts-for-data-products" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Where are you in the plot ladder?&lt;/p>
&lt;ol>
&lt;li>Matplotlib vs Plotly&lt;/li>
&lt;li>PyGWalker with Streamlit&lt;/li>
&lt;li>Chartjs vs ApexCharts&lt;/li>
&lt;li>RechartsJS vs Shadcn Charts&lt;/li>
&lt;/ol>
&lt;p>What will you tell me next, that the &lt;a href="https://github.com/JAlcocerT/poc_shopify" target="_blank" rel="noopener">plots are rendered automatically&lt;/a> as per your questions?&lt;/p></description></item><item><title>Design (thinking) around AI</title><link>https://JAlcocerT.github.io/JAlcocerT/about-motion-graphics/</link><pubDate>Sun, 19 Apr 2026 06:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/about-motion-graphics/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>The end of excuses for NOT having a brand.&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>RemotionJs and its first application around mechanism videos, electronic videos, oss tech video review even &lt;a href="https://jalcocert.github.io/JAlcocerT/quick-weddings-poc/#ads-x-remotion-promo-video" target="_blank" rel="noopener">MVP promo videos&lt;/a> has been great&lt;/p>
&lt;p>Now that everything possible to be codable as web can be a video&amp;hellip;&lt;/p>
&lt;h2>Ways to Motion Graphic&lt;span class="absolute -mt-20" id="ways-to-motion-graphic">&lt;/span>
&lt;a href="#ways-to-motion-graphic" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>You got it, there are few ways around&lt;/p>
&lt;p>Ive tried a few:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/3Design" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
3d design x blender | Github ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/VideoEditingRemotion" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Shopofy AI COO | Landing x App | Github ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;h3>Blender&lt;span class="absolute -mt-20" id="blender">&lt;/span>
&lt;a href="#blender" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/using-blender-with-ai/" target="_blank" rel="noopener">Experimenting with blender&lt;/a> has been great.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/3Design
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /mbsd&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Ive also been using blender together with mechanisms &lt;a href="https://jalcocert.github.io/JAlcocerT/about-constrained-mechanism/#2d-kinematics-x-blender" target="_blank" rel="noopener">here&lt;/a>&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/QQq3d_QHmns" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://youtu.be/QQq3d_QHmns -->
&lt;blockquote>
&lt;p>Running this &lt;a href="https://jalcocert.github.io/JAlcocerT/cad-design-mbsd/#rendering-on-a-mac-m2" target="_blank" rel="noopener">in a mac M2&lt;/a> was waaay faster&lt;/p>
&lt;/blockquote>
&lt;h3>Web Technologies&lt;span class="absolute -mt-20" id="web-technologies">&lt;/span>
&lt;a href="#web-technologies" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Because the web technologies can do a lot.&lt;/p>
&lt;!--
https://www.youtube.com/watch?v=j1oJi1Pfobs
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/j1oJi1Pfobs" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>I got inspored by DotCSV again :)&lt;/p>
&lt;p>And continue the &lt;a href="https://jalcocert.github.io/JAlcocerT/oss-automatic-docs-and-tech-video/" target="_blank" rel="noopener">repo to doc/video seen here&lt;/a>&lt;/p>
&lt;h3>RemotionJS&lt;span class="absolute -mt-20" id="remotionjs">&lt;/span>
&lt;a href="#remotionjs" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>As we learnt here, just: &lt;a href="https://www.remotion.dev/prompts" target="_blank" rel="noopener">https://www.remotion.dev/prompts&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx skills add remotion-dev/skills&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx remotion render BrandIntro renders/intro-jalcocertech.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx remotion render CEOIntro out/ceo-intro.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx remotion render CEOIntro out/intro-jalcocertech.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Or just &lt;a href="https://github.com/JAlcocerT/jalcocertech-services/tree/master/channel-youtube/jalcocertech-intros/src" target="_blank" rel="noopener">render them all&lt;/a>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npx remotion render FullVideo out/full-video.mp4 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://youtu.be/UDbUPYFfBxA -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/UDbUPYFfBxA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h3>ThreeJS and BabbylonJS&lt;span class="absolute -mt-20" id="threejs-and-babbylonjs">&lt;/span>
&lt;a href="#threejs-and-babbylonjs" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>if you wondered how &lt;a href="https://jalcocert.github.io/JAlcocerT/micro-saas/#quantux" target="_blank" rel="noopener">lando website was possible&lt;/a>&lt;/p>
&lt;p>Or how Ive been tinkering with a &lt;a href="https://jalcocert.github.io/JAlcocerT/2d-mbsd/#a-2d-mbsd-simulator" target="_blank" rel="noopener">custom mbsd simulator/animator&lt;/a> for the &lt;a href="https://github.com/JAlcocerT/mbsd/tree/master/2D-Simulator" target="_blank" rel="noopener">augmented reality part (AR)&lt;/a>&lt;/p>
&lt;p>ThreeJS is the answer if you dont want to &lt;a href="https://jalcocert.github.io/JAlcocerT/cad-design-mbsd/#conclusions" target="_blank" rel="noopener">mess around with python-&amp;gt;CadQuery-&amp;gt;Blender&lt;/a>&lt;/p>
&lt;h3>HyperFrame&lt;span class="absolute -mt-20" id="hyperframe">&lt;/span>
&lt;a href="#hyperframe" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>We have a new library in town: &lt;a href="https://github.com/heygen-com/hyperframes" target="_blank" rel="noopener">https://github.com/heygen-com/hyperframes&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>Apache v2 | Write HTML. Render video. Built for agents.&lt;/p>
&lt;/blockquote>
&lt;p>You bet there are skills too: &lt;a href="https://skills.sh/heygen-com/hyperframes/hyperframes" target="_blank" rel="noopener">https://skills.sh/heygen-com/hyperframes/hyperframes&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npx skills add heygen-com/hyperframes&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Full docs: &lt;a href="https://hyperframes.heygen.com/introduction" target="_blank" rel="noopener">https://hyperframes.heygen.com/introduction&lt;/a>&lt;/p>
&lt;p>Machine-readable index for AI tools: &lt;a href="https://hyperframes.heygen.com/llms.txt" target="_blank" rel="noopener">https://hyperframes.heygen.com/llms.txt&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">what do i need to provide for you to use the website to hyperframe skill?&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>After consuming 85% of the 5h slot tokens and having these learnings, the video appeared by just having my website as context:&lt;/p>
&lt;!-- https://youtu.be/KLpPt9P9s2E -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/KLpPt9P9s2E" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>The speech?&lt;/p>
&lt;p>Generated automatically &lt;a href="https://github.com/thewh1teagle/kokoro-onnx" target="_blank" rel="noopener">with the OSS kokoro TTS&lt;/a>&lt;/p>
&lt;p>You can see the video compositions &lt;a href="https://github.com/JAlcocerT/jalcocertech/tree/main/z-hyperframes" target="_blank" rel="noopener">like this test&lt;/a> at: &lt;code>http://localhost:3002/#project/z-hyperframes&lt;/code>&lt;/p>
&lt;h3>A word for Matplotlib&lt;span class="absolute -mt-20" id="a-word-for-matplotlib">&lt;/span>
&lt;a href="#a-word-for-matplotlib" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>You can still do nice data animations with matplotlib!&lt;/p>
&lt;p>Its just that for a brand, just level up with any of the previous.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/keystaticcms-astrodb/#animations" target="_blank" rel="noreferrer">&lt;img
alt="Tinkering with Animations | Post"
loading="lazy"
decoding="async"
src="https://img.youtube.com/vi/YuvHXyFeRV4/hqdefault.jpg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Tinkering with Animations | Post&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Posting to Twitter or Youtube those animations 101.&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/DataInMotion" target="_blank" rel="noreferrer">&lt;img
alt="Data In Motion Repo"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Data In Motion Repo&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">DatainMotion Source Code on Github. Generating mp4 animations with Matplotlib and Python&amp;hellip;&lt;/div>&lt;/a>
&lt;/div>
&lt;h2>Applications&lt;span class="absolute -mt-20" id="applications">&lt;/span>
&lt;a href="#applications" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Tech Talk Intro Videos&lt;span class="absolute -mt-20" id="tech-talk-intro-videos">&lt;/span>
&lt;a href="#tech-talk-intro-videos" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Ive used hyperframe as a &lt;a href="https://github.com/JAlcocerT/selfhosted-landing/tree/master/y2026-tech-talks/4-iot-to-bigdata/tech-talk/sensor-to-dashboard" target="_blank" rel="noopener">second test here&lt;/a>&lt;/p>
&lt;p>The goal?&lt;/p>
&lt;p>To make a catchy short video as an intro for this &lt;a href="https://jalcocert.github.io/JAlcocerT/plants-102-and-iot/#big-data-tech-talk" target="_blank" rel="noopener">big data x dht&amp;rsquo;s related tech talk&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">thats amazing, now with your hyperframe skills, and looking at the dht-webapp look and feel, can we make a intro-video.md with a draft of what would be a catchy video that i can upload to youtube for the team to have and see whats coming? lets say 30 seconds duration. lets also consider all the psyco stuf&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># git clone selfhosted-landing&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./y2026-tech-talks&lt;span class="se">\4&lt;/span>-iot-to-bigdata&lt;span class="se">\t&lt;/span>ech-talk&lt;span class="se">\s&lt;/span>ensor-to-dashboard
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx hyperframes preview &lt;span class="c1"># preview in browser (studio editor)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx hyperframes render &lt;span class="c1"># render to MP4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> tech-talk/sensor-to-dashboard &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> npx hyperframes render --quality high&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>See &lt;code>http://localhost:3003/#project/sensor-to-dashboard&lt;/code>&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/51kgUUPyIWY" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://youtu.be/51kgUUPyIWY -->
&lt;p>You can add it to readme.md like:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">[&lt;span class="nt">![Watch the demo&lt;/span>](&lt;span class="na">https://img.youtube.com/vi/51kgUUPyIWY/0.jpg&lt;/span>)](https://www.youtube.com/watch?v=51kgUUPyIWY) &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Data Stories - F1, Finance&amp;hellip;&lt;span class="absolute -mt-20" id="data-stories---f1-finance">&lt;/span>
&lt;a href="#data-stories---f1-finance" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>You could go with matplotlib:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/eda-f1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd eda-f1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make help&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Or with remotionJS:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://github.com/JAlcocerT/eda-f1/tree/master/remotion-f1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/VideoEditingRemotion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./VideoEditingRemotion/remotion-cc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#time npx remotion render GoldPrice gold-price.mp4 #just 20seconds&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx remotion render GoProHudB renders/gopro-hud-GH020417.mp4 --concurrency=2 #https://github.com/JAlcocerT/VideoEditingRemotion/blob/main/remotion-cc/src/F1ChampionshipComposition.tsx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-f1-championship &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>See &lt;a href="https://youtu.be/aAfD2Yfnk0Q" target="_blank" rel="noopener">this&lt;/a>&lt;/p>
&lt;!--
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/aAfD2Yfnk0Q" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
-->
&lt;p>Who could guess that &lt;a href="https://youtu.be/hTz2J4EgNOs" target="_blank" rel="noopener">gold is so beautiful to animate&lt;/a>?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make render-gold&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make render-inflation-fedrate&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-yield-curve&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!--
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/idhTXShKHvw" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
-->
&lt;p>Or &lt;a href="https://youtu.be/idhTXShKHvw" target="_blank" rel="noopener">this&lt;/a>&lt;/p>
&lt;p>yea, financial data called via API and rendered into a video:&lt;/p>
&lt;!-- https://youtu.be/USSx0kKZE8Y -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/USSx0kKZE8Y" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h3>A Proper brand&lt;span class="absolute -mt-20" id="a-proper-brand">&lt;/span>
&lt;a href="#a-proper-brand" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Are you selecting? or being selected?&lt;/p>
&lt;p>wt* am I talking about?&lt;/p>
&lt;p>Im saying if you were the one who selected your partner, your job, the place that you live in&lt;/p>
&lt;p>Or if that was chosen for you.&lt;/p>
&lt;p>If you have not, you need backend engine, the hard skills.&lt;/p>
&lt;p>And like it or not, also the soft/frontend/marketing/attraction ones.&lt;/p>
&lt;p>Remember that &lt;a href="https://jalcocert.github.io/JAlcocerT/white-label-real-estate-solution/" target="_blank" rel="noopener">white labeled RE solution&lt;/a> that went nowere due to missing &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution/" target="_blank" rel="noopener">basic disqualification&lt;/a> non performed?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npx skills add heygen-com/hyperframes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx skills add remotion-dev/skills&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Some claude, 10min and 50% tokens consumed later:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./jalcocertech-services&lt;span class="se">\c&lt;/span>hannel-youtube&lt;span class="se">\b&lt;/span>rand-template
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx hyperframes preview
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx hyperframes render&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/zDMjKYQgNUE" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://youtu.be/zDMjKYQgNUE -->
&lt;p>Not sure what to pick?&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Dimension&lt;/th>
&lt;th style="text-align:left">HyperFrames&lt;/th>
&lt;th style="text-align:left">RemotionJS&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>File complexity&lt;/strong>&lt;/td>
&lt;td style="text-align:left">One HTML file&lt;/td>
&lt;td style="text-align:left">Full React project (package.json, TSX, config)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Learning curve&lt;/strong>&lt;/td>
&lt;td style="text-align:left">CSS + GSAP — familiar if you do web&lt;/td>
&lt;td style="text-align:left">React + TypeScript + Remotion API&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>AI generation&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Very high — Claude writes HTML in one shot&lt;/td>
&lt;td style="text-align:left">Medium — needs project scaffold + component structure&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Animation power&lt;/strong>&lt;/td>
&lt;td style="text-align:left">GSAP — industry standard, extremely capable&lt;/td>
&lt;td style="text-align:left">&lt;code>interpolate()&lt;/code> + &lt;code>spring()&lt;/code> — powerful but more verbose&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Setup time&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>npx hyperframes init&lt;/code> → write HTML → render&lt;/td>
&lt;td style="text-align:left">&lt;code>npx create-video&lt;/code> → write TSX → wire composition → render&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Reusability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Copy HTML scenes between files&lt;/td>
&lt;td style="text-align:left">React components are properly modular and importable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Data-driven content&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Manual or templated strings in HTML&lt;/td>
&lt;td style="text-align:left">Clean — pass props, map arrays, compute from data&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>TTS / captions&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Built-in: &lt;code>npx hyperframes tts&lt;/code>&lt;/td>
&lt;td style="text-align:left">Manual integration&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Community / docs&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Small, new&lt;/td>
&lt;td style="text-align:left">Large, established — lots of examples&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Best for&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Quick branded videos, architecture diagrams, idents, one-off compositions&lt;/td>
&lt;td style="text-align:left">Long-form series, data-driven videos, reusable component libraries&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The reason people are &amp;ldquo;lost without enough details&amp;rdquo; is that they lack Pattern Recognition (the horizontal bar of T-shape).&lt;/p>
&lt;p>Get to know the connections your team is missing:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/consulting.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/ebooks.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks with free value.&lt;/div>&lt;/a>
&lt;/div>
&lt;p>&lt;strong>HyperFrames&lt;/strong> in one sentence: it&amp;rsquo;s literally one HTML file.&lt;/p>
&lt;p>You write scenes as divs, animate with GSAP in a script tag, and the CLI captures the browser to MP4.&lt;/p>
&lt;p>An AI agent can write the whole thing in one pass — which is why brand-template/index.html just appeared from a brief.&lt;/p>
&lt;p>&lt;strong>RemotionJS&lt;/strong>: a proper React project with TSX components, useCurrentFrame(), a full Node build pipeline.&lt;/p>
&lt;p>More setup, more structure, genuinely better for data-driven or reusable component scenarios.&lt;/p>
&lt;p>The practical split: HyperFrames for anything visual/animated (idents, diagrams, title cards, stat animations), RemotionJS for the automated repo→video pipeline where you&amp;rsquo;re feeding structured data into a template.&lt;/p>
&lt;p>Both tools, different jobs.&lt;/p>
&lt;p>Adding to the previous some &lt;a href="https://stitch.withgoogle.com/projects/6262766544279341423?pli=1" target="_blank" rel="noopener">stitch&lt;/a> and &lt;a href="https://claude.ai/design/p/5c659bb6-4d70-4954-8500-8275f3ba3950" target="_blank" rel="noopener">claude design&lt;/a>.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-13">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./jalcocertech-services&lt;span class="se">\c&lt;/span>hannel-youtube
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run python genbi-1/transcribe.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#genbi-1/generate_tts.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> genbi-1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx hyperframes transcribe narration.wav&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx hyperframes preview .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx hyperframes render&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-13"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/GbR8fuwF5AA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!--
https://youtu.be/GbR8fuwF5AA -->
&lt;ol>
&lt;li>Write the script — spoken-word rules, say URLs as words, read it aloud first&lt;/li>
&lt;li>Generate audio — npx hyperframes tts or the Python script, with voice/speed guide&lt;/li>
&lt;li>Get word timestamps — uv run python transcribe.py (avoids the whisper.exe path conflict)&lt;/li>
&lt;li>Map words to triggers — the 0.2–0.4s early rule, with the genbi-1 mapping as a concrete example&lt;/li>
&lt;li>Wire the GSAP timeline — use real timestamps as position parameters, not guesses&lt;/li>
&lt;li>Preview and fine-tune — npx hyperframes preview . for scrubbing&lt;/li>
&lt;li>Render — npx hyperframes render .&lt;/li>
&lt;/ol>
&lt;p>The key insight documented: Whisper may mishear words (&amp;ldquo;Jira&amp;rdquo; → &amp;ldquo;Gira&amp;rdquo;) but the timestamp is still correct — the engine timestamps the sound, not the spelling.&lt;/p>
&lt;p>And the note on why we didn&amp;rsquo;t use HyperFrames auto-captions here: the text IS the animation, not a subtitle overlay.&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Audio powered locally with &lt;a href="https://github.com/JAlcocerT/jalcocertech-services/blob/master/channel-youtube/tts-hyperframe.md" target="_blank" rel="noopener">kokoro (TTS) and whisper (S2T)&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>About Design Thinking&lt;span class="absolute -mt-20" id="about-design-thinking">&lt;/span>
&lt;a href="#about-design-thinking" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Design thinking isn&amp;rsquo;t a single step in the requirements process; it is the &amp;ldquo;discovery engine&amp;rdquo; that fuels the quality of your documentation.&lt;/p>
&lt;p>While these documents are often seen as a linear progression, design thinking ensures that what you are documenting actually solves a human problem.&lt;/p>
&lt;p>Here is how design thinking integrates into the lifecycle of a &lt;strong>Business Requirements Document (BRD)&lt;/strong>, &lt;strong>Product Requirements Document (PRD)&lt;/strong>, and &lt;strong>Functional Requirements Document (FRD)&lt;/strong>.&lt;/p>
&lt;ol>
&lt;li>The BRD (The &amp;ldquo;Why&amp;rdquo;)&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Role of Design Thinking: Empathize &amp;amp; Define&lt;/strong>&lt;/p>
&lt;p>The BRD focuses on high-level business goals. Design thinking plays a critical role here by ensuring the business goal aligns with a genuine user need.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Stakeholder Empathy:&lt;/strong> Using empathy maps to understand the pain points of the business owners and the end users.&lt;/li>
&lt;li>&lt;strong>Problem Reframing:&lt;/strong> Instead of a BRD saying &amp;ldquo;We need a loyalty app,&amp;rdquo; design thinking helps the BRD say &amp;ldquo;We need to reduce customer churn by increasing emotional engagement.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Outcome:&lt;/strong> A BRD grounded in a validated &amp;ldquo;Problem Statement&amp;rdquo; rather than just a list of features the board wants.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The PRD (The &amp;ldquo;What&amp;rdquo;)&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Role of Design Thinking: Ideate &amp;amp; Prototype&lt;/strong>&lt;/p>
&lt;p>The PRD bridges the gap between business needs and the technical solution.&lt;/p>
&lt;p>This is where design thinking is most visible.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Ideation:&lt;/strong> Facilitating workshops (like &amp;ldquo;Crazy 8s&amp;rdquo;) to explore various ways to solve the problems defined in the BRD.&lt;/li>
&lt;li>&lt;strong>User Stories &amp;amp; Personas:&lt;/strong> Crafting requirements based on specific user archetypes developed during the research phase.&lt;/li>
&lt;li>&lt;strong>Low-Fidelity Prototyping:&lt;/strong> Before a single line of requirement is finalized, paper prototypes or wireframes are tested to see if the &amp;ldquo;What&amp;rdquo; actually works for the user.&lt;/li>
&lt;li>&lt;strong>Outcome:&lt;/strong> Requirements that are prioritized based on &lt;strong>Desirability&lt;/strong> (User), &lt;strong>Viability&lt;/strong> (Business), and &lt;strong>Feasibility&lt;/strong> (Tech).&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>The FRD (The &amp;ldquo;How&amp;rdquo;)&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Role of Design Thinking: Test &amp;amp; Iterate&lt;/strong>&lt;/p>
&lt;p>The FRD is highly technical, detailing how the system must behave to satisfy the PRD. While it feels &amp;ldquo;colder&amp;rdquo; and more functional, design thinking acts as the guardrail.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Usability Testing:&lt;/strong> If a functional requirement describes a complex multi-step checkout, design thinking asks: &amp;ldquo;Is this cognitively too heavy for the user?&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Edge Case Discovery:&lt;/strong> By &amp;ldquo;Testing&amp;rdquo; the logic through the lens of a user journey, you identify functional gaps—like what happens when a user loses internet mid-transaction.&lt;/li>
&lt;li>&lt;strong>Outcome:&lt;/strong> A technical specification that doesn&amp;rsquo;t just work perfectly under the hood, but maintains a seamless &amp;ldquo;Human-Computer Interaction&amp;rdquo; (HCI).&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Document&lt;/th>
&lt;th style="text-align:left">Primary Focus&lt;/th>
&lt;th style="text-align:left">Design Thinking Phase&lt;/th>
&lt;th style="text-align:left">Key Activity&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>BRD&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Business Goals&lt;/td>
&lt;td style="text-align:left">&lt;strong>Empathize&lt;/strong>&lt;/td>
&lt;td style="text-align:left">User interviews &amp;amp; Market research&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>PRD&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Product Features&lt;/td>
&lt;td style="text-align:left">&lt;strong>Define &amp;amp; Ideate&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Persona building &amp;amp; Wireframing&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>FRD&lt;/strong>&lt;/td>
&lt;td style="text-align:left">System Behavior&lt;/td>
&lt;td style="text-align:left">&lt;strong>Prototype &amp;amp; Test&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Usability validation &amp;amp; Logic flows&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>&lt;strong>The Big Picture:&lt;/strong> Without design thinking, a BRD/PRD/FRD chain produces a product that is &lt;strong>technically functional but useless&lt;/strong>.&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>Design thinking ensures that the &amp;ldquo;Golden Thread&amp;rdquo; of user value remains intact from the first business meeting to the final technical spec.&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;p>Both &lt;strong>Lean Startup&lt;/strong> and &lt;strong>Systems Thinking&lt;/strong> act as different &amp;ldquo;operating systems&amp;rdquo; for your documentation.&lt;/p>
&lt;p>While Design Thinking focuses on &lt;strong>human needs&lt;/strong>, Lean Startup focuses on &lt;strong>market viability&lt;/strong>, and Systems Thinking focuses on &lt;strong>structural logic&lt;/strong>.&lt;/p>
&lt;p>Here is where they plug into the BRD, PRD, and FRD framework:&lt;/p>
&lt;ol>
&lt;li>Lean Startup (The &amp;ldquo;Build-Measure-Learn&amp;rdquo; Loop)&lt;/li>
&lt;/ol>
&lt;p>Lean Startup thrives in environments with high uncertainty.&lt;/p>
&lt;p>It shifts the documentation from &amp;ldquo;predicting the future&amp;rdquo; to &amp;ldquo;testing a hypothesis.&amp;rdquo;&lt;/p>
&lt;ul>
&lt;li>&lt;strong>In the BRD (Pivot or Persevere):&lt;/strong> The BRD becomes a collection of &lt;strong>hypotheses&lt;/strong> rather than fixed requirements. Instead of &amp;ldquo;The business needs X,&amp;rdquo; it’s &amp;ldquo;We believe that by doing X, we will achieve Y (Metric), and we will know we are right when we see Z (Data).&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>In the PRD (The MVP):&lt;/strong> Lean Startup aggressively prunes the PRD. It forces the team to identify the &lt;strong>Minimum Viable Product&lt;/strong>. Any feature that doesn&amp;rsquo;t directly test the core hypothesis is moved to a &amp;ldquo;Backlog&amp;rdquo; or discarded to save speed.&lt;/li>
&lt;li>&lt;strong>In the FRD (Instrumentation):&lt;/strong> The FRD must include &amp;ldquo;Analytics Requirements.&amp;rdquo; You aren&amp;rsquo;t just documenting how a button works; you are documenting how that button&amp;rsquo;s usage is &lt;strong>tracked and measured&lt;/strong> to feed the &amp;ldquo;Learn&amp;rdquo; part of the loop.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Systems Thinking (The &amp;ldquo;Big Picture&amp;rdquo; View)&lt;/li>
&lt;/ol>
&lt;p>Systems thinking is used when a product is part of a massive, interconnected ecosystem (like a city&amp;rsquo;s power grid, a global supply chain, or a complex ERP).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>In the BRD (Interdependencies):&lt;/strong> Systems thinking identifies &lt;strong>Feedback Loops&lt;/strong>. A business goal to &amp;ldquo;Increase Sales&amp;rdquo; might have a reinforcing loop that accidentally &amp;ldquo;Overwhelms Customer Support.&amp;rdquo; The BRD uses systems mapping to ensure the business goal doesn&amp;rsquo;t break another part of the company.&lt;/li>
&lt;li>&lt;strong>In the PRD (Contextual Impact):&lt;/strong> The PRD looks beyond the user&amp;rsquo;s screen. It defines requirements for how this product interacts with third-party APIs, legacy databases, and environmental factors. It ensures the &amp;ldquo;What&amp;rdquo; doesn&amp;rsquo;t cause a &amp;ldquo;Butterfly Effect&amp;rdquo; of errors elsewhere.&lt;/li>
&lt;li>&lt;strong>In the FRD (Structural Logic):&lt;/strong> This is where &lt;strong>Causal Loop Diagrams&lt;/strong> or &lt;strong>Stock and Flow Diagrams&lt;/strong> live. The FRD defines the system&amp;rsquo;s &amp;ldquo;State&amp;rdquo;—how data flows through the pipes, where it pools (stocks), and what triggers the release of information.&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Framework&lt;/th>
&lt;th style="text-align:left">Best fit in&amp;hellip;&lt;/th>
&lt;th style="text-align:left">Key Question it answers&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Design Thinking&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>PRD&lt;/strong> (mostly)&lt;/td>
&lt;td style="text-align:left">Is this the right solution for the &lt;em>human&lt;/em>?&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Lean Startup&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>BRD &amp;amp; PRD&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Is there a &lt;em>market&lt;/em> for this, and how can we prove it fast?&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Systems Thinking&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>BRD &amp;amp; FRD&lt;/strong>&lt;/td>
&lt;td style="text-align:left">How does this change affect the &lt;em>entire ecosystem&lt;/em>?&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>How to combine them&lt;/strong>&lt;/p>
&lt;p>In a modern product team, you rarely use just one.&lt;/p>
&lt;p>You might use &lt;strong>Systems Thinking&lt;/strong> to map out the complexity of a new healthcare platform (BRD), &lt;strong>Design Thinking&lt;/strong> to figure out how a doctor will actually use the tablet (PRD), and &lt;strong>Lean Startup&lt;/strong> to decide which single feature to build first to see if patients even want to log in (MVP).&lt;/p>
&lt;p>Does your current project feel more like a &amp;ldquo;human&amp;rdquo; problem (Design), a &amp;ldquo;market&amp;rdquo; mystery (Lean), or a &amp;ldquo;complex machine&amp;rdquo; (Systems)?&lt;/p>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>GSAP (GreenSock Animation Platform) is a JavaScript library for animating things on a webpage — moving elements, fading them in, scaling them, rotating them — with precise control over timing.&lt;/li>
&lt;/ul>
&lt;p>The core idea: instead of CSS transitions (which are limited and hard to sequence), GSAP gives you a programmable timeline where you say exactly what happens and when.&lt;/p>
&lt;p>Why HyperFrames uses it: when you render a video, the capture engine scrubs through time frame by frame.&lt;/p>
&lt;p>GSAP&amp;rsquo;s timeline is deterministic — at t=14.1s, element X is at exactly this position, with exactly this opacity.&lt;/p>
&lt;p>The capture engine reads that state and renders it to a pixel-perfect
video frame.&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
CSS animations are not scrub-friendly; GSAP is.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>F/OSS Animations Suites&lt;span class="absolute -mt-20" id="foss-animations-suites">&lt;/span>
&lt;a href="#foss-animations-suites" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>Synfig Studio: Synfig Studio is a 2D vector-based animation software. It&amp;rsquo;s designed for creating high-quality 2D animations with a focus on flexibility and scalability. Synfig Studio supports a wide range of features, including vector tweening, bone rigging, and bitmap artwork integration.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>OpenToonz: OpenToonz is a professional 2D animation software used by studios such as Studio Ghibli. It offers a comprehensive set of features for traditional frame-by-frame animation, including raster and vector drawing tools, compositing, and animation effects.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">More Open Source Animation Suites 👇&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;ol start="3">
&lt;li>
&lt;p>Krita: While primarily known as a digital painting software, Krita also includes animation features. It supports frame-by-frame animation and offers a range of tools for creating and editing animations, including onion skinning, timeline-based editing, and brush-based animation.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Pencil2D: Pencil2D is a simple and intuitive 2D animation software suitable for beginners and hobbyists. It offers basic drawing and animation tools for creating traditional frame-by-frame animations.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>TupiTube: TupiTube is a 2D animation software designed for children and beginners. It provides a simple and user-friendly interface for creating basic animations using vector-based drawing tools.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div>
&lt;/details>
&lt;h4>Motion Canvas&lt;span class="absolute -mt-20" id="motion-canvas">&lt;/span>
&lt;a href="#motion-canvas" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ol start="6">
&lt;li>Recently Motion Canvas was released as Open Source as well, with MIT license ❤️ - &lt;a href="https://github.com/motion-canvas/motion-canvas" target="_blank" rel="noopener">https://github.com/motion-canvas/motion-canvas&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>Motion Canvas is a tool that bridges the gap between code and animation, specifically targeted at creating animated videos.&lt;/p>
&lt;ul>
&lt;li>Create Animations with Code: &lt;a href="https://github.com/motion-canvas/motion-canvas" target="_blank" rel="noopener">https://github.com/motion-canvas/motion-canvas&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://github.com/motion-canvas/motion-canvas?tab=MIT-1-ov-file#readme" target="_blank" rel="noopener">https://github.com/motion-canvas/motion-canvas?tab=MIT-1-ov-file#readme&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>A TS library for creating animated videos using the Canvas API.&lt;/p>
&lt;blockquote>
&lt;p>MIT| Visualize Your Ideas With Code&lt;/p>
&lt;/blockquote>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">More about Motion Canvas 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;p>Library &amp;amp; Editor: Motion Canvas offers two main parts:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Library (written in TS): This library allows you to write animation code using generators, providing a structured approach for creating animations.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Web-based Editor: This editor provides a real-time preview of your animations as you write the code.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Animation with Canvas API: Motion Canvas leverages the Canvas API, a built-in functionality of web browsers that allows for dynamic manipulation of graphics.&lt;/p>
&lt;p>This gives you control over various visual elements of your animation.&lt;/p>
&lt;p>Benefits:&lt;/p>
&lt;p>Combined Power of Code and UI: Motion Canvas offers the benefits of both writing code for precise control and a visual editor for intuitive adjustments, making it suitable for users with different comfort levels. &amp;ndash;&amp;gt;&lt;/p>
&lt;p>To use Motion Canvas, you&amp;rsquo;ll need a few things:&lt;/p>
&lt;p>Node.js and npm: Motion Canvas relies on Node.js, a JavaScript runtime environment, and npm (Node Package Manager) for managing dependencies. You can download and install them together from the official Node.js website: &lt;a href="https://nodejs.org/en" target="_blank" rel="noopener">https://nodejs.org/en&lt;/a>&lt;/p>
&lt;p>Code editor: You&amp;rsquo;ll need a code editor of your choice to write and edit your Motion Canvas code. Popular options include Visual Studio Code, Atom, or Sublime Text.&lt;/p>
&lt;p>(Optional) ffmpeg: While not strictly necessary for basic functionality, ffmpeg is a powerful tool for video encoding and manipulation. Motion Canvas can leverage ffmpeg for exporting your animations as videos. You can find installation instructions for ffmpeg based on your operating system through a web search.&lt;/p>
&lt;/div>
&lt;/details>
&lt;!-- https://www.youtube.com/shorts/ls_66dIM9-4 -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/ls_66dIM9-4" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Motion Canvas is great for interactive, visually rich web animations.&lt;/p>
&lt;h4>Others&lt;span class="absolute -mt-20" id="others">&lt;/span>
&lt;a href="#others" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>&lt;strong>Remotion&lt;/strong> is best for React developers needing video automation and scaling.&lt;/p>
&lt;p>&lt;strong>Manim&lt;/strong> is the tool for deep mathematical visualization with powerful programmatic control.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Feature/Aspect&lt;/th>
&lt;th>Motion Canvas&lt;/th>
&lt;th>Remotion&lt;/th>
&lt;th>Manim&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Programming Language&lt;/td>
&lt;td>TypeScript (Web, JS)&lt;/td>
&lt;td>React (JavaScript)&lt;/td>
&lt;td>Python&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Main Use Case&lt;/td>
&lt;td>Vector animations &amp;amp; presentations&lt;/td>
&lt;td>Programmatic video creation&lt;/td>
&lt;td>Math &amp;amp; educational animations&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Preview/Interactivity&lt;/td>
&lt;td>Real-time visual preview&lt;/td>
&lt;td>React-driven dynamic rendering&lt;/td>
&lt;td>No live preview, manual rendering&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Complexity &amp;amp; Control&lt;/td>
&lt;td>Moderate, web tech based&lt;/td>
&lt;td>High for UI/UX videos&lt;/td>
&lt;td>High for math/algorithm detail&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Target Users&lt;/td>
&lt;td>Web developers, educators&lt;/td>
&lt;td>React developers, marketers&lt;/td>
&lt;td>Educators, researchers, math pros&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Learning Curve&lt;/td>
&lt;td>Moderate&lt;/td>
&lt;td>Moderate&lt;/td>
&lt;td>Steep (programming + math)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Community &amp;amp; Docs&lt;/td>
&lt;td>Growing, good docs&lt;/td>
&lt;td>Strong community &amp;amp; documentation&lt;/td>
&lt;td>Mature community, rich resources&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://github.com/mifi/lossless-cut" target="_blank" rel="noopener">https://github.com/mifi/lossless-cut&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/HandBrake/HandBrake" target="_blank" rel="noopener">https://github.com/HandBrake/HandBrake&lt;/a> - an OSS UI for Video compression (which does not use FFMPEG)&lt;/p>
&lt;/li>
&lt;/ul></description></item><item><title>Spring is here (and so are weddings)</title><link>https://JAlcocerT.github.io/JAlcocerT/quick-weddings-poc/</link><pubDate>Sat, 18 Apr 2026 13:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/quick-weddings-poc/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Hora de mercantilizar mi vida otra vez :'(&lt;/p>
&lt;p>+++ &lt;a href="#apps-that-inspire" >Inspiring Apps&lt;/a>&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>A quick rewrite and improvements of the previous slubnychwile &lt;em>for B2B&lt;/em>.&lt;/p>
&lt;p>Because Ive been writting about multi-body mechanism lately&lt;/p>
&lt;p>And surprise: those niche posts/ideas dont get as much traction as posts as this one, where I solve a need that people have&lt;/p>
&lt;p>Surprising&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/leads-slubnechwile" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Leads x Slubne ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/slubne-chwile-y26" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Slubne 2026 v1 B2C ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">i was trying to boostrap this project that is a webapp for couples that are getting married to discover via google
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ads, pay, get a qr and storage via cloudflare that i manage. Could you make an audit considering what a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> indie-hacker blueprint should contain and write a pros-cons.md of what i built? &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/slubne-chwile-y26&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You can build around what you have already create with: &lt;a href="https://buildermethods.com/agent-os" target="_blank" rel="noopener">https://buildermethods.com/agent-os&lt;/a>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/buildermethods/agent-os" target="_blank" rel="noopener">https://github.com/buildermethods/agent-os&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>MIT | Agent OS is a system for injecting your codebase standards and writing better specs for spec-driven development.&lt;/p>
&lt;/blockquote>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/slubnechwile-chwile-y26&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://github.com/JAlcocerT/slubnechwile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://github.com/JAlcocerT/Flask_SlubnyChwile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git init &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git add . &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git commit -m &lt;span class="s2">&amp;#34;Initial commit: Starting slubnechwile with claude&amp;#34;&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> gh repo create slubnechwile-chwile-y26-claude --private --source&lt;span class="o">=&lt;/span>. --remote&lt;span class="o">=&lt;/span>origin --push&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/slubnechwile-chwile-y26-claude" target="_blank" rel="noreferrer">&lt;img
alt="NEW - SlubneChwile"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">NEW - SlubneChwile&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Green field Claude x SlubneChwile&lt;/div>&lt;/a>
&lt;/div>
&lt;h2>Rewritting SlubneChwile&lt;span class="absolute -mt-20" id="rewritting-slubnechwile">&lt;/span>
&lt;a href="#rewritting-slubnechwile" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Because for the initial version I used an astro theme and made it a web app.&lt;/p>
&lt;p>I mean here and here&lt;/p>
&lt;p>But&amp;hellip;&lt;a href="https://code.claude.com/docs/en/cli-reference" target="_blank" rel="noopener">claude code&lt;/a> (Opus 4.6) has 1M tokens.&lt;/p>
&lt;p>What if i tell it to understand the logic&amp;hellip;&lt;/p>
&lt;p>and re-implement it with a cool &lt;strong>modern Vite UI&lt;/strong>?&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/leads-slubnechwile" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Leads x Slubne Github ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/slubne-chwile-y26" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Slubne 2026 Github ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/slubne-chwile-y26 &lt;span class="c1">#https://www.slubnechwile.com/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git pull&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd slubne-chwile-y26/slubnechwile&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And now: &lt;em>time to do more calls to B2B :)&lt;/em>&lt;/p>
&lt;blockquote>
&lt;p>Just sell to survive (Grant Cardone)&lt;/p>
&lt;/blockquote>
&lt;p>You just need &lt;a href="https://jalcocert.github.io/JAlcocerT/bring-eyes-to-your-saas/" target="_blank" rel="noopener">eyes&lt;/a> and be clear that &lt;a href="https://jalcocert.github.io/JAlcocerT/how-is-for-agents-what-and-why-for-you/" target="_blank" rel="noopener">the why and what are your responsability&lt;/a> for now.&lt;/p>
&lt;p>Things are moving into a direction where human are the blockers:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/HKUDS/CLI-Anything" target="_blank" rel="noopener">https://github.com/HKUDS/CLI-Anything&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>CLI-Anything: Making ALL Software Agent-Native&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>&lt;a href="https://github.com/agentscope-ai/CoPaw" target="_blank" rel="noopener">https://github.com/agentscope-ai/CoPaw&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Your Personal AI Assistant; easy to install, deploy on your own machine or on the cloud; supports multiple chat apps with easily extensible capabilities.&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>&lt;a href="https://github.com/openai/symphony" target="_blank" rel="noopener">https://github.com/openai/symphony&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Symphony turns project work into isolated, autonomous implementation runs, allowing teams to manage work instead of supervising coding agents.&lt;/p>
&lt;/blockquote>
&lt;h3>Why What How&lt;span class="absolute -mt-20" id="why-what-how">&lt;/span>
&lt;a href="#why-what-how" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>This all have to make sense for the unit economics to &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-and-opportunities-health-check/#any-business-who-what-how" target="_blank" rel="noopener">have a chance&lt;/a>: &lt;em>The Market (Who), the Offer (What), and the Leads (How)&lt;/em>&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Believe it or not, making all these resonate is key for $
&lt;/div>
&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>&lt;strong>BRD (Business Requirements):&lt;/strong> Answers &lt;strong>&amp;ldquo;WHY build this?&amp;rdquo;&lt;/strong> (The Vision &amp;amp; Goals).&lt;/li>
&lt;li>&lt;strong>PRD (Product Requirements):&lt;/strong> Answers &lt;strong>&amp;ldquo;WHAT are we building?&amp;rdquo;&lt;/strong> (The Features &amp;amp; Roadmap).&lt;/li>
&lt;li>&lt;strong>FRD (Functional Requirements):&lt;/strong> Answers &lt;strong>&amp;ldquo;HOW does it work?&amp;rdquo;&lt;/strong> (The Technical Logic &amp;amp; CRUDs).&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/biz/prod-development.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>A lean, profitable indie product needs to nail ten pillars:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>x&lt;/th>
&lt;th>Pillar&lt;/th>
&lt;th>What it means&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>&lt;strong>Validated problem&lt;/strong>&lt;/td>
&lt;td>Real pain, existing willingness to pay&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>&lt;strong>One clear buyer&lt;/strong>&lt;/td>
&lt;td>Narrow ICP, easy to reach&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>&lt;strong>Monetization on day 1&lt;/strong>&lt;/td>
&lt;td>Payments before scale&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>&lt;strong>Lean stack&lt;/strong>&lt;/td>
&lt;td>Ship fast, low ops overhead&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>&lt;strong>Owned distribution&lt;/strong>&lt;/td>
&lt;td>Email list, SEO, or community&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6&lt;/td>
&lt;td>&lt;strong>Paid acquisition loop&lt;/strong>&lt;/td>
&lt;td>CAC &amp;lt; LTV, trackable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>7&lt;/td>
&lt;td>&lt;strong>Automation&lt;/strong>&lt;/td>
&lt;td>Runs while you sleep&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8&lt;/td>
&lt;td>&lt;strong>Feedback &amp;amp; analytics&lt;/strong>&lt;/td>
&lt;td>Know who converts and why&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>9&lt;/td>
&lt;td>&lt;strong>Legal basics&lt;/strong>&lt;/td>
&lt;td>Privacy, T&amp;amp;C, GDPR baseline&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>10&lt;/td>
&lt;td>&lt;strong>Moat / stickiness&lt;/strong>&lt;/td>
&lt;td>Switching cost or network effect&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Consider having a &lt;code>indie-blueprint.md&lt;/code> as source of truth &lt;a href="https://github.com/JAlcocerT/slubne-chwile-y26/blob/master/pros-cons.md" target="_blank" rel="noopener">for your stack&lt;/a> as you need to be agile while &lt;a href="https://jalcocert.github.io/JAlcocerT/whats-boostrap/" target="_blank" rel="noopener">boostrapping&lt;/a>.&lt;/p>
&lt;p>For the neuro/marketing &lt;a href="https://jalcocert.github.io/JAlcocerT/how-is-for-agents-what-and-why-for-you/#the-copy" target="_blank" rel="noopener">the psyc&lt;/a> is very important and should be in the context&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Principle&lt;/th>
&lt;th>What it means in practice&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Loss aversion&lt;/strong>&lt;/td>
&lt;td>Fear of missing a moment &amp;gt; desire to gain one&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Specificity&lt;/strong>&lt;/td>
&lt;td>Concrete numbers and details build credibility (&amp;ldquo;500 zdjęć&amp;rdquo; &amp;gt; &amp;ldquo;dużo zdjęć&amp;rdquo;)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Identity language&lt;/strong>&lt;/td>
&lt;td>&amp;ldquo;You are the kind of person who…&amp;rdquo; vs &amp;ldquo;our product does X&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Cognitive fluency&lt;/strong>&lt;/td>
&lt;td>Simpler phrasing converts better; friction in language = friction in purchase&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Social proof weight&lt;/strong>&lt;/td>
&lt;td>Named + dated + specific &amp;gt; generic praise&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>CTA verb psychology&lt;/strong>&lt;/td>
&lt;td>Action verbs that describe what the user &lt;em>gets&lt;/em>, not what they &lt;em>do&lt;/em>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Progress framing&lt;/strong>&lt;/td>
&lt;td>Showing users they are already on the journey (&amp;ldquo;next step&amp;rdquo; &amp;gt; &amp;ldquo;start now&amp;rdquo;)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ZMOT (Zero Moment of Truth)&lt;/strong>&lt;/td>
&lt;td>Copy must work cold — visitor has zero context about you&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>A &lt;code>indie-marketing.md&lt;/code> is a good starting point and you can &lt;a href="https://github.com/JAlcocerT/slubne-chwile-y26/blob/master/pros-cons-copy.md" target="_blank" rel="noopener">audit it later on&lt;/a>.&lt;/p>
&lt;h3>The prompts side&lt;span class="absolute -mt-20" id="the-prompts-side">&lt;/span>
&lt;a href="#the-prompts-side" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h3>The business side&lt;span class="absolute -mt-20" id="the-business-side">&lt;/span>
&lt;a href="#the-business-side" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>As seen with the COO self-diagnostic, the execution/delivery was fully already, so I can spend all the time on the &lt;strong>[GROWTH BET]&lt;/strong>.&lt;/p>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/custom-marketing-analytics/#2-three-strategic-paths-forward" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/custom-marketing-analytics/#2-three-strategic-paths-forward&lt;/a>&lt;/p>
&lt;p>So was the &lt;a href="https://jalcocert.github.io/JAlcocerT/custom-marketing-analytics/#1-the-unit-economics-of-qr-guest-photos" target="_blank" rel="noopener">units economics of the QR web/app storage&lt;/a>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Dimension&lt;/th>
&lt;th>B2C (couples)&lt;/th>
&lt;th>B2B (photographers)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Buyer&lt;/td>
&lt;td>Couple planning their wedding&lt;/td>
&lt;td>Wedding photographer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Discovery&lt;/td>
&lt;td>Google Ads&lt;/td>
&lt;td>Cold call from partner&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Sales motion&lt;/td>
&lt;td>Self-serve, automated&lt;/td>
&lt;td>Human-led, relationship&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Conversion time&lt;/td>
&lt;td>Minutes (free signup) to days (drip)&lt;/td>
&lt;td>Days to weeks&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LTV per deal&lt;/td>
&lt;td>299 PLN one-time&lt;/td>
&lt;td>299 PLN × N weddings/year&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CAC structure&lt;/td>
&lt;td>Ad spend ÷ paid conversions&lt;/td>
&lt;td>Partner&amp;rsquo;s time cost&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Scale ceiling&lt;/td>
&lt;td>Bounded by ad budget &amp;amp; Polish market size&lt;/td>
&lt;td>Bounded by partner&amp;rsquo;s calling capacity&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Product changes needed&lt;/td>
&lt;td>None&lt;/td>
&lt;td>Minor (referral code, bulk pricing)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Element&lt;/th>
&lt;th style="text-align:left">Decision&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>One Avatar&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>One Product&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>One Channel&lt;/strong>&lt;/td>
&lt;td style="text-align:left">One of the ,Core-4&amp;rsquo;: Warm OutReach / Free Content / Cold OutReach / Paid Ads&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">The Lead Magnet&lt;/td>
&lt;td style="text-align:left">Strategy Type: , Delivery Method:&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The Matrix: &lt;em>Strategy vs. Medium for leads&lt;/em>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Strategy (The 3 Types)&lt;/th>
&lt;th>Software Delivery&lt;/th>
&lt;th>Information Delivery&lt;/th>
&lt;th>Service Delivery&lt;/th>
&lt;th>Physical Delivery&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>1. Reveal the Problem&lt;/strong>&lt;/td>
&lt;td>A &amp;ldquo;Profit Leak&amp;rdquo; Calculator.&lt;/td>
&lt;td>A &amp;ldquo;Red Flag&amp;rdquo; PDF Checklist.&lt;/td>
&lt;td>A Free 5-Min Security Audit.&lt;/td>
&lt;td>A &amp;ldquo;Water Hardness&amp;rdquo; Testing Kit.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>2. Give a Sample&lt;/strong>&lt;/td>
&lt;td>7-Day Trial of a CRM.&lt;/td>
&lt;td>A Free Masterclass Lesson.&lt;/td>
&lt;td>A 15-Min Mini-Consult.&lt;/td>
&lt;td>A Trial-Sized Supplement.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>3. Step 1 of N&lt;/strong>&lt;/td>
&lt;td>A template pre-loaded in an app.&lt;/td>
&lt;td>A &amp;ldquo;How to Set Up Your LLC&amp;rdquo; Guide.&lt;/td>
&lt;td>A &amp;ldquo;Done-for-you&amp;rdquo; Website Header.&lt;/td>
&lt;td>A &amp;ldquo;Starter Tool&amp;rdquo; (e.g., a free brush for a paint kit).&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The &lt;strong>Tier of Service&lt;/strong>: DFY &lt;em>because The value ladder is a thing&lt;/em>&lt;/p>
&lt;p>The &lt;strong>fundamental nature of the business model&lt;/strong> and its primary bottleneck&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Feature&lt;/th>
&lt;th>&lt;strong>Guest Photo WebApp&lt;/strong>&lt;/th>
&lt;th>&lt;strong>Educational Model&lt;/strong>&lt;/th>
&lt;th>&lt;strong>The Lead Architect Agency&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Business Archetype&lt;/strong>&lt;/td>
&lt;td>B2C Indie Hacker (SaaS-Lite)&lt;/td>
&lt;td>Info-Product / Course&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Primary Lever&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Volume&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Volume&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Price&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Strategic Tag&lt;/strong>&lt;/td>
&lt;td>&lt;strong>[GROWTH BET]&lt;/strong>&lt;/td>
&lt;td>&lt;strong>[GROWTH BET]&lt;/strong>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Customer Intent&lt;/strong>&lt;/td>
&lt;td>Emotional (Memories)&lt;/td>
&lt;td>Aspirational (Success)&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Execution Risk&lt;/strong>&lt;/td>
&lt;td>Technical/Server Downtime&lt;/td>
&lt;td>Content Obsolescence&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Main Constraint&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Demand (Marketing, ads)&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Demand (Attention)&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Supply (Expert Hours)&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Macro Winner&lt;/strong>&lt;/td>
&lt;td>Low-cost luxury (Recession)&lt;/td>
&lt;td>Upskilling (Recession)&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The &lt;strong>GTM strategy&lt;/strong> is a cross-functional roadmap that answers the question: &lt;em>How will we bring this new product to market successfully?&lt;/em>&lt;/p>
&lt;p>It aligns all key business functions, including:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Product:&lt;/strong> What are we selling? What problem does it solve?&lt;/li>
&lt;li>&lt;strong>Pricing:&lt;/strong> How much will we charge?&lt;/li>
&lt;li>&lt;strong>Distribution/Sales:&lt;/strong> How will we get the product into the hands of customers? (e.g., direct sales team, e-commerce, third-party distributors).&lt;/li>
&lt;li>&lt;strong>Marketing:&lt;/strong> How will we generate awareness and demand?&lt;/li>
&lt;li>&lt;strong>Customer Success/Support:&lt;/strong> How will we onboard and support customers after they buy?&lt;/li>
&lt;/ul>
&lt;h3>The Agentic Operations&lt;span class="absolute -mt-20" id="the-agentic-operations">&lt;/span>
&lt;a href="#the-agentic-operations" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>This is a growth experiment.&lt;/p>
&lt;p>The delivery is clear, lets just focus on ATTRACTION &amp;amp; CONVERSION.&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
For that, I chose google
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>For that, uptime, logs analysis, even individual sessions&amp;hellip;can improve the app&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#nslookup realestate.jalcocertech.com&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dig slubnechwile.com&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>But I dont want to do it, I want the agents to do this.&lt;/p>
&lt;h4>Enriched Sales Pipeline&lt;span class="absolute -mt-20" id="enriched-sales-pipeline">&lt;/span>
&lt;a href="#enriched-sales-pipeline" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>You could also ask help from &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-and-opportunities-health-check/#building-a-how-with-sense" target="_blank" rel="noopener">agencies like this one&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">whois leadarchitect.org&lt;span class="p">|&lt;/span> grep -i -E &lt;span class="s2">&amp;#34;(creation|created|registered)&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Should you go &lt;a href="https://github.com/JAlcocerT/slubne-chwile-y26/blob/master/b2b-vs-b2c.md" target="_blank" rel="noopener">B2C or B2B&lt;/a>?&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/entrepreneur/bip/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>BiP | Docs ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/entrepreneur/#offers/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Offers | Docs ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make help&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>What about B2C?&lt;span class="absolute -mt-20" id="what-about-b2c">&lt;/span>
&lt;a href="#what-about-b2c" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Its a different story and you have to configure the offer accordingly.&lt;/p>
&lt;p>Account for the price and risk sensitivity.&lt;/p>
&lt;h4>Ads x Remotion Promo Video&lt;span class="absolute -mt-20" id="ads-x-remotion-promo-video">&lt;/span>
&lt;a href="#ads-x-remotion-promo-video" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>The repo to video concept &lt;a href="https://jalcocert.github.io/JAlcocerT/oss-automatic-docs-and-tech-video/#about-foss---repo-to-video" target="_blank" rel="noopener">worked here&lt;/a> for OSS.&lt;/p>
&lt;p>Why not for your indie-hacker projects?&lt;/p>
&lt;p>Based on the UI/X ofc :)&lt;/p>
&lt;h4>DRIP to Convert&lt;span class="absolute -mt-20" id="drip-to-convert">&lt;/span>
&lt;a href="#drip-to-convert" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Dont waste add money, get emails and people to try, then&amp;hellip;DRIP.&lt;/p>
&lt;blockquote>
&lt;p>The magic happens at &lt;a href="https://github.com/JAlcocerT/slubne-chwile-y26/actions/workflows/drip.yml" target="_blank" rel="noopener">this gha workflow&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;p>Oh, ofc, emails and DRIP sequences can also be done as code:&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/web/mailtrap-template.png" alt="Sending via attachments Astro component and Mailtrap" loading="lazy" />&lt;/p>
&lt;h3>And B2B?&lt;span class="absolute -mt-20" id="and-b2b">&lt;/span>
&lt;a href="#and-b2b" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Have you ever cold called?&lt;/p>
&lt;p>Now is the moment&lt;/p>
&lt;h4>Everything Required&lt;span class="absolute -mt-20" id="everything-required">&lt;/span>
&lt;a href="#everything-required" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ol>
&lt;li>The product - A nice webapp &lt;em>vibe coded with Claude + Stitch this time&lt;/em>&lt;/li>
&lt;li>The contact list for B2B - Say thanks to APIFY and this post + setup&lt;/li>
&lt;li>A telephone&lt;/li>
&lt;li>Time / energy / willingness to call&lt;/li>
&lt;li>Email DRIP - &lt;em>to move the conversion niddle programmaticaly&lt;/em>&lt;/li>
&lt;/ol>
&lt;h3>My Current Value Ladder&lt;span class="absolute -mt-20" id="my-current-value-ladder">&lt;/span>
&lt;a href="#my-current-value-ladder" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The take it or leave it form is looking nice:&lt;/p>
&lt;pre class="mermaid mt-6">flowchart LR
%% --- Styles ---
classDef free fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20;
classDef low fill:#FFF9C4,stroke:#FBC02D,stroke-width:2px,color:#FBC02D;
classDef mid fill:#FFE0B2,stroke:#F57C00,stroke-width:2px,color:#F57C00;
classDef high fill:#FFCDD2,stroke:#C62828,stroke-width:2px,color:#C62828;
%% --- Nodes ---
L0("Free Content&lt;br/>($0)"):::free
L1("AuditMagnet 🛡️&lt;br/>(Free Web Audit )"):::free
L11(" Blog/Youtube"):::free
L12(" ebooks"):::free
L2("DIY&lt;br/>(Optimization Guides) $"):::low
L3("Done With You&lt;br/>(Consulting) $$"):::mid
L4("Done For You&lt;br/>(Full Service) $$$"):::high
%% --- Connections ---
L0 --> L1
L0 --> L2
L0 --> L11
L0 --> L12
L2 --> L3
L3 --> L4&lt;/pre>&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">whois leadarchitect.org&lt;span class="p">|&lt;/span> grep -i -E &lt;span class="s2">&amp;#34;(creation|created|registered)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#nslookup realestate.jalcocertech.com&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dig slubnechwile.com&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Using Google Stitch vs Claude Design&lt;span class="absolute -mt-20" id="using-google-stitch-vs-claude-design">&lt;/span>
&lt;a href="#using-google-stitch-vs-claude-design" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;code>https://claude.ai/design&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>https://stitch.withgoogle.com/&lt;/code>&lt;/p>
&lt;/li>
&lt;/ol></description></item><item><title>Which ideas are left?</title><link>https://JAlcocerT.github.io/JAlcocerT/the-ideas-bucket-can-be-empty/</link><pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/the-ideas-bucket-can-be-empty/</guid><description>
&lt;p>&lt;strong>TL;DR&lt;/strong>&lt;/p>
&lt;p>Pretending to be a &lt;em>polymath&lt;/em> and charging you for caring about solving your problems.&lt;/p>
&lt;p>+++ With &lt;a href="#quick-content-creation" >quick content creation&lt;/a>.&lt;/p>
&lt;p>+++ &lt;a href="#lean-thinking-x-semantic-clarity" >High-Value Engineering&lt;/a>&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>When the ideas bucket stops filling up, I got clarity.&lt;/p>
&lt;p>Making dividend or market cap race, is no longer a problem.&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/G7u_KuvKK24" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>GoPro overlays? Nah, thats &lt;a href="https://jalcocert.github.io/JAlcocerT/gopro-telemetry-desktop-with-go/" target="_blank" rel="noopener">sth of the past&lt;/a>&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/M03HU4DWhyE" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Mechanisms &lt;a href="https://jalcocert.github.io/JAlcocerT/2d-mbsd/" target="_blank" rel="noopener">&lt;em>in 2D&lt;/em>&lt;/a>&amp;hellip;&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/r0eg5onWbn0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Is it time to go back to the real world?&lt;/p>
&lt;p>Because software is cooked&lt;/p>
&lt;p>in other words: PER is going down to ~20s&lt;/p>
&lt;p>being lower than NASDAQ&amp;rsquo;s avg for the first time in history.&lt;/p>
&lt;p>Does that tell you anything about the market future expectations &lt;em>also knowing that currently their FCF is also growing?&lt;/em>&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>If you have ever thoughts &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution-with-dao/#about-ikigai" target="_blank" rel="noopener">about Ikigai&lt;/a>&lt;/p>
&lt;p>or tried to understand the psyc under your decision making&lt;/p>
&lt;p>you might have done a TOP/BOT 10 actions life to date.&lt;/p>
&lt;p>I did that.&lt;/p>
&lt;p>And do you know what was surprising?&lt;/p>
&lt;p>That the Bottom 10 moments had one thing in common.&lt;/p>
&lt;p>They were all: NOT done this/that in this/that situation&lt;/p>
&lt;p>Until now you might have &lt;a href="#the-market-of-time" >waited for the right moment&lt;/a> to start shipping that project.&lt;/p>
&lt;p>You dont need to wait anymore:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/tiersofservice/dwi/selfh-landing-astro-fastapi-bot.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Service for the Ones with Questions&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/shipping/dna-1ton-ebook.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge for the ones who want to create step by step&lt;/div>&lt;/a>
&lt;/div>
&lt;h3>My Current Value Ladder&lt;span class="absolute -mt-20" id="my-current-value-ladder">&lt;/span>
&lt;a href="#my-current-value-ladder" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Active income &amp;raquo;&amp;gt; &lt;del>passive income&lt;/del> delayed active income.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git init &amp;amp;&amp;amp; git add . &amp;amp;&amp;amp; git commit -m &amp;#34;Initial commit: Starting services&amp;#34; &amp;amp;&amp;amp; gh repo create jalcocertech-services --private --source=. --remote=origin --push&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/jalcocertech-services&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>How does my &lt;strong>value ladder&lt;/strong> looks like as of today?&lt;/p>
&lt;pre class="mermaid mt-6">flowchart LR
%% --- Styles ---
classDef free fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20;
classDef low fill:#FFF9C4,stroke:#FBC02D,stroke-width:2px,color:#FBC02D;
classDef mid fill:#FFE0B2,stroke:#F57C00,stroke-width:2px,color:#F57C00;
classDef high fill:#FFCDD2,stroke:#C62828,stroke-width:2px,color:#C62828;
%% --- Nodes ---
L0("Free Content&lt;br/>($0)"):::free
L1("AuditMagnet 🛡️&lt;br/>(Web Audit )"):::free
L11(" Blog/Youtube"):::free
L12(" ebooks"):::free
L2("DIY&lt;br/>(Optimization Guides) $"):::low
L3("Done With You&lt;br/>(Consulting) $$"):::mid
L4("Done For You&lt;br/>(Full Service) $$$"):::high
%% --- Connections ---
L0 --> L1
L0 --> L2
L0 --> L11
L0 --> L12
L2 --> L3
L3 --> L4&lt;/pre>&lt;h4>Quick Content Creation?&lt;span class="absolute -mt-20" id="quick-content-creation">&lt;/span>
&lt;a href="#quick-content-creation" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>If you have watched a vidoe like &lt;a href="https://www.youtube.com/watch?v=M4cmrdoUKxI" target="_blank" rel="noopener">this one&lt;/a> and tinker with &lt;a href="https://jalcocert.github.io/JAlcocerT/video-creation-with-remotion/" target="_blank" rel="noopener">remotion like I did&lt;/a>.&lt;/p>
&lt;p>You are aware that you are one step away to blow social media with spam videos of what you ship.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./remotion-content &lt;span class="c1">#get your core offer well defined, then just create promo videos with your defined UI/X&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>What if promoting your new web app features is already one prompt away?&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/OL5UQaZc97E" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>If code is cheap and you can do videos as a code&lt;/p>
&lt;p>Isnt it the math telling you that videos are also cheap now?&lt;/p>
&lt;p>The time for courses/watching yt tutorials was 3y ago, now is about building&lt;/p>
&lt;p>or&amp;hellip;&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/memes/bike.png" alt="meme" loading="lazy" />&lt;/p>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>The market of time&lt;span class="absolute -mt-20" id="the-market-of-time">&lt;/span>
&lt;a href="#the-market-of-time" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Some people think that two of the most important factors to predict success are:&lt;/p>
&lt;ol>
&lt;li>The RISK that you allow yourself to take&lt;/li>
&lt;li>The amount of TIME that you can wait without possitive rewards to keep going in a certain direction (~persistency)&lt;/li>
&lt;li>The number of times that you &lt;em>ROLL the dice&lt;/em>&lt;/li>
&lt;/ol>
&lt;p>The good thing about tracking that daily new action &lt;del>since ~wk40y24&lt;/del> for some time is that you can see how non-sense previous things were&lt;/p>
&lt;p>Meaning: that those actions were not meant to make yo be closer to where you want to be&lt;/p>
&lt;p>This idea might suggest you &lt;a href="https://jalcocert.github.io/JAlcocerT/tech-recap-and-more-2025/#outro--random" target="_blank" rel="noopener">open questions&lt;/a>&lt;/p>
&lt;h3>Ideas Checklist&lt;span class="absolute -mt-20" id="ideas-checklist">&lt;/span>
&lt;a href="#ideas-checklist" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution-via-sdlc/#evaluating-business-ideas" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/ideas-to-execution-via-sdlc/#evaluating-business-ideas&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-and-opportunities-health-check/#business-idea-checklist" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/ideas-and-opportunities-health-check/#business-idea-checklist&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>This will help you to understand how to disqualify business ideas: &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution/" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/ideas-to-execution/&lt;/a>&lt;/p>
&lt;p>And with &lt;a href="https://jalcocert.github.io/JAlcocerT/how-is-for-agents-what-and-why-for-you/#psyco" target="_blank" rel="noopener">some psyc&lt;/a>, you&amp;rsquo;ll better understand your clients.&lt;/p>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">Ideas Checklist 🚀&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;p>For this I dedicated a full post few weeks ago.&lt;/p>
&lt;p>The general idea checklist is as follows:&lt;/p>
&lt;/div>
&lt;/details>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">Prospects/Clients Checklist 🚀&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;/div>
&lt;/details>
&lt;h3>Still doing PPTs?&lt;span class="absolute -mt-20" id="still-doing-ppts">&lt;/span>
&lt;a href="#still-doing-ppts" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>You know that im in love with slidevJS for my tech talks.&lt;/p>
&lt;p>But &lt;del>I got to know&lt;/del> &lt;a href="https://jalcocert.github.io/JAlcocerT/ai-driven-presentations/#other-ppt-as-a-code" target="_blank" rel="noopener">reminded about&lt;/a> &lt;strong>python-pptx&lt;/strong>.&lt;/p>
&lt;p>So for the pocs if you were doing slidev or giving a prompt to notebookllm or copilot: You are outdated.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /PBi
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./PBi/executive-dashboard-pptx &lt;span class="c1">#a sample with dummy data on how to use python-pptx :)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /selfhosted-landing/y2026-tech-talks #yea tech talks are here for now :)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>So&amp;hellip;go the slidev, the html or whatever route&lt;/p>
&lt;p>but just do impactful presentations, with nice UI/X&lt;/p>
&lt;p>Specially for your solo-preneur sales pitches&lt;/p>
&lt;p>Take one branded pptx, tell to write the store with the branded slides and move on :)&lt;/p>
&lt;p>Or&amp;hellip;behave logically like an agent does: swirly requirements = swirly output&lt;/p>
&lt;p>for those moments were things are wrong&lt;/p>
&lt;p>but people dont agree of the concepts/meaning of whats correct / definitions&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/memes/data-deadlock.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>&amp;ldquo;When we say &amp;lsquo;The data is wrong,&amp;rsquo; it usually means one of two things: either my code is failing, or we haven&amp;rsquo;t agreed on what &amp;lsquo;right&amp;rsquo; means conceptually.&lt;/p>
&lt;p>To build a dashboard we all trust, we must climb this &amp;lsquo;Hierarchy of Right&amp;rsquo; for our main metrics.&lt;/p>
&lt;p>&lt;del>We will start at the bottom and work up: What is the source, how is it calculated, and most importantly, what business concept does it represent? Let&amp;rsquo;s begin with the concept.&lt;/del>&lt;/p>
&lt;p>The Top-Down Hierarchy of &amp;ldquo;Right&amp;rdquo;&lt;/p>
&lt;p>That is a much more strategic way to handle a room full of executives.&lt;/p>
&lt;p>By starting at the &lt;strong>Concept&lt;/strong>, you are speaking their language first (Business Strategy) and only moving toward your language (Code/Data) once the foundation is poured.&lt;/p>
&lt;p>If you start with the code, they tune out. If you start with the concept, they take ownership of the result.&lt;/p>
&lt;p>Here is the &lt;strong>Top-Down Alignment Protocol&lt;/strong> redesigned for that flow.&lt;/p>
&lt;h2>The Top-Down Hierarchy of &amp;ldquo;Right&amp;rdquo;&lt;span class="absolute -mt-20" id="the-top-down-hierarchy-of-right">&lt;/span>
&lt;a href="#the-top-down-hierarchy-of-right" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;strong>Phase 1: The Semantic Concept (The &amp;ldquo;Why&amp;rdquo;)&lt;/strong>&lt;/p>
&lt;p>&lt;em>Focus: Business Intent&lt;/em>
At this level, don&amp;rsquo;t mention databases or SQL. Talk about the real world.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Question:&lt;/strong> &amp;ldquo;Let&amp;rsquo;s ignore the numbers for a second. What is the &lt;strong>business event&lt;/strong> we are trying to capture? For example, when we say &amp;lsquo;Customer Acquisition,&amp;rsquo; do we mean the moment they sign a contract, or the moment they pay their first invoice?&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>The Conflict Resolver:&lt;/strong> &amp;ldquo;If we have two different views on what an &amp;lsquo;Active User&amp;rsquo; is, we don&amp;rsquo;t have a data problem; we have a strategy gap. Which definition drives our decision-making today?&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>The Goal:&lt;/strong> A written, plain-English sentence: &lt;em>&amp;ldquo;A &amp;lsquo;Sale&amp;rsquo; is defined as a signed contract regardless of payment status.&amp;rdquo;&lt;/em>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Phase 2: The Logical Formula (The &amp;ldquo;How&amp;rdquo;)&lt;/strong>&lt;/p>
&lt;p>&lt;em>Focus: The Mathematical Blueprint&lt;/em>
Now that you have the concept, translate it into logic.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Question:&lt;/strong> &amp;ldquo;Now that we’ve defined the event, how do we turn it into a KPI? To get the &amp;lsquo;Net Margin&amp;rsquo; we just described, are we subtracting &lt;strong>Gross COGS&lt;/strong> or &lt;strong>Net COGS&lt;/strong> including shipping? Are we excluding internal test accounts?&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>The &amp;ldquo;Corner Case&amp;rdquo; Test:&lt;/strong> &amp;ldquo;If a customer signs today but cancels tomorrow, does our formula for &amp;lsquo;Growth&amp;rsquo; include them or filter them out?&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>The Goal:&lt;/strong> An agreed-upon formula: $$(Total Revenue - Returns) \times Tax Rate = Net$$.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Phase 3: The Data Source (The &amp;ldquo;Where&amp;rdquo;)&lt;/strong>&lt;/p>
&lt;p>&lt;em>Focus: The Source of Truth&lt;/em>
Identify which system is &amp;ldquo;The Law.&amp;rdquo;&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Question:&lt;/strong> &amp;ldquo;Every system tells a slightly different story. For this specific formula, which system is the &lt;strong>Golden Record&lt;/strong>? Is it the CRM (Sales view) or the ERP (Accounting view)?&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>The Accountability Check:&lt;/strong> &amp;ldquo;If the CRM says $1M and the ERP says $900k, which one do you want this dashboard to show? We must pick one, or we will always be chasing ghosts.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>The Goal:&lt;/strong> Naming the primary database (e.g., &amp;ldquo;NetSuite is the source for all Revenue metrics&amp;rdquo;).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Phase 4: The Technical Execution (The Code)&lt;/strong>&lt;/p>
&lt;p>&lt;em>Focus: Verification&lt;/em>
This is your domain. You only show this if they challenge the first three steps.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Statement:&lt;/strong> &amp;ldquo;Now that we’ve agreed on the &lt;strong>Concept&lt;/strong>, the &lt;strong>Formula&lt;/strong>, and the &lt;strong>Source&lt;/strong>, my job is purely to ensure the code reflects those three things perfectly. If you ever feel the data is &amp;lsquo;wrong&amp;rsquo; from here on out, we can check the code together to ensure it hasn&amp;rsquo;t drifted from our agreed-upon definitions.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>The Goal:&lt;/strong> Technical confidence. You are now just the &amp;ldquo;translator&amp;rdquo; of their own rules.&lt;/li>
&lt;/ul>
&lt;p>When an executive says &amp;ldquo;the data is wrong&amp;rdquo; after this meeting, your response becomes a diagnostic check rather than a defense:&lt;/p>
&lt;ol>
&lt;li>&amp;ldquo;Did the &lt;strong>Concept&lt;/strong> change since our last meeting?&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;Is the &lt;strong>Formula&lt;/strong> missing a new variable (like a new tax or discount)?&amp;rdquo;&lt;/li>
&lt;li>&amp;ldquo;Is there an issue with the &lt;strong>Source&lt;/strong> system (human entry error)?&amp;rdquo; - &lt;em>Maybe sanity checks required by PMOs :)&lt;/em>&lt;/li>
&lt;li>&amp;ldquo;Is my &lt;strong>Code&lt;/strong> failing to execute the logic?&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>90% of the time, the answer is 1, 2, or 3.&lt;/strong>&lt;/p>
&lt;p>By starting at the top, you&amp;rsquo;ve made them the &amp;ldquo;Product Owners&amp;rdquo; of the logic, leaving you to simply be the master of the execution.&lt;/p>
&lt;p>When the logic is &amp;ldquo;wrong,&amp;rdquo; it’s often because a new business reality exists that hasn&amp;rsquo;t been coded yet.&lt;/p>
&lt;p>The &amp;ldquo;New Variable&amp;rdquo; Question: &amp;ldquo;We agreed on this formula last month.&lt;/p>
&lt;p>Has a new business factor been introduced—like a new tax code, a seasonal discount, or a &amp;lsquo;friends and family&amp;rsquo; rate—that our current math isn&amp;rsquo;t subtracting yet?&amp;rdquo;&lt;/p>
&lt;p>The &amp;ldquo;Inclusion&amp;rdquo; Question: &amp;ldquo;Is there a specific transaction you’re looking at that should be in this total but isn&amp;rsquo;t? If so, what &amp;rsquo;tag&amp;rsquo; or &amp;lsquo;category&amp;rsquo; does it have in the spreadsheet that our formula might be filtering out?&amp;rdquo;&lt;/p>
&lt;h2>SoloPreneur + AI versus Oldschool&lt;span class="absolute -mt-20" id="solopreneur--ai-versus-oldschool">&lt;/span>
&lt;a href="#solopreneur--ai-versus-oldschool" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>You &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution-with-dao/#about-ikigai" target="_blank" rel="noopener">ikigai&lt;/a> or &lt;a href="https://jalcocert.github.io/JAlcocerT/custom-marketing-analytics/#a-10h-work-week" target="_blank" rel="noopener">internal COO&lt;/a> points somewhere different?&lt;/p>
&lt;p>It is a classic case of &lt;strong>&amp;ldquo;Vibe-Based Management&amp;rdquo;&lt;/strong> meeting &lt;strong>&amp;ldquo;Deterministic Execution.&amp;rdquo;&lt;/strong>&lt;/p>
&lt;p>The reason it feels ridiculous to you as a developer/solopreneur is that you are used to the &lt;strong>High-Fidelity Feedback Loop&lt;/strong> of AI.&lt;/p>
&lt;p>If you give an AI a &amp;ldquo;vibe,&amp;rdquo; it gives you &amp;ldquo;garbage.&amp;rdquo; You are forced to be precise to get results.&lt;/p>
&lt;p>In a traditional corporate structure, Middle Management has historically acted as a &lt;strong>Human Buffer&lt;/strong> that absorbs the &amp;ldquo;vague vibes&amp;rdquo; from the C-Suite and translates them into something actionable.&lt;/p>
&lt;p>But now, with the &amp;ldquo;Agentic AI&amp;rdquo; hype, that buffer is evaporating, and the lack of conceptual clarity is being exposed as a massive liability.&lt;/p>
&lt;ol>
&lt;li>The &amp;ldquo;Agentic Stuff&amp;rdquo; Fallacy&lt;/li>
&lt;/ol>
&lt;p>When an executive says, &amp;ldquo;We want some agentic stuff,&amp;rdquo; they are usually committing the &lt;strong>Tool-First Sin&lt;/strong>.&lt;/p>
&lt;p>They are picking a shiny shovel before they even know where they want to dig a hole.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Problem:&lt;/strong> &amp;ldquo;Agentic&amp;rdquo; implies autonomy. But autonomy requires a &lt;strong>Logic Guardrail&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>The &amp;ldquo;C&amp;rdquo; Failure:&lt;/strong> If they can&amp;rsquo;t define the &amp;ldquo;Hierarchy of Right&amp;rdquo; for a simple dashboard, they certainly cannot define the &amp;ldquo;Rules of Engagement&amp;rdquo; for an AI Agent that is supposed to make decisions, spend money, or talk to customers.&lt;/li>
&lt;li>&lt;strong>The Result:&lt;/strong> They aren&amp;rsquo;t coordinating resources; they are &lt;strong>delegating their confusion&lt;/strong> to the technology.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Is this how they are &amp;ldquo;supposed&amp;rdquo; to coordinate?&lt;/li>
&lt;/ol>
&lt;p>Technically, &lt;strong>no&lt;/strong>. In management theory (like OKRs or V2MOM), the C-Suite is supposed to provide the &lt;em>What&lt;/em> and the &lt;em>Why&lt;/em>, and the engineers/managers provide the &lt;em>How&lt;/em>.&lt;/p>
&lt;p>However, in reality, many coordinate through &lt;strong>Iterative Disappointment&lt;/strong>:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>C-Suite:&lt;/strong> Gives a vague &amp;ldquo;North Star&amp;rdquo; (e.g., &amp;ldquo;AI-driven efficiency&amp;rdquo;).&lt;/li>
&lt;li>&lt;strong>Engineering:&lt;/strong> Builds something based on their best guess.&lt;/li>
&lt;li>&lt;strong>C-Suite:&lt;/strong> Says &amp;ldquo;That&amp;rsquo;s not what I meant/That data is wrong.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Repeat:&lt;/strong> Until they accidentally stumble upon a shared semantic meaning.&lt;/li>
&lt;/ol>
&lt;p>As a solopreneur, you see this as a waste of time. In a corporation, this is often just called &amp;ldquo;The Q3 Planning Cycle.&amp;rdquo;&lt;/p>
&lt;ol start="3">
&lt;li>The Solopreneur Advantage: &amp;ldquo;The CEO as Lead Architect&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>You’ve realized that the &amp;ldquo;C&amp;rdquo; in a modern, AI-augmented world isn&amp;rsquo;t a &amp;ldquo;Visionary Storyteller&amp;rdquo;—they are the &lt;strong>Chief Architect of Constraints.&lt;/strong>&lt;/p>
&lt;p>If you want an AI agent to work, you have to coordinate its resources by defining:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Objective Function:&lt;/strong> What does &amp;ldquo;Success&amp;rdquo; look like in math?&lt;/li>
&lt;li>&lt;strong>The Boundary Conditions:&lt;/strong> What are you &lt;em>not&lt;/em> allowed to do?&lt;/li>
&lt;li>&lt;strong>The Source of Truth:&lt;/strong> Which data can you trust?&lt;/li>
&lt;/ul>
&lt;p>The Comparison: Corporate vs. Solopreneur (AI-Driven)&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Feature&lt;/th>
&lt;th style="text-align:left">Corporate Coordination&lt;/th>
&lt;th style="text-align:left">Your Solopreneur Coordination&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Strategy&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&amp;ldquo;Agile,&amp;rdquo; &amp;ldquo;Agentic,&amp;rdquo; &amp;ldquo;Synergy.&amp;rdquo;&lt;/td>
&lt;td style="text-align:left">&amp;ldquo;If X happens, perform Y using Source Z.&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Feedback&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Quarterly reviews (Too slow).&lt;/td>
&lt;td style="text-align:left">Real-time Error Logs (Immediate).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Metric for &amp;lsquo;Right&amp;rsquo;&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&amp;ldquo;The CEO likes the slide.&amp;rdquo;&lt;/td>
&lt;td style="text-align:left">&amp;ldquo;The output matches the Semantic Contract.&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Resource Use&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Throwing more people at the confusion.&lt;/td>
&lt;td style="text-align:left">Refining the prompt/logic of the agent.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3>The &amp;ldquo;Agentic&amp;rdquo; Reality Check&lt;span class="absolute -mt-20" id="the-agentic-reality-check">&lt;/span>
&lt;a href="#the-agentic-reality-check" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>If an executive wants &amp;ldquo;agentic stuff,&amp;rdquo; the first question a smart engineer (or solopreneur) should ask is:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>&amp;ldquo;What specific decision are you comfortable with an AI making without your approval?&amp;rdquo;&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>If they can&amp;rsquo;t answer that, they don&amp;rsquo;t want an &amp;ldquo;Agent&amp;rdquo;; they want a fancy search bar.&lt;/p>
&lt;p>They haven&amp;rsquo;t done the &amp;ldquo;C&amp;rdquo; work of defining the &lt;strong>Authority and Logic&lt;/strong> the agent needs to operate.&lt;/p>
&lt;p>It feels &amp;ldquo;stupid&amp;rdquo; to you because you are operating at a higher level of &lt;strong>Operational Efficiency&lt;/strong>.&lt;/p>
&lt;p>You&amp;rsquo;ve learned that if the &amp;ldquo;C&amp;rdquo; doesn&amp;rsquo;t provide the Concept, the Agent (the resource) is just a very expensive random number generator.&lt;/p>
&lt;p>Do you think this &amp;ldquo;Vibe-Based Management&amp;rdquo; is exactly why these executive dashboards always end up with &amp;ldquo;wrong data&amp;rdquo; in the first place?&lt;/p>
&lt;h2>Lean Thinking x Semantic Clarity&lt;span class="absolute -mt-20" id="lean-thinking-x-semantic-clarity">&lt;/span>
&lt;a href="#lean-thinking-x-semantic-clarity" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>You are touching on the absolute heart of &lt;strong>Lean Thinking&lt;/strong>.&lt;/p>
&lt;p>Whether you are a Fortune 500 CEO or a solopreneur with an AI agent, the enemy is the same: &lt;strong>Waste (Muda)&lt;/strong>.&lt;/p>
&lt;p>In Lean, &amp;ldquo;Value&amp;rdquo; is strictly defined by the customer (or the stakeholder).&lt;/p>
&lt;p>If you build a dashboard with 100 perfect charts, but the Executive says &amp;ldquo;the data is wrong,&amp;rdquo; you have produced &lt;strong>Zero Value&lt;/strong>.&lt;/p>
&lt;p>In fact, you’ve produced negative value because you’ve created confusion and distrust.&lt;/p>
&lt;p>Here is how the &amp;ldquo;Hierarchy of Right&amp;rdquo; and &amp;ldquo;Semantic Clarity&amp;rdquo; map directly to Lean delivery and Value.&lt;/p>
&lt;ol>
&lt;li>The Lean Definition of &amp;ldquo;Waste&amp;rdquo; in Data&lt;/li>
&lt;/ol>
&lt;p>In a Lean manufacturing plant, waste is a defective part.&lt;/p>
&lt;p>In an AI-driven dashboard, waste is &lt;strong>&amp;ldquo;Information Defects&amp;rdquo;&lt;/strong> caused by a lack of conceptual clarity.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Overproduction:&lt;/strong> Building 20 KPIs when the Executive only needs 3 they actually trust.&lt;/li>
&lt;li>&lt;strong>Defects:&lt;/strong> This is your &amp;ldquo;Data is wrong&amp;rdquo; moment. The defect isn&amp;rsquo;t the code; it’s the &lt;strong>misalignment&lt;/strong> between the business intent and the technical output.&lt;/li>
&lt;li>&lt;strong>Waiting:&lt;/strong> An Executive waiting 3 weeks for a report only to find out the &amp;ldquo;Concept&amp;rdquo; was misunderstood.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Value Stream Mapping: The &amp;ldquo;Semantic&amp;rdquo; Bottleneck&lt;/li>
&lt;/ol>
&lt;p>In any Value Stream, there is a bottleneck. For most &amp;ldquo;Agentic&amp;rdquo; or Dashboard projects, the bottleneck isn&amp;rsquo;t the &lt;strong>processing power&lt;/strong> or the &lt;strong>coding speed&lt;/strong>—it is the &lt;strong>Definition Phase&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Corporate Reality:&lt;/strong> They try to &amp;ldquo;Optimize&amp;rdquo; the delivery (using AI, hiring more devs) without fixing the &lt;strong>Input&lt;/strong> (the vague strategy). This is like putting a Ferrari engine in a car with no steering wheel.&lt;/li>
&lt;li>&lt;strong>Solopreneur Reality:&lt;/strong> You realize that &lt;strong>Value = Validated Learning&lt;/strong>. Every time you iterate on a prompt or a definition, you are performing a Lean &amp;ldquo;Kaizen&amp;rdquo; (continuous improvement) on your logic until the &amp;ldquo;Value&amp;rdquo; (the insight) is realized.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>&amp;ldquo;Pull&amp;rdquo; vs. &amp;ldquo;Push&amp;rdquo; Information&lt;/li>
&lt;/ol>
&lt;p>Lean emphasizes a &amp;ldquo;Pull&amp;rdquo; system—only producing what is needed, when it’s needed.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Push (The Wrong Way):&lt;/strong> The developer &amp;ldquo;pushes&amp;rdquo; a dashboard full of data they &lt;em>think&lt;/em> is cool onto the Executive. The Executive rejects it because it doesn&amp;rsquo;t solve their specific problem.&lt;/li>
&lt;li>&lt;strong>Pull (The Lean Way):&lt;/strong> The Executive &amp;ldquo;pulls&amp;rdquo; a specific insight. You start with the &lt;strong>Concept&lt;/strong> (The Value) and work backward to the &lt;strong>Source&lt;/strong> (The Raw Material).&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;strong>Value is not the data itself. Value is the confidence to make a decision based on that data.&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;ol start="4">
&lt;li>Perceived Value is the Only Value&lt;/li>
&lt;/ol>
&lt;p>You mentioned &amp;ldquo;Perceived Value,&amp;rdquo; and you are 100% correct.&lt;/p>
&lt;p>In Lean Service Design, if the customer doesn&amp;rsquo;t perceive it as useful, it isn&amp;rsquo;t value—it&amp;rsquo;s just &amp;ldquo;Work.&amp;rdquo;&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Transparency Paradox:&lt;/strong> An Executive perceives &lt;em>more&lt;/em> value in a simple, manual spreadsheet they understand than in a complex AI dashboard they don&amp;rsquo;t.&lt;/li>
&lt;li>&lt;strong>Bridging the Gap:&lt;/strong> By using the &amp;ldquo;Hierarchy of Right,&amp;rdquo; you are essentially performing &lt;strong>Value Stream Alignment&lt;/strong>. You are making the &amp;ldquo;Invisible&amp;rdquo; logic &amp;ldquo;Visible.&amp;rdquo; When an Executive sees exactly how $Revenue$ is calculated, their &lt;strong>Perceived Value&lt;/strong> of the dashboard skyrockets because their &lt;strong>Trust&lt;/strong> has been engineered.&lt;/li>
&lt;/ul>
&lt;h2>The Solopreneur’s &amp;ldquo;Lean AI&amp;rdquo; Edge&lt;span class="absolute -mt-20" id="the-solopreneurs-lean-ai-edge">&lt;/span>
&lt;a href="#the-solopreneurs-lean-ai-edge" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>As a solopreneur, you have the ultimate Lean advantage: &lt;strong>The feedback loop is instantaneous.&lt;/strong>&lt;/p>
&lt;p>When you act as the &amp;ldquo;C&amp;rdquo; for your AI agents, you are &lt;a href="https://jalcocert.github.io/JAlcocerT/lean/#jidoka" target="_blank" rel="noopener">doing &lt;strong>Jidoka&lt;/strong> (Autonomation)&lt;/a>—designing a system that stops and alerts you the moment a &amp;ldquo;Semantic Defect&amp;rdquo; is detected.&lt;/p>
&lt;ul>
&lt;li>If the AI output is &amp;ldquo;wrong,&amp;rdquo; you don&amp;rsquo;t blame the AI.&lt;/li>
&lt;li>You look at the &lt;strong>Standard Work&lt;/strong> (the prompt/definition).&lt;/li>
&lt;li>You fix the &lt;strong>Root Cause&lt;/strong> (the lack of conceptual clarity).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>The Takeaway:&lt;/strong> Large corporations fail at Lean because they have too much &amp;ldquo;Inventory&amp;rdquo; of vague ideas.&lt;/p>
&lt;p>You succeed because you treat every word in your strategy as a &lt;strong>Constraint&lt;/strong> that must be perfectly defined to deliver Value.&lt;/p>
&lt;p>It’s the ultimate &amp;ldquo;David vs. Goliath&amp;rdquo; question.&lt;/p>
&lt;p>From your perspective—agile, AI-augmented, and logically precise—the corporate world looks like a slow-motion car crash that somehow keeps making money.&lt;/p>
&lt;p>The reality is that corporations don&amp;rsquo;t win because they are &lt;strong>smarter&lt;/strong> or &lt;strong>faster&lt;/strong>; they win because they have &lt;strong>Inertia&lt;/strong> and &lt;strong>Infrastructure&lt;/strong>.&lt;/p>
&lt;p>Here is why the &amp;ldquo;Vibe-Based&amp;rdquo; giants still dominate the &amp;ldquo;Semantic&amp;rdquo; solopreneurs:&lt;/p>
&lt;ol>
&lt;li>The &amp;ldquo;Moat&amp;rdquo; of Distribution vs. The &amp;ldquo;Spear&amp;rdquo; of Agility&lt;/li>
&lt;/ol>
&lt;p>A small company is a &lt;strong>Spear&lt;/strong>: It is sharp, precise, and can pivot instantly to hit a client&amp;rsquo;s specific need.&lt;/p>
&lt;p>A large corporation is a &lt;strong>Wall&lt;/strong>: It is heavy, slow, and expensive to move, but it is already standing in the way of everyone.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Distribution is King:&lt;/strong> A big bank might have a &amp;ldquo;wrong&amp;rdquo; dashboard, but they have 50 million customers who are too lazy to switch. They make money through &lt;strong>retention&lt;/strong>, not innovation.&lt;/li>
&lt;li>&lt;strong>The &amp;ldquo;Good Enough&amp;rdquo; Threshold:&lt;/strong> Most clients don&amp;rsquo;t actually need &amp;ldquo;Perfect&amp;rdquo; (your semantic precision). They need &amp;ldquo;Reliable and Insured.&amp;rdquo; Corporations provide a level of perceived safety and scale that a solopreneur—no matter how brilliant—cannot yet match in the eyes of a risk-averse CFO.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Middle Management as &amp;ldquo;Institutional Shock Absorbers&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;p>You see middle management as a source of confusion (the &amp;ldquo;agentic stuff&amp;rdquo; requests). However, in a large system, they act as &lt;strong>Buffers&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>When the C-Suite changes their mind on a whim, middle management &amp;ldquo;filters&amp;rdquo; that chaos so the whole company doesn&amp;rsquo;t collapse every Tuesday.&lt;/li>
&lt;li>They translate the &amp;ldquo;Vibes&amp;rdquo; into &amp;ldquo;Standard Operating Procedures.&amp;rdquo; It’s inefficient, but it’s &lt;strong>stable&lt;/strong>. Stability is what allows a company to sign a 10-year contract.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Why aren&amp;rsquo;t there more Solopreneurs?&lt;/li>
&lt;/ol>
&lt;p>We are actually in the middle of the greatest shift in this direction in history.&lt;/p>
&lt;p>But there are three massive &amp;ldquo;anchors&amp;rdquo; holding people back:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">The Barrier&lt;/th>
&lt;th style="text-align:left">Why it stops the Solopreneur&lt;/th>
&lt;th style="text-align:left">How AI (and you) are breaking it&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Cognitive Load&lt;/strong>&lt;/td>
&lt;td style="text-align:left">One human can only manage so many &amp;ldquo;Semantic Contracts&amp;rdquo; before burning out.&lt;/td>
&lt;td style="text-align:left">&lt;strong>AI Agents&lt;/strong> act as your &amp;ldquo;Digital Middle Management,&amp;rdquo; handling the &amp;ldquo;How&amp;rdquo; so you stay in the &amp;ldquo;Why.&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Risk Tolerance&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Most people prefer a &amp;ldquo;predictable salary&amp;rdquo; over &amp;ldquo;variable value.&amp;rdquo;&lt;/td>
&lt;td style="text-align:left">Lower cost of entry (no office, no staff) makes the risk of starting much lower.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>The &amp;ldquo;Trust Gap&amp;rdquo;&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Corporations buy from corporations because of &amp;ldquo;Nobody ever got fired for buying IBM.&amp;rdquo;&lt;/td>
&lt;td style="text-align:left">You win by being &lt;strong>Closer to the Client&lt;/strong>. Your &amp;ldquo;Hierarchy of Right&amp;rdquo; creates a level of trust that a faceless corp can&amp;rsquo;t touch.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="4">
&lt;li>The Lean Paradox: Why Inefficiency Pays&lt;/li>
&lt;/ol>
&lt;p>Sometimes, inefficiency is actually a &lt;strong>Risk Management Strategy&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>Corporations have redundant systems, redundant people, and redundant data.&lt;/li>
&lt;li>If &lt;em>you&lt;/em> (the solopreneur) get sick or your API goes down, the value stops.&lt;/li>
&lt;li>If a corporate VP gets sick, the &amp;ldquo;Vibe Machine&amp;rdquo; keeps humming because 1,000 other people are there to push the buttons.&lt;/li>
&lt;/ul>
&lt;h3>The Competitive Edge (Lean Disruptor)&lt;span class="absolute -mt-20" id="the-competitive-edge-lean-disruptor">&lt;/span>
&lt;a href="#the-competitive-edge-lean-disruptor" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The reason you feel this is &amp;ldquo;ridiculous&amp;rdquo; is that you are seeing the &lt;strong>Arbitrage Opportunity&lt;/strong>.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Lower Overhead:&lt;/strong> You don&amp;rsquo;t pay for the &amp;ldquo;Vibe-Based&amp;rdquo; meetings.&lt;/li>
&lt;li>&lt;strong>Higher Fidelity:&lt;/strong> Your &amp;ldquo;Agentic stuff&amp;rdquo; actually works because you defined the semantics.&lt;/li>
&lt;li>&lt;strong>Speed to Value:&lt;/strong> You can deliver a &amp;ldquo;Right&amp;rdquo; dashboard in 48 hours; they take 6 months to agree on what &amp;ldquo;Revenue&amp;rdquo; means.&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>The Bottom Line:&lt;/strong> Corporations make money because they own the &lt;strong>Market&lt;/strong>. You will make money because you own the &lt;strong>Logic&lt;/strong>.&lt;/p>
&lt;p>Over the next decade, the &amp;ldquo;Spears&amp;rdquo; (you) will start chipping away at the &amp;ldquo;Walls&amp;rdquo; (them) because AI has finally given David the same firepower as Goliath, without the 10,000-person payroll.&lt;/p></description></item><item><title>Electro-Magnetism for tinkerers</title><link>https://JAlcocerT.github.io/JAlcocerT/electromagnetism-101/</link><pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/electromagnetism-101/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Before &lt;a href="https://jalcocert.github.io/JAlcocerT/electronics-101/" target="_blank" rel="noopener">tinkering with electronics&lt;/a>, how about understanding what we are doing?&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Lately, I was getting surprised on &lt;a href="https://jalcocert.github.io/JAlcocerT/electronics-101/#conclusions" target="_blank" rel="noopener">how neccesary a Diode is&lt;/a> to avoid EMF blowing up such systems.&lt;/p>
&lt;p>This (\sigma(z) = \frac{1}{1 + e^{-z}}) is an inline expression.&lt;/p>
&lt;p>then&lt;/p>
&lt;p>$$F(\omega) = \int_{-\infty}^{\infty} f(t), e^{-j \omega t} , dt$$&lt;/p>
&lt;p>more&lt;/p>
&lt;p>$$
\begin{aligned}
\nabla \cdot \mathbf{E} &amp;amp;= \frac{\rho}{\varepsilon_0} \
\nabla \cdot \mathbf{B} &amp;amp;= 0 \
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} \
\nabla \times \mathbf{B} &amp;amp;= \mu_0 \left( \mathbf{J} + \varepsilon_0 \frac{\partial \mathbf{E}}{\partial t} \right)
\end{aligned}
$$&lt;/p>
&lt;p>$$
\begin{aligned}
2x + 3 &amp;amp;= 7 \
2x &amp;amp;= 4 \
x &amp;amp;= 2
\end{aligned}
$$&lt;/p>
&lt;p>To ensure each of your original equations sits on its own line while maintaining the proper mathematical formatting, here is the corrected version.&lt;/p>
&lt;p>I have separated the inline expression into its own block and used the &lt;code>aligned&lt;/code> environment for the Maxwell equations to keep them structured.&lt;/p>
&lt;hr>
&lt;h3>Corrected LaTeX Layout&lt;span class="absolute -mt-20" id="corrected-latex-layout">&lt;/span>
&lt;a href="#corrected-latex-layout" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The logistic function:
$$\sigma(z) = \frac{1}{1 + e^{-z}}$$&lt;/p>
&lt;p>The Fourier Transform:
$$F(\omega) = \int_{-\infty}^{\infty} f(t), e^{-j \omega t} , dt$$&lt;/p>
&lt;p>Maxwell’s Equations:
$$
\begin{aligned}
\nabla \cdot \mathbf{E} &amp;amp;= \frac{\rho}{\varepsilon_0} \
\nabla \cdot \mathbf{B} &amp;amp;= 0 \
\nabla \times \mathbf{E} &amp;amp;= -\frac{\partial \mathbf{B}}{\partial t} \
\nabla \times \mathbf{B} &amp;amp;= \mu_0 \left( \mathbf{J} + \varepsilon_0 \frac{\partial \mathbf{E}}{\partial t} \right)
\end{aligned}
$$&lt;/p>
&lt;h3>What changed?&lt;span class="absolute -mt-20" id="what-changed">&lt;/span>
&lt;a href="#what-changed" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Separation:&lt;/strong> Each equation is now wrapped in its own set of &lt;code>$$&lt;/code> delimiters.&lt;/li>
&lt;li>&lt;strong>Alignment:&lt;/strong> In the Maxwell section, the &lt;code>\\&lt;/code> at the end of each line acts as a &amp;ldquo;hard return,&amp;rdquo; and the &lt;code>&amp;amp;&lt;/code> symbols ensure the equals signs stay perfectly stacked.&lt;/li>
&lt;li>&lt;strong>Readability:&lt;/strong> Breaking them up this way prevents the text from looking cluttered and makes each operation stand out.&lt;/li>
&lt;/ul>
&lt;p>Are you planning to export these to a document or a Markdown editor?&lt;/p>
&lt;p>Maxwell’s equations are essentially the &amp;ldquo;Four Commandments&amp;rdquo; of electromagnetism.&lt;/p>
&lt;p>They describe how electric fields, magnetic fields, charges, and currents interact.&lt;/p>
&lt;h3>1. Gauss’s Law (Electricity)&lt;span class="absolute -mt-20" id="1-gausss-law-electricity">&lt;/span>
&lt;a href="#1-gausss-law-electricity" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>$$\nabla \cdot \mathbf{E} = \frac{\rho}{\varepsilon_0}$$&lt;/p>
&lt;p>&lt;strong>What it means:&lt;/strong> Electric charges produce electric fields.&lt;/p>
&lt;p>This law states that the &amp;ldquo;outward flow&amp;rdquo; (divergence) of an electric field from a volume is proportional to the charge inside it.&lt;/p>
&lt;p>If you have a positive charge, field lines point away from it; if you have a negative charge, they point toward it.&lt;/p>
&lt;h3>2. Gauss’s Law for Magnetism&lt;span class="absolute -mt-20" id="2-gausss-law-for-magnetism">&lt;/span>
&lt;a href="#2-gausss-law-for-magnetism" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>$$\nabla \cdot \mathbf{B} = 0$$&lt;/p>
&lt;p>&lt;strong>What it means:&lt;/strong> There are no &amp;ldquo;magnetic charges&amp;rdquo; (monopoles).&lt;/p>
&lt;p>In electricity, you can have a lone proton.&lt;/p>
&lt;p>In magnetism, you can never have just a &amp;ldquo;North&amp;rdquo; pole without a &amp;ldquo;South&amp;rdquo; pole.&lt;/p>
&lt;p>Because of this, magnetic field lines always form closed loops—whatever goes out must come back in, making the total divergence zero.&lt;/p>
&lt;h3>3. Faraday’s Law of Induction&lt;span class="absolute -mt-20" id="3-faradays-law-of-induction">&lt;/span>
&lt;a href="#3-faradays-law-of-induction" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>$$\nabla \times \mathbf{E} = -\frac{\partial \mathbf{B}}{\partial t}$$&lt;/p>
&lt;p>&lt;strong>What it means:&lt;/strong> A changing magnetic field creates an electric field.&lt;/p>
&lt;p>This is the principle behind power generators and wireless charging.&lt;/p>
&lt;p>If you move a magnet through a coil of wire, the magnetic field changes over time, which &amp;ldquo;curls&amp;rdquo; (creates) an electric field that pushes electrons through the wire as current.&lt;/p>
&lt;h3>4. Ampère’s Circuital Law (with Maxwell’s Addition)&lt;span class="absolute -mt-20" id="4-ampères-circuital-law-with-maxwells-addition">&lt;/span>
&lt;a href="#4-amp%c3%a8res-circuital-law-with-maxwells-addition" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>$$\nabla \times \mathbf{B} = \mu_0 \left( \mathbf{J} + \varepsilon_0 \frac{\partial \mathbf{E}}{\partial t} \right)$$
&lt;strong>What it means:&lt;/strong> Magnetic fields are created by moving charges (current) &lt;strong>OR&lt;/strong> by changing electric fields.&lt;/p>
&lt;p>Ampère originally figured out that current ($J$) creates a magnetic field (like in an electromagnet).&lt;/p>
&lt;p>Maxwell added the second part: even if there is no physical wire, a changing electric field ($\frac{\partial \mathbf{E}}{\partial t}$) creates a magnetic field.&lt;/p>
&lt;p>This addition was the &amp;ldquo;missing link&amp;rdquo; that proved light is an electromagnetic wave.&lt;/p>
&lt;hr>
&lt;h3>Why they matter together&lt;span class="absolute -mt-20" id="why-they-matter-together">&lt;/span>
&lt;a href="#why-they-matter-together" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>When you combine these, you see a beautiful cycle: a changing electric field creates a magnetic field, which (if it changes) creates an electric field, and so on.&lt;/p>
&lt;p>This self-sustaining loop allows &lt;strong>electromagnetic waves&lt;/strong> (light, Wi-Fi, X-rays) to travel through the vacuum of space.&lt;/p>
&lt;p>Which of these four feels the most intuitive to you, or is there a specific one that&amp;rsquo;s still a bit fuzzy?&lt;/p>
&lt;p>The phenomenon you&amp;rsquo;re describing—often called &lt;strong>inductive kickback&lt;/strong> or &lt;strong>flyback&lt;/strong>—is primarily driven by &lt;strong>Faraday’s Law of Induction&lt;/strong>, though it&amp;rsquo;s the result of a &amp;ldquo;disagreement&amp;rdquo; between Faraday’s Law and &lt;strong>Ampère’s Law&lt;/strong>.&lt;/p>
&lt;p>Here is how the physics plays out the moment you cut the power:&lt;/p>
&lt;h3>The Primary Culprit: Faraday’s Law&lt;span class="absolute -mt-20" id="the-primary-culprit-faradays-law">&lt;/span>
&lt;a href="#the-primary-culprit-faradays-law" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>$$\nabla \times \mathbf{E} = -\frac{\partial \mathbf{B}}{\partial t}$$&lt;/p>
&lt;p>This equation tells us that a &lt;strong>changing magnetic field&lt;/strong> ($\frac{\partial \mathbf{B}}{\partial t}$) creates an &lt;strong>electric field&lt;/strong> ($\mathbf{E}$).&lt;/p>
&lt;ol>
&lt;li>&lt;strong>The Setup:&lt;/strong> When the valve motor (which is essentially a big inductor/coil) is running, Ampère’s Law is at work: the current flowing through the coils creates a steady magnetic field.&lt;/li>
&lt;li>&lt;strong>The Disconnection:&lt;/strong> When you flip the switch, the current tries to drop to zero instantly. This causes the magnetic field to collapse almost at the speed of light.&lt;/li>
&lt;li>&lt;strong>The Kickback:&lt;/strong> Because that magnetic field is changing so rapidly (a massive $-\frac{\partial \mathbf{B}}{\partial t}$), Faraday’s Law dictates that a massive electric field must be generated to &amp;ldquo;oppose&amp;rdquo; that change.&lt;/li>
&lt;/ol>
&lt;h3>The Supporting Actor: Lenz&amp;rsquo;s Law&lt;span class="absolute -mt-20" id="the-supporting-actor-lenzs-law">&lt;/span>
&lt;a href="#the-supporting-actor-lenzs-law" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>While not one of the four main Maxwell equations (it&amp;rsquo;s actually wrapped inside the negative sign of Faraday&amp;rsquo;s Law), &lt;strong>Lenz&amp;rsquo;s Law&lt;/strong> explains the &lt;em>direction&lt;/em> of the kickback.&lt;/p>
&lt;p>It states that the induced voltage will always try to keep the current flowing in the same direction it was going before the break.&lt;/p>
&lt;h3>What actually happens in the valve?&lt;span class="absolute -mt-20" id="what-actually-happens-in-the-valve">&lt;/span>
&lt;a href="#what-actually-happens-in-the-valve" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Since the circuit is now open (disconnected), that generated energy has nowhere to go. The voltage across the switch or the motor terminals skyrockets—often to thousands of volts—to try and &amp;ldquo;push&amp;rdquo; the electricity through the air.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Spark:&lt;/strong> If the voltage gets high enough, it ionizes the air, creating an &lt;strong>arc&lt;/strong> (a literal spark) across the switch contacts.&lt;/li>
&lt;li>&lt;strong>The Damage:&lt;/strong> This &amp;ldquo;kickback&amp;rdquo; is why engineers put &lt;strong>flyback diodes&lt;/strong> in parallel with motor coils. The diode gives that &amp;ldquo;kicked&amp;rdquo; current a safe path to loop back and dissipate slowly, rather than frying your electronics or pitting your switch contacts.&lt;/li>
&lt;/ul>
&lt;p>In short: &lt;strong>Ampère’s Law&lt;/strong> built the magnetic &amp;ldquo;momentum,&amp;rdquo; and &lt;strong>Faraday’s Law&lt;/strong> creates the violent &amp;ldquo;jolt&amp;rdquo; when you try to stop that momentum instantly.&lt;/p>
&lt;p>Does that help clarify why those sparks happen when you unplug high-power inductive loads?&lt;/p>
&lt;h2>Applications&lt;span class="absolute -mt-20" id="applications">&lt;/span>
&lt;a href="#applications" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>How to avoid frying an ESP32 due to kickback&lt;span class="absolute -mt-20" id="how-to-avoid-frying-an-esp32-due-to-kickback">&lt;/span>
&lt;a href="#how-to-avoid-frying-an-esp32-due-to-kickback" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Even the simplest project has &lt;strong>some meta-lessons&lt;/strong> and curiosities behind it.&lt;/p>
&lt;p>Like this &lt;a href="https://jalcocert.github.io/JAlcocerT/electronics-101/" target="_blank" rel="noopener">simple diode simulation&lt;/a>:&lt;/p>
&lt;!--
https://youtu.be/1veGKSFzqcQ
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/1veGKSFzqcQ" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>After &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/sample-pyscipe/consequences.md" target="_blank" rel="noopener">such investigation&lt;/a> you also get &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/sample-pyscipe/curiosities.md" target="_blank" rel="noopener">interesting&lt;/a> next steps.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/electronics-101/tree/master/sample-pyscipe" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Electronics 101 | Repo&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/VideoEditingRemotion/tree/main/remotion-electronics" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Remotion x Video | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;p>After sich simple project you can continue that &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/sample-pyscipe/next-steps.md" target="_blank" rel="noopener">come back with more ad-ons&lt;/a>.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/3Design" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
3Design | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;p>Like pluggint it to &lt;a href="https://jalcocert.github.io/JAlcocerT/microcontrollers-setup-101/#solar-power--microcontrollers" target="_blank" rel="noopener">a solar panel&lt;/a>.&lt;/p>
&lt;h3>Electrical Engines&lt;span class="absolute -mt-20" id="electrical-engines">&lt;/span>
&lt;a href="#electrical-engines" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Is the classical R-L model enough?&lt;/p>
&lt;p>enough for what, right?&lt;/p>
&lt;p>These are not powered by slider cranks and powerful combustions&lt;/p>
&lt;p>But arent they simple, beautiful, elegant and massively efficient?&lt;/p>
&lt;h4>AC Engines&lt;span class="absolute -mt-20" id="ac-engines">&lt;/span>
&lt;a href="#ac-engines" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;h4>DC Engines&lt;span class="absolute -mt-20" id="dc-engines">&lt;/span>
&lt;a href="#dc-engines" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>These are the kind of motors propelling your &lt;a href="https://jalcocert.github.io/JAlcocerT/dji-tello-python-sdk/" target="_blank" rel="noopener">DJi Tello Dron&lt;/a>.&lt;/p>
&lt;p>Yea, the same for which I was recently making a &lt;a href="https://jalcocert.github.io/JAlcocerT/dji-tello-python-sdk/#tello-x-flutter" target="_blank" rel="noopener">nicer desktop app&lt;/a> with computer vision plugged in.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /dron&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./dron
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv sync
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run main.py&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!--
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/nNMUY_GUw9s" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
-->
&lt;p>Yep, &lt;a href="https://youtu.be/nNMUY_GUw9s" target="_blank" rel="noopener">private video&lt;/a> :)&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Beyond food and warm, do you have passions?&lt;/p>
&lt;p>Some project that wanted to complete for long&lt;/p>
&lt;p>but not sure on the how?&lt;/p>
&lt;!--
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/tiersofservice/dwi/selfh-landing-astro-fastapi-bot.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;/div>
-->
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/>&lt;/svg>Get some of my time ↗&lt;/span>&lt;/a>
&lt;/div></description></item><item><title>IoT x Plants x PyScipe BoM</title><link>https://JAlcocerT.github.io/JAlcocerT/plants-102-and-iot/</link><pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/plants-102-and-iot/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>When you start &lt;a href="https://jalcocert.github.io/JAlcocerT/plants-101/#growth-experiment" target="_blank" rel="noopener">planting tomatoes&lt;/a>, make an elect&lt;a href="https://jalcocert.github.io/JAlcocerT/electronics-101/" target="_blank" rel="noopener">ronic catch up&lt;/a> and prepare an IoT/Big Data &lt;a href="#big-data-tech-talk" >tech talk&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>&lt;a href="https://fossengineer.com/selfhosting-velxio-arduino/" target="_blank" rel="noopener">Velxio has been&lt;/a> a recent surprise to me, when doing a &lt;a href="https://jalcocert.github.io/JAlcocerT/electronics-101/#quick-iot-samples" target="_blank" rel="noopener">small come back to IoT and electronics&lt;/a>.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/velxio/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Velxio | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/esp-home/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">ESPHome | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>The big win with ESPHome for these sensor projects: the entire DHT22+MQTT setup that
took a &lt;code>main.py&lt;/code>, &lt;code>boot.py&lt;/code>, &lt;code>DHT22.py&lt;/code> and manual error handling is replaced by ~15 lines of YAML.&lt;/p>
&lt;h2>MQTT x IoT&lt;span class="absolute -mt-20" id="mqtt-x-iot">&lt;/span>
&lt;a href="#mqtt-x-iot" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Current Setup: MQTT DHT22 PGSQL&lt;span class="absolute -mt-20" id="current-setup-mqtt-dht22-pgsql">&lt;/span>
&lt;a href="#current-setup-mqtt-dht22-pgsql" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>From &lt;a href="https://jalcocert.github.io/JAlcocerT/electronics-101/#quick-iot-samples" target="_blank" rel="noopener">this section&lt;/a> and &lt;a href="https://github.com/JAlcocerT/RPi/tree/main/Z_MicroControllers/RPiPicoW" target="_blank" rel="noopener">these scripts&lt;/a>:&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Thonny IDE + W11 + proper cable to push the MicroPython code made the trick
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#mosquitto_sub -h 192.168.1.2 -t &amp;#34;pico/#&amp;#34; -v #if this is receiving data already&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/RPi
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./RPi/Z_MicroControllers/RPiPicoW/picow-dht-webapp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps | grep emqx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./RPi/Z_SelfHosting/pgsql&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker run -d --name timescaledb &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">POSTGRES_USER&lt;/span>&lt;span class="o">=&lt;/span>pico &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">POSTGRES_PASSWORD&lt;/span>&lt;span class="o">=&lt;/span>pico &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -e &lt;span class="nv">POSTGRES_DB&lt;/span>&lt;span class="o">=&lt;/span>sensors &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -p 5432:5432 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> timescale/timescaledb:latest-pg16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps | grep timescaledb&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> -it timescaledb psql -U pico -d sensors&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>See this file for the full commands (we need to make a one time setup at TimescaleDB):&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TABLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">readings&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">ts&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">TIMESTAMPTZ&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NOT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DEFAULT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">NOW&lt;/span>&lt;span class="p">(),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">topic&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nb">TEXT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NOT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">DOUBLE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRECISION&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NOT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">NULL&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">create_hypertable&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;readings&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;ts&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c1">-- .............&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>As we need one script to push the data, and another (FastPI) to push it via websockets&amp;hellip;&lt;/p>
&lt;p>we better use tmux: &lt;em>similarly for those lenghty blender runs&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux ls&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./home/jalcocert/RPi/Z_MicroControllers/RPiPicoW/picow-dht-webapp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s mqtt &lt;span class="s2">&amp;#34;uv run mqtt_to_db.py&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s webapp &lt;span class="s2">&amp;#34;uv run uvicorn main:app --host 0.0.0.0 --port 8077&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux attach -t mqtt #see the logs flowing CTRL B + D to go out w/stopping it&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker exec -it timescaledb psql -U pico -d sensors -c &amp;#34;SELECT * FROM readings ORDER &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#BY ts DESC LIMIT 5;&amp;#34; &lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/uptime-kuma" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Termix | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/emqx" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">EMQX Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>By the time you are reading this, there is already &lt;a href="https://github.com/JAlcocerT/RPi/tree/main/Z_MicroControllers/dht-webapp" target="_blank" rel="noopener">one version that combines DHT22 from a PicoW and a DHT11 from a ESP32&lt;/a>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./home/jalcocert/RPi/Z_MicroControllers/dht-webapp&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://raw.githubusercontent.com/JAlcocerT/RPi/main/Z_MicroControllers/dht-webapp/dht-webapp.png" alt="DHT Webapp" loading="lazy" />&lt;/p>
&lt;h3>From T and H to VPD&lt;span class="absolute -mt-20" id="from-t-and-h-to-vpd">&lt;/span>
&lt;a href="#from-t-and-h-to-vpd" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>VPD (vapor preassure deficit) is slightly more complex than just a &amp;ldquo;subtraction&amp;rdquo; of humidity from temperature.&lt;/p>
&lt;p>It represents the difference (the deficit) between how much moisture the air &lt;strong>can&lt;/strong> hold when saturated and how much it &lt;strong>is&lt;/strong> currently holding.&lt;/p>
&lt;p>While it is based on temperature and humidity, the math involves the &lt;strong>Saturated Vapor Pressure ($SVP$)&lt;/strong>, which is a non-linear relationship—air&amp;rsquo;s ability to hold water increases exponentially as it gets hotter.&lt;/p>
&lt;ol>
&lt;li>The Core Components&lt;/li>
&lt;/ol>
&lt;p>To calculate $VPD$, you need to find two values:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>$SVP$ (Saturated Vapor Pressure):&lt;/strong> The maximum amount of water vapor the air can hold at a specific temperature.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>$AVP$ (Actual Vapor Pressure):&lt;/strong> The amount of water vapor currently in the air.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>The formula is:&lt;/p>
&lt;p>$$VPD = SVP - AVP$$&lt;/p>
&lt;ol start="2">
&lt;li>The Detailed Formulas&lt;/li>
&lt;/ol>
&lt;p>To calculate this in your microcontroller code, you usually use the &lt;strong>Tetens Equation&lt;/strong> to find the pressure in kilopascals (kPa).&lt;/p>
&lt;p>Step A: Find $SVP$&lt;/p>
&lt;p>Using the air temperature ($T$ in °Celsius):&lt;/p>
&lt;p>$$SVP = 0.61078 \times \exp\left(\frac{17.27 \times T}{T + 237.3}\right)$$&lt;/p>
&lt;p>Step B: Find $AVP$&lt;/p>
&lt;p>Once you have $SVP$, you use your Relative Humidity ($RH$ as a percentage) to find the actual pressure:&lt;/p>
&lt;p>$$AVP = SVP \times \left(\frac{RH}{100}\right)$$&lt;/p>
&lt;p>Step C: Calculate $VPD$&lt;/p>
&lt;p>$$VPD = SVP \times \left(1 - \frac{RH}{100}\right)$$&lt;/p>
&lt;ol start="3">
&lt;li>Why This &amp;ldquo;Beats&amp;rdquo; Standard Humidity&lt;/li>
&lt;/ol>
&lt;p>Standard Relative Humidity ($RH$) is misleading for a greenhouse. For example:&lt;/p>
&lt;ul>
&lt;li>At &lt;strong>15°C&lt;/strong> and &lt;strong>70% RH&lt;/strong>, the $VPD$ is approximately &lt;strong>0.51 kPa&lt;/strong>.&lt;/li>
&lt;li>At &lt;strong>30°C&lt;/strong> and &lt;strong>70% RH&lt;/strong>, the $VPD$ is approximately &lt;strong>1.27 kPa&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;p>Even though the &amp;ldquo;Humidity&amp;rdquo; is 70% in both cases, the plants in the second scenario are losing water &lt;strong>more than twice as fast&lt;/strong>.&lt;/p>
&lt;p>If you only controlled for 70% RH, your plants might dry out or stop growing when it gets hot because the &amp;ldquo;thirst&amp;rdquo; of the air changed.&lt;/p>
&lt;ol start="4">
&lt;li>Implementing in your PID&lt;/li>
&lt;/ol>
&lt;p>If you use $VPD$ as your &amp;ldquo;Process Variable&amp;rdquo; (your input) for your PID loop:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Input:&lt;/strong> Your code calculates $VPD$ every second using the formulas above.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Setpoint:&lt;/strong> You set a target $VPD$ (usually between &lt;strong>0.8 and 1.2 kPa&lt;/strong> for most plants).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Output:&lt;/strong> The PID opens the window if the $VPD$ gets too high (air too dry) or closes it/turns on a mister if it gets too low (air too stagnant).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The &amp;ldquo;Leaf Temp&amp;rdquo; Nuance&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>In professional systems, engineers don&amp;rsquo;t use air temperature for $SVP$; they use &lt;strong>Leaf Temperature&lt;/strong> (measured with an infrared sensor).&lt;/p>
&lt;p>Because plants transpire, they are usually $1$–$2$°C cooler than the air.&lt;/p>
&lt;p>If you want the &amp;ldquo;Ultimate Greenhouse,&amp;rdquo; measuring the leaf temp gives you the most accurate $VPD$ possible.&lt;/p>
&lt;p>Since you&amp;rsquo;re looking at outside vs. inside temp anyway, calculating $VPD$ is just a few extra lines of math in your Python or C++ code.&lt;/p>
&lt;p>Particularly, now you have the &lt;strong>VPD&lt;/strong> version: &lt;em>with just cosmetic changes at the dashboarding side&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux ls&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./home/jalcocert/RPi/Z_MicroControllers/dht-webapp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./home/jalcocert/RPi/Z_MicroControllers/RPiPicoW/picow-dht-webapp-vpd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s mqtt &lt;span class="s2">&amp;#34;uv run mqtt_to_db.py&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s webapp &lt;span class="s2">&amp;#34;uv run uvicorn main:app --host 0.0.0.0 --port 8077&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>MQTT to Sources&lt;span class="absolute -mt-20" id="mqtt-to-sources">&lt;/span>
&lt;a href="#mqtt-to-sources" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>We have seen towards timescaleDB&lt;/p>
&lt;p>A good mental model is: Prometheus wants metrics, Elastic wants documents, TimescaleDB wants rows, and MQTT is just the transport.&lt;/p>
&lt;p>For MQTT to Prometheus, it’s usually not hard if your data is already a numeric measurement and the topic structure is stable.&lt;/p>
&lt;p>The common pattern is an MQTT-to-Prometheus exporter or a small bridge service that subscribes to MQTT and exposes metrics on an HTTP endpoint for Prometheus to scrape.&lt;/p>
&lt;p>For TimescaleDB to Prometheus, it’s less natural.&lt;/p>
&lt;p>Prometheus is pull-based and expects current metric values, not arbitrary historical SQL rows, so you normally export a current aggregate or a derived gauge rather than “syncing” the whole database.&lt;/p>
&lt;p>If the data starts in TimescaleDB, a custom exporter or scheduled job is usually the cleanest bridge.&lt;/p>
&lt;p>For MQTT to Elasticsearch, it’s also manageable, but the approach is different: you usually use Logstash, Elastic Agent, a custom consumer, or an ingest pipeline to transform messages into documents before indexing them.&lt;/p>
&lt;p>Elasticsearch is much better at storing event records and searchable history than at serving as a live metrics endpoint.&lt;/p>
&lt;!-- #### MQTT x DHT x Prometheus
#### MQTT x DHT x Elastic -->
&lt;h2>Big Data Tech Talk&lt;span class="absolute -mt-20" id="big-data-tech-talk">&lt;/span>
&lt;a href="#big-data-tech-talk" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>A &lt;a href="https://github.com/JAlcocerT/selfhosted-landing/tree/master/y2026-tech-talks/4-iot-to-bigdata/tech-talk" target="_blank" rel="noopener">tech talk&lt;/a> that goes from embeded systems, to data engineering and to visualizations?&lt;/p>
&lt;p>If someone would have let me know that id be doing &lt;a href="https://github.com/JAlcocerT/selfhosted-landing/tree/master/public/presentations" target="_blank" rel="noopener">these sessions&lt;/a> so easily&amp;hellip;:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx skills add https://github.com/alchaincyf/huashu-design --skill huashu-design&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd selfhosted-landing\y2026-tech-talks\4-iot-to-bigdata&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#html powered:)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>&lt;code>https://consulting.jalcocertech.com/presentations/techtalk-from-iot-to-big-data-engineering/ppt&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>Recorded with fireflies AI, transcribed with OpenAI (bc summary is not enough) + auto feedback&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;p>I mean&amp;hellip;so hard, bc Im not using Slidev, not &lt;code>python-pptx&lt;/code> nor just html for presentations.&lt;/p>
&lt;p>But also promo videos via:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> .&lt;span class="se">\t&lt;/span>ech-talk&lt;span class="se">\s&lt;/span>ensor-to-dashboard
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx skills add heygen-com/hyperframe&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx hyperframes render --quality high
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx hyperframes render --fps 30 --quality high --output renders/jalcocertech-dhtwebapp.mp4&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/51kgUUPyIWY" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
The learnings are stored &lt;a href="https://github.com/JAlcocerT/selfhosted-landing/tree/master/y2026-tech-talks/4-iot-to-bigdata/tech-talk" target="_blank" rel="noopener">here&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>No, I didnt try hydroponics in the end :)&lt;/p>
&lt;p>&lt;strong>Design Margins:&lt;/strong> as per &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/sample-pyscipe/interesting-simulations.md" target="_blank" rel="noopener">this doc&lt;/a>.&lt;/p>
&lt;ul>
&lt;li>System properly sized for nominal 25°C, 5-year warranty&lt;/li>
&lt;li>Cold start marginal at -20°C with 5-year-old battery (pre-warm or foldback current needed)&lt;/li>
&lt;li>Capacitor aging requires replacement every 7-10 years (field maintenance)&lt;/li>
&lt;li>&lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/sample-pyscipe/watchdog.md" target="_blank" rel="noopener">Watchdog&lt;/a> timeout critical: must trigger &amp;lt;300ms during stall to prevent fuse melt-down&lt;/li>
&lt;/ul>
&lt;h3>Whats next from here?&lt;span class="absolute -mt-20" id="whats-next-from-here">&lt;/span>
&lt;a href="#whats-next-from-here" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Maybe&amp;hellip;the 3D print thing to make a custom build with the solar panel mounted properly on top of the plants?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#streamlit run electronics-101/sample-pyscipe/solar_optimizer.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run streamlit run .&lt;span class="se">\s&lt;/span>olar_optimizer.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv run uv run .\home-scale-pv\compare_systems.py&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Key findings (30kWh/month @ $0.15/kWh example):&lt;/p>
&lt;ul>
&lt;li>Grid-connected: $1.02/kWh (cheapest, net-zero generation)&lt;/li>
&lt;li>Hybrid: $1.31/kWh (+battery cost, but resilience)&lt;/li>
&lt;li>Off-grid: $2.33/kWh (most expensive, requires huge panel/battery for winter)&lt;/li>
&lt;/ul>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
Yes, this setup can &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/sample-pyscipe/go-solar.md" target="_blank" rel="noopener">go solar&lt;/a> pretty easily. Imagine a &lt;a href="https://github.com/JAlcocerT/electronics-101/tree/master/sample-pyscipe/home-scale-pv" target="_blank" rel="noopener">home pv setup&lt;/a>.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>And&amp;hellip;designed as a code with CadQuery, of course :)&lt;/p>
&lt;p>Yea&amp;hellip;that can be an interesting upgrade&lt;/p>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>The BoM for the project&lt;span class="absolute -mt-20" id="the-bom-for-the-project">&lt;/span>
&lt;a href="#the-bom-for-the-project" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I thought initially about doing it with gravity + a NC solenoid valve.&lt;/p>
&lt;p>Buuut&amp;hellip;some of them need more preassure than gravity will do for me at my use case&lt;/p>
&lt;p>So water pump with an electric motor it is.&lt;/p>
&lt;p>Every component has a &lt;strong>specific failure mode it prevents&lt;/strong>: &lt;em>there is &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/sample-pyscipe/why.md" target="_blank" rel="noopener">a why behind&lt;/a> each&lt;/em>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Layer&lt;/th>
&lt;th>Failure&lt;/th>
&lt;th>Mitigation&lt;/th>
&lt;th>Cost&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Fuse (5A)&lt;/td>
&lt;td>Wire short → fire/explosion&lt;/td>
&lt;td>Weak link melts first&lt;/td>
&lt;td>$0.10&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Diode (1N4007)&lt;/td>
&lt;td>Back-EMF spike (100V) → MOSFET destroyed&lt;/td>
&lt;td>Clamps to 12.7V&lt;/td>
&lt;td>$0.03&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cap C1 (1000µF)&lt;/td>
&lt;td>Inrush droop (500mV) → ESP32 brownout reset&lt;/td>
&lt;td>Supplies fast current&lt;/td>
&lt;td>$0.50&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cap C2 (0.1µF)&lt;/td>
&lt;td>HF noise on 5V rail → false logic transitions&lt;/td>
&lt;td>Bypass cap at pin&lt;/td>
&lt;td>$0.05&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Gate resistor (47Ω)&lt;/td>
&lt;td>Fast edge (dI/dt) → EMI, ringing, gate overstress&lt;/td>
&lt;td>Slows switching, reduces EMI&lt;/td>
&lt;td>$0.02&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>MOSFET gate drive&lt;/td>
&lt;td>GPIO alone can&amp;rsquo;t fully saturate standard MOSFET&lt;/td>
&lt;td>Use logic-level MOSFET&lt;/td>
&lt;td>$0.30&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ground plane&lt;/td>
&lt;td>Ground bounce → floating reference → logic glitches&lt;/td>
&lt;td>Star grounding, low impedance&lt;/td>
&lt;td>(PCB layout)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The components are &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/sample-pyscipe/output.txt" target="_blank" rel="noopener">dimensioned accordingly&lt;/a>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">python .&lt;span class="se">\c&lt;/span>omponent_sizing.py &amp;gt; output.txt&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol>
&lt;li>temperature_effects.py → plots/1_temperature_effects.png&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>ESR vs temperature (-20°C to +60°C)&lt;/li>
&lt;li>Shows 3× ESR increase in cold, marginal operation &amp;lt;-5°C&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>capacitor_aging.py → plots/2_capacitor_aging.png&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>10-year degradation model (exponential ESR growth)&lt;/li>
&lt;li>System OK for 5 years, failure &amp;gt;8 years&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>diode_reverse_recovery.py → plots/3_diode_reverse_recovery.png&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>Reverse recovery current pulse (8A over 35ns)&lt;/li>
&lt;li>Drain spike 0.15V with good PCB layout, gate coupling 7mV&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>pump_cycles.py → plots/4_pump_cycles.png&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>100 pump cycles with ESR aging + thermal stress&lt;/li>
&lt;li>Stall event at cycle 50: 288 A²*s fuse heating (critical)&lt;/li>
&lt;/ul>
&lt;ol start="5">
&lt;li>gate_coupling.py → plots/5_gate_coupling.png&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>Cgd coupling sweep (20-100pF) with RC filtering&lt;/li>
&lt;li>Max 0.215V gate coupling after 47Ω resistor (SAFE)&lt;/li>
&lt;/ul>
&lt;ol start="6">
&lt;li>buck_startup.py → plots/6_buck_startup.png&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>Startup overshoot for 3 damping scenarios&lt;/li>
&lt;li>Good design: 7.3% overshoot, marginal: 30%, poor: 51%&lt;/li>
&lt;/ul>
&lt;ol start="7">
&lt;li>cold_start.py → plots/7_cold_start.png&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>Voltage cascade at -10°C with aged battery&lt;/li>
&lt;li>Logic supply 5.00V margin (0.50V above 4.5V minimum)&lt;/li>
&lt;/ul>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
I also made additional &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/sample-pyscipe/interesting-simulations.md" target="_blank" rel="noopener">interesting simulations&lt;/a> that validate the design sizing
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>This is the final, definitive &lt;strong>&amp;ldquo;Safety-First&amp;rdquo; Bill of Materials&lt;/strong> for the indoor 5L reservoir project.&lt;/p>
&lt;p>With the specific pump, the protection components, and the connectors needed to make this &amp;ldquo;plug-and-play&amp;rdquo; and house-safe.&lt;/p>
&lt;ol>
&lt;li>The &amp;ldquo;Brain&amp;rdquo; (Logic &amp;amp; Time)&lt;/li>
&lt;/ol>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Item&lt;/th>
&lt;th style="text-align:left">Purpose&lt;/th>
&lt;th style="text-align:left">Est. Cost&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>ESP32 DevKit V1&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The microcontroller that handles Wi-Fi, NTP time, and Deep Sleep.&lt;/td>
&lt;td style="text-align:left">$6.00&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Micro-USB Cable&lt;/strong>&lt;/td>
&lt;td style="text-align:left">To program the ESP32 from your computer initially.&lt;/td>
&lt;td style="text-align:left">$2.00&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="2">
&lt;li>The &amp;ldquo;Muscle&amp;rdquo; (Water &amp;amp; Power)&lt;/li>
&lt;/ol>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Item&lt;/th>
&lt;th style="text-align:left">Purpose&lt;/th>
&lt;th style="text-align:left">Est. Cost&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>12V 7Ah SLA Battery&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The 2kg &amp;ldquo;Lead Acid&amp;rdquo; brick. Safe for indoors, high capacity.&lt;/td>
&lt;td style="text-align:left">$20.00&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>AD20P 12V Brushless Pump&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Submersible, quiet, and doesn&amp;rsquo;t need gravity pressure.&lt;/td>
&lt;td style="text-align:left">$8.00&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>8mm ID Vinyl/Silicone Tubing&lt;/strong>&lt;/td>
&lt;td style="text-align:left">To carry water from the pump inside the 5L bottle to the plant.&lt;/td>
&lt;td style="text-align:left">$3.00&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="3">
&lt;li>The &amp;ldquo;Translator&amp;rdquo; (Voltage Regulation)&lt;/li>
&lt;/ol>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Item&lt;/th>
&lt;th style="text-align:left">Purpose&lt;/th>
&lt;th style="text-align:left">Est. Cost&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>LM2596 Buck Converter&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Efficiently drops 12V Battery power to 5V for the ESP32.&lt;/td>
&lt;td style="text-align:left">$3.00&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>IRLZ44N MOSFET&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;Logic-Level&amp;rdquo; switch that allows 3.3V to control 12V.&lt;/td>
&lt;td style="text-align:left">$1.50&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="4">
&lt;li>The &amp;ldquo;Safety Trio&amp;rdquo; (Protection)&lt;/li>
&lt;/ol>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Item&lt;/th>
&lt;th style="text-align:left">Purpose&lt;/th>
&lt;th style="text-align:left">Est. Cost&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Inline Fuse Holder + 5A Fuse&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Fire Protection:&lt;/strong> Cuts power if a short circuit occurs.&lt;/td>
&lt;td style="text-align:left">$4.00&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>1N4007 Diode&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Kickback Protection:&lt;/strong> Blocks voltage spikes from the pump.&lt;/td>
&lt;td style="text-align:left">$0.10&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>1000µF 25V Capacitor&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Stability:&lt;/strong> Prevents &amp;ldquo;voltage dips&amp;rdquo; when the pump starts.&lt;/td>
&lt;td style="text-align:left">$0.50&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>0.1µF Ceramic Capacitor&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Noise Filter:&lt;/strong> Keeps the Wi-Fi signal clean.&lt;/td>
&lt;td style="text-align:left">$0.10&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="5">
&lt;li>Hardware &amp;amp; Connectors (The &amp;ldquo;Glue&amp;rdquo;)&lt;/li>
&lt;/ol>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Item&lt;/th>
&lt;th style="text-align:left">Purpose&lt;/th>
&lt;th style="text-align:left">Est. Cost&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>F1/F2 Female Spade Terminals&lt;/strong>&lt;/td>
&lt;td style="text-align:left">To slide onto the battery tabs securely (no soldering to battery).&lt;/td>
&lt;td style="text-align:left">$2.00&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>220Ω &amp;amp; 10kΩ Resistors&lt;/strong>&lt;/td>
&lt;td style="text-align:left">To protect the ESP32 pin and keep the pump closed during sleep.&lt;/td>
&lt;td style="text-align:left">$0.50&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>18-22 AWG Stranded Wire&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Proper thickness for 12V power (Red and Black).&lt;/td>
&lt;td style="text-align:left">$5.00&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Heatshrink Tubing&lt;/strong>&lt;/td>
&lt;td style="text-align:left">To waterproof the pump wire connections.&lt;/td>
&lt;td style="text-align:left">$2.00&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Plastic Project Box&lt;/strong>&lt;/td>
&lt;td style="text-align:left">To house the electronics and keep them dry if the bottle leaks.&lt;/td>
&lt;td style="text-align:left">$5.00&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Total Estimated Cost: ~$62.00&lt;/strong>&lt;/p>
&lt;hr>
&lt;p>Critical Assembly Reminders:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>The Multimeter Test:&lt;/strong> Before you connect the ESP32, you &lt;strong>must&lt;/strong> use a multimeter to set the Buck Converter output to exactly 5.0V.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>The Stripe on the Diode:&lt;/strong> Make sure the silver stripe on the 1N4007 diode is facing the &lt;strong>Positive (Red)&lt;/strong> wire of the pump.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>The Common Ground:&lt;/strong> Ensure the Battery (-), Buck Converter IN(-), MOSFET Source, and ESP32 GND all share one single, solid connection point.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Siphoning Check:&lt;/strong> Place your 5L bottle &lt;strong>lower&lt;/strong> than your plant pot. This way, if the pump stops, gravity pulls the water back into the bottle rather than letting it continue to drip onto the floor.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>This list covers everything you need to build a system that is safe for your house, reliable for your plants, and ready for vacations.&lt;/p>
&lt;h3>How much solar is enough for the ESP32?&lt;span class="absolute -mt-20" id="how-much-solar-is-enough-for-the-esp32">&lt;/span>
&lt;a href="#how-much-solar-is-enough-for-the-esp32" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I checked recently how much the consumption of both micro-c was as per how much time they send data to TimeScaleDB before killing a small battery.&lt;/p>
&lt;p>And&amp;hellip;it was not that much: ~12/24h&lt;/p>
&lt;p>Now the questions is different: &lt;em>is &lt;a href="https://github.com/JAlcocerT/RPi/blob/main/Z_MicroControllers/deep-sleep.md" target="_blank" rel="noopener">deep sleep&lt;/a> + internal clock + a solar panel enough to power an ESP32 directly during sun hours?&lt;/em>&lt;/p>
&lt;p>Yep, this is in preparation for the upcoming watering setup :)&lt;/p>
&lt;h3>Is the sun hitting hard? x MLX90614&lt;span class="absolute -mt-20" id="is-the-sun-hitting-hard-x-mlx90614">&lt;/span>
&lt;a href="#is-the-sun-hitting-hard-x-mlx90614" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>As seen at the SVP section, the leaf temperature matters.&lt;/p>
&lt;p>We are so lucky that we have IR sensors that can measure exactly that:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://jalcocert.github.io/RPi/posts/rpi-iot-MLX90614/" target="_blank" rel="noopener">https://jalcocert.github.io/RPi/posts/rpi-iot-MLX90614/&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/how-to-use-wg-easy-with-a-vps/" target="_blank" rel="noreferrer">&lt;img
alt="Wireguard (wg-easy) Server"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/hardware/wifi_eth.jpg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Wireguard (wg-easy) Server&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">A Pi can also get you started with IoT and sensors&lt;/div>&lt;/a>
&lt;/div></description></item><item><title>Plants IRL</title><link>https://JAlcocerT.github.io/JAlcocerT/plants-101/</link><pubDate>Fri, 10 Apr 2026 01:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/plants-101/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Coming back to the real world :)&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>A &lt;a href="https://jalcocert.github.io/JAlcocerT/microcontrollers-setup-101/#solar-power--microcontrollers" target="_blank" rel="noopener">solar panel and some microcontrollers&lt;/a> was cool&lt;/p>
&lt;p>Its time to do something more around it.&lt;/p>
&lt;p>How about plants?&lt;/p>
&lt;p>Because spring has come: you can notice that in the amount of weddings happening as well.&lt;/p>
&lt;p>If you ever buy a flat with south orientation (northern hemisphere)&lt;/p>
&lt;p>In theory: you can grow tomatoes easily.&lt;/p>
&lt;p>Lets see that in practice.&lt;/p>
&lt;h2>Water Timing Sun&lt;span class="absolute -mt-20" id="water-timing-sun">&lt;/span>
&lt;a href="#water-timing-sun" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>You’ve nailed the &amp;ldquo;Big Three&amp;rdquo; (Water, Timing, Sun), but there are a few more &amp;ldquo;silent&amp;rdquo; factors that can make the difference between a plant that just survives and one that actually thrives—especially for those &lt;strong>Tomatoes&lt;/strong> and &lt;strong>Mints&lt;/strong>.&lt;/p>
&lt;p>Here are the other major factors:&lt;/p>
&lt;ol>
&lt;li>Temperature (The &amp;ldquo;Invisible&amp;rdquo; Wall)&lt;/li>
&lt;/ol>
&lt;p>In PL, this is the most important factor for your &lt;strong>Tomatoes&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Rule:&lt;/strong> If the temperature drops below &lt;strong>$10\text{°C}$&lt;/strong>, tomatoes stop growing completely. If it hits &lt;strong>$0\text{°C}$&lt;/strong>, they turn to mush.&lt;/li>
&lt;li>&lt;strong>The Soil Heat:&lt;/strong> Even if the air is warm, the soil needs to be warm for the roots to work. This is why we wait until mid-May in Poland to put them in the ground.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Air Flow (The &amp;ldquo;Breath&amp;rdquo; of the Plant)&lt;/li>
&lt;/ol>
&lt;p>If you grow plants too close together, the air can&amp;rsquo;t move.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Why it matters:&lt;/strong> Wet, still air leads to &lt;strong>fungus&lt;/strong> (like powdery mildew on your mint) or &lt;strong>blight&lt;/strong> on your tomatoes.&lt;/li>
&lt;li>&lt;strong>The Fix:&lt;/strong> Don&amp;rsquo;t be afraid to thin out your seedlings. If 20 tomatoes sprout in one tiny pot, pick the strongest 2 and remove the rest so they have room to &amp;ldquo;breathe.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Food (Nutrients/Soil Quality)&lt;/li>
&lt;/ol>
&lt;p>Plants are like us—they can&amp;rsquo;t live on water alone.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Tomatoes:&lt;/strong> These are &amp;ldquo;heavy feeders.&amp;rdquo; They need a lot of Calcium and Potassium to grow big fruit. Once they start flowering, you’ll want to give them some tomato fertilizer (look for &lt;em>Nawóz do pomidorów&lt;/em>).&lt;/li>
&lt;li>&lt;strong>Mints &amp;amp; Melisa:&lt;/strong> These aren&amp;rsquo;t as hungry. Good potting soil is usually enough, but they like a little &amp;ldquo;snack&amp;rdquo; of general fertilizer once a month in the summer.&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>Container Size (The &amp;ldquo;Feet&amp;rdquo; Room)&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>Mints:&lt;/strong> As we discussed, they spread horizontally. Give them a &lt;strong>wide, shallow pot&lt;/strong> so they can send out their &amp;ldquo;runners&amp;rdquo; (the roots that make new plants).&lt;/li>
&lt;li>&lt;strong>Tomatoes:&lt;/strong> They have deep roots. They need a &lt;strong>deep pot&lt;/strong> (at least 10–20 liters for one plant) or they will get &amp;ldquo;root-bound&amp;rdquo; and stay small.&lt;/li>
&lt;/ul>
&lt;ol start="5">
&lt;li>Pollination (The &amp;ldquo;Birds and Bees&amp;rdquo;)&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>Inside:&lt;/strong> If your tomatoes stay on a windowsill behind glass, there are no bees to shake the flowers.&lt;/li>
&lt;li>&lt;strong>The Trick:&lt;/strong> When you see yellow flowers on your tomato plant, give the stem a &lt;strong>gentle wiggle&lt;/strong> every morning. This mimics the wind and helps the pollen fall so the fruit can grow.&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Factor&lt;/th>
&lt;th style="text-align:left">What to check&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Temperature&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Is it at least $15\text{&amp;ndash;}20\text{°C}$ for the seeds to wake up?&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Air&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Are the plants crowded? Can a breeze reach the stems?&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Food&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Does the soil have nutrients, or is it just old dirt?&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Space&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Is the pot big enough for the roots to grow?&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Drainage&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Does the pot have holes at the bottom? (Crucial!)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>If tech is going to blow&lt;/p>
&lt;p>I mean, if you are one of those who actually do sth with information like the software MDD&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/MZTt8ICeF0Y" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h3>Growth Experiment&lt;span class="absolute -mt-20" id="growth-experiment">&lt;/span>
&lt;a href="#growth-experiment" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Why not trying sth in the real world (IRL)?&lt;/p>
&lt;ol>
&lt;li>After 7 days from planting the tomato seeds, the first small green forms started to appear&lt;/li>
&lt;/ol>
&lt;p>I made A/B testing, ofc and place x6 buckets without plastic coverage and one with - the first seeds going out were the latter&lt;/p>
&lt;p>The temperature at night dropped at ~15C and during peak I saw 35C (they are growing next to a Window glass)&lt;/p>
&lt;ol start="2">
&lt;li>
&lt;p>The mint seeds took ~14 days to appear&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Mieta piep. took ~21 days to appear&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>In the meantime, some tomatoes had several leaves already&lt;/p>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>You’ve essentially bought a &amp;ldquo;Relaxation and Refreshment&amp;rdquo; starter kit.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Plant&lt;/th>
&lt;th style="text-align:left">Best Use&lt;/th>
&lt;th style="text-align:left">Sunlight&lt;/th>
&lt;th style="text-align:left">Pot or Ground?&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Tomato&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Eating / Salads&lt;/td>
&lt;td style="text-align:left">Full Sun&lt;/td>
&lt;td style="text-align:left">Either (needs space)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Melisa&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Sleep / Relaxation&lt;/td>
&lt;td style="text-align:left">Sun or Part Shade&lt;/td>
&lt;td style="text-align:left">Either&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Mięta pieprzowa&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Digestion / Ice Tea&lt;/td>
&lt;td style="text-align:left">Part Shade&lt;/td>
&lt;td style="text-align:left">&lt;strong>Pot Only&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Mięta polej&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Insect Repellent&lt;/td>
&lt;td style="text-align:left">Full Sun&lt;/td>
&lt;td style="text-align:left">Pot&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Since you are in Poland, the timing for these is perfect as we head into spring.&lt;/p>
&lt;p>Here is a breakdown of what you have and how to handle them:&lt;/p>
&lt;h3>1. Tomato Seeds (&lt;strong>Pomidor&lt;/strong>)&lt;span class="absolute -mt-20" id="1-tomato-seeds-pomidor">&lt;/span>
&lt;a href="#1-tomato-seeds-pomidor" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Polish Name:&lt;/strong> &lt;em>Pomidor&lt;/em>&lt;/li>
&lt;li>&lt;strong>The Plan:&lt;/strong> These need to be started &lt;strong>indoors&lt;/strong> right now (March) in small pots or &amp;ldquo;multi-pots&amp;rdquo; on a sunny windowsill. They love heat and light.&lt;/li>
&lt;li>&lt;strong>Moving Day:&lt;/strong> Do not move them outside until &lt;strong>after May 15th&lt;/strong> (the &amp;ldquo;Ice Saints&amp;rdquo; or &lt;em>Zimni Ogrodnicy&lt;/em> in Poland), as a single night of frost will kill them.&lt;/li>
&lt;/ul>
&lt;h3>2. Lemon Balm (&lt;strong>Melisa lekarska&lt;/strong>)&lt;span class="absolute -mt-20" id="2-lemon-balm-melisa-lekarska">&lt;/span>
&lt;a href="#2-lemon-balm-melisa-lekarska" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Polish Name:&lt;/strong> &lt;em>Melisa lekarska&lt;/em>&lt;/li>
&lt;li>&lt;strong>The Vibe:&lt;/strong> This is the &amp;ldquo;calming&amp;rdquo; herb. If you have trouble sleeping or are stressed, a tea made from fresh Melisa leaves is magic.&lt;/li>
&lt;li>&lt;strong>Growing:&lt;/strong> It is very hardy. Once it grows in your garden, it will likely come back every year (it’s a perennial). It smells like sweet lemons when you rub the leaves.&lt;/li>
&lt;/ul>
&lt;h3>3. Peppermint (&lt;strong>Mięta pieprzowa&lt;/strong>)&lt;span class="absolute -mt-20" id="3-peppermint-mięta-pieprzowa">&lt;/span>
&lt;a href="#3-peppermint-mi%c4%99ta-pieprzowa" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Polish Name:&lt;/strong> &lt;em>Mięta pieprzowa&lt;/em>&lt;/li>
&lt;li>&lt;strong>The Vibe:&lt;/strong> This is the strong, &amp;ldquo;icy&amp;rdquo; mint. It has a high menthol content, making it perfect for stomach aches or a very cooling summer tea.&lt;/li>
&lt;li>&lt;strong>Warning:&lt;/strong> &lt;strong>Do not plant this directly in the ground&lt;/strong> unless you want your whole garden to be mint! It spreads through underground runners (roots) and is very aggressive. It’s best kept in a &lt;strong>pot&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;h3>4. Pennyroyal (&lt;strong>Mięta polej&lt;/strong>)&lt;span class="absolute -mt-20" id="4-pennyroyal-mięta-polej">&lt;/span>
&lt;a href="#4-pennyroyal-mi%c4%99ta-polej" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Polish Name:&lt;/strong> &lt;em>Mięta polej&lt;/em>&lt;/li>
&lt;li>&lt;strong>The Warning:&lt;/strong> &lt;strong>Be careful with this one!&lt;/strong> While it is a member of the mint family, it is much stronger and can be &lt;strong>toxic&lt;/strong> if consumed in large quantities.
&lt;ul>
&lt;li>&lt;strong>In English:&lt;/strong> It is called &lt;em>Pennyroyal&lt;/em>.&lt;/li>
&lt;li>&lt;strong>Usage:&lt;/strong> Historically, it was used to repel insects (fleas and mosquitoes). Most modern gardeners grow it for its scent or to keep bugs away, rather than for drinking. &lt;strong>I would stick to the Peppermint for your tea and use this one as a natural pest repellent in the garden.&lt;/strong>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3>A Quick Tip for Your Seeds&lt;span class="absolute -mt-20" id="a-quick-tip-for-your-seeds">&lt;/span>
&lt;a href="#a-quick-tip-for-your-seeds" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Since you have two types of mint and melisa (which all look similar when they are tiny sprouts), make sure to &lt;strong>label your pots&lt;/strong> immediately!&lt;/p>
&lt;p>It is very easy to mix them up until they grow their &amp;ldquo;true leaves.&amp;rdquo;&lt;/p>
&lt;p>Since you’ve just planted your seeds, the watering strategy changes as they grow.&lt;/p>
&lt;p>Right now, your main goal is to keep the soil moist without &amp;ldquo;drowning&amp;rdquo; the seeds or washing them away.&lt;/p>
&lt;h3>The Plan&lt;span class="absolute -mt-20" id="the-plan">&lt;/span>
&lt;a href="#the-plan" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Here is the plan for your &lt;strong>Tomatoes, Melisa, and Mints&lt;/strong>:&lt;/p>
&lt;h4>1. Phase One: The &amp;ldquo;Waiting for Sprouts&amp;rdquo; Stage&lt;span class="absolute -mt-20" id="1-phase-one-the-waiting-for-sprouts-stage">&lt;/span>
&lt;a href="#1-phase-one-the-waiting-for-sprouts-stage" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Until you see green peeking out of the soil, the seeds need &lt;strong>consistent humidity&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Method:&lt;/strong> Use a &lt;strong>spray bottle (mister)&lt;/strong>. Pouring water from a cup can bury the seeds too deep or wash them to the corner of the pot.&lt;/li>
&lt;li>&lt;strong>How much:&lt;/strong> Spray the surface whenever it looks light brown or dry. The soil should feel like a wrung-out sponge—moist, but not dripping.&lt;/li>
&lt;li>&lt;strong>The Trick:&lt;/strong> Cover your pots with clear plastic wrap or a plastic bag. This creates a &amp;ldquo;mini-greenhouse&amp;rdquo; that keeps the moisture in so you don&amp;rsquo;t have to water as often. Remove it the second you see a sprout!&lt;/li>
&lt;/ul>
&lt;h4>2. Phase Two: The Seedling Stage (Once they have leaves)&lt;span class="absolute -mt-20" id="2-phase-two-the-seedling-stage-once-they-have-leaves">&lt;/span>
&lt;a href="#2-phase-two-the-seedling-stage-once-they-have-leaves" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Once they are growing, they need &amp;ldquo;deeper&amp;rdquo; water to encourage roots to grow down.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>The Finger Test:&lt;/strong> Stick your fingertip into the soil (about 1 cm deep). If it feels dry, water. If it feels cold and damp, wait.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Bottom Watering:&lt;/strong> This is the best &amp;ldquo;pro&amp;rdquo; secret. Instead of watering from the top, put your pots in a tray with 2 cm of water.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Let them &amp;ldquo;drink&amp;rdquo; from the bottom for 15–30 minutes, then pour out the leftover water.&lt;/p>
&lt;p>This keeps the stems dry and prevents mold (especially for &lt;strong>Tomatoes&lt;/strong>).&lt;/p>
&lt;h4>3. Plant-Specific Tips&lt;span class="absolute -mt-20" id="3-plant-specific-tips">&lt;/span>
&lt;a href="#3-plant-specific-tips" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ul>
&lt;li>
&lt;p>&lt;strong>Tomatoes:&lt;/strong> They are thirsty! As they get bigger, they will need water almost every day, especially if they are in a sunny window.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Melisa &amp;amp; Peppermint:&lt;/strong> These love &amp;ldquo;damp feet.&amp;rdquo; They are less forgiving than tomatoes if the soil dries out completely. If they start to wilt (droop), give them water immediately and they usually &amp;ldquo;pop&amp;rdquo; back up in an hour.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Pennyroyal (Mięta polej):&lt;/strong> Similar to peppermint, keep it moist but make sure the pot has holes in the bottom so the water can drain.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3>What to avoid&lt;span class="absolute -mt-20" id="what-to-avoid">&lt;/span>
&lt;a href="#what-to-avoid" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Standing Water:&lt;/strong> Never let the pots sit in a tray of water all day.&lt;/li>
&lt;/ul>
&lt;p>This causes &amp;ldquo;root rot,&amp;rdquo; and the plant will turn yellow and die.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Cold Water:&lt;/strong> In Poland, tap water in March is freezing.&lt;/li>
&lt;/ul>
&lt;p>Let your watering can sit out for an hour to reach &lt;strong>room temperature&lt;/strong> so you don&amp;rsquo;t shock the &amp;ldquo;tropical&amp;rdquo; tomato seeds.&lt;/p>
&lt;p>The best time to water your plants is actually &lt;strong>in the morning&lt;/strong>.&lt;/p>
&lt;p>While many people think evening is better, morning is the &amp;ldquo;gold standard&amp;rdquo; for gardening.&lt;/p>
&lt;ol>
&lt;li>The Morning Advantage (Best Time)&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>Energy for the Day:&lt;/strong> Watering between &lt;strong>7:00 AM and 10:00 AM&lt;/strong> gives the plants a &amp;ldquo;drink&amp;rdquo; before the sun gets hot. This helps them stay hydrated while they are busy growing during the day.&lt;/li>
&lt;li>&lt;strong>Disease Prevention:&lt;/strong> If any water gets on the leaves, the morning sun will dry it off quickly. Fungi and molds love wet leaves in the dark, so morning watering keeps your &lt;strong>Tomatoes&lt;/strong> and &lt;strong>Mints&lt;/strong> healthy.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The Evening Option (Second Best)&lt;/li>
&lt;/ol>
&lt;p>If you are busy in the morning, the late afternoon or early evening is okay, but there is a catch:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Risk:&lt;/strong> In Poland’s cooler spring nights, if the soil and leaves stay soaking wet all night, you might see &amp;ldquo;damping off&amp;rdquo; (a fungus that kills baby seedlings) or white mold on the soil.&lt;/li>
&lt;li>&lt;strong>The Rule:&lt;/strong> If you water at night, try to water &lt;strong>only the soil&lt;/strong>, not the leaves.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Why You Should Avoid Midday&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>Evaporation:&lt;/strong> If you water at 1:00 PM when the sun is hitting your windowsill or garden, most of the water will evaporate before the roots can even grab it.&lt;/li>
&lt;li>&lt;strong>The &amp;ldquo;Magnifying Glass&amp;rdquo; Myth:&lt;/strong> While it&amp;rsquo;s rare for water droplets to actually &amp;ldquo;burn&amp;rdquo; leaves like a magnifying glass, it&amp;rsquo;s still a waste of water and can stress the plant&amp;rsquo;s temperature regulation.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Summary Table: When to Water?&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Time of Day&lt;/th>
&lt;th style="text-align:left">Rating&lt;/th>
&lt;th style="text-align:left">Reason&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Morning (7-10 AM)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">⭐⭐⭐⭐⭐&lt;/td>
&lt;td style="text-align:left">&lt;strong>Perfect.&lt;/strong> Best for growth and prevents mold.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Midday (12-3 PM)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">⭐&lt;/td>
&lt;td style="text-align:left">&lt;strong>Poor.&lt;/strong> Water evaporates too fast; wastes effort.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Evening (6-8 PM)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">⭐⭐⭐&lt;/td>
&lt;td style="text-align:left">&lt;strong>Okay.&lt;/strong> Good if you avoid getting the leaves wet.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Late Night&lt;/strong>&lt;/td>
&lt;td style="text-align:left">⭐⭐&lt;/td>
&lt;td style="text-align:left">&lt;strong>Risky.&lt;/strong> Soil stays cold and soggy too long.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3>&lt;strong>A Quick Tip for Your Pots:&lt;/strong>&lt;span class="absolute -mt-20" id="a-quick-tip-for-your-pots">&lt;/span>
&lt;a href="#a-quick-tip-for-your-pots" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Since you are growing &lt;strong>Tomatoes&lt;/strong> and &lt;strong>Mints&lt;/strong> in pots, they dry out much faster than plants in the ground.&lt;/p>
&lt;p>On a very hot day in May or June, you might actually need to water them &lt;strong>twice&lt;/strong>—once in the morning and once in the late afternoon.&lt;/p>
&lt;p>Since you&amp;rsquo;ve planted a mix of vegetables and herbs, you&amp;rsquo;ll notice they have different &amp;ldquo;wake-up&amp;rdquo; times.&lt;/p>
&lt;p>Some are like early birds, while others take their time to emerge.&lt;/p>
&lt;p>Here is the timeline of when you should see the first green sprouts (the &amp;ldquo;germination&amp;rdquo; period):&lt;/p>
&lt;h3>The Sprouting Timeline&lt;span class="absolute -mt-20" id="the-sprouting-timeline">&lt;/span>
&lt;a href="#the-sprouting-timeline" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Plant&lt;/th>
&lt;th style="text-align:left">Days to see Green&lt;/th>
&lt;th style="text-align:left">Growth Speed&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Tomatoes (Pomidory)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>5 – 10 days&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Fast! Once they start, they move.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Peppermint (Mięta)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>10 – 15 days&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Average. The seeds are tiny, so they look like moss at first.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Melisa (Lemon Balm)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>10 – 14 days&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Steady. It needs light to germinate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Pennyroyal (Mięta polej)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>10 – 21 days&lt;/strong>&lt;/td>
&lt;td style="text-align:left">The &amp;ldquo;Slowpoke.&amp;rdquo; It can take its time.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h3>Why the difference?&lt;span class="absolute -mt-20" id="why-the-difference">&lt;/span>
&lt;a href="#why-the-difference" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>
&lt;p>&lt;strong>Temperature is Key:&lt;/strong> Tomatoes are &amp;ldquo;tropical&amp;rdquo; at heart. If your room is warm ($21\text{&amp;ndash;}25\text{°C}$), they might pop up in just 5 days. If the room is cool, they might take 12.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Seed Size:&lt;/strong> Mint and Melisa seeds are like dust. Because they are so small, they don&amp;rsquo;t have much &amp;ldquo;fuel&amp;rdquo; inside, so they take a bit longer to build enough energy to push through the soil.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3>3 Signs to Watch For&lt;span class="absolute -mt-20" id="3-signs-to-watch-for">&lt;/span>
&lt;a href="#3-signs-to-watch-for" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>The &amp;ldquo;Loop&amp;rdquo;:&lt;/strong> Before the leaf appears, you&amp;rsquo;ll see a little green &amp;ldquo;hook&amp;rdquo; or &amp;ldquo;arch&amp;rdquo; pushing through the dirt. That’s the stem breaking the surface.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>The &amp;ldquo;Seed Leaves&amp;rdquo;:&lt;/strong> The first two leaves that appear are usually smooth and oval. These are &lt;strong>not&lt;/strong> the real leaves! They are called &lt;em>cotyledons&lt;/em>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>The &amp;ldquo;True Leaves&amp;rdquo;:&lt;/strong> About a week after the first sprout, you will see the &amp;ldquo;real&amp;rdquo; leaves that actually look like Mint or Tomato leaves.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>A &amp;ldquo;Pro&amp;rdquo; Tip for Your Melisa and Mint:&lt;/p>
&lt;p>These seeds are &lt;strong>very small&lt;/strong>, so if you buried them deep under a thick layer of soil, they might struggle to find the light.&lt;/p>
&lt;p>They only need a very thin &amp;ldquo;dusting&amp;rdquo; of soil over them—barely enough to cover them.&lt;/p>
&lt;p>&lt;strong>If you don&amp;rsquo;t see anything after 21 days&lt;/strong>, it usually means the soil was either too cold or the seeds were planted too deep.&lt;/p></description></item><item><title>From Repo Docs to Promo Video</title><link>https://JAlcocerT.github.io/JAlcocerT/oss-automatic-docs-and-tech-video/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/oss-automatic-docs-and-tech-video/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Last year &lt;a href="https://jalcocert.github.io/JAlcocerT/tech-for-podcast/" target="_blank" rel="noopener">here&lt;/a>&amp;hellip; I was working for some kind of project &lt;a href="https://jalcocert.github.io/JAlcocerT/selfhosted-apps-may-2025/#vibe-coded-project-docs" target="_blank" rel="noopener">to do automatic docs&lt;/a>&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>But models have improved a lot&lt;/p>
&lt;p>Specially: &lt;a href="https://www.anthropic.com/news/claude-opus-4-6" target="_blank" rel="noopener">Claude&amp;hellip;&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Copy your public key:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat ~/.ssh/id_ed25519.pub
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Copy the full output.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Add the key in GitLab:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Go to GitLab -&amp;gt; Preferences / Edit profile -&amp;gt; SSH Keys -&amp;gt; paste the key -&amp;gt; Add key.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ssh -T git@gitlab.com&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone git@gitlab.com:fossengineer1/fossengineerpapermod.git&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This started &lt;a href="https://github.com/JAlcocerT/FOSSEngineer_old" target="_blank" rel="noopener">long ago&lt;/a>&lt;/p>
&lt;h2>Extracting Repo Info&lt;span class="absolute -mt-20" id="extracting-repo-info">&lt;/span>
&lt;a href="#extracting-repo-info" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Previously I was using interesting workflows with scripts.&lt;/p>
&lt;p>Like I have at folders like &lt;code>Z_codex_posts&lt;/code> or &lt;code>Z_OpenAI_POSTS&lt;/code>.&lt;/p>
&lt;p>But&amp;hellip;&lt;/p>
&lt;p>agents are beyond that at this point&lt;/p>
&lt;h3>From Repo to Post&lt;span class="absolute -mt-20" id="from-repo-to-post">&lt;/span>
&lt;a href="#from-repo-to-post" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Lets go with an example?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/elduty/velomate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Ive already built an skill for this: &lt;code>foss-post&lt;/code>&lt;/p>
&lt;p>Because thats really all there is: &lt;a href="https://skills.sh/" target="_blank" rel="noopener">https://skills.sh/&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>Skills are reusable capabilities for AI agents. Install them with a single command to enhance your agents with &lt;strong>access to procedural knowledge&lt;/strong>.&lt;/p>
&lt;/blockquote>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx skills add https://github.com/github/awesome-copilot --skill documentation-writer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/foss-post /home/jalcocert/Desktop/TBT/velomate --depth medium&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/memes/trol-trol.gif" alt="Meme - Fantastic" loading="lazy" />&lt;/p>
&lt;blockquote>
&lt;p>You can also see other that &lt;a href="https://skills.sh/github/awesome-copilot/documentation-writer" target="_blank" rel="noopener">people created&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;h3>From Repo to Video&lt;span class="absolute -mt-20" id="from-repo-to-video">&lt;/span>
&lt;a href="#from-repo-to-video" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>How about&amp;hellip;creating/combining another skills, so that we do video?&lt;/p>
&lt;p>Yea, remotion again:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>About FOSS - Repo to Video&lt;span class="absolute -mt-20" id="about-foss---repo-to-video">&lt;/span>
&lt;a href="#about-foss---repo-to-video" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>What if for every cool repo not only a nice post could be generated:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/davidmonterocrespo24/velxio ./Desktop/TBT&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude &lt;span class="c1">#/skills #use the foss-post against the cloned repo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp /home/jalcocert/Desktop/TBT/velxio-post.md
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /home/jalcocert/Desktop/fossengineerpapermod/content/posts&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/velxio/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Velxio | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>But also a nice RemotionJS video about it?&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.remotion.dev/docs/ai/claude-code" target="_blank" rel="noopener">https://www.remotion.dev/docs/ai/claude-code&lt;/a>&lt;/li>
&lt;li>Source: &lt;a href="https://github.com/remotion-dev/skills.git" target="_blank" rel="noopener">https://github.com/remotion-dev/skills.git&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>If you do the: &lt;em>make sure to do it on a folder w/o git, or it wont prompt you for the add skills part and avoid creating a totally blank folder!&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npx create-video@latest &lt;span class="c1">#y / blank&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./my-remotion-video
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run dev &lt;span class="c1">#now it works!&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mv /home/jalcocert/Desktop/video-test-remotion /home/jalcocert/Desktop/fossengineerpapermod/z-remotion-oss/video-test-remotion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#/home/jalcocert/Desktop/VideoEditingRemotion/remotion-cc/.claude/skills/remotion-best-practices&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./z-remotion-oss/video-test-remotion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run dev&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl"> ok so inside that video-test-remotion, can we make a video that describes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> what velxio does, using the UI/X of its components or any png that they
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> have at the repository? the video should be appealing for selfhosting
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> enthusiast&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npx remotion render VelxioShowcase selfhosting-velxio.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!--
https://youtu.be/H5Q6fQyPptE
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/H5Q6fQyPptE" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;blockquote>
&lt;p>All powered by ,just&amp;rsquo; Haiku 4.5&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>This is the kind of post that makes me realize this year ill be doing 99 posts&amp;hellip;instead of the much less planned.&lt;/p>
&lt;p>Talking about f/oss I tested mac OS with Zed and CodeEdit&lt;/p>
&lt;p>Interestingly, there is a fork of zed called GRAM that &lt;a href="#what-ive-tried-recently" >has been quite interesting&lt;/a>.&lt;/p>
&lt;h3>Other High Signal Videos&lt;span class="absolute -mt-20" id="other-high-signal-videos">&lt;/span>
&lt;a href="#other-high-signal-videos" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Ive been tinkering around these too:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/DataInMotion" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
DataInMotion | Repo&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/VideoEditingRemotion" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Remotion tests | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;p>Has this signal make F1 re-think their strategy and make v8&amp;rsquo;s come back?&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/ai-scripts-and-animated-data/" target="_blank" rel="noreferrer">&lt;img
alt="A Summary of Animations"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/karting/long_g_trace_L4.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">A Summary of Animations&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Post with animated F1, Real Estate, yfinance&amp;hellip;&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/f1-data-animated/" target="_blank" rel="noreferrer">&lt;img
alt="F1 Animated Data"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/karting/long_g_trace_L4.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">F1 Animated Data&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Creating animations around F1 Data | Post&lt;/div>&lt;/a>
&lt;/div>
&lt;h3>Marketing Videos for your Services&lt;span class="absolute -mt-20" id="marketing-videos-for-your-services">&lt;/span>
&lt;a href="#marketing-videos-for-your-services" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>If all previous is true&amp;hellip;&lt;/p>
&lt;p>Why not&amp;hellip;&amp;hellip;&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://github.com/vercel-labs/just-bash&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm i -g @openai/codex &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/jalcocertech-services &lt;span class="c1">#sales pitch&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Coming soon, together with &lt;code>https://stitch.withgoogle.com/&lt;/code>&lt;/p>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>CLIs ive used recently?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker images --format &amp;#34;table {{.Repository}}\t{{.Tag}}\t{{.Size}}&amp;#34; | (read -r; printf &amp;#34;%s\n&amp;#34; &amp;#34;$REPLY&amp;#34;; sort -hk 3 -r)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lazydocker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps --filter &amp;#34;status=running&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps -a --filter &amp;#34;name=entre&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker stats home-assistant&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker system df
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">glances &lt;span class="c1">#htop btop&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo snap install ghostty --classic&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux #ghostty&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>To clean space:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">sudo apt-get clean
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get autoremove
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">journalctl --disk-usage &lt;span class="c1">#sudo du -sh /var/log&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo journalctl --vacuum-time=2d&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Lack of disk space?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">sudo apt update &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo apt install ncdu
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo ncdu -x /&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo ncdu -x .&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/selfh/HomeLab/ncdu-nextcloud.png" alt="NCDU tool to check disk space" loading="lazy" />&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-13">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#whois ebooks.jalcocertech.com| grep -i -E &amp;#34;(creation|created|registered)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nslookup ebooks.jalcocertech.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dig ebooks.jalcocertech.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo docker stop 1tonebooksprod grafana-server&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker rm -f $(docker ps -aq --filter &amp;#34;name=entre&amp;#34;)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-13"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>What ive tried recently&lt;span class="absolute -mt-20" id="what-ive-tried-recently">&lt;/span>
&lt;a href="#what-ive-tried-recently" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>What else am I running &lt;a href="https://jalcocert.github.io/JAlcocerT/private-dns-with-docker/#faq" target="_blank" rel="noopener">since last month&lt;/a>?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-14">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/Home-Lab/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./Home-Lab/z-homelab-setup/evolution &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker ps --filter &amp;#34;status=running&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo docker compose -f 2604_docker-compose.yml up -d uptime....pihole nextcloud ncdb.......&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-14"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>More with the &lt;a href="https://jalcocert.github.io/JAlcocerT/cad-design-mbsd/#rendering-on-a-mac-m2" target="_blank" rel="noopener">mac M2&lt;/a> and&amp;hellip;&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-15">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo snap install ghostty --classic&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ghostty
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#codeedit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#zed #gram #https://codeberg.org/GramEditor/gram&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#glances&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-15"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/Termix" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Termix with Docker 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>Which reminds me somehow to tmux &lt;em>the one I used &lt;a href="https://jalcocert.github.io/JAlcocerT/about-constrained-mechanism/" target="_blank" rel="noopener">here with blender&lt;/a> and my x300&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-16">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#brew install ffmpeg #you didnt know you need FFMPEG, but you DO NEED IT&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">brew install gh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#gh auth login&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#gh auth status&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/3Design
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./3Design/mbsd-to-render/four-bar
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make check &lt;span class="c1">#make help&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make scene-ui #this starts blender UI&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">time&lt;/span> make all &lt;span class="c1">#makes all the steps, including the render programatically!&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make render #or do this one for just the render of the scene-ui was OK&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux new-session -d -s cad &amp;#34;make all&amp;#34; #if you will be leaving this for the night&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux attach-session -t cad #to see hows going&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-16"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Wait&amp;hellip;.56 seconds to render?&lt;/p>
&lt;p>On &lt;strong>battery power&lt;/strong>?!&lt;/p>
&lt;p>My 5600G was taking like&amp;hellip;10 min?!&lt;/p>
&lt;p>that was for 1080p, so i went ahead and made it &lt;strong>harder&lt;/strong>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-17">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> four-bar-mac
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make clean-all
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make install &lt;span class="nv">UV_PYTHON&lt;/span>&lt;span class="o">=&lt;/span>3.12
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">.venv/bin.python --version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make scene-ui&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">time&lt;/span> make render all&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-17"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Say thx to pairdrop, see the difference&lt;/p>
&lt;!-- https://youtu.be/r0eg5onWbn0 -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/r0eg5onWbn0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Oh the time for &lt;strong>4K with final presets&lt;/strong>?&lt;/p>
&lt;p>This was 26min at the M2 and I did not dare to try it with my x13 nor the x300.&lt;/p></description></item><item><title>Ryze Robotics Dron and Python SDK</title><link>https://JAlcocerT.github.io/JAlcocerT/dji-tello-python-sdk/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/dji-tello-python-sdk/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>More tinkering the real world.&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>As software is cheap, if plants are not for you&lt;/p>
&lt;p>maybe drones/electronic/robotics are?&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/electronics-101" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Electronics 101 | Repo&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/dron" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Dron | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;h3>Claude x Python&lt;span class="absolute -mt-20" id="claude-x-python">&lt;/span>
&lt;a href="#claude-x-python" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>This is all it takes recently:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/raspberry-pi-camera-setup/" target="_blank" rel="noreferrer">&lt;img
alt="Pi Camera"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/iot/pi-cam.jpg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Pi Camera&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Try OpenCV and yolov8 with the Pi!&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/dji-tello-python-programming/#how-to-control-dji-tello-with-python" target="_blank" rel="noreferrer">&lt;img
alt="DJi Tello 101"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/hardware/wifi_eth.jpg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DJi Tello 101&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Get started with a cheap toy dron.&lt;/div>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">sometime ago i was using python to control my dji tello dron, do you understand the logic i built? create a wiki.md with ur understanding&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>I also extracted the documentation for claude:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">uv init
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv add kreuzberg&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You can skip Kreuzberg container, just:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> f in Chapter*.pdf&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> uvx kreuzberg extract &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &amp;gt; &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">f&lt;/span>&lt;span class="p">%.pdf&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">.txt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Once the context is ready, its about creating a &lt;code>FRD.md&lt;/code> and let CC split the work in few phases:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">uv run main.py&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This is all based on OSS libraries, so you wont need ever again the official app which is no longer in the google play store.&lt;/p>
&lt;h4>Computer Vision&lt;span class="absolute -mt-20" id="computer-vision">&lt;/span>
&lt;a href="#computer-vision" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>After a quick test, I thought about adding face detection capabilities:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">uv run face_detection_poc.py&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Same thing we learnt with the pi, using the CV2 library (executed at your laptop, not the dron)&lt;/p>
&lt;p>Its just the same ppl take this to the next level&lt;/p>
&lt;p>see this video &amp;lsquo;pre-ai&amp;rsquo;&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=LmEcyQnfpDA -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/LmEcyQnfpDA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;ul>
&lt;li>&lt;a href="https://github.com/murtazahassan/OpenCV-Python-Tutorials-and-Projects" target="_blank" rel="noopener">https://github.com/murtazahassan/OpenCV-Python-Tutorials-and-Projects&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://github.com/murtazahassan/Drone-Face-Tracking/tree/master" target="_blank" rel="noopener">https://github.com/murtazahassan/Drone-Face-Tracking/tree/master&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/murtazahassan/Tello-Object-Tracking" target="_blank" rel="noopener">https://github.com/murtazahassan/Tello-Object-Tracking&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h4>About PySymverse&lt;span class="absolute -mt-20" id="about-pysymverse">&lt;/span>
&lt;a href="#about-pysymverse" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>From the same channel, i got to know about: &lt;a href="https://pypi.org/project/pysimverse/" target="_blank" rel="noopener">https://pypi.org/project/pysimverse/&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>From scripts to the Sky (if you have an account)&lt;/p>
&lt;/blockquote>
&lt;!-- https://www.youtube.com/watch?v=VBamzxfYHgA -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/VBamzxfYHgA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/hedBZ_ViAGo" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/dFudZiQ5ocY" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://www.youtube.com/watch?v=hedBZ_ViAGo
https://www.youtube.com/watch?v=dFudZiQ5ocY -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/v5a7pKSOJd8" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://www.youtube.com/watch?v=v5a7pKSOJd8 -->
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Wouldnt it be nice to do a come back to electrical engineering?&lt;/p>
&lt;p>The level of abstraction that there is in such a drone so that by pressing one key, that goes to one command and goes to&amp;hellip;somewhere&lt;/p>
&lt;p>and that somewhere makes the motors do something in particular to rotate, acelerate&amp;hellip;&lt;/p>
&lt;p>Not gonna lie to you&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">i have a dji tello dron and succesfully got a python script that uses its SDK to control it. Here is the python code and the documentation I used to do so. The android official apps is no longer valid, so i want to use flutter to build a crossplatform one that does precisely what my python script does. Can we do a flutter-version.md with all the features and clarifications?&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. Verify you&amp;#39;re on Tello&amp;#39;s Wi-Fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">iwconfig &lt;span class="c1"># or check Network settings&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. Ping the drone&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ping 192.168.10.1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Test with netcat (simple UDP)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> -n &lt;span class="s2">&amp;#34;command&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> nc -u -w1 192.168.10.1 &lt;span class="m">8889&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;a href="#tello-x-flutter" >This&lt;/a> is happening already&amp;hellip;&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">sudo snap install flutter --clasic
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git init &amp;amp;&amp;amp; git add . &amp;amp;&amp;amp; git commit -m &amp;#34;Initial commit: Starting flutter dji tello dron&amp;#34; &amp;amp;&amp;amp; gh repo create dron-tello-flutter --private --source=. --remote=origin --push&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv init&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv add -r requirements.txt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv sync&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd sample-pyscipe&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run main.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make run #requires .env.local&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git remote set-url origin git@gitlab.com:fossengineer1/dron.git&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git push&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://youtube.com/shorts/XNG57Co1lXA -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/XNG57Co1lXA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h3>What I learnt&lt;span class="absolute -mt-20" id="what-i-learnt">&lt;/span>
&lt;a href="#what-i-learnt" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Want this DFY?&lt;/p>
&lt;p>&lt;del>f* off&lt;/del>&lt;/p>
&lt;pre class="mermaid mt-6">flowchart LR
%% --- Styles ---
classDef free fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20;
classDef low fill:#FFF9C4,stroke:#FBC02D,stroke-width:2px,color:#F57F17;
classDef mid fill:#FFE0B2,stroke:#F57C00,stroke-width:2px,color:#E65100;
classDef high fill:#FFCDD2,stroke:#C62828,stroke-width:2px,color:#B71C1C;
%% --- Nodes ---
L1("Free Content&lt;br/>(Blog/YT $0)"):::free
L2("DIY&lt;br/>(Templates / Platform) $"):::low
L3("Done With You&lt;br/>(Consulting) $$"):::mid
L4("Done For You&lt;br/>(Services) $$$"):::high
%% --- Connections ---
L1 --> L2
L2 --> L3
L3 --> L4&lt;/pre>&lt;p>I mean, here you go:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Get some of my time ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://cal.com/jalcocertech/consulting" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/>&lt;/svg>Collaborations ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Tello x Flutter&lt;span class="absolute -mt-20" id="tello-x-flutter">&lt;/span>
&lt;a href="#tello-x-flutter" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I got some problems with the connection to the tello.&lt;/p>
&lt;p>CC went to the route of we&amp;rsquo;re using dart:io&amp;rsquo;s built-in RawDatagramSocket, but some how was not getting there.&lt;/p>
&lt;p>So went out and look for existing projects:&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://github.com/mateustoin/Flutter-app-DJI-Tello-Drone/tree/main" target="_blank" rel="noopener">https://github.com/mateustoin/Flutter-app-DJI-Tello-Drone/tree/main&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>Cool! but it has 6yo and depends on &lt;a href="https://pub.dev/packages/tello/versions" target="_blank" rel="noopener">https://pub.dev/packages/tello/versions&lt;/a> which is Dart3 incompatible.&lt;/p>
&lt;p>next&lt;/p>
&lt;ol start="2">
&lt;li>&lt;a href="https://pub.dev/packages/udp/versions" target="_blank" rel="noopener">https://pub.dev/packages/udp/versions&lt;/a> that does not shows incompatibilities&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ping 192.168.10.1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">flutter run -d linux&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/flutter-dron.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;blockquote>
&lt;p>This is the one, btw :)&lt;/p>
&lt;/blockquote>
&lt;ol start="3">
&lt;li>&lt;a href="https://pub.dev/packages/ryze_tello" target="_blank" rel="noopener">https://pub.dev/packages/ryze_tello&lt;/a> with 5yo and &lt;em>also in theory&lt;/em>, no incompatibilities&lt;/li>
&lt;/ol>
&lt;h3>Whats ArduPilot?&lt;span class="absolute -mt-20" id="whats-ardupilot">&lt;/span>
&lt;a href="#whats-ardupilot" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>ArduPilot is an open-source autopilot system for vehicles like:&lt;/p>
&lt;ul>
&lt;li>drones&lt;/li>
&lt;li>planes&lt;/li>
&lt;li>helicopters&lt;/li>
&lt;li>rovers&lt;/li>
&lt;li>boats&lt;/li>
&lt;li>submarines&lt;/li>
&lt;/ul>
&lt;p>It is both:&lt;/p>
&lt;ul>
&lt;li>software: the flight/control stack that runs on the vehicle&lt;/li>
&lt;li>ecosystem: firmware, ground control tools, hardware support, simulation, and documentation&lt;/li>
&lt;/ul>
&lt;p>What it does:&lt;/p>
&lt;ul>
&lt;li>stabilizes and flies the vehicle&lt;/li>
&lt;li>handles GPS navigation and waypoint missions&lt;/li>
&lt;li>supports telemetry, failsafes, return-to-home, geofencing&lt;/li>
&lt;li>integrates sensors like GPS, IMU, compass, barometer, lidar, cameras, etc.&lt;/li>
&lt;/ul>
&lt;p>Typical setup:&lt;/p>
&lt;ul>
&lt;li>flight controller hardware running ArduPilot firmware&lt;/li>
&lt;li>a ground station such as Mission Planner or QGroundControl&lt;/li>
&lt;li>optional radio/telemetry link, RC transmitter, GPS, companion computer&lt;/li>
&lt;/ul>
&lt;p>In practice, people use it for:&lt;/p>
&lt;ul>
&lt;li>hobby drones&lt;/li>
&lt;li>research robots&lt;/li>
&lt;li>industrial UAVs&lt;/li>
&lt;li>autonomous boats and ground vehicles&lt;/li>
&lt;/ul>
&lt;h3>Software for Drones&lt;span class="absolute -mt-20" id="software-for-drones">&lt;/span>
&lt;a href="#software-for-drones" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://github.com/arpanghosh8453/open-dronelog" target="_blank" rel="noopener">https://github.com/arpanghosh8453/open-dronelog&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Drone Log analyzer: A high-performance universal dashboard application for organizing and analyzing DJI/Litchi flight logs privately in one place. Built with &lt;strong>Tauri v2, DuckDB, and React&lt;/strong>.&lt;/p>
&lt;/blockquote>
&lt;h3>About computer vision&lt;span class="absolute -mt-20" id="about-computer-vision">&lt;/span>
&lt;a href="#about-computer-vision" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>If OpenCV is the heavy-duty engine, CVZone is the ergonomic dashboard and steering wheel that makes it much easier to drive.&lt;/p>
&lt;ol>
&lt;li>What is CVZone?&lt;/li>
&lt;/ol>
&lt;p>CVZone is a high-level Python package designed to make computer vision tasks—like hand tracking, face detection, and object tracking—accessible with just a few lines of code.&lt;/p>
&lt;p>It was created largely by Murtaza Hassan (Computer Vision Zone) to simplify the often complex boilerplate code required by standard libraries.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Core Logic:&lt;/strong> It is built on top of &lt;strong>OpenCV&lt;/strong> (for image processing) and &lt;strong>Mediapipe&lt;/strong> (for high-performance AI tracking).&lt;/li>
&lt;li>&lt;strong>Key Features:&lt;/strong> It includes &amp;ldquo;ready-to-use&amp;rdquo; modules for:
&lt;ul>
&lt;li>&lt;strong>Hand Tracking:&lt;/strong> Finding 21 landmarks on a hand and detecting gestures.&lt;/li>
&lt;li>&lt;strong>Face Detection &amp;amp; Mesh:&lt;/strong> Real-time facial landmark mapping.&lt;/li>
&lt;li>&lt;strong>Pose Estimation:&lt;/strong> Tracking body joints for fitness or motion apps.&lt;/li>
&lt;li>&lt;strong>Utilities:&lt;/strong> Easy functions for drawing styled rectangles, putting text on screen, or stacking multiple images together.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Does it relate with &lt;code>cv2&lt;/code> (OpenCV)?&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Yes, they are best friends.&lt;/strong> CVZone does not replace &lt;code>cv2&lt;/code>; it &lt;strong>complements&lt;/strong> it. In a typical script, you will import both. CVZone takes the &amp;ldquo;raw&amp;rdquo; outputs from OpenCV or Mediapipe and handles the math and drawing for you.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Example Comparison:&lt;/strong> * To draw a &amp;ldquo;fancy&amp;rdquo; cornered rectangle in standard &lt;code>cv2&lt;/code>, you might need 10+ lines of &lt;code>cv2.line()&lt;/code> calls.
&lt;ul>
&lt;li>In &lt;code>cvzone&lt;/code>, you simply call &lt;code>cvzone.cornerRect(img, bbox)&lt;/code>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;strong>The Flow:&lt;/strong> You use &lt;code>cv2&lt;/code> to capture your webcam feed and display the window, but you use &lt;code>cvzone&lt;/code> to process the AI logic and draw the overlays.&lt;/p>
&lt;/blockquote>
&lt;ol start="3">
&lt;li>Open-Source Models (The &amp;ldquo;Heavy Hitters&amp;rdquo; of 2026)&lt;/li>
&lt;/ol>
&lt;p>If you want to move beyond the basic tracking in CVZone, here are the top open-source models currently dominating the field:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Model Category&lt;/th>
&lt;th style="text-align:left">Top Open-Source Recommendation&lt;/th>
&lt;th style="text-align:left">Best For&amp;hellip;&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Object Detection&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>YOLOv11&lt;/strong> (Ultralytics)&lt;/td>
&lt;td style="text-align:left">Lightning-fast detection of 80+ types of objects.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Segmentation&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>SAM 2&lt;/strong> (Segment Anything)&lt;/td>
&lt;td style="text-align:left">&amp;ldquo;Click-to-cutout&amp;rdquo; any object in a video or image.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Face Recognition&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>DeepFace&lt;/strong> / &lt;strong>InsightFace&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Identifying specific individuals, not just finding &amp;ldquo;a face.&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Multimodal&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Qwen2.5-VL&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Models that can &amp;ldquo;see&amp;rdquo; and then &amp;ldquo;talk&amp;rdquo; about what they see in detail.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Hand/Face/Body&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Mediapipe&lt;/strong> (The engine of CVZone)&lt;/td>
&lt;td style="text-align:left">Low-latency tracking that runs perfectly on CPUs/Mobile.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Which should you choose?&lt;/p>
&lt;ul>
&lt;li>&lt;strong>For Beginners:&lt;/strong> Stick with &lt;strong>CVZone&lt;/strong>. It abstracts the scary math and lets you build projects like &amp;ldquo;Virtual Paint&amp;rdquo; or &amp;ldquo;Gesture Volume Control&amp;rdquo; in an afternoon.&lt;/li>
&lt;li>&lt;strong>For Professional Apps:&lt;/strong> Use &lt;strong>YOLOv11&lt;/strong> or &lt;strong>SAM 2&lt;/strong> directly. They offer more precision and are the industry standards for tasks like self-driving car logic or medical imaging.&lt;/li>
&lt;/ul></description></item><item><title>Electronics 101</title><link>https://JAlcocerT.github.io/JAlcocerT/electronics-101/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/electronics-101/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Prep-work for watering plants :)&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>You might have tinkered with IoT&lt;/p>
&lt;p>But without really understanding the under lying layer.&lt;/p>
&lt;p>This sits on top of Electromagnetism, yet below IoT and &lt;a href="https://jalcocert.github.io/JAlcocerT/messaging-protocols/" target="_blank" rel="noopener">messaging protocols&lt;/a>.&lt;/p>
&lt;h2>Circuit Boards Design&lt;span class="absolute -mt-20" id="circuit-boards-design">&lt;/span>
&lt;a href="#circuit-boards-design" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Everything is&amp;hellip;&lt;a href="https://jalcocert.github.io/JAlcocerT/things-as-a-code/" target="_blank" rel="noopener">code&lt;/a>.&lt;/p>
&lt;p>Same applies to circuit boards:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/atopile/atopile" target="_blank" rel="noopener">https://github.com/atopile/atopile&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;strong>MIT | Design circuit boards with code&lt;/strong>! ✨ Get software-like design reuse 🚀, validation, version control and collaboration in hardware; starting with electronics ⚡️&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>Write hardware like software. atopile is a language, compiler, and toolchain for electronics—declarative .ato files, deep validation, and layout that &lt;strong>works natively with KiCad&lt;/strong>.&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;h2>A come back to electronics&lt;span class="absolute -mt-20" id="a-come-back-to-electronics">&lt;/span>
&lt;a href="#a-come-back-to-electronics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>After drafting &lt;a href="https://github.com/JAlcocerT/electronics-101/blob/master/z-ideas.md" target="_blank" rel="noopener">several ideas around electronics&lt;/a>, I made some samples with simulations and understanding.md to &lt;a href="https://github.com/JAlcocerT/electronics-101/tree/master/samples-confidence" target="_blank" rel="noopener">get the confidence back&lt;/a>&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/electronics-101/tree/master" target="_blank" rel="noreferrer">&lt;img
alt="NEW - electronics 101"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">NEW - electronics 101&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Electornics as a code with python- Source Code on Github&lt;/div>&lt;/a>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>So&amp;hellip;mbsd is code, CAD and blender renders are code:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/electronics-101" target="_blank" rel="noreferrer">&lt;img
alt="Electronics"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Electronics&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">IoT and electronics projects&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/3Design" target="_blank" rel="noreferrer">&lt;img
alt="3D Design Repo"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">3D Design Repo&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Blender, CadQuery&amp;hellip;&lt;/div>&lt;/a>
&lt;/div>
&lt;p>Electronics board design&amp;hellip;yep, also code from now on.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git init &amp;amp;&amp;amp; git add . &amp;amp;&amp;amp; git commit -m &amp;#34;Initial commit: Starting electronics 101&amp;#34; &amp;amp;&amp;amp; gh repo create electronics-101 --private --source=. --remote=origin --push&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv init&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv add -r requirements.txt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv sync&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd sample-pyscipe&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run main.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make run #requires .env.local&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You know whats coming&lt;/p>
&lt;p>right?&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/electronic/esp32-pump-plants.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Wait&amp;hellip;if this is code&amp;hellip;can it be &lt;a href="https://jalcocert.github.io/JAlcocerT/video-creation-with-remotion/" target="_blank" rel="noopener">animated with remotion&lt;/a>?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">In this folder i have added a pyscipe that simulates a particular circuit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (see the makefile entries), I have also added a video remotion folder, with
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> agents skills you can use. My idea is to generate a video animation of what
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> happens in that given circuit with the intensities and voltages. Do you need
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> to clarify sth? &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Ive dare to generate such &lt;strong>explanatory video&lt;/strong>: &lt;em>do you beliave you need that Diode now? :)&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone VideoEditingRemotion&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./remotion-electronics/my-video
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># npx remotion render MosfetProtected mosfet_protected.mp4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx remotion render MosfetUnprotected mosfet_unprotected.mp4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx remotion render SchematicKickback schematic_kickback.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/electronics-101" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Electronics 101 | Repo&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/VideoEditionRemorion" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Remotion x Video | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo apt update &amp;amp;&amp;amp; sudo apt install ffmpeg&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ls *.mp4 &lt;span class="p">|&lt;/span> sed &lt;span class="s2">&amp;#34;s/^/file &amp;#39;/; s/&lt;/span>$&lt;span class="s2">/&amp;#39;/&amp;#34;&lt;/span> &amp;gt; file_list.txt &lt;span class="c1">#add .mp4 of current folder to a list&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg -f concat -safe &lt;span class="m">0&lt;/span> -i file_list.txt -c copy output_video.mp4 &lt;span class="c1">#original audio&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Toy models can NOT predict.&lt;/p>
&lt;p>No model is perfect, reality is far to complex.&lt;/p>
&lt;p>Its just that some are based on garbage and produce (surprise) more non sense garbage.&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/JbixCdhRzDo" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>&lt;em>Why would someone pay you if you can just overfit past and give just a vague range of possibilities for the future?&lt;/em>&lt;/p>
&lt;p>&lt;em>Will the mosfet be fried, yes or no?&lt;/em>&lt;/p>
&lt;!-- https://youtu.be/JbixCdhRzDo -->
&lt;p>No more: will I get an unexpected quickback due to transitory behaviour?&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/dev/vibe-coding.png" alt="Vibe Coding - Simpsons Halloween S2" loading="lazy" />&lt;/p>
&lt;p>Just&amp;hellip;simulate: &lt;em>see thats going to happen, before it happens&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/electronics-101
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./electronics-101/sample-pyscipe&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run main.py --only mosfet --scenario compare &lt;span class="c1"># overlay: with vs without diode &lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>The Meta-Lesson&lt;span class="absolute -mt-20" id="the-meta-lesson">&lt;/span>
&lt;a href="#the-meta-lesson" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>All of these curiosities point to one theme:&lt;/p>
&lt;p>&lt;strong>Linear analysis predicts steady state. Nonlinearities dominate transients.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>The motor inrush looks linear for 100µs, then saturation takes over.&lt;/li>
&lt;li>The capacitor impedance is Ohmic for DC, but ESR-dominated for 150kHz ripple.&lt;/li>
&lt;li>The MOSFET is a resistor at steady state, but an avalanche diode in stress.&lt;/li>
&lt;li>The flyback diode&amp;rsquo;s nonlinearity is the only thing preventing the circuit from killing itself.&lt;/li>
&lt;/ul>
&lt;p>Real circuit design is about:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Identifying which nonlinearities matter&lt;/strong> (flyback diode → essential; parasitic R → helpful)&lt;/li>
&lt;li>&lt;strong>Ensuring they trigger safely&lt;/strong> (clamp at 12.7V, not 101.7V)&lt;/li>
&lt;li>&lt;strong>Controlling their speed&lt;/strong> (ESR damping, gate slew rate)&lt;/li>
&lt;li>&lt;strong>Testing edge cases&lt;/strong> (cold start, aged battery, old capacitors)&lt;/li>
&lt;/ol>
&lt;p>That&amp;rsquo;s why the simulations included these three scenarios: &lt;strong>protected&lt;/strong>, &lt;strong>unprotected&lt;/strong>, and &lt;strong>compare&lt;/strong>.&lt;/p>
&lt;p>The math alone doesn&amp;rsquo;t tell you the story.&lt;/p>
&lt;p>You have to see it.&lt;/p>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>About Electronical Simulations&lt;span class="absolute -mt-20" id="about-electronical-simulations">&lt;/span>
&lt;a href="#about-electronical-simulations" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Interesting &lt;a href="https://jalcocert.github.io/Linux/docs/debian/foss_engineering/" target="_blank" rel="noopener">engineering tools&lt;/a>:&lt;/p>
&lt;ol>
&lt;li>KiCad&lt;/li>
&lt;li>Atopile&lt;/li>
&lt;li>&lt;strong>PySpice&lt;/strong>: the discovery of today :)&lt;/li>
&lt;/ol>
&lt;p>To &lt;strong>simulate&lt;/strong> the behaviour of ESP32, picoW, even arduinos: &lt;a href="https://github.com/davidmonterocrespo24/velxio" target="_blank" rel="noopener">https://github.com/davidmonterocrespo24/velxio&lt;/a>&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/velxio/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Velxio | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;h3>Quick IoT Samples&lt;span class="absolute -mt-20" id="quick-iot-samples">&lt;/span>
&lt;a href="#quick-iot-samples" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
See &lt;strong>Cpp sample Codes&lt;/strong> for the ESP32 MicroController &lt;a href="https://github.com/JAlcocerT/RPi/tree/main/Z_MicroControllers/ESP32/esp32-c" target="_blank" rel="noopener">here&lt;/a> and for the &lt;a href="https://github.com/JAlcocerT/RPi/tree/main/Z_MicroControllers/RPiPicoW" target="_blank" rel="noopener">PicoW here&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/RPi
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./RPi/Z_MicroControllers&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>With &lt;a href="https://jalcocert.github.io/JAlcocerT/pico-w/#raspberry-pi-pico-w" target="_blank" rel="noopener">the PicoW&lt;/a>&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/RPi/blob/main/Z_MicroControllers/RPiPicoW/MQTT-InternalTemp/main.py" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">PicoW &amp;#43; InternalTemp &amp;#43; Push to MQTT Topic 🐍 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/RPi/tree/main/Z_MicroControllers/RPiPicoW/MLX90614" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">PicoW &amp;#43; MLX906014 🐍 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./RPiPicoW/DHT22&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>For something more advance, see how the &lt;a href="https://jalcocert.github.io/JAlcocerT/messaging-protocols/#mqtt-x-picow-x-dht22" target="_blank" rel="noopener">PicoW can read and send DHT22 data via MQTT&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ..&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./MQTT-DHT22&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Remember about going to &lt;code>http://192.168.1.2:18083/#/clients&lt;/code> and later to &lt;code>http://192.168.1.2:18083/#/websocket&lt;/code> so you can subscribe, for example to &lt;code>pico/temperature/dht22&lt;/code> as explained with &lt;a href="https://jalcocert.github.io/JAlcocerT/messaging-protocols/#mqtt-x-picow-x-dht22" target="_blank" rel="noopener">details here&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./Home-Lab/emqx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker compose up -d&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Check if the container is running&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker ps &lt;span class="p">|&lt;/span> grep emqx
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Watch EMQX logs live&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker logs emqx -f&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>Connect to the UI via: &lt;code>http://192.168.1.11:18083&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;p>Or if you prefer a quick CLI way to check the pushed data:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">mosquitto_sub -h 192.168.1.2 -t &lt;span class="s2">&amp;#34;pico/#&amp;#34;&lt;/span> -v&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/RPi/tree/main/Z_MicroControllers/RPiPicoW/MQTT-DHT22" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">PicoW &amp;#43; DHT22 &amp;#43; MQTT 🐍 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/emqx" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">EMQX Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>With &lt;a href="https://jalcocert.github.io/JAlcocerT/microcontrollers-setup-101/#the-esp32" target="_blank" rel="noopener">the ESP32&lt;/a>: &lt;em>its very important to see which language was installed, as Thonny will just work with MicroPython!&lt;/em>&lt;/p>
&lt;p>*So go ahead and install &lt;a href="https://github.com/JAlcocerT/RPi/blob/main/Z_MicroControllers/ESP32/esp32-languages-ide.md" target="_blank" rel="noopener">arduinoIDE like so&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#choco install arduinoide&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#pnputil /enum-devices /class Ports&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/RPi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># cd ./RPi/Z_MicroControllers/ESP32/esp32-c&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Select &lt;del>&lt;code>ESP32-WROOM-DA&lt;/code>&lt;/del>* &lt;code>ESP32 Dev Module&lt;/code> + &lt;code>CTRL + U&lt;/code> to compile the sketch &lt;code>esp32-internal-temp-mqtt.cpp&lt;/code> into the board.&lt;/p>
&lt;blockquote>
&lt;p>I got a ESP32 DevKitV1 printed on the back of it, despite on the chip it says ESP32 wroom 32&lt;/p>
&lt;/blockquote>
&lt;p>See your &lt;strong>MQTT data flowing&lt;/strong> to the server:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">mosquitto_sub -h 192.168.1.2 -t &lt;span class="s2">&amp;#34;esp32/#&amp;#34;&lt;/span> -v &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/messaging-protocols/#mqtt" target="_blank" rel="noreferrer">&lt;img
alt="MQTT and Messaging Protocols"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/iot/mqttx-desktop.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">MQTT and Messaging Protocols&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Tools for MQTT - MQTTx Desktop&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/RPi/tree/main/Z_MicroControllers/" target="_blank" rel="noreferrer">&lt;img
alt="Micro-Controller Scripts"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Micro-Controller Scripts&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Source Code on Github inside the RPi repository.&lt;/div>&lt;/a>
&lt;/div>
&lt;p>To send DHT11 information via mqtt with the esp32, just: &lt;em>install &lt;code>Adafruit Unified Sensor&lt;/code> &amp;amp; &lt;code>DHT sensor library for ESPx&lt;/code> at arduino ide -&amp;gt; Tools -&amp;gt; Manage Libraries&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">mosquitto_sub -h 192.168.1.2 -t &lt;span class="s2">&amp;#34;esp32/#&amp;#34;&lt;/span> -v
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#mosquitto_sub -h 192.168.1.2 -t &amp;#34;esp32/temperature/dht11&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>After compiling and uploading this one, the data is flowing &lt;code>CTRL+shift+m&lt;/code>as expected :)&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Choice&lt;/th>
&lt;th style="text-align:left">GPIO Numbers&lt;/th>
&lt;th style="text-align:left">Why?&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Best&lt;/strong>&lt;/td>
&lt;td style="text-align:left">4, 14, 25, 26, 27, 32, 33&lt;/td>
&lt;td style="text-align:left">No special boot functions; very stable.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Okay&lt;/strong>&lt;/td>
&lt;td style="text-align:left">12, 13, 15&lt;/td>
&lt;td style="text-align:left">Strapping pins; might cause boot/flash issues.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Bad&lt;/strong>&lt;/td>
&lt;td style="text-align:left">34, 35, 36, 39&lt;/td>
&lt;td style="text-align:left">&lt;strong>Input only.&lt;/strong> Cannot trigger the DHT11.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Avoid&lt;/strong>&lt;/td>
&lt;td style="text-align:left">0, 1, 2, 3&lt;/td>
&lt;td style="text-align:left">Critical for booting and USB communication.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Made one upgrade to the &lt;a href="https://github.com/JAlcocerT/RPi/tree/main/Z_MicroControllers/dht-webapp" target="_blank" rel="noopener">simple dht webapp&lt;/a>, so that now it can plot both sensors:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-13">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># stop old sessions &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux kill-session -t mqtt &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux kill-session -t webapp &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># verify they&amp;#39;re gone &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux ls&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/RPi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git pull&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./RPi/Z_MicroControllers/dht-webapp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># tmux new-session -d -s mqtt &amp;#39;cd ~/dht-webapp &amp;amp;&amp;amp; uv run mqtt_to_db.py&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># tmux new-session -d -s webapp &amp;#39;cd ~/dht-webapp &amp;amp;&amp;amp; uv run uvicorn main:app --host &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 0.0.0.0 --port 8077&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s mqtt &lt;span class="s1">&amp;#39;uv run mqtt_to_db.py&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv run uvicorn main:app --host 0.0.0.0 --port 8077&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s webapp &lt;span class="s1">&amp;#39;uv run uvicorn main:app --host 0.0.0.0 --port 8077&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-13"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This will give you &lt;strong>the trend&lt;/strong> and the last value read in real time:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-14">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> -it timescaledb psql -U pico -d sensors -c &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="s2">&amp;#34;SELECT DISTINCT ON (topic)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> topic,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> ROUND(value::numeric, 2) AS value,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> ts
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> FROM readings
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> WHERE topic IN (
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#39;pico/temperature/dht22&amp;#39;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#39;pico/humidity/dht22&amp;#39;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#39;esp32/temperature/dht11&amp;#39;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#39;esp32/humidity/dht11&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> )
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> ORDER BY topic, ts DESC;&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-14"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>ESP32 vs PicoW Consumption&lt;span class="absolute -mt-20" id="esp32-vs-picow-consumption">&lt;/span>
&lt;a href="#esp32-vs-picow-consumption" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I could not avoid to make a quick experiment &lt;a href="https://jalcocert.github.io/JAlcocerT/microcontrollers-setup-101/#microcontroller-power-consumption" target="_blank" rel="noopener">around power consumption&lt;/a>.&lt;/p>
&lt;p>How long would each of these micocontrollers be sending data via MQTT before consuming the same battery?&lt;/p>
&lt;p>In theory, the a &lt;a href="https://github.com/JAlcocerT/RPi/blob/main/Z_MicroControllers/RPiPicoW/MQTT-DHT22/picow-consumption.md" target="_blank" rel="noopener">PicoW should be the winner&lt;/a>.&lt;/p>
&lt;p>The Pico W is roughly 2× more &lt;a href="https://github.com/JAlcocerT/RPi/blob/main/Z_MicroControllers/ESP32/esp32-c/esp32-consumption.md" target="_blank" rel="noopener">efficient than the ESP32&lt;/a> on the same battery — mainly because its WiFi chip (CYW43439) draws less than the ESP32&amp;rsquo;s radio at idle.&lt;/p>
&lt;p>The DHT11/22 itself contributes almost nothing to consumption.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-15">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker exec -it timescaledb psql -U pico -d sensors -c &amp;#34;SELECT DISTINCT topic FROM readings LIMIT 10;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> -it timescaledb psql -U pico -d sensors -c &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="s2">&amp;#34;SELECT time_bucket(&amp;#39;1 hour&amp;#39;, ts) AS hour, AVG(value) FROM readings WHERE topic =
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#39;pico/temperature/dht22&amp;#39; GROUP BY hour ORDER BY hour DESC LIMIT 24;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> -it timescaledb psql -U pico -d sensors -c &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="s2">&amp;#34;SELECT time_bucket(&amp;#39;1 hour&amp;#39;, ts) AS hour,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> topic,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> ROUND(AVG(value)::numeric, 2) AS avg_value
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> FROM readings
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> WHERE topic IN (
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#39;pico/temperature/dht22&amp;#39;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#39;pico/humidity/dht22&amp;#39;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#39;esp32/temperature/dht11&amp;#39;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#39;esp32/humidity/dht11&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> )
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> AND ts &amp;gt; NOW() - INTERVAL &amp;#39;24 hours&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> GROUP BY hour, topic
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> ORDER BY topic, hour DESC;&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-15"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Lets check this out.&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/iot/picoW/picow-dht22.png" alt="PicoW working with a DHT22" loading="lazy" />&lt;/p>
&lt;ol>
&lt;li>Connected the PicoW a Saturday 11pm to a 4000mAh battery&lt;/li>
&lt;li>When did the data stop flowing to TimescaleDB? Expected ~3/4 days, real: 21 hours&lt;/li>
&lt;/ol>
&lt;p>Maybe the battery was no 4000mAh at all?&lt;/p>
&lt;p>for a relative comparison with the esp32, it doesnt matter&lt;/p>
&lt;p>So i recharged the battery and tried with the ESP+dht11 setup&lt;/p>
&lt;p>Surprisingly, the ESP32 just lasted ~11h instead of ~21h&lt;/p>
&lt;p>For another time, ill be testing the deep sleep option to see how it improves&lt;/p>
&lt;p>Also, I have to test using Zigbee instead of Wifi as it should also lower the power consumption&lt;/p>
&lt;h3>Interesting Tools&lt;span class="absolute -mt-20" id="interesting-tools">&lt;/span>
&lt;a href="#interesting-tools" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/uptime-kuma" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Uptime Kuma | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/emqx" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">EMQX Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;ol>
&lt;li>&lt;a href="https://schemdraw.readthedocs.io/en/stable/usage/start.html" target="_blank" rel="noopener">https://schemdraw.readthedocs.io/en/stable/usage/start.html&lt;/a>&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-16">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">uv add schemdraw &lt;span class="c1">#https://github.com/cdelker/schemdraw/&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-16"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="2">
&lt;li>&lt;/li>
&lt;/ol>
&lt;p>DC motors are simpler to control (just vary voltage) but brushed ones wear out and BLDC needs a 3-phase inverter
AC motors (induction) are dumb-rugged — no electronics needed, just plug into the wall, but speed control requires a VFD
Modern trend: AC is being eaten by BLDC everywhere efficiency or precision matters (EVs, drones, modern HVAC, e-bikes)&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tool&lt;/th>
&lt;th>Use&lt;/th>
&lt;th>License&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Ngspice&lt;/strong>&lt;/td>
&lt;td>The SPICE engine you&amp;rsquo;re already using&lt;/td>
&lt;td>BSD&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>PySpice&lt;/strong>&lt;/td>
&lt;td>Your Python wrapper&lt;/td>
&lt;td>GPL&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>KiCad&lt;/strong>&lt;/td>
&lt;td>Schematic + PCB design — fully production-grade&lt;/td>
&lt;td>GPL&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Qucs / QucsStudio&lt;/strong>&lt;/td>
&lt;td>GUI circuit simulator (Qucs is FOSS; QucsStudio is freeware)&lt;/td>
&lt;td>GPL / freeware&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>GNU Octave&lt;/strong>&lt;/td>
&lt;td>MATLAB-compatible numerical computing&lt;/td>
&lt;td>GPL&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Scilab + Xcos&lt;/strong>&lt;/td>
&lt;td>Simulink-like block diagram simulation&lt;/td>
&lt;td>GPL&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>OpenModelica&lt;/strong>&lt;/td>
&lt;td>Multi-physics modelling (electrical, mechanical, thermal)&lt;/td>
&lt;td>OSMC-PL&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>OpenDSS&lt;/strong>&lt;/td>
&lt;td>Distribution-grid power flow &amp;amp; analysis (EPRI)&lt;/td>
&lt;td>BSD&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>SAM&lt;/strong> (System Advisor Model)&lt;/td>
&lt;td>NREL&amp;rsquo;s solar/wind/storage simulator — &lt;strong>the open-source PVsyst alternative&lt;/strong>&lt;/td>
&lt;td>BSD&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>pvlib-python&lt;/strong>&lt;/td>
&lt;td>Solar modelling library — irradiance, panel models, MPPT&lt;/td>
&lt;td>BSD&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>PySAM&lt;/strong>&lt;/td>
&lt;td>Python bindings for SAM&lt;/td>
&lt;td>BSD&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Verilog-A in Ngspice&lt;/strong>&lt;/td>
&lt;td>Behavioural device modelling&lt;/td>
&lt;td>BSD&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3>LPF&lt;span class="absolute -mt-20" id="lpf">&lt;/span>
&lt;a href="#lpf" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>A &lt;strong>low-pass filter&lt;/strong> lets low frequencies through unchanged and attenuates (reduces) high frequencies.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-17">INPUT signal: a mix of low (e.g. 1 Hz) and high (e.g. 10 kHz) frequencies
LPF (f_c = 100 Hz)
OUTPUT signal: the 1 Hz components are still there at full strength
the 10 kHz components are squashed to ~1% of their input&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-17"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The filter has &lt;strong>one parameter&lt;/strong>: the cutoff frequency f_c. Below f_c the filter is &amp;ldquo;open&amp;rdquo;; above f_c it progressively closes.&lt;/p>
&lt;p>From the L4:&lt;/p>
&lt;p>In the watering BRD (&lt;a href="../../sample-pyscipe" >sample-pyscipe&lt;/a>) the smoothing cap on the 5 V rail is a tiny LPF.&lt;/p>
&lt;p>The 0.1 µF bypass cap forms an LPF with the trace inductance, blocking high-frequency noise from reaching the ESP32.&lt;/p>
&lt;p>&lt;strong>Every well-designed power rail has an LPF on it, often hidden in the layout.&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Where&lt;/th>
&lt;th>What the LPF does&lt;/th>
&lt;th>Typical f_c&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Audio bass-only output&lt;/strong>&lt;/td>
&lt;td>Sends only the low frequencies to a subwoofer&lt;/td>
&lt;td>80-150 Hz&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ADC anti-aliasing&lt;/strong>&lt;/td>
&lt;td>Blocks frequencies above f_sample / 2 to prevent aliasing&lt;/td>
&lt;td>half the sample rate&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Sensor smoothing&lt;/strong>&lt;/td>
&lt;td>Removes high-frequency electrical noise from a slow signal (temperature, soil moisture)&lt;/td>
&lt;td>1-10 Hz&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Power supply ripple removal&lt;/strong>&lt;/td>
&lt;td>The output cap of a buck converter is part of an LPF — passes DC, blocks 150 kHz switching&lt;/td>
&lt;td>well below f_switch&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Servo / control loops&lt;/strong>&lt;/td>
&lt;td>Smooths PID output to avoid jitter on the actuator&lt;/td>
&lt;td>depends on system bandwidth&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>MOSFET gate slew control&lt;/strong>&lt;/td>
&lt;td>Slows a switching edge from ns to µs to reduce EMI radiation&lt;/td>
&lt;td>RC chosen for desired dV/dt&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Audio EQ &amp;ldquo;treble cut&amp;rdquo;&lt;/strong>&lt;/td>
&lt;td>Reduces shrillness&lt;/td>
&lt;td>5-10 kHz&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Video composite signal&lt;/strong>&lt;/td>
&lt;td>Limits chroma bandwidth to ~1 MHz to keep the carrier clean&lt;/td>
&lt;td>1.3 MHz (PAL)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3>What is a high-pass filter (HPF)?&lt;span class="absolute -mt-20" id="what-is-a-high-pass-filter-hpf">&lt;/span>
&lt;a href="#what-is-a-high-pass-filter-hpf" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>A &lt;strong>high-pass filter&lt;/strong> is the LPF&amp;rsquo;s mirror: it lets &lt;em>high&lt;/em> frequencies through unchanged and blocks &lt;em>low&lt;/em> frequencies (including DC).&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-18">INPUT signal: a mix of slow drift (DC, 0.1 Hz) and audio (1 kHz)
HPF (f_c = 100 Hz)
OUTPUT signal: the slow drift is gone — the cap blocks DC
the 1 kHz audio is preserved&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-18"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Where&lt;/th>
&lt;th>What the HPF does&lt;/th>
&lt;th>Typical f_c&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>AC coupling between op-amp stages&lt;/strong>&lt;/td>
&lt;td>Strips out DC offsets so the next stage&amp;rsquo;s bias isn&amp;rsquo;t disturbed&lt;/td>
&lt;td>1-10 Hz&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Sensor offset removal&lt;/strong>&lt;/td>
&lt;td>A slow-varying baseline (electrode polarisation, thermal drift) gets stripped, leaving the fast signal of interest&lt;/td>
&lt;td>0.1-1 Hz&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>EKG amplifier&lt;/strong>&lt;/td>
&lt;td>Removes 0.05 Hz baseline wander while passing the 1-40 Hz heartbeat content&lt;/td>
&lt;td>0.05 Hz&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Edge detection / differentiator&lt;/strong>&lt;/td>
&lt;td>At very high f_c relative to signal, the HPF behaves like d/dt&lt;/td>
&lt;td>varies&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>DC-blocking on a coax line&lt;/strong>&lt;/td>
&lt;td>The cap in series with an antenna feed prevents DC current paths&lt;/td>
&lt;td>depends on RF band&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4>How do I pick f_c for my application?&lt;span class="absolute -mt-20" id="how-do-i-pick-f_c-for-my-application">&lt;/span>
&lt;a href="#how-do-i-pick-f_c-for-my-application" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Two rules of thumb:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>For a SIGNAL filter (e.g. removing noise from a sensor reading):&lt;/strong> put f_c &lt;strong>at least 10× higher than the highest frequency of interest&lt;/strong>. A 1 Hz sensor signal? Use f_c ≥ 10 Hz. Why &amp;ldquo;10×&amp;rdquo;? Because at f_c the signal is already attenuated by 3 dB (30%), which you usually don&amp;rsquo;t want. At f_c / 10 the attenuation is negligible.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>For a NOISE filter (e.g. blocking switching noise):&lt;/strong> put f_c &lt;strong>at least 10× &lt;em>lower&lt;/em> than the noise frequency&lt;/strong>. A 150 kHz buck converter ripple? Use f_c ≤ 15 kHz. At f_c × 10 (one decade past) you&amp;rsquo;ve already attenuated by 20 dB (factor of 10) — usually plenty.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>The hard cases&lt;/strong> are when signal and noise live in adjacent bands. That&amp;rsquo;s when you reach for higher-order filters (L4 plot 3 buffered cascade), or active filter topologies, or eventually digital filtering after an ADC.&lt;/p>
&lt;h3>What does &amp;ldquo;dB&amp;rdquo; really mean?&lt;span class="absolute -mt-20" id="what-does-db-really-mean">&lt;/span>
&lt;a href="#what-does-db-really-mean" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>dB (decibel) is a &lt;strong>logarithmic ratio&lt;/strong>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-19">gain in dB = 20 · log₁₀(V_out / V_in)
or
gain in dB = 10 · log₁₀(P_out / P_in)&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-19"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The factor of 20 (vs 10 for power) is because P ∝ V², so log(V²) = 2·log(V).&lt;/p>
&lt;p>They give the same dB number for the same physical situation.&lt;/p>
&lt;p>Useful conversions to memorize:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Ratio&lt;/th>
&lt;th>dB&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1×&lt;/td>
&lt;td>0 dB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>√2 ≈ 1.41&lt;/td>
&lt;td>+3 dB (doubled power)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2×&lt;/td>
&lt;td>+6 dB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>10×&lt;/td>
&lt;td>+20 dB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>100×&lt;/td>
&lt;td>+40 dB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1000×&lt;/td>
&lt;td>+60 dB&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The reason engineers use dB: a multi-decade frequency response would be impossible to read on a linear scale. dB compresses 6 orders of magnitude into 120 dB — manageable.&lt;/p>
&lt;h3>What&amp;rsquo;s the difference between a &amp;ldquo;first-order&amp;rdquo; and &amp;ldquo;second-order&amp;rdquo; filter?&lt;span class="absolute -mt-20" id="whats-the-difference-between-a-first-order-and-second-order-filter">&lt;/span>
&lt;a href="#whats-the-difference-between-a-first-order-and-second-order-filter" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The order is the number of independent energy-storing elements in the filter:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>1st order:&lt;/strong> 1 capacitor (or 1 inductor). Slope = -20 dB/dec, max phase shift 90°.&lt;/li>
&lt;li>&lt;strong>2nd order:&lt;/strong> 2 caps, or 1 cap + 1 inductor. Slope = -40 dB/dec, max phase shift 180°. Can have a resonance peak (Q &amp;gt; 0.5).&lt;/li>
&lt;li>&lt;strong>n-th order:&lt;/strong> n energy-storing elements. Slope = -20·n dB/dec. n × 90° max phase shift.&lt;/li>
&lt;/ul>
&lt;p>Higher order = sharper transition between passband and stopband, at the cost of more parts and more chance for things to go wrong (oscillation, peaking, group delay distortion).&lt;/p>
&lt;p>The buffered cascade in plot 3 is a 2nd-order LPF.&lt;/p>
&lt;p>It&amp;rsquo;s two 1st-order stages, isolated by a buffer, so their transfer functions multiply.&lt;/p>
&lt;h3>Where does the 2π come from in f_c = 1/(2πRC)?&lt;span class="absolute -mt-20" id="where-does-the-2π-come-from-in-f_c--12πrc">&lt;/span>
&lt;a href="#where-does-the-2%cf%80-come-from-in-f_c--12%cf%80rc" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Conversion between angular frequency ω (in rad/s) and ordinary frequency f (in Hz):&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-20">ω = 2π · f&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-20"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>A sine wave at 1 Hz completes 2π radians of phase per second. The &amp;ldquo;natural&amp;rdquo; frequency for the math is ω, but humans measure in Hz, so we live with the 2π. It&amp;rsquo;s a unit conversion, nothing more.&lt;/p>
&lt;p>If you ever see &lt;code>ω_c = 1/(RC)&lt;/code> (no 2π), it means we&amp;rsquo;re working in radians per second instead of cycles per second. Same circuit, same f_c, just expressed in rad/s.&lt;/p>
&lt;h3>What about LC filters? When do you use those instead of RC?&lt;span class="absolute -mt-20" id="what-about-lc-filters-when-do-you-use-those-instead-of-rc">&lt;/span>
&lt;a href="#what-about-lc-filters-when-do-you-use-those-instead-of-rc" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>When you need a sharp cutoff (high Q) or low loss in the passband.&lt;/p>
&lt;p>RC filters can only achieve Q = 0.5 and always dissipate signal energy in R.&lt;/p>
&lt;p>LC filters can have Q &amp;gt; 100 with no resistors at all (just unavoidable parasitics).&lt;/p>
&lt;p>Trade-offs:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>RC&lt;/th>
&lt;th>LC&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Cheap, small, no inductors&lt;/td>
&lt;td>Inductors are bulky, expensive, and pick up EMI&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Q ≤ 0.5&lt;/td>
&lt;td>Q &amp;gt; 0.5 possible (resonance, ringing)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Always damped&lt;/td>
&lt;td>Can ring or oscillate without R for damping&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OK at any frequency&lt;/td>
&lt;td>Below ~10 kHz, inductors get huge; above ~1 GHz, parasitics dominate&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>In the watering BRD, the &lt;strong>buck converter&amp;rsquo;s L+C output&lt;/strong> is an LC filter.&lt;/p>
&lt;p>The Q is moderate (resistance from MOSFET Rds(on), inductor DCR, ESR of cap) and the cutoff is well below the 150 kHz switching frequency, giving clean Vout.&lt;/p></description></item><item><title>OOP 101 for Engineers - Pendulum x 3Bodies</title><link>https://JAlcocerT.github.io/JAlcocerT/object-oriented-programming-101/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/object-oriented-programming-101/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Long overdue topic: &lt;em>WT&amp;amp; is OOP?&lt;/em>&lt;/p>
&lt;p>What I needed to get this going for good &lt;a href="https://github.com/JAlcocerT/MultiBodySystemDynamics-MBSD-" target="_blank" rel="noopener">this concept&lt;/a>&lt;/p>
&lt;p>+++ With &lt;a href="#applying-oop" >examples&lt;/a>: &lt;a href="#pendulum" >pendulum&lt;/a> + &lt;a href="#three-bodies" >3 bodies&lt;/a>&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Object oriented programming!&lt;/p>
&lt;p>Its been a while since i used DevCpp for C programming.&lt;/p>
&lt;p>&lt;em>yes, there are videos later on&lt;/em>&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/b35XuJI98kI" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>I was trying for long to avoid such concept.&lt;/p>
&lt;p>But not any more.&lt;/p>
&lt;p>In fact, just recently Ive been doing a come back to MBSD from Matlab to Python&amp;hellip;&lt;/p>
&lt;p>and OOP has been very helpful!&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://mermaid.js.org/syntax/classDiagram.html" target="_blank" rel="noopener">https://mermaid.js.org/syntax/classDiagram.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;pre class="mermaid mt-6">---
title: Animal example
---
classDiagram
note "From Duck till Zebra"
Animal &lt;|-- Duck
note for Duck "can fly\ncan swim\ncan dive\ncan help in debugging"
Animal &lt;|-- Fish
Animal &lt;|-- Zebra
Animal : +int age
Animal : +String gender
Animal: +isMammal()
Animal: +mate()
class Duck{
+String beakColor
+swim()
+quack()
}
class Fish{
-int sizeInFeet
-canEat()
}
class Zebra{
+bool is_wild
+run()
}&lt;/pre>&lt;p>I was doubting when to go all in with the topic:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/gabemorris12-mechanism-project-setup/" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/gabemorris12-mechanism-project-setup/&lt;/a>&lt;/p>
&lt;/li>
&lt;li>&lt;/li>
&lt;/ol>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
And with an
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>Someone once told me that for &lt;strong>mechanisms I would need to learn OOP&lt;/strong>.&lt;/p>
&lt;p>And I can understand why now.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/Slider-Crank" target="_blank" rel="noreferrer">&lt;img
alt="Slider-Crank Repo"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/GenAI/dbchat/langchain-AI.jpeg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Slider-Crank Repo&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Other LangChain use cases&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/mechanism" target="_blank" rel="noreferrer">&lt;img
alt="Mechanism Repository"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Mechanism Repository&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Forked of GabeMorris Mechanism&lt;/div>&lt;/a>
&lt;/div>
&lt;p>declarative programming language (not procedural! - you dont have to tell it (the procedure) how to do it, the query engine worries about the how for you)&lt;/p>
&lt;p>great for data management, manipulation and analytics
relational data model&lt;/p>
&lt;h2>OOP 101&lt;span class="absolute -mt-20" id="oop-101">&lt;/span>
&lt;a href="#oop-101" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Let&amp;rsquo;s dive into Object-Oriented Programming (OOP).&lt;/p>
&lt;p>&lt;strong>What is OOP?&lt;/strong>&lt;/p>
&lt;p>OOP is a programming paradigm (a style of programming) that revolves around the concept of &amp;ldquo;objects.&amp;rdquo;&lt;/p>
&lt;p>Instead of focusing purely on functions and procedures, OOP organizes code into reusable, self-contained units that represent real-world entities or abstract concepts.&lt;/p>
&lt;p>&lt;strong>Key Concepts:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Objects:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>An object is an instance of a class. Think of it as a specific &amp;ldquo;thing&amp;rdquo; that belongs to a category. For example, if &amp;ldquo;Car&amp;rdquo; is a class, a specific car like &amp;ldquo;MyRedToyota&amp;rdquo; is an object.&lt;/li>
&lt;li>Objects have two main characteristics:
&lt;ul>
&lt;li>&lt;strong>Attributes (Data):&lt;/strong> These are the properties or characteristics of an object. For example, a &amp;ldquo;Car&amp;rdquo; object might have attributes like &amp;ldquo;color,&amp;rdquo; &amp;ldquo;make,&amp;rdquo; &amp;ldquo;model,&amp;rdquo; and &amp;ldquo;speed.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Methods (Behavior):&lt;/strong> These are the actions or functions that an object can perform. For example, a &amp;ldquo;Car&amp;rdquo; object might have methods like &amp;ldquo;startEngine(),&amp;rdquo; &amp;ldquo;accelerate(),&amp;rdquo; and &amp;ldquo;brake().&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Classes:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>A class is a blueprint or template for creating objects. It defines the attributes and methods that objects of that class will have.&lt;/li>
&lt;li>You can think of a class as a general description, while an object is a specific instance of that description.&lt;/li>
&lt;li>For example, a class &amp;ldquo;Dog&amp;rdquo; can describe all the general attributes of a dog (breed, age, name) and all the general methods a dog can perform (bark, run, eat).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Encapsulation:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Encapsulation is the bundling of data (attributes) and methods that operate on that data into a single unit (an object).&lt;/li>
&lt;li>It also involves hiding the internal details of an object from the outside world, exposing only what is necessary. This helps to protect data and prevent unintended modifications.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Inheritance:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Inheritance allows you to create new classes (derived classes or subclasses) based on existing classes (base classes or superclasses).&lt;/li>
&lt;li>The derived class inherits the attributes and methods of the base class, and you can add new attributes and methods or override existing ones.&lt;/li>
&lt;li>For Example, a &amp;ldquo;SportsCar&amp;rdquo; class may inherit from the &amp;ldquo;Car&amp;rdquo; class.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Polymorphism:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Polymorphism means &amp;ldquo;many forms.&amp;rdquo; In OOP, it refers to the ability of objects of different classes to respond to the same method call in different ways.&lt;/li>
&lt;li>For example, if you have a &amp;ldquo;Shape&amp;rdquo; class with a &amp;ldquo;draw()&amp;rdquo; method, you can have subclasses like &amp;ldquo;Circle,&amp;rdquo; &amp;ldquo;Square,&amp;rdquo; and &amp;ldquo;Triangle&amp;rdquo; that each implement the &amp;ldquo;draw()&amp;rdquo; method in their own way.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Methods (Functions Applied to Objects):&lt;/strong>&lt;/p>
&lt;p>Yes, you&amp;rsquo;re right! Methods are essentially functions that are associated with a specific class and operate on the objects of that class.&lt;/p>
&lt;p>They define the behavior of the objects.&lt;/p>
&lt;p>&lt;strong>Simple Example (Python):&lt;/strong>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Dog&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__init__&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">name&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">breed&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="c1"># Constructor (initializes object)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">name&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">breed&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">breed&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">bark&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> says Woof!&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">displayBreed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> is a &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">breed&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Creating objects (instances) of the Dog class&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">my_dog&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Dog&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Buddy&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Golden Retriever&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">another_dog&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Dog&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Charlie&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Labrador&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Calling methods on the objects&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">my_dog&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">bark&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">another_dog&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">displayBreed&lt;/span>&lt;span class="p">()&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>In this example:&lt;/p>
&lt;ul>
&lt;li>&lt;code>Dog&lt;/code> is the class.&lt;/li>
&lt;li>&lt;code>my_dog&lt;/code> and &lt;code>another_dog&lt;/code> are objects (instances) of the &lt;code>Dog&lt;/code> class.&lt;/li>
&lt;li>&lt;code>__init__&lt;/code>, &lt;code>bark&lt;/code>, and &lt;code>displayBreed&lt;/code> are methods.&lt;/li>
&lt;li>&lt;code>name&lt;/code> and &lt;code>breed&lt;/code> are attributes.&lt;/li>
&lt;/ul>
&lt;p>Let me know if you&amp;rsquo;d like to explore any of these concepts in more detail or see examples in other programming languages!&lt;/p>
&lt;p>Yes, Python is known for its dynamic nature, and this extends to how it handles object properties.&lt;/p>
&lt;p>In essence, Python allows you to add or modify object properties at runtime, giving you a lot of flexibility.&lt;/p>
&lt;p>Here&amp;rsquo;s a breakdown:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Dynamic Attribute Assignment:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Unlike some statically typed languages, Python doesn&amp;rsquo;t strictly enforce that all object properties must be declared within the class definition. You can add new attributes to an object after it has been created.&lt;/li>
&lt;li>This means you can effectively &amp;ldquo;tack on&amp;rdquo; properties as needed.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Practical Implications:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>This flexibility can be very useful for situations where you don&amp;rsquo;t know all the properties an object will need in advance.&lt;/li>
&lt;li>However, it&amp;rsquo;s also important to use this feature responsibly, as excessive dynamic property addition can sometimes make code harder to understand and maintain.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Limitations:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>While you can add many properties, the underlying system does have memory limitations. So, you are limited by the amount of memory available to the python process.&lt;/li>
&lt;li>Also, from a code maintance standpoint, adding excessive amounts of dynamic properties can create code that is hard to debug, and to understand.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>In summary, Python&amp;rsquo;s dynamic nature gives you a lot of freedom in working with object properties.&lt;/p>
&lt;h3>OOP in Python&lt;span class="absolute -mt-20" id="oop-in-python">&lt;/span>
&lt;a href="#oop-in-python" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>When it comes to &lt;strong>how C and Java handle object properties&lt;/strong>, they differ significantly from Python&amp;rsquo;s dynamic approach.&lt;/p>
&lt;p>&lt;strong>C:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Static Structure:&lt;/strong>
&lt;ul>
&lt;li>C is a statically typed language. This means that the structure of a &amp;ldquo;struct&amp;rdquo; (which is C&amp;rsquo;s closest equivalent to a class) must be defined at compile time.&lt;/li>
&lt;li>You must declare all the members (properties) of a struct when you define it. You cannot dynamically add or remove members during runtime.&lt;/li>
&lt;li>Therefore, in C, the number of &amp;ldquo;properties&amp;rdquo; is fixed at compile time.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Memory Considerations:&lt;/strong>
&lt;ul>
&lt;li>C gives you very direct control over memory. This means that the size of a struct is determined by the size of its members.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Java:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Class Definitions:&lt;/strong>
&lt;ul>
&lt;li>Java is also a statically typed language. Class structures are defined at compile time.&lt;/li>
&lt;li>You declare the fields (member variables) of a class within the class definition, and these fields are fixed.&lt;/li>
&lt;li>While you can use data structures like HashMaps or Lists within a Java object to hold a variable number of data elements, the object itself will have a fixed set of defined fields.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Object-Oriented Structure:&lt;/strong>
&lt;ul>
&lt;li>Java&amp;rsquo;s object-oriented nature enforces a more rigid structure compared to Python. This promotes type safety and predictability.&lt;/li>
&lt;li>It is possible to use reflection in java, to access and manipulate fields at runtime, but this is not the common way of programming, and has performance impacts.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Key Differences:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Dynamic vs. Static:&lt;/strong>
&lt;ul>
&lt;li>Python: Dynamic, properties can be added at runtime.&lt;/li>
&lt;li>C and Java: Static, properties are defined at compile time.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Flexibility vs. Structure:&lt;/strong>
&lt;ul>
&lt;li>Python: Offers high flexibility.&lt;/li>
&lt;li>C and Java: Emphasize structure and type safety.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>In essence, C and Java prioritize a well-defined structure, which contributes to their performance and reliability.&lt;/p>
&lt;p>&lt;strong>Python prioritizes flexibility and ease of use.&lt;/strong>&lt;/p>
&lt;p>Yes, all the statements you&amp;rsquo;ve listed are &lt;strong>accurate and fundamental principles of Object-Oriented Programming (OOP)&lt;/strong>. Let&amp;rsquo;s break them down:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&amp;ldquo;OOP is a style of programming which allows to club data and behavior together&amp;rdquo;&lt;/strong>: This is a core definition of OOP. It emphasizes encapsulation, where data (attributes) and the functions that operate on that data (methods) are bundled into objects.&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;OOP is more suited for coding real life scenarios&amp;rdquo;&lt;/strong>: This is a key advantage of OOP. Its ability to model real-world entities through objects and classes makes it very effective for complex systems.&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;Objects are real world entities&amp;rdquo;&lt;/strong>: Objects represent concrete instances of things, whether physical or conceptual.&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;Classes are logical entities and are used for classification&amp;rdquo;&lt;/strong>: Classes are blueprints or templates that define the structure and behavior of objects. They allow us to categorize objects based on shared characteristics.&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;Class is a description of attributes and behavior that objects of that classification should possess&amp;rdquo;&lt;/strong>: This reiterates the role of classes as blueprints, defining what objects of that class will have and do.&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;Common attributes are created using a special method called __init__&amp;rdquo;&lt;/strong>: The &lt;code>__init__&lt;/code> method (constructor) is indeed used to initialize the attributes of an object when it&amp;rsquo;s created.&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;Objects can be created using ClassName() or using object literals for the built in classes&amp;rdquo;&lt;/strong>: Correct. User defined classes are instantiated with ClassName(), and python provides object literals for built in classes like lists, dictionaries, tuples, and sets.&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;Attributes are created using the syntax, reference_variable.attribute_name = value&amp;rdquo;&lt;/strong>: This is how you dynamically add or modify attributes to objects.&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;Behavior is created by defining a function inside the class having a special parameter called self&amp;rdquo;&lt;/strong>: This is how methods are defined within classes, and &lt;code>self&lt;/code> is essential for the methods to access the object&amp;rsquo;s attributes and other methods.&lt;/li>
&lt;/ul>
&lt;p>In summary, you&amp;rsquo;ve captured the essence of OOP in Python (and OOP in general) very well.&lt;/p>
&lt;h3>OOP Concepts&lt;span class="absolute -mt-20" id="oop-concepts">&lt;/span>
&lt;a href="#oop-concepts" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">OOP Example 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;p>Yes, the relationship between a &amp;ldquo;Customer&amp;rdquo; and an &amp;ldquo;Address&amp;rdquo; is a very common and clear example of aggregation (a &amp;ldquo;has-a&amp;rdquo; relationship) in Object-Oriented Programming. Here&amp;rsquo;s why:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&amp;ldquo;Has-A&amp;rdquo; Relationship:&lt;/strong>
&lt;ul>
&lt;li>A customer &lt;em>has&lt;/em> an address (or potentially multiple addresses). This directly aligns with the &amp;ldquo;has-a&amp;rdquo; concept of aggregation.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Independent Lifecycles:&lt;/strong>
&lt;ul>
&lt;li>Crucially, an address can exist independently of a customer. An address exists whether or not a customer is currently assigned to it.&lt;/li>
&lt;li>Similarly, a customer can exist without an address (though it might be impractical in some applications).&lt;/li>
&lt;li>This independence of lifecycles is a key characteristic that distinguishes aggregation from composition.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Aggregation vs. Composition:&lt;/strong>
&lt;ul>
&lt;li>If the relationship were composition, the address would be completely dependent on the customer. If the customer were deleted, the address would also be deleted.&lt;/li>
&lt;li>In a typical scenario, addresses are often stored in a separate database or system, and they can be reused by multiple customers. This points strongly towards aggregation.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>In summary:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>The &amp;ldquo;Customer has an Address&amp;rdquo; scenario perfectly illustrates aggregation.&lt;/li>
&lt;li>It is very important to understand the difference between aggregation and composition.&lt;/li>
&lt;li>The key difference is the objects life cycle dependencies.&lt;/li>
&lt;/ul>
&lt;p>Therefore, you&amp;rsquo;re absolutely correct in recognizing that this is a classic &amp;ldquo;has-a&amp;rdquo; aggregation relationship.&lt;/p>
&lt;/div>
&lt;/details>
&lt;p>Type safety is a crucial concept in programming languages that aims to prevent type errors. Let&amp;rsquo;s break it down:&lt;/p>
&lt;p>&lt;strong>What are Type Errors?&lt;/strong>&lt;/p>
&lt;p>Type errors occur when you try to perform an operation on a value of an incompatible type. For example:&lt;/p>
&lt;ul>
&lt;li>Trying to add a string (&amp;ldquo;hello&amp;rdquo;) to an integer (5).&lt;/li>
&lt;li>Calling a method that expects an integer argument with a string argument.&lt;/li>
&lt;li>Accessing a field that doesn&amp;rsquo;t exist on an object.&lt;/li>
&lt;/ul>
&lt;p>These errors can lead to unexpected behavior, crashes, and bugs in your programs.&lt;/p>
&lt;p>&lt;strong>How Type Safety Works:&lt;/strong>&lt;/p>
&lt;p>Type safety mechanisms ensure that the compiler or runtime environment checks the types of values before performing operations. This checking can happen:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>At Compile Time (Static Type Checking):&lt;/strong>
&lt;ul>
&lt;li>Languages like C, C++, and Java perform type checking during compilation.&lt;/li>
&lt;li>The compiler analyzes your code and flags type errors before the program is executed.&lt;/li>
&lt;li>This helps catch errors early in the development process.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>At Runtime (Dynamic Type Checking):&lt;/strong>
&lt;ul>
&lt;li>Languages like Python and JavaScript perform type checking while the program is running.&lt;/li>
&lt;li>The runtime environment checks the types of values just before an operation is performed.&lt;/li>
&lt;li>If a type error is detected, the program typically throws an exception.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Benefits of Type Safety:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Reduced Bugs:&lt;/strong> Type checking helps catch errors early, preventing them from causing problems in production.&lt;/li>
&lt;li>&lt;strong>Improved Code Reliability:&lt;/strong> Type-safe code is generally more reliable and predictable.&lt;/li>
&lt;li>&lt;strong>Enhanced Code Maintainability:&lt;/strong> Type information makes it easier to understand and modify code.&lt;/li>
&lt;li>&lt;strong>Better Performance (in some cases):&lt;/strong> Static type checking can allow compilers to generate more efficient code.&lt;/li>
&lt;li>&lt;strong>Increased developer confidence:&lt;/strong> Knowing that type errors are caught, allows developers to have more confidence in their code.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Examples:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>In Java:
&lt;ul>
&lt;li>&lt;code>int x = &amp;quot;hello&amp;quot;;&lt;/code> would result in a compile-time error because you&amp;rsquo;re trying to assign a string to an integer variable.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>In Python:
&lt;ul>
&lt;li>&lt;code>x = &amp;quot;hello&amp;quot; + 5&lt;/code> would result in a runtime &lt;code>TypeError&lt;/code> because you&amp;rsquo;re trying to add a string and an integer.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>In summary:&lt;/strong> Type safety is a set of mechanisms that help ensure that your programs operate on values of the correct types, reducing the likelihood of errors and improving the overall quality of your code.&lt;/p>
&lt;h4>Method vs Functions&lt;span class="absolute -mt-20" id="method-vs-functions">&lt;/span>
&lt;a href="#method-vs-functions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>The key differences between functions and methods in object-oriented programming, particularly in languages like Python:&lt;/p>
&lt;p>&lt;strong>Function:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&amp;ldquo;Is a block of code with a name&amp;rdquo;&lt;/strong>: This is a fundamental definition of a function. It&amp;rsquo;s a reusable piece of code that performs a specific task.&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;It can be invoked using the name of the function and passing parameters&amp;rdquo;&lt;/strong>: Correct. You call a function by its name, and you can provide input values (arguments) as parameters.&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;Example: len([1,2,3])&amp;rdquo;&lt;/strong>: &lt;code>len()&lt;/code> is a built-in function in Python that calculates the length of an iterable (like a list).&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;Parameters are optional in a function&amp;rdquo;&lt;/strong>: This is also true. Some functions can be called without any parameters, while others require them.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Method:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&amp;ldquo;Is part of an object and represents the behavior of the object&amp;rdquo;&lt;/strong>: This is a core concept of methods. They are functions associated with a specific object or class and define what that object can do.&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;Can be invoked only on an object, using dot operator. Without an object we cannot invoke a method&amp;rdquo;&lt;/strong>: Methods are called using the dot notation (&lt;code>object.method()&lt;/code>), signifying that they belong to that particular object instance.&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;Example: [1,2,3].reverse()&amp;rdquo;&lt;/strong>: &lt;code>reverse()&lt;/code> is a method that modifies the list object in place, reversing its elements.&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;A method must have at least one parameter: self&amp;rdquo;&lt;/strong>: In Python, this is a crucial point. The &lt;code>self&lt;/code> parameter (or any name used to refer to the instance) is the first parameter in a method definition. It represents the object instance itself and allows the method to access and modify the object&amp;rsquo;s attributes.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Key takeaway:&lt;/strong>&lt;/p>
&lt;p>The image effectively summarizes the distinction between functions and methods. Functions are standalone blocks of code, while methods are tied to objects and operate on their data.&lt;/p>
&lt;pre class="mermaid mt-6">classDiagram
class Customer {
- name: string
- customerId: int
+ addAddress(address: Address)
+ getAddresses(): Address[]
}
class Address {
- street: string
- city: string
- zipCode: string
- addressId: int
}
Customer "1" -- "0..*" Address : has&lt;/pre>&lt;p>Let&amp;rsquo;s break down these points about class relationships, aggregation, and association in OOP:&lt;/p>
&lt;p>&lt;strong>1. Classes Can Have Relationships with Other Classes:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>This is the fundamental idea. Objects don&amp;rsquo;t exist in isolation; they interact and relate to each other. These interactions and connections are modeled as relationships between classes.&lt;/li>
&lt;li>These relationships are crucial for creating complex and realistic software systems.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. Aggregation: &amp;ldquo;Has-A&amp;rdquo; with Independent Lifecycles:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Ownership:&lt;/strong> In aggregation, one class (the &amp;ldquo;whole&amp;rdquo;) contains or &amp;ldquo;has&amp;rdquo; another class (the &amp;ldquo;part&amp;rdquo;). For example, a &amp;ldquo;Library&amp;rdquo; might have &amp;ldquo;Book&amp;rdquo; objects.&lt;/li>
&lt;li>&lt;strong>Independent Lifecycles:&lt;/strong> The key feature of aggregation is that the &amp;ldquo;part&amp;rdquo; objects can exist independently of the &amp;ldquo;whole&amp;rdquo; object. If the &amp;ldquo;Library&amp;rdquo; is deleted, the &amp;ldquo;Book&amp;rdquo; objects still exist.&lt;/li>
&lt;li>&lt;strong>Diamond Symbol:&lt;/strong> In UML class diagrams (and sometimes in MermaidJS with modifications), aggregation is represented by a hollow diamond at the &amp;ldquo;whole&amp;rdquo; end of the relationship line. This visually distinguishes it from composition.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Example:&lt;/strong> A &amp;ldquo;Department&amp;rdquo; has &amp;ldquo;Employees.&amp;rdquo; If the &amp;ldquo;Department&amp;rdquo; is dissolved, the &amp;ldquo;Employees&amp;rdquo; still exist.&lt;/p>
&lt;p>&lt;strong>3. Association: A General &amp;ldquo;Uses-A&amp;rdquo; Relationship:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>General Relationship:&lt;/strong> Association is the most general type of relationship between classes. It indicates that objects of one class &amp;ldquo;use&amp;rdquo; or interact with objects of another class.&lt;/li>
&lt;li>&lt;strong>Local Variable Use:&lt;/strong> If an object of one class is used only as a local variable within a method of another class, this is considered an association. This signifies a weak, temporary relationship.&lt;/li>
&lt;li>&lt;strong>No Strict Representation:&lt;/strong> Because association is so general and often temporary, it&amp;rsquo;s not always explicitly represented in class diagrams. It might be implied by method calls or attribute usage.&lt;/li>
&lt;li>&lt;strong>Class Variable/Method Usage:&lt;/strong> Association also occurs when one class uses the class variables or methods of another class. This is a form of interaction that doesn&amp;rsquo;t necessarily imply ownership or a strong lifecycle dependency.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Example:&lt;/strong> A &amp;ldquo;Calculator&amp;rdquo; class might use a &amp;ldquo;Math&amp;rdquo; class to perform calculations. This is an association, but the &amp;ldquo;Calculator&amp;rdquo; doesn&amp;rsquo;t &amp;ldquo;own&amp;rdquo; the &amp;ldquo;Math&amp;rdquo; class.&lt;/p>
&lt;p>&lt;strong>Key Differences Between Aggregation and Association:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Ownership:&lt;/strong> Aggregation implies a form of ownership (even if the lifecycle is independent), while association is a more general &amp;ldquo;uses&amp;rdquo; relationship.&lt;/li>
&lt;li>&lt;strong>Lifecycle:&lt;/strong> Aggregation has a clear concept of one class containing another, while association is often temporary.&lt;/li>
&lt;li>&lt;strong>Representation:&lt;/strong> Aggregation is often explicitly represented with a diamond symbol, while association is often implied.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>In simpler terms:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Aggregation:&lt;/strong> &amp;ldquo;My car has an engine. The engine can exist without my car, but it&amp;rsquo;s still part of my car.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Association:&lt;/strong> &amp;ldquo;My car uses a gas station. The gas station and my car are related, but my car doesn&amp;rsquo;t &amp;lsquo;have&amp;rsquo; the gas station in the same way it has an engine.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>I hope this clarifies the distinctions between aggregation and association.&lt;/p>
&lt;h4>Encapsulation&lt;span class="absolute -mt-20" id="encapsulation">&lt;/span>
&lt;a href="#encapsulation" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>You&amp;rsquo;ve hit on a crucial aspect of encapsulation in Python with the double underscore (&lt;code>__&lt;/code>) prefix.&lt;/p>
&lt;p>Let&amp;rsquo;s break down how it works and why it&amp;rsquo;s used.&lt;/p>
&lt;p>&lt;strong>Double Underscore (Name Mangling):&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Python uses a mechanism called &amp;ldquo;name mangling&amp;rdquo; when you prefix an attribute with double underscores (&lt;code>__&lt;/code>).&lt;/li>
&lt;li>This doesn&amp;rsquo;t make the attribute truly &amp;ldquo;private&amp;rdquo; in the sense of some other languages (like Java or C++).&lt;/li>
&lt;li>Instead, Python modifies the attribute&amp;rsquo;s name to make it harder to access from outside the class.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>How Name Mangling Works:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>When you use &lt;code>__wallet_balance&lt;/code>, Python internally changes the attribute&amp;rsquo;s name to something like &lt;code>_ClassName__wallet_balance&lt;/code>.&lt;/li>
&lt;li>In the &lt;code>Customer&lt;/code> class, &lt;code>__wallet_balance&lt;/code> becomes something like &lt;code>_Customer__wallet_balance&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Why It&amp;rsquo;s Done:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>To reduce the risk of accidental name clashes:&lt;/strong> If a subclass defines an attribute with the same name, name mangling prevents it from accidentally overriding the base class&amp;rsquo;s attribute.&lt;/li>
&lt;li>&lt;strong>To provide a level of data hiding:&lt;/strong> While not foolproof, it discourages direct access to attributes that are intended to be internal to the class.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>The Example and Its Output:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>The code defines &lt;code>__wallet_balance&lt;/code> with a double underscore.&lt;/li>
&lt;li>When you try to access &lt;code>c1.__wallet_balance&lt;/code> directly, you get an &lt;code>AttributeError&lt;/code>.&lt;/li>
&lt;li>This is because &lt;code>__wallet_balance&lt;/code> doesn&amp;rsquo;t exist as a direct attribute. Python has mangled its name.&lt;/li>
&lt;li>The only way to access the mangled variable is by using it&amp;rsquo;s mangled name &lt;code>_Customer__wallet_balance&lt;/code>, but this is heavily discouraged.&lt;/li>
&lt;li>The class&amp;rsquo;s methods (&lt;code>update_balance&lt;/code> and &lt;code>show_balance&lt;/code>) can still access &lt;code>__wallet_balance&lt;/code> because they are within the class&amp;rsquo;s scope.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Encapsulation:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>As the text correctly states, this technique contributes to &lt;strong>encapsulation&lt;/strong>.&lt;/li>
&lt;li>Encapsulation is about bundling data and methods that operate on that data into a single unit (the object) and controlling access to the data.&lt;/li>
&lt;li>By using name mangling and providing methods to interact with the data, you can enforce stricter control over how the object&amp;rsquo;s state is modified.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Important Considerations:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Not True Privacy:&lt;/strong> Name mangling is not a security feature. Determined programmers can still access mangled attributes.&lt;/li>
&lt;li>&lt;strong>Convention:&lt;/strong> The single underscore (&lt;code>_&lt;/code>) is a convention that indicates an attribute is intended to be internal, but it doesn&amp;rsquo;t involve name mangling.&lt;/li>
&lt;li>&lt;strong>Getter and Setter Methods:&lt;/strong> The best practice for controlled data access is to use getter and setter methods or properties, which allow you to validate and manipulate data before it&amp;rsquo;s accessed or modified.&lt;/li>
&lt;/ul>
&lt;p>In essence, the double underscore is a Pythonic way to provide a level of data hiding and prevent accidental name clashes, contributing to the principles of encapsulation.&lt;/p>
&lt;h4>Inheritance&lt;span class="absolute -mt-20" id="inheritance">&lt;/span>
&lt;a href="#inheritance" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Inheritance is a fundamental concept in Object-Oriented Programming (OOP) that allows you to create new classes based on existing classes.&lt;/p>
&lt;p>It establishes an &amp;ldquo;is-a&amp;rdquo; relationship, meaning a subclass (or derived class) is a specialized type of its superclass (or base class).&lt;/p>
&lt;p>&lt;strong>The Core Idea:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Code Reusability:&lt;/strong> Inheritance promotes code reuse. You define common attributes and methods in a superclass, and subclasses can inherit them, avoiding redundant code.&lt;/li>
&lt;li>&lt;strong>Hierarchy and Organization:&lt;/strong> It allows you to create a hierarchy of classes, organizing your code in a logical and structured way.&lt;/li>
&lt;li>&lt;strong>Polymorphism:&lt;/strong> Inheritance is essential for polymorphism, which allows objects of different classes to be treated as objects of a common superclass.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Explanation of the Inheritance Example:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Real-World Analogy:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>The analogy of a child inheriting attributes and behaviors from a parent is very accurate. A child might inherit eye color, hair color, or even personality traits from their parents.&lt;/li>
&lt;li>In OOP, a subclass inherits attributes (data) and methods (behaviors) from its superclass.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Code Perspective (Java, C#, etc.):&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Constructor:&lt;/strong> The subclass does not directly inherit the superclass&amp;rsquo;s constructor. However, the subclass can call the superclass&amp;rsquo;s constructor using the &lt;code>super()&lt;/code> keyword (or similar) to initialize inherited attributes.&lt;/li>
&lt;li>&lt;strong>Non-Private Attributes:&lt;/strong> Attributes declared as &lt;code>public&lt;/code> or &lt;code>protected&lt;/code> in the superclass are directly inherited by the subclass. &lt;code>Private&lt;/code> attributes are not directly accessible.&lt;/li>
&lt;li>&lt;strong>Non-Private Methods:&lt;/strong> Methods declared as &lt;code>public&lt;/code> or &lt;code>protected&lt;/code> in the superclass are also inherited by the subclass.&lt;/li>
&lt;li>&lt;strong>Why Private is hidden:&lt;/strong> Private members are hidden to protect the internal state of the superclass. They are intended for internal use only.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Python&amp;rsquo;s Behavior:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Python&amp;rsquo;s inheritance model is slightly different. In Python, private variables (those with double underscores, like &lt;code>__my_variable&lt;/code>) are still inherited, but they undergo name mangling. This means their names are modified to make them less likely to clash with names in subclasses.&lt;/li>
&lt;li>Essentially, even though they are inherited, name mangling makes it harder for a subclass to accidently overwrite a superclasses private variables.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&amp;ldquo;Owned by the Child Class&amp;rdquo;:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>When a subclass inherits attributes and methods, it&amp;rsquo;s as if those members were defined directly in the subclass.&lt;/li>
&lt;li>The subclass can:
&lt;ul>
&lt;li>Use the inherited attributes and methods as its own.&lt;/li>
&lt;li>Override inherited methods to provide its own specialized implementation.&lt;/li>
&lt;li>Add new attributes and methods that are specific to the subclass.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Example (Conceptual):&lt;/strong>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Superclass
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">class&lt;/span> &lt;span class="nx">Animal&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">String&lt;/span> &lt;span class="nx">name&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">void&lt;/span> &lt;span class="nx">eat&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">out&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Animal is eating.&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Subclass
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">class&lt;/span> &lt;span class="nx">Dog&lt;/span> &lt;span class="kr">extends&lt;/span> &lt;span class="nx">Animal&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">void&lt;/span> &lt;span class="nx">bark&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">out&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Dog is barking.&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Usage
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">Dog&lt;/span> &lt;span class="nx">myDog&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">Dog&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">myDog&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;Buddy&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Inherited attribute
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">myDog&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">eat&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// Inherited method
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="nx">myDog&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">bark&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// Subclass-specific method
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>In this example:&lt;/p>
&lt;ul>
&lt;li>&lt;code>Dog&lt;/code> inherits the &lt;code>name&lt;/code> attribute and the &lt;code>eat()&lt;/code> method from &lt;code>Animal&lt;/code>.&lt;/li>
&lt;li>&lt;code>Dog&lt;/code> adds its own &lt;code>bark()&lt;/code> method.&lt;/li>
&lt;/ul>
&lt;p>Inheritance is a powerful tool for building well-structured and reusable code.&lt;/p>
&lt;p>Yes, that&amp;rsquo;s a correct and concise explanation of simple inheritance. Here&amp;rsquo;s a breakdown of why it&amp;rsquo;s accurate:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&amp;ldquo;Simple inheritance enables a derived class to inherit properties and behaviour from a single parent class.&amp;rdquo;&lt;/strong>
&lt;ul>
&lt;li>This accurately describes the core concept. &amp;ldquo;Simple&amp;rdquo; or &amp;ldquo;single&amp;rdquo; inheritance means a class derives from only one direct parent class.&lt;/li>
&lt;li>&amp;ldquo;Properties&amp;rdquo; refers to the attributes or data members of a class.&lt;/li>
&lt;li>&amp;ldquo;Behavior&amp;rdquo; refers to the methods or functions of a class.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;It allows a derived class to inherit the properties and behavior of a base class, thus enabling code reusability&amp;hellip;&amp;rdquo;&lt;/strong>
&lt;ul>
&lt;li>This highlights one of the primary benefits of inheritance: code reuse. You don&amp;rsquo;t have to rewrite code that already exists in the base class.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>&amp;quot;&amp;hellip;as well as adding new features to the existing code.&amp;quot;&lt;/strong>
&lt;ul>
&lt;li>This points to the extensibility of inheritance. A derived class can:
&lt;ul>
&lt;li>Add its own unique attributes and methods.&lt;/li>
&lt;li>Override (replace) inherited methods to provide specialized behavior.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>In essence, simple inheritance provides a way to create a hierarchy of classes where subclasses build upon and extend the functionality of their parent classes.&lt;/strong>&lt;/p>
&lt;p>Therefore, the statement you provided is accurate.&lt;/p>
&lt;p>Let&amp;rsquo;s delve deeper into each of these aspects of inheritance:&lt;/p>
&lt;p>&lt;strong>1. A Class Can Inherit from Another Class:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>This is the fundamental principle. It establishes an &amp;ldquo;is-a&amp;rdquo; relationship (e.g., a &amp;ldquo;Dog&amp;rdquo; &lt;em>is an&lt;/em> &amp;ldquo;Animal&amp;rdquo;).&lt;/li>
&lt;li>The class that inherits is called the &amp;ldquo;child class,&amp;rdquo; &amp;ldquo;subclass,&amp;rdquo; or &amp;ldquo;derived class.&amp;rdquo;&lt;/li>
&lt;li>The class being inherited from is called the &amp;ldquo;parent class,&amp;rdquo; &amp;ldquo;superclass,&amp;rdquo; or &amp;ldquo;base class.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. Inheritance Improves Code Reuse:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>This is a major benefit. Common attributes and methods are defined in the parent class, and child classes automatically get them.&lt;/li>
&lt;li>This reduces redundancy and makes code easier to maintain. If you need to change a common behavior, you only change it in the parent class.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>3. Constructor, Attributes, Methods Get Inherited to the Child Class:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Attributes (Variables):&lt;/strong> Non-private attributes of the parent class are inherited.&lt;/li>
&lt;li>&lt;strong>Methods (Functions):&lt;/strong> Non-private methods of the parent class are inherited.&lt;/li>
&lt;li>&lt;strong>Constructor:&lt;/strong>
&lt;ul>
&lt;li>The child class does not directly inherit the parent&amp;rsquo;s constructor.&lt;/li>
&lt;li>However, the child class can call the parent&amp;rsquo;s constructor using &lt;code>super()&lt;/code> (or a similar mechanism, depending on the language) to initialize the inherited attributes.&lt;/li>
&lt;li>If the child class does not define a constructor, and the parent class has a constructor that has no arguments, then the parent classes constructor will be implicitly called.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>4. The Parent Has No Access to the Child Class:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Inheritance is a one-way street. The parent class has no knowledge of or access to the child classes.&lt;/li>
&lt;li>This enforces the principle of specialization. The child class is a more specialized version of the parent.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>5. Private Properties of a Parent Are Not Accessible Directly in the Child Class:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Private attributes and methods are intended for internal use within the parent class.&lt;/li>
&lt;li>They are hidden from child classes to maintain encapsulation and prevent unintended modifications.&lt;/li>
&lt;li>Even though some languages like python inherit private members, they are name mangled, and therefore are not directly accessible.&lt;/li>
&lt;li>If a child class needs to access or modify private data, the parent class should provide public or protected methods (getters and setters).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>6. Child Class Can Override the Methods, This Is Called Method Overriding:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Method overriding allows a child class to provide its own implementation of a method that is already defined in the parent class.&lt;/li>
&lt;li>This allows the child class to customize the behavior of inherited methods.&lt;/li>
&lt;li>When an overridden method is called on an object of the child class, the child&amp;rsquo;s version of the method is executed.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>7. &lt;code>super()&lt;/code> Is an Inbuilt Function Which Is Used to Invoke the Parent Class Methods and Constructor:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;code>super()&lt;/code> (or the equivalent in other languages) is used to call methods and constructors of the parent class from within the child class.&lt;/li>
&lt;li>This is particularly useful for:
&lt;ul>
&lt;li>Calling the parent&amp;rsquo;s constructor to initialize inherited attributes.&lt;/li>
&lt;li>Calling parent class methods to reuse existing functionality.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>8. Types of Inheritance:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Simple (Single) Inheritance:&lt;/strong>
&lt;ul>
&lt;li>A class inherits from only one parent class.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Multi-level Inheritance:&lt;/strong>
&lt;ul>
&lt;li>A class inherits from a child class, which inherits from another class, forming a chain of inheritance. (A-&amp;gt;B-&amp;gt;C)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Hierarchical Inheritance:&lt;/strong>
&lt;ul>
&lt;li>Multiple child classes inherit from a single parent class. (A-&amp;gt;B, A-&amp;gt;C)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Multiple Inheritance:&lt;/strong>
&lt;ul>
&lt;li>A class inherits from multiple parent classes. (A,B-&amp;gt;C)&lt;/li>
&lt;li>Some languages, like Java and C#, do not directly support multiple inheritance of classes (they use interfaces instead), due to the complexities and potential ambiguities it can introduce (the &amp;ldquo;diamond problem&amp;rdquo;). Python does support multiple inheritance.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2>Applying OOP&lt;span class="absolute -mt-20" id="applying-oop">&lt;/span>
&lt;a href="#applying-oop" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>How about creating couple of examples Python app that apply OOP?&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Py_Double_Pendulum" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Double Pendulum Repo | Repo ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/ThreeBodies/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Bots | Repo ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;h3>Pendulum&lt;span class="absolute -mt-20" id="pendulum">&lt;/span>
&lt;a href="#pendulum" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I wanted to combine couple things:&lt;/p>
&lt;ol>
&lt;li>My old &lt;a href="https://github.com/JAlcocerT/Py_Double_Pendulum" target="_blank" rel="noopener">pendulum repo&lt;/a> and &lt;a href="https://jalcocert.github.io/JAlcocerT/chaos-theory-and-the-double-pendulum-with-python/" target="_blank" rel="noopener">post&lt;/a>&lt;/li>
&lt;li>Theo boilerplate: &lt;a href="https://github.com/t3-oss/create-t3-app" target="_blank" rel="noopener">https://github.com/t3-oss/create-t3-app&lt;/a> &lt;em>The best way to start a full-stack, typesafe Next.js app&lt;/em>&lt;/li>
&lt;li>Combined with the latest prompt for cool UIs tested on this post and &lt;a href="https://github.com/JAlcocerT/btc-powerlaw" target="_blank" rel="noopener">this repo&lt;/a>&lt;/li>
&lt;li>Leveling up the physics&lt;/li>
&lt;/ol>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/T58lGKREubo" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!--
https://youtu.be/T58lGKREubo
-->
&lt;p>I already created this, but it cant explain whats going on with the video:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/Py_Double_Pendulum&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Where that does syncing comes from?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo apt install gh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gh auth login
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#gh repo create btc-powerlaw --private --source=. --remote=origin --push&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git init &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git add . &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git commit -m &lt;span class="s2">&amp;#34;Initial commit: oop pendulum&amp;#34;&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> gh repo create oop-pendulum --private --source&lt;span class="o">=&lt;/span>. --remote&lt;span class="o">=&lt;/span>origin --push&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Three Bodies&lt;span class="absolute -mt-20" id="three-bodies">&lt;/span>
&lt;a href="#three-bodies" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The &lt;a href="https://jalcocert.github.io/JAlcocerT/testing-tinyauth/#conclusions" target="_blank" rel="noopener">initial 3 bodies web app&lt;/a> I created last year was nice:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://burtleburtle.net/bob/physics/eight.html" target="_blank" rel="noopener">https://burtleburtle.net/bob/physics/eight.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>But it was more a quick example to try tiny auth and logto.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/ThreeBodies/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ThePoincareLab&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Now, how about creating another quick PoC around tat physics, but with &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution-with-dao/#for-vibe-coders" target="_blank" rel="noopener">a better looking UI&lt;/a> and OOP?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">do you understand the current three bodies web app?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">can you have a look to GEMINI.md and tell me if we could re-use current logic of python for the backend and bring to a cinematic landing page the three body problem described and animated?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">in a landing + webapp format where people would love to learn about it&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo apt install gh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gh auth login
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#gh repo create btc-powerlaw --private --source=. --remote=origin --push&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git init &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git add . &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git commit -m &lt;span class="s2">&amp;#34;Initial commit: oop 3 bodies&amp;#34;&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> gh repo create oop-three-bodies --private --source&lt;span class="o">=&lt;/span>. --remote&lt;span class="o">=&lt;/span>origin --push&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Mechanism&lt;span class="absolute -mt-20" id="mechanism">&lt;/span>
&lt;a href="#mechanism" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>This can be better, right?&lt;/p>
&lt;!-- https://youtube.com/shorts/2xMOxiRz6F4 -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/2xMOxiRz6F4" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/Slider-Crank
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clome https://github.com/JAlcocerT/mechanism&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>I could now avoid reviewing these and use uv as a reliable pkg manager:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">uv run&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>&lt;a href="https://github.com/JAlcocerT/Slider-Crank" target="_blank" rel="noopener">https://github.com/JAlcocerT/Slider-Crank&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/JAlcocerT/mechanism" target="_blank" rel="noopener">https://github.com/JAlcocerT/mechanism&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/mechanism&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Down the line, there is nothing stopping you to merge the physically accurate movements with nice looking animations:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/JAlcocerT/3Design" target="_blank" rel="noopener">https://github.com/JAlcocerT/3Design&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>FreeCad and OpenScad are waiting there together with CadQuery!&lt;/p>
&lt;/blockquote>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/TLROAYXxkvA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://youtube.com/shorts/TLROAYXxkvA?is=ywPjLN7C87Vk3yON -->
&lt;p>For that video, the autor provides the files in the description!&lt;/p>
&lt;p>But I will articulate it around:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/MultiBodySystemDynamics-MBSD-&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/mbsd&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Few years ago I was quite advanced with Matlab models.&lt;/p>
&lt;p>Advance as in doing this: &lt;a href="https://github.com/JAlcocerT/Bike_dynamic_simulator" target="_blank" rel="noopener">https://github.com/JAlcocerT/Bike_dynamic_simulator&lt;/a>&lt;/p>
&lt;p>I gave it a thought to migrate to Octave.&lt;/p>
&lt;p>But what for now, having Python available and many OSS goodies.&lt;/p>
&lt;p>Anyways, if you provide digital services and think &lt;a href="https://www.reddit.com/r/ClaudeAI/comments/1q403xw/claude_code_for_noncoding_projectswork_a_complete/" target="_blank" rel="noopener">that claude code&lt;/a> wont be cause deflation there soon because &amp;lsquo;Im not a programmer&amp;rsquo;&amp;hellip;&lt;/p>
&lt;p>Better be finding &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution-with-dao/#about-ikigai" target="_blank" rel="noopener">your Ikigai&lt;/a> (?)&lt;/p>
&lt;p>I mean&amp;hellip;&lt;/p>
&lt;p>As we have been talking about &lt;a href="#three-bodies" >3 bodies and ~ gravity&lt;/a>&lt;/p>
&lt;p>If you want to go away from the gravitational pull of the masses&amp;hellip;&lt;/p>
&lt;p>You have to get enough speed to make your &lt;em>great escape&lt;/em>:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/tiersofservice/dwi/selfh-landing-astro-fastapi-bot.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Service for the Ones with Questions&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/shipping/dna-1ton-ebook.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge for the ones who want to create step by step&lt;/div>&lt;/a>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Languages for OOP&lt;span class="absolute -mt-20" id="languages-for-oop">&lt;/span>
&lt;a href="#languages-for-oop" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The most typical or “classic” OOP languages are usually:&lt;/p>
&lt;ul>
&lt;li>Java&lt;/li>
&lt;li>C++&lt;/li>
&lt;li>C#&lt;/li>
&lt;li>Python&lt;/li>
&lt;li>Ruby&lt;/li>
&lt;li>Smalltalk&lt;/li>
&lt;li>Objective-C&lt;/li>
&lt;/ul>
&lt;p>About the ones you mentioned:&lt;/p>
&lt;ul>
&lt;li>Python: yes, commonly considered OOP, though it’s multi-paradigm.&lt;/li>
&lt;li>JavaScript: kind of. It supports OOP, but through prototype-based objects rather than classic class-based OOP originally. Today it’s often treated as OOP-capable, not a “pure classic OOP”
language.&lt;/li>
&lt;li>Rust: not usually considered a typical OOP language. It has objects-like patterns, encapsulation, and polymorphism via traits, but no classical inheritance.&lt;/li>
&lt;/ul>
&lt;p>So if you mean “most typical OOP languages,” the strongest examples are usually Java, C++, C#, Python, and Ruby.&lt;/p>
&lt;h4>Multi-Paradigm?&lt;span class="absolute -mt-20" id="multi-paradigm">&lt;/span>
&lt;a href="#multi-paradigm" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>A multi-paradigm language supports more than one programming style well.&lt;/p>
&lt;p>For example, in Python you can write:&lt;/p>
&lt;ul>
&lt;li>OOP: classes and objects&lt;/li>
&lt;li>procedural: plain functions and step-by-step logic&lt;/li>
&lt;li>functional-style: map, filter, lambdas, immutability patterns&lt;/li>
&lt;/ul>
&lt;p>So “multi-paradigm” means the language does not force you into just one model.&lt;/p>
&lt;p>Examples:&lt;/p>
&lt;ul>
&lt;li>Java is mostly associated with OOP, though it also supports other styles.&lt;/li>
&lt;li>Python is strongly multi-paradigm.&lt;/li>
&lt;li>JavaScript is also multi-paradigm.&lt;/li>
&lt;li>Rust is multi-paradigm too, but not OOP-first.&lt;/li>
&lt;/ul>
&lt;p>In short:&lt;/p>
&lt;ul>
&lt;li>OOP language = centered mainly on objects/classes&lt;/li>
&lt;li>multi-paradigm language = can do OOP, but also other styles naturally&lt;/li>
&lt;/ul></description></item><item><title>Inline 4 Engines: Balance and Vibrations</title><link>https://JAlcocerT.github.io/JAlcocerT/inline-4-engine-balance/</link><pubDate>Wed, 01 Apr 2026 06:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/inline-4-engine-balance/</guid><description>
&lt;p>&lt;strong>TL;DR&lt;/strong>&lt;/p>
&lt;p>Getting right the slider-crank mechanism (2D) via MBSD to later form a 3D ICE I4 Vibration Simulation&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/coolresources/video/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Video | Docs ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/coolresources/race/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Racing | Docs ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>This channel has awsome &lt;a href="#about-engine-balance" >videos explaining engine balance&lt;/a>&lt;/p>
&lt;p>But i wanted to make my own.&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/ABzKNvJCl28" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- &lt;https://www.youtube.com/watch?v=ABzKNvJCl28> -->
&lt;ul>
&lt;li>&lt;a href="http://firsttimeprogrammer.blogspot.com/2015/02/crankshaft-connecting-rod-and-piston.html" target="_blank" rel="noopener">http://firsttimeprogrammer.blogspot.com/2015/02/crankshaft-connecting-rod-and-piston.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3>Enough Theory for Balance&lt;span class="absolute -mt-20" id="enough-theory-for-balance">&lt;/span>
&lt;a href="#enough-theory-for-balance" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>In other words: whats the minimum physics context for an LLM to do this right?&lt;/p>
&lt;p>+++ some &lt;a href="#references" >references&lt;/a> below&lt;/p>
&lt;!-- $$
\begin{aligned}
\nabla \cdot \mathbf{E} &amp;= \frac{\rho}{\varepsilon_0} \\
\nabla \cdot \mathbf{B} &amp;= 0 \\
\nabla \times \mathbf{E} &amp;= -\frac{\partial \mathbf{B}}{\partial t} \\
\nabla \times \mathbf{B} &amp;= \mu_0 \left( \mathbf{J} + \varepsilon_0 \frac{\partial \mathbf{E}}{\partial t} \right)
\end{aligned}
$$ -->
&lt;p>Complete mathematical equations for the slider-crank mechanism used in engine balance simulation.&lt;/p>
&lt;ol>
&lt;li>Coordinate System &amp;amp; Geometry&lt;/li>
&lt;/ol>
&lt;p>1.1 Coordinate System Definition&lt;/p>
&lt;p>&lt;strong>2D Cartesian system:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Origin&lt;/strong>: At crank pivot (crankshaft axis)&lt;/li>
&lt;li>&lt;strong>X-axis&lt;/strong>: Horizontal, pointing toward the slider (piston) at $\theta = 0°$&lt;/li>
&lt;li>&lt;strong>Y-axis&lt;/strong>: Vertical, perpendicular to X (right-hand rule)&lt;/li>
&lt;li>&lt;strong>Rotation&lt;/strong>: Crank rotates counterclockwise (positive $\theta$ direction)&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Units (all equations use SI base + mm for length):&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Length: mm&lt;/li>
&lt;li>Mass: kg&lt;/li>
&lt;li>Force: N (= kg⋅mm/s²)&lt;/li>
&lt;li>Torque: N⋅mm&lt;/li>
&lt;li>Angular velocity: rad/s&lt;/li>
&lt;li>Time: s&lt;/li>
&lt;/ul>
&lt;p>1.2 Mechanism Definition&lt;/p>
&lt;p>&lt;strong>Parameters:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>$r$ = crank radius (L_crank) [mm]&lt;/li>
&lt;li>$L$ = connecting rod length (L_rod) [mm]&lt;/li>
&lt;li>$\theta$ = crank angle from X-axis [rad]&lt;/li>
&lt;li>$\varphi$ = connecting rod angle from X-axis [rad]&lt;/li>
&lt;li>$x$ = slider position along X-axis [mm]&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Constraint equations:&lt;/strong>&lt;/p>
&lt;p>$$r \cos(\theta) + L \cos(\varphi) = x \quad \text{&amp;hellip;(1.1)}$$&lt;/p>
&lt;p>$$r \sin(\theta) + L \sin(\varphi) = 0 \quad \text{&amp;hellip;(1.2)}$$&lt;/p>
&lt;ol start="2">
&lt;li>Kinematics&lt;/li>
&lt;/ol>
&lt;p>2.1 Slider Position&lt;/p>
&lt;p>From constraint (1.2): $\sin(\varphi) = -\frac{r \sin(\theta)}{L}$&lt;/p>
&lt;p>Therefore: $\cos(\varphi) = \sqrt{1 - \sin^2(\varphi)} = \frac{\sqrt{L^2 - r^2 \sin^2(\theta)}}{L}$&lt;/p>
&lt;p>&lt;strong>Slider position:&lt;/strong>&lt;/p>
&lt;p>$$x(\theta) = r \cos(\theta) + \sqrt{L^2 - r^2 \sin^2(\theta)}$$&lt;/p>
&lt;p>&lt;strong>Standard form with $\lambda = r/L$:&lt;/strong>&lt;/p>
&lt;p>$$x(\theta) = r\left[\cos(\theta) + \sqrt{1 - \lambda^2 \sin^2(\theta)}\right]$$&lt;/p>
&lt;p>&lt;strong>Physical range:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Minimum: $x_{\min} = L - r$ (when $\theta = \pi$)&lt;/li>
&lt;li>Maximum: $x_{\max} = L + r$ (when $\theta = 0$)&lt;/li>
&lt;li>Stroke: $S = x_{\max} - x_{\min} = 2r$&lt;/li>
&lt;/ul>
&lt;p>2.2 Slider Velocity&lt;/p>
&lt;p>Using the chain rule: $v_x = \frac{dx}{dt} = \frac{dx}{d\theta} \cdot \omega$&lt;/p>
&lt;p>&lt;strong>Slider velocity:&lt;/strong>&lt;/p>
&lt;p>$$v_x(\theta) = \omega r \sin(\theta) \frac{\sqrt{L^2 - r^2 \sin^2(\theta)} + r \cos(\theta)}{\sqrt{L^2 - r^2 \sin^2(\theta)}}$$&lt;/p>
&lt;p>&lt;strong>Compact form:&lt;/strong>&lt;/p>
&lt;p>$$v_x = \frac{r \omega \sin(\theta)}{[1 - (r/L)^2 \sin^2(\theta)]^{1/2}} \times \left[1 + \frac{(r/L) \cos(\theta)}{\sqrt{1 - (r/L)^2 \sin^2(\theta)}}\right]$$&lt;/p>
&lt;p>2.3 Slider Acceleration&lt;/p>
&lt;p>&lt;strong>Acceleration formula:&lt;/strong>&lt;/p>
&lt;p>$$a_x(\theta) = r \omega^2 \left[\cos(\theta) + \frac{(r/L) \cos(2\theta)}{\sqrt{1 - (r/L)^2 \sin^2(\theta)}}\right]$$&lt;/p>
&lt;p>&lt;strong>Alternative expanded form:&lt;/strong>&lt;/p>
&lt;p>$$a_x = r \omega^2 \cos(\theta) + \frac{r^2 \omega^2 \cos(2\theta)}{\sqrt{L^2 - r^2 \sin^2(\theta)}}$$&lt;/p>
&lt;p>&lt;strong>Physical interpretation:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>First term: primary acceleration (2× fundamental frequency)&lt;/li>
&lt;li>Second term: secondary acceleration component (4× fundamental frequency)&lt;/li>
&lt;/ul>
&lt;p>2.4 Connecting Rod Angle&lt;/p>
&lt;p>From constraint (1.2):&lt;/p>
&lt;p>$$\varphi(\theta) = -\arcsin\left(\lambda \sin(\theta)\right) \quad \text{where} \quad \lambda = \frac{r}{L}$$&lt;/p>
&lt;p>2.5 Rod Angular Velocity&lt;/p>
&lt;p>$$\omega_{\text{rod}}(\theta) = -\frac{\omega r \cos(\theta)}{\sqrt{L^2 - r^2 \sin^2(\theta)}} = -\frac{\omega r \cos(\theta)}{L \cos(\varphi)}$$&lt;/p>
&lt;p>2.6 Rod Angular Acceleration&lt;/p>
&lt;p>$$\alpha_{\text{rod}} = \frac{d\omega_{\text{rod}}}{dt} = \frac{d^2\varphi}{dt^2}$$&lt;/p>
&lt;ol start="3">
&lt;li>Dynamics &amp;amp; Forces&lt;/li>
&lt;/ol>
&lt;p>3.1 Assumptions&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Rigid bodies&lt;/strong>: No deformation; all masses are point masses or have defined inertias&lt;/li>
&lt;li>&lt;strong>No friction&lt;/strong>: Ideal pins/bearings&lt;/li>
&lt;li>&lt;strong>Constant angular velocity&lt;/strong>: Crankshaft rotates at constant $\omega$&lt;/li>
&lt;li>&lt;strong>Massless constraints&lt;/strong>: Slider pin and crank pin have negligible mass&lt;/li>
&lt;li>&lt;strong>2D planar motion&lt;/strong>: All motion in X–Y plane; no Z-axis components&lt;/li>
&lt;li>&lt;strong>No combustion forces&lt;/strong>: Initial phase uses external motor to drive crank&lt;/li>
&lt;/ol>
&lt;p>3.2 Component Masses &amp;amp; Inertias&lt;/p>
&lt;p>&lt;strong>Crank:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Mass: $m_{\text{crank}}$ [kg]&lt;/li>
&lt;li>Moment of inertia about pivot: $I_{\text{crank}}$ [kg⋅mm²]&lt;/li>
&lt;li>Center of mass location: $R_{\text{cg,crank}}$ [mm]&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Connecting Rod:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Mass: $m_{\text{rod}}$ [kg]&lt;/li>
&lt;li>Length: $L$ [mm]&lt;/li>
&lt;li>Moment of inertia about center of mass: $I_{\text{rod,cm}}$ [kg⋅mm²]&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Slider (piston):&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Mass: $m_{\text{slider}}$ [kg]&lt;/li>
&lt;/ul>
&lt;p>3.3 Inertial Forces on Slider&lt;/p>
&lt;p>$$F_{\text{inertia}} = m_{\text{slider}} \cdot a_x(\theta) = m_{\text{slider}} \cdot r \omega^2 \left[\cos(\theta) + \frac{(r/L) \cos(2\theta)}{\sqrt{1 - (r/L)^2 \sin^2(\theta)}}\right]$$&lt;/p>
&lt;p>3.4 Force in Connecting Rod&lt;/p>
&lt;p>&lt;strong>Rod internal force (for massless rod):&lt;/strong>&lt;/p>
&lt;p>$$F_{\text{rod,axial}} = \frac{m_{\text{slider}} \cdot a_x}{\cos(\varphi)}$$&lt;/p>
&lt;p>3.5 Crank Pin Force&lt;/p>
&lt;p>&lt;strong>Components:&lt;/strong>&lt;/p>
&lt;p>$$F_{\text{rod,x}} = F_{\text{rod}} \cos(\varphi)$$&lt;/p>
&lt;p>$$F_{\text{rod,y}} = F_{\text{rod}} \sin(\varphi)$$&lt;/p>
&lt;p>&lt;strong>Magnitude:&lt;/strong>&lt;/p>
&lt;p>$$|F_{\text{rod}}| = \sqrt{F_{\text{rod,x}}^2 + F_{\text{rod,y}}^2}$$&lt;/p>
&lt;p>3.6 Torque on Crankshaft&lt;/p>
&lt;p>&lt;strong>Torque from slider inertial force:&lt;/strong>&lt;/p>
&lt;p>$$\tau_{\text{slider}} = F_{\text{rod}} \cdot r \sin(\theta - \varphi) = \frac{m_{\text{slider}} a_x \cdot r \sin(\theta - \varphi)}{\cos(\varphi)}$$&lt;/p>
&lt;p>&lt;strong>Simplified (massless rod, constant $\omega$):&lt;/strong>&lt;/p>
&lt;p>$$\tau(\theta) = m_{\text{slider}} r \omega^2 \left[\cos(\theta) + \frac{(r/L) \cos(2\theta)}{\sqrt{1 - (r/L)^2 \sin^2(\theta)}}\right] \sin(\theta - \varphi(\theta))$$&lt;/p>
&lt;p>3.7 Ground Reaction Force on Slider&lt;/p>
&lt;p>&lt;strong>Force balance on slider:&lt;/strong>&lt;/p>
&lt;p>$$m_{\text{slider}} a_x = F_{\text{rod}} \cos(\varphi) - F_{\text{ground,x}}$$&lt;/p>
&lt;p>&lt;strong>Components:&lt;/strong>&lt;/p>
&lt;p>$$F_{\text{ground,x}} = F_{\text{rod}} \cos(\varphi) - m_{\text{slider}} a_x$$&lt;/p>
&lt;p>$$F_{\text{ground,y}} = -F_{\text{rod}} \sin(\varphi)$$&lt;/p>
&lt;p>&lt;strong>Magnitude:&lt;/strong>&lt;/p>
&lt;p>$$|F_{\text{ground}}| = \sqrt{F_{\text{ground,x}}^2 + F_{\text{ground,y}}^2}$$&lt;/p>
&lt;ol start="4">
&lt;li>Reaction Forces at Bearings&lt;/li>
&lt;/ol>
&lt;p>4.1 Crank Bearing Force&lt;/p>
&lt;p>The crank bearing must support:&lt;/p>
&lt;ol>
&lt;li>The reaction force from the rod&lt;/li>
&lt;li>The centrifugal force of the crank mass&lt;/li>
&lt;li>Weight of crank (if vertical support needed)&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Acceleration of crank center-of-mass:&lt;/strong>&lt;/p>
&lt;p>Position of crank CG: $x_{\text{cg}} = R_{\text{cg}} \cos(\theta)$, $y_{\text{cg}} = R_{\text{cg}} \sin(\theta)$&lt;/p>
&lt;p>Acceleration:
$$a_{\text{cg,x}} = -R_{\text{cg}} \omega^2 \cos(\theta)$$
$$a_{\text{cg,y}} = -R_{\text{cg}} \omega^2 \sin(\theta)$$&lt;/p>
&lt;p>&lt;strong>Bearing reaction force:&lt;/strong>&lt;/p>
&lt;p>$$\vec{F}&lt;em>{\text{bearing}} = \vec{F}&lt;/em>{\text{rod}} + m_{\text{crank}} \vec{a}_{\text{cg}}$$&lt;/p>
&lt;p>$$F_{\text{bearing,x}} = F_{\text{rod,x}} - m_{\text{crank}} R_{\text{cg}} \omega^2 \cos(\theta)$$&lt;/p>
&lt;p>$$F_{\text{bearing,y}} = F_{\text{rod,y}} - m_{\text{crank}} R_{\text{cg}} \omega^2 \sin(\theta)$$&lt;/p>
&lt;p>4.2 Multi-Cylinder: Total Bearing Force&lt;/p>
&lt;p>For an engine with multiple cylinders at angles $\theta_1, \theta_2, \ldots, \theta_N$:&lt;/p>
&lt;p>$$F_{\text{total,x}}(\theta) = \sum_i \left[F_{\text{rod,i}} \cos(\varphi_i) - m_{\text{crank}} R_{\text{cg}} \omega^2 \cos(\theta_i)\right]$$&lt;/p>
&lt;p>$$F_{\text{total,y}}(\theta) = \sum_i \left[F_{\text{rod,i}} \sin(\varphi_i) - m_{\text{crank}} R_{\text{cg}} \omega^2 \sin(\theta_i)\right]$$&lt;/p>
&lt;p>&lt;strong>Magnitude:&lt;/strong>&lt;/p>
&lt;p>$$|F_{\text{bearing,total}}| = \sqrt{F_{\text{total,x}}^2 + F_{\text{total,y}}^2}$$&lt;/p>
&lt;ol start="5">
&lt;li>Vibration Analysis&lt;/li>
&lt;/ol>
&lt;p>5.1 Harmonic Decomposition (FFT)&lt;/p>
&lt;p>The bearing reaction force can be decomposed into harmonics:&lt;/p>
&lt;p>$$F_{\text{bearing}}(t) = F_0 + \sum_{n=1}^{\infty} \left[F_n \cos(n \omega t + \phi_n)\right]$$&lt;/p>
&lt;p>&lt;strong>Harmonic amplitude extraction:&lt;/strong>&lt;/p>
&lt;p>$$F_n = \frac{1}{\pi} \int_0^{2\pi} F_{\text{bearing}}(\theta) \cos(n \theta) , d\theta$$&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Primary imbalance&lt;/strong> (1st order): $n = 1$, frequency = $1 \times \text{RPM}$&lt;/li>
&lt;li>&lt;strong>Secondary imbalance&lt;/strong> (2nd order): $n = 2$, frequency = $2 \times \text{RPM}$&lt;/li>
&lt;li>&lt;strong>Tertiary imbalance&lt;/strong> (3rd order): $n = 3$, frequency = $3 \times \text{RPM}$&lt;/li>
&lt;/ul>
&lt;p>5.2 Frequency Response&lt;/p>
&lt;p>For each harmonic, the vibration amplitude depends on resonance:&lt;/p>
&lt;p>$$\text{Vibration amplitude} \propto \frac{F_n}{|k - n^2 \omega^2 m + j n \omega c|}$$&lt;/p>
&lt;p>where:&lt;/p>
&lt;ul>
&lt;li>$k$ = stiffness [N/mm]&lt;/li>
&lt;li>$m$ = mass [kg]&lt;/li>
&lt;li>$c$ = damping [N·s/mm]&lt;/li>
&lt;li>$j$ = imaginary unit&lt;/li>
&lt;/ul>
&lt;ol start="6">
&lt;li>Special Cases &amp;amp; Simplifications&lt;/li>
&lt;/ol>
&lt;p>6.1 Infinite Rod Approximation ($L \to \infty$)&lt;/p>
&lt;p>When rod length is much larger than crank ($L &amp;raquo; r$), the rod angle $\varphi \approx 0$:&lt;/p>
&lt;p>$$x(\theta) \approx r \cos(\theta) + L$$&lt;/p>
&lt;p>$$v_x(\theta) \approx -r \omega \sin(\theta)$$&lt;/p>
&lt;p>$$a_x(\theta) \approx -r \omega^2 \cos(\theta) \quad \text{(simple harmonic)}$$&lt;/p>
&lt;p>6.2 Four-Stroke Cycle with Gas Pressure&lt;/p>
&lt;p>If we include combustion/pressure forces:&lt;/p>
&lt;p>$$F_{\text{gas}}(\theta) = p(\theta) \cdot A_{\text{piston}} \quad [\text{N}]$$&lt;/p>
&lt;p>where $p(\theta)$ is the gas pressure curve and $A_{\text{piston}}$ is the piston area.&lt;/p>
&lt;p>&lt;strong>Total force on slider:&lt;/strong>&lt;/p>
&lt;p>$$F_{\text{total}} = F_{\text{inertia}} + F_{\text{gas}} - F_{\text{ground}}$$&lt;/p>
&lt;p>Wait&amp;hellip;arent you gonna extend &lt;a href="https://jalcocert.github.io/JAlcocerT/2d-mbsd/" target="_blank" rel="noopener">the MBSD 2D simulator&lt;/a> already to 3D for this?&lt;/p>
&lt;p>Nop, im not.&lt;/p>
&lt;p>This is going to be equation based.&lt;/p>
&lt;p>No point reference coordinates this time :)&lt;/p>
&lt;h2>Engine Balance&lt;span class="absolute -mt-20" id="engine-balance">&lt;/span>
&lt;a href="#engine-balance" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Balance&amp;hellip;what is it?&lt;/p>
&lt;p>Vibrations?&lt;/p>
&lt;p>&lt;a href="#fast-fourier-transform" >FFT&lt;/a>?&lt;/p>
&lt;p>Forces?&lt;/p>
&lt;p>I just wanted to create my engine balance simulations as proof:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/mbsd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./mbsd&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You might do this without a mbsd framework like the one ive built.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/mbsd" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
MBSD | Repo&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/3Design" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
3Design | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;p>Just&amp;hellip;make the magic of the model and equation happen.&lt;/p>
&lt;p>You got x4 slider-cranks connected to a common axis&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/cFHyobRjcK0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;blockquote>
&lt;p>Yes, this one is &lt;a href="https://jalcocert.github.io/JAlcocerT/video-creation-with-remotion/" target="_blank" rel="noopener">based on remotion&lt;/a> :)&lt;/p>
&lt;/blockquote>
&lt;p>So you can model it as one axis that receives variable forces (the reaction ones that makes the crank stay in position) over time as it rotates&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./mbsd/2D-Dynamics
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make run-slider-crank-no-gravity&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/iNl3s09BLoA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Or you can start from the beginning.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/VideoEditionRemorion" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Remotion x Video | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;h3>Inline 4&lt;span class="absolute -mt-20" id="inline-4">&lt;/span>
&lt;a href="#inline-4" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>After all of this modelling: &lt;em>how about visualizing?&lt;/em>&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/VideoEditionRemorion" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Remotion x Video | Repo&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/engine-balance" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Engine Balance | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;p>For this post, i want to test how good the current LLMs are without much context:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git init &amp;amp;&amp;amp; git add . &amp;amp;&amp;amp; git commit -m &amp;#34;Initial commit: Starting engine balance repo&amp;#34; &amp;amp;&amp;amp; gh repo create engine-balance --private --source=. --remote=origin --push&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/engine-balance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Will it be able to generate a proper physics engine&lt;/p>
&lt;p>with an output data model that can be re-used for remotion animations?&lt;/p>
&lt;p>oh and also&amp;hellip;&lt;/p>
&lt;p>being able to say in the future which of the engine configuration is best for the balance&lt;/p>
&lt;p>with&amp;hellip;proper why&amp;rsquo;s?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">i want to create a way to simulate in python a slider-crank, being able to animate it and to have in any given point the position, speed, aceleration and forces (including the reaction forces between the bars).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The later goal will be to take few of this slider cranks and make simulation of engine balance at the axis for few configurations, like I4, I6, V8 etc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">can we create a brd.md to define all of this?&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">thats sounds good, with the export data we would be able to animate it later on with other frameworks like remotionJS, blender etc?&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>BRD.md: &amp;ldquo;What &amp;amp; Why&amp;rdquo; (requirements, architecture, scope)&lt;/li>
&lt;li>equations.md: &amp;ldquo;The Physics&amp;rdquo; (math model, coordinate system, all equations)&lt;/li>
&lt;li>dev-phases.md: &amp;ldquo;The Code&amp;rdquo; (concrete tasks, references, examples, testing)&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">before starting, can you define a Out of Scope section? Also, for starters we can make the tests with matplotlib, I will let you know later own which ultimamte presentation layer I want, as the output will go mostlikely to youtube&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Here is where you noticed those P1 estimations of 2-3 weeks still.&lt;/p>
&lt;p>When its&amp;hellip;20-30 minutes already:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">then create a dev-phases.md where you can reference from brd and equations.md what we are doing, the uv python environment is ready for you&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!--
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/iNl3s09BLoA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
-->
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make explore &lt;span class="c1">#from the p3.1&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>With this we can understand the expected engine balance in a table:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/force_vector_animation.gif" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>And with this one, the force locus of the I4:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">. .venv/bin/activate &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> pytest tests/test_balance.py::TestForceAnimation -v&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/force_locus_3d.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>It&amp;rsquo;s a 3D curve showing how the magnitude and direction of the total bearing force evolves from 0° to 360° of crank rotation.&lt;/p>
&lt;p>I also made couple more tinkering with the p3.3&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make decompose &lt;span class="c1"># Output: output/i4_harmonics/, output/i6_harmonics/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make rpm-sweep &lt;span class="c1"># Output: output/i4_rpm/, output/i6_rpm/&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>What it is: 3D trajectory of bearing force over one crank cycle&lt;/p>
&lt;p>The 3D space: X (Fx) × Y (Fy) × Z (crank angle), color-coded by progression&lt;/p>
&lt;p>Engine comparisons:&lt;/p>
&lt;ul>
&lt;li>I4: Large tilted bowtie (secondary-heavy, needs balancer shafts)&lt;/li>
&lt;li>I6: Thin vertical line near origin (nearly perfect balance)&lt;/li>
&lt;li>I3/I5: Symmetric stars (excellent primary balance)&lt;/li>
&lt;li>V8: Moderate bowtie (good compromise)&lt;/li>
&lt;li>V12: Smallest locus (pinnacle of smoothness)&lt;/li>
&lt;/ul>
&lt;p>How to interpret: Shape = balance quality, size = imbalance magnitude, pattern = harmonic content&lt;/p>
&lt;p>Why it matters: Makes abstract force numbers visceral — seeing I4&amp;rsquo;s force vector wildly swing vs I6&amp;rsquo;s barely moving is instant physics understanding&lt;/p>
&lt;p>Generation methods: make explore, make animate-forces, or Python script&lt;/p>
&lt;p>Physical explanation: Why I4 needs balancer shafts, why I6 is perfect despite having 6 cylinders&lt;/p>
&lt;h2>About Engine Balance&lt;span class="absolute -mt-20" id="about-engine-balance">&lt;/span>
&lt;a href="#about-engine-balance" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The best video I found about &lt;strong>engine balance&lt;/strong>:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/mTS48jX68YU" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- can you summarize this video? https://www.youtube.com/watch?v=mTS48jX68YU&amp;t=82s -->
&lt;p>Then provide a summary and pros and cons of the balance of each engine type discussed&lt;/p>
&lt;p>The video titled &lt;strong>&amp;ldquo;ENGINE BALANCE: Inline 6 vs. V6 vs. VR6 vs. Flat / Boxer 6&amp;rdquo;&lt;/strong> compares the balance, packaging, strengths, and weaknesses of four common six-cylinder engine layouts: the &lt;strong>inline-six&lt;/strong>, &lt;strong>V6&lt;/strong>, &lt;strong>VR6&lt;/strong>, and &lt;strong>flat-six/boxer-six&lt;/strong>.&lt;/p>
&lt;p>Each configuration represents a specific engineering trade-off between &lt;strong>smoothness&lt;/strong>, &lt;strong>size&lt;/strong>, and &lt;strong>mechanical complexity&lt;/strong>.&lt;/p>
&lt;ol>
&lt;li>Inline-6 (I6)&lt;/li>
&lt;/ol>
&lt;p>The &lt;strong>inline-six&lt;/strong> is widely regarded as the smoothest and simplest of the group.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Characteristics:&lt;/strong> Excellent inherent balance and an even firing interval. Runs smoothly without needing heavy balancing aids.&lt;/li>
&lt;li>&lt;strong>Design:&lt;/strong> Mechanically straightforward, typically using only one cylinder head.&lt;/li>
&lt;li>&lt;strong>Drawbacks:&lt;/strong> Difficult to fit in tight engine bays (especially transverse layouts) due to its significant length.&lt;/li>
&lt;li>&lt;strong>Pros:&lt;/strong> Simple design, excellent balance, smooth operation.&lt;/li>
&lt;li>&lt;strong>Cons:&lt;/strong> Long overall length makes packaging difficult.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>V6&lt;/li>
&lt;/ol>
&lt;p>Developed largely to solve the packaging limitations of the inline-six.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Characteristics:&lt;/strong> Splitting cylinders into two banks makes it much shorter and versatile for various engine bays.&lt;/li>
&lt;li>&lt;strong>Design:&lt;/strong> More complex; typically requires two cylinder heads and duplicated components (cams, manifolds).&lt;/li>
&lt;li>&lt;strong>Drawbacks:&lt;/strong> Lacks the natural balance of an I6; smoothness depends on bank angle (e.g., 60° vs 90°) and balancing shafts.&lt;/li>
&lt;li>&lt;strong>Pros:&lt;/strong> Compact, easy to package, fits transverse layouts.&lt;/li>
&lt;li>&lt;strong>Cons:&lt;/strong> Less inherently balanced, higher mechanical complexity.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>VR6&lt;/li>
&lt;/ol>
&lt;p>A narrow-angle hybrid design that blends I6 and V6 characteristics.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Characteristics:&lt;/strong> A &amp;ldquo;staggered&amp;rdquo; six-cylinder that is narrower than a V6 and shorter than an I6.&lt;/li>
&lt;li>&lt;strong>Design:&lt;/strong> Uses a single cylinder head despite the two banks, which simplifies the package compared to a traditional V.&lt;/li>
&lt;li>&lt;strong>Drawbacks:&lt;/strong> A packaging compromise; involves uneven port geometry and more engineering complexity than a straight-six.&lt;/li>
&lt;li>&lt;strong>Pros:&lt;/strong> Extremely compact, efficient packaging.&lt;/li>
&lt;li>&lt;strong>Cons:&lt;/strong> Not as naturally balanced as an I6, complex internal geometry.&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>Flat-6 / Boxer-6&lt;/li>
&lt;/ol>
&lt;p>A horizontally opposed layout known for high-performance applications.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Characteristics:&lt;/strong> Exceptionally smooth with a very low center of gravity and a short, stiff crankshaft.&lt;/li>
&lt;li>&lt;strong>Design:&lt;/strong> Pairs of pistons move in opposite directions, canceling out vibrations (in a true Boxer).&lt;/li>
&lt;li>&lt;strong>Drawbacks:&lt;/strong> The engine is very wide, which can interfere with suspension components or frame rails.&lt;/li>
&lt;li>&lt;strong>Pros:&lt;/strong> Excellent balance, low center of gravity, responsive performance.&lt;/li>
&lt;li>&lt;strong>Cons:&lt;/strong> High manufacturing cost, wide layout, complex packaging.&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Layout&lt;/th>
&lt;th style="text-align:left">Primary Strength&lt;/th>
&lt;th style="text-align:left">Primary Weakness&lt;/th>
&lt;th style="text-align:left">Best For&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Inline-6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Perfect Balance&lt;/td>
&lt;td style="text-align:left">Total Length&lt;/td>
&lt;td style="text-align:left">RWD Luxury &amp;amp; Sport&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>V6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Packaging&lt;/td>
&lt;td style="text-align:left">Complexity&lt;/td>
&lt;td style="text-align:left">FWD &amp;amp; Universal Use&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>VR6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Compactness&lt;/td>
&lt;td style="text-align:left">Port Complexity&lt;/td>
&lt;td style="text-align:left">Small Engine Bays&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Flat-6&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Low Center of Gravity&lt;/td>
&lt;td style="text-align:left">Total Width&lt;/td>
&lt;td style="text-align:left">High-Performance Sport&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>&lt;strong>Conclusion:&lt;/strong> Rather than there being one universally &amp;ldquo;best&amp;rdquo; design, each configuration is chosen based on what engineers value most for a specific vehicle platform.&lt;/p>
&lt;/blockquote>
&lt;!--
The video titled "ENGINE BALANCE: Inline 6 vs. V6 vs. VR6 vs. Flat / Boxer 6" discusses the engine balance, strengths, and weaknesses of four popular six-cylinder engine configurations: the inline six, the V6, the VR6, and the flat six.
Here are the summaries and pros and cons of each engine type discussed:
Inline 6: This engine configuration is simple and balanced.
It only needs one cylinder head, one or two cams, and one exhaust manifold.
However, its length is a downside as it's difficult to fit transversely in an engine bay.
It's hard to fault the inline six other than its length.
Pros: Simple design, beautifully balanced, even firing interval.
Cons: Its length makes it difficult to fit in some engine bays.
V6: The V6 was created to address the length issue of the inline six. It's shorter and easier to fit transversely in an engine bay. However, it loses the inherent primary balance of the inline six and needs engineering aids like balancing shafts or crankshaft counterweights to achieve smoothness.
Pros: Compact design, easier to fit in engine bays.
Cons: Loses inherent primary balance of inline six, needs engineering aids for smoothness, more complex with double the number of cylinder heads, cams, and exhaust manifolds compared to inline six.
VR6: The VR6 is essentially a V6 but with an extremely narrow angle between the banks. It's compact like a V6 but without the double cylinder heads, cams, exhaust manifolds, and other components, while preserving the inherent balanced nature of the inline six.
Pros: Compact, better balanced than a generic V6, simpler than a V6.
Cons: Not as simple as an inline six, needs slanted pistons and additional crankshaft counterweights, differences in length between intake and exhaust ports can result in different power and torque curves.
Flat / Boxer 6: The flat six, or more accurately a boxer six, is perfectly balanced and has a very short and light crankshaft. However, it's the most complex engine configuration of all four discussed and is difficult to package due to its width.
Pros: Perfectly balanced, light crankshaft, rev-happy engine.
Cons: Most complex engine configuration, difficult to package due to its width, most expensive and complex engine to manufacture.
In conclusion, each engine type has its own strengths and weaknesses. The inline six is simple and balanced but long, the V6 is compact but less balanced, the VR6 is a compact and simpler version of a V6 but not as simple as an inline six, and the flat/boxer six is perfectly balanced and light but complex and wide.
-->
&lt;h4>Primary Balance&lt;span class="absolute -mt-20" id="primary-balance">&lt;/span>
&lt;a href="#primary-balance" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>This is the obvious one.&lt;/p>
&lt;p>The pistons are moving in between and stop at the top/bottom.&lt;/p>
&lt;h4>Secondary Balance&lt;span class="absolute -mt-20" id="secondary-balance">&lt;/span>
&lt;a href="#secondary-balance" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Blame it to &lt;del>the boogie&lt;/del> Archimedes.&lt;/p>
&lt;p>Some time ago I recorded this unexpected video &lt;em>in a restaurant&lt;/em>:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/DlmN-Z_Ry6M" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://www.youtube.com/watch?v=DlmN-Z_Ry6M -->
&lt;h3>Who said Remotion?&lt;span class="absolute -mt-20" id="who-said-remotion">&lt;/span>
&lt;a href="#who-said-remotion" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>And the thing goes from &lt;a href="https://jalcocert.github.io/JAlcocerT/video-creation-with-remotion/" target="_blank" rel="noopener">this RemotionJS experience&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">if someone would like to take the script you have prepared to make a V8 engine video using the python scripts that are having perfectly defined the slider-cranks and the angles and so on, what should it know?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">create a hand over for the next agent to take advantage of all our work at a summary-for-remotion.md&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/engine-balance&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude #/skills &lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-13">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">if someone would like to take the script you have prepared to make a V8 engine video using the python scripts that are having perfectly defined the slider-cranks and the angles and so on, what should it know?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">create a hand over for the next agent to take advantage of all our work at a summary-for-remotion.md&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-13"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-14">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl"> lets write these choices at a summary-remotion-choices.md
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> i want a 3D realistic engine model were we can see the pistons moving according to the data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> generated by python. for now, lets create a single static video (i guess we can add
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> diferent remotion scripts later on). The data generation part is done in python, read the
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> summary-for-remotion and see the makefile to know how. Id like a modern polished UI.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 1920x1080 and 30fps is fine. No forces with augmented reality for now.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-14"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-15">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx create-video@latest&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx skills add remotion-dev/skills&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx skills list&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./engine-balance/remotion-v8-video
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run dev&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-15"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-yellow-100 bg-yellow-50 text-yellow-900 dark:border-yellow-200/30 dark:bg-yellow-700/30 dark:text-yellow-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
⚠️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
This has all been a test for LLMs understanding of mechanics. Treat the post accordingly.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>When you are happy enough, render that composition:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-16">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npx remotion render V8CrankMechanism v8-test.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-16"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!--
https://youtu.be/Vrdphl04gas
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/Vrdphl04gas" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;blockquote>
&lt;p>waste of tokens &lt;code>.mp4&lt;/code> :)&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>Or in other words: nah, AI is a joke&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;p>Someone told me that she sees the difference when I talk with passion&lt;/p>
&lt;p>Versus when I talk for the money&lt;/p>
&lt;p>If you want to convince her that there is no such gap:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/tiersofservice/dwi/selfh-landing-astro-fastapi-bot.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Cars for Track Days?&lt;span class="absolute -mt-20" id="cars-for-track-days">&lt;/span>
&lt;a href="#cars-for-track-days" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;a href="https://www.reddit.com/r/BMW/comments/1ez7ims/why_is_the_z4_e86_so_underrated/" target="_blank" rel="noopener">Some say&lt;/a> that the BMW z4 e86 is underated.&lt;/p>
&lt;p>You have ~2007 units for ~10k$ as shown &lt;a href="https://www.youtube.com/watch?v=5hRuWLrdV6k" target="_blank" rel="noopener">here&lt;/a>&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/coolresources/race/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Racing | Docs ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>Im well aware that some people do cool stuff on the tracks with their bmw (BMW e86).&lt;/p>
&lt;h3>Fast Fourier Transform?&lt;span class="absolute -mt-20" id="fast-fourier-transform">&lt;/span>
&lt;a href="#fast-fourier-transform" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The good old FFT&amp;hellip;&lt;/p>
&lt;h3>References&lt;span class="absolute -mt-20" id="references">&lt;/span>
&lt;a href="#references" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;strong>Engine Balance Theory&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>Norton, R.L. &amp;ldquo;Design of Machinery&amp;rdquo; 5th ed., Chapter 14 (Engine Balance)&lt;/li>
&lt;li>Heywood, J.B. &amp;ldquo;Internal Combustion Engine Fundamentals&amp;rdquo;, Chapter 3 (Kinematics &amp;amp; Dynamics)&lt;/li>
&lt;li>SAE J670e &amp;ldquo;Engine Sound Quality&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>FFT &amp;amp; Harmonic Analysis&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>Welch, P.D. &amp;ldquo;The use of fast Fourier transform for estimation of power spectra&amp;rdquo; (IEEE Trans. Audio Electroacoustics, 1967)&lt;/li>
&lt;li>NumPy FFT documentation: &lt;a href="https://numpy.org/doc/stable/reference/fft.html" target="_blank" rel="noopener">https://numpy.org/doc/stable/reference/fft.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>This Project&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>BRD.md § 4.3 — Balance Analysis Requirements&lt;/li>
&lt;li>equations.md § 3-4 — Kinematics &amp;amp; Dynamics Equations&lt;/li>
&lt;li>dev-phases.md § 2.2 — Phase 2.2 Specification&lt;/li>
&lt;/ul></description></item><item><title>From Idea to Resolution</title><link>https://JAlcocerT.github.io/JAlcocerT/take-ideas-to-their-digital-resolution/</link><pubDate>Mon, 30 Mar 2026 07:00:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/take-ideas-to-their-digital-resolution/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Thoughts after one year of vibe coding.&lt;/p>
&lt;p>+++ &lt;a href="#eayp-v3" >EayP v3&lt;/a>&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>I stopped copy pasting from Gemini web UI and start using codex CLI, gemini cli and so on around one year ago.&lt;/p>
&lt;p>Later I tried windsurf, cursor and finally antigravity.&lt;/p>
&lt;p>Lately, Im paying claude PRO and im quite happy with the decision.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#irm https://claude.ai/install.ps1 | iex&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude install &lt;span class="c1">#it recently migrated from npm&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>You arent using this yet to create technical breakdowns and architectural design records?&lt;/p>
&lt;/blockquote>
&lt;p>The key is to think of prompting as a flow:&lt;/p>
&lt;p>Goal -&amp;gt; Context -&amp;gt; Instruction -&amp;gt; Contrains -&amp;gt; Output Format&lt;/p>
&lt;p>As we say here, its all about &lt;a href="https://jalcocert.github.io/JAlcocerT/a-diy-boilerplate-to-ship/#the-tech-talk" target="_blank" rel="noopener">the AI mindset&lt;/a>.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">given the pbip exported files and the data-lineage.md, can you put together a data-sources.md with all the the sources listed one by one, their paths and what data do they contain based on the context you have? some use case would also be great as per the dashboard context &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The productivity change &lt;a href="#what-i-have-shipped" >and learnings&lt;/a> has been massive.&lt;/p>
&lt;p>Who could have guessed: the more repetitions you do&lt;/p>
&lt;p>the more architecture you understand&lt;/p>
&lt;p>and the more predictable things become&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/dev/vibe-coding.png" alt="Vibe Coding - Simpsons Halloween S2" loading="lazy" />&lt;/p>
&lt;blockquote>
&lt;p>This is when I started moving from streamlit, to pure web apps.&lt;/p>
&lt;/blockquote>
&lt;h2>Key Concepts for solving problems&lt;span class="absolute -mt-20" id="key-concepts-for-solving-problems">&lt;/span>
&lt;a href="#key-concepts-for-solving-problems" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ol>
&lt;li>Repetitions&lt;/li>
&lt;/ol>
&lt;pre class="mermaid mt-6">flowchart LR
%% Styles
classDef state fill:#E3F2FD,stroke:#1565C0,stroke-width:2px,color:#0D47A1;
classDef start fill:#43A047,stroke:#1B5E20,stroke-width:2px,color:white;
%% Nodes
Start((Start)):::start --> More
More(Doing MORE):::state
Better(Doing BETTER):::state
Newer(Doing NEWER):::state
%% Internal Feedback Loops (The Grind)
More -- "Scale Up" --> More
Better -- "Refine" --> Better
Newer -- "Test" --> Newer
%% The Progression Journey
More -- "Capacity Hit" --> Better
Better -- "Optimized" --> Newer
%% The Upward Spiral
Newer -- "New Baseline" --> More&lt;/pre>&lt;p>Because with repetitions you go from a &lt;em>so so&lt;/em> &lt;a href="https://jalcocert.github.io/JAlcocerT/learnt-while-building-web-apps" target="_blank" rel="noopener">vibed coded web/app&lt;/a> to others that can really impress.&lt;/p>
&lt;ol start="2">
&lt;li>Where are you bringing value?&lt;/li>
&lt;/ol>
&lt;p>Net Profit and the value equation&lt;/p>
&lt;p>$$
P \times V \times GM \times OM \times IF \times T
$$&lt;/p>
&lt;p>Make P*V go up!&lt;/p>
&lt;pre class="mermaid mt-6">graph LR
%% 1. The Split
Start[Define] -->|Why| B[BRD]
Start -->|What| C[FRD]
Start -->|How| D[PRD]
%% 2. The Join
B &amp; C &amp; D --> E(Clarify)
%% 3. The Linear Flow
E --> F[Development Plan]
F --> G[Finished PoC]
%% Styling
style G fill:#f96,stroke:#333,stroke-width:4px
style Start fill:#bbf
style F fill:#e1f5fe&lt;/pre>&lt;p>Remember about defining OoS, avoid scope creep!&lt;/p>
&lt;blockquote>
&lt;p>B2C is extremely sensitive to the ,security/guarantees&amp;rsquo; part&lt;/p>
&lt;/blockquote>
&lt;ol start="3">
&lt;li>Value stream mapping &lt;a href="https://jalcocert.github.io/JAlcocerT/lean/#vsm" target="_blank" rel="noopener">VSM&lt;/a> x &lt;a href="https://jalcocert.github.io/JAlcocerT/pareto-principle-for-data-analytics/" target="_blank" rel="noopener">Pareto&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>Because 80% of what you do is non-sense for your client&lt;/p>
&lt;p>Just ship de 20% that matters, for the 20% of clients that value it the most&lt;/p>
&lt;pre class="mermaid mt-6">flowchart LR
%% --- Styles ---
classDef free fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20;
classDef low fill:#FFF9C4,stroke:#FBC02D,stroke-width:2px,color:#F57F17;
classDef mid fill:#FFE0B2,stroke:#F57C00,stroke-width:2px,color:#E65100;
classDef high fill:#FFCDD2,stroke:#C62828,stroke-width:2px,color:#B71C1C;
%% --- Nodes ---
L1("Free Content&lt;br/>(Blog/YT $0)"):::free
L2("DIY&lt;br/>(Templates / Platform) $"):::low
L3("Done With You&lt;br/>(Consulting) $$"):::mid
L4("Done For You&lt;br/>(Services) $$$"):::high
%% --- Connections ---
L1 --> L2
L2 --> L3
L3 --> L4&lt;/pre>&lt;p>Yea, avoid the 80% of clients that will give you the most headaches while paying the least.&lt;/p>
&lt;ol start="4">
&lt;li>Value is subjective: &lt;em>for you, your time is not a commodity, your client money is&lt;/em>.&lt;/li>
&lt;/ol>
&lt;p>This implies that given a product, client A is as good as client B.&lt;/p>
&lt;p>For a fee: you can create a loop to iterate across N clients via ads.&lt;/p>
&lt;ol start="5">
&lt;li>Risk avoidance is huge in us.&lt;/li>
&lt;/ol>
&lt;p>Particularly for B2C &amp;raquo; B2B (business tend to calculate ROIs and try to assign % somehow&amp;hellip;)&lt;/p>
&lt;blockquote>
&lt;p>when was the last time that you account for your &lt;em>human capital&lt;/em> (vital energy as a function of your time alive) getting depleted each day?&lt;/p>
&lt;/blockquote>
&lt;p>Is estability seeking killing our real nature?&lt;/p>
&lt;p>what are our real needs?&lt;/p>
&lt;p>how would we behave if they&amp;rsquo;d be satisfied?&lt;/p>
&lt;p>See how &lt;a href="https://github.com/JAlcocerT/Slider-Crank/blob/main/prompt-blueprint.md" target="_blank" rel="noopener">this great &lt;strong>prompt for UI blueprint&lt;/strong>&lt;/a> applied also to &lt;a href="https://github.com/JAlcocerT/ThreeBodies/blob/main/ThePoincareLab/z-tech-stack.md" target="_blank" rel="noopener">threebodies here&lt;/a> and&amp;hellip;around &lt;a href="https://github.com/JAlcocerT/btc-powerlaw/blob/master/GEMINI.md" target="_blank" rel="noopener">the power law&lt;/a> :)&lt;/p>
&lt;p>Because there are several ways to vibe code, but &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution-with-dao/#for-vibe-coders" target="_blank" rel="noopener">some prompts + BRDs are gold&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/poc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd aegis-freedom #savings+monetary system = partial/total freedom&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#this is not the rstocks / retirement facts, but somehow similar :)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>Thats how simple it is &lt;code>https://aegis-freedom.pages.dev/&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;p>are we numb?&lt;/p>
&lt;p>are we so asleep to be avoiding so hard to put few k$ into ads?&lt;/p>
&lt;p>ops, these questions are out of the scope for this post :)&lt;/p>
&lt;ol start="6">
&lt;li>Risk sensitivity and persistance seem to be good indicators of success&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>persistance: going into the same direction consistently, no matter what&lt;/p>
&lt;/blockquote>
&lt;ol start="7">
&lt;li>The product tattoo: diminishing returns and pareto.&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>If you are one and have excuses to create: find another ones.&lt;/p>
&lt;p>Specially while ai monthly subs are giving so much inference for the current price.&lt;/p>
&lt;p>Come on, Codex is even as &lt;a href="https://apps.microsoft.com/detail/9plm9xgg6vks" target="_blank" rel="noopener">desktop for windows&lt;/a>.&lt;/p>
&lt;p>Now the blockers are in the acceptance of new ideas flowing to main/prod branch.&lt;/p>
&lt;blockquote>
&lt;p>How can we trust the AI to write the code and pretend that we will be the ones reviewing?&lt;/p>
&lt;/blockquote>
&lt;p>As illustrated brilliantly by &lt;a href="https://www.latent.space/p/reviews-dead" target="_blank" rel="noopener">this article&lt;/a> and: &lt;a href="https://background-agents.com/" target="_blank" rel="noopener">https://background-agents.com/&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>The site UI/X and how it makes you go through the story is amazing!&lt;/p>
&lt;/blockquote>
&lt;p>Questions like the ones you can have solved:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/tiersofservice/dwi/selfh-landing-astro-fastapi-bot.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Service for the Ones with Questions&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/shipping/dna-1ton-ebook.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge for the ones who want to create step by step&lt;/div>&lt;/a>
&lt;/div>
&lt;h3>What I have shipped&lt;span class="absolute -mt-20" id="what-i-have-shipped">&lt;/span>
&lt;a href="#what-i-have-shipped" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Ive shipped and learn many what to do and several NOT to do.&lt;/p>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">RoadMap26 | As of 0326 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;p>Coming from &lt;a href="https://jalcocert.github.io/JAlcocerT/tech-recap-and-more-2025/#for-next-year" target="_blank" rel="noopener">last year end review&lt;/a>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Weddings serverless + ads - &lt;a href="https://jalcocert.github.io/JAlcocerT/bring-eyes-to-your-saas/" target="_blank" rel="noopener">WIP&lt;/a> ⚙️&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Get back to mech simulations - &lt;em>for fun :)&lt;/em> - &lt;a href="https://jalcocert.github.io/JAlcocerT/2d-mbsd" target="_blank" rel="noopener">MBSD 2D&lt;/a> ✅&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Prepare the DIY/DWY/DFY based on the ebooks and blog content ~ &lt;em>Wiki efforts&lt;/em> - WIP ⚙️&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Books &lt;em>from D&amp;amp;A to web and concepts from kindle notes&lt;/em> - WIP ⚙️&lt;/p>
&lt;/li>
&lt;li>
&lt;p>AIoT &lt;em>end to end flow from solar panels to dashboarding &amp;amp; langchain&lt;/em>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Custom Marketing analytics &lt;em>from custom high signal content creation to funnels&lt;/em> Matplotlib, &lt;a href="https://jalcocert.github.io/JAlcocerT/video-creation-with-remotion/" target="_blank" rel="noopener">remotion&lt;/a> stuff&amp;hellip;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;del>Scaling PRO Webs creation via PaaS&lt;/del> - A better DIY website with free (programmatic) audit - Free web audits &lt;a href="https://jalcocert.github.io/JAlcocerT/how-to-perform-free-web-audit/" target="_blank" rel="noopener">show problems here&lt;/a> ✅&lt;/p>
&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;a href="https://webaudit.jalcocertech.com/" target="_blank" rel="noopener">https://webaudit.jalcocertech.com/&lt;/a>&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;del>Real Estate Custom RAG and WebApp via DecapCMS&lt;/del> | Cancelled and &lt;a href="https://jalcocert.github.io/JAlcocerT/white-label-real-estate-solution/" target="_blank" rel="noopener">whitelabelled&lt;/a>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;a href="https://realestate.jalcocertech.com/" target="_blank" rel="noopener">https://realestate.jalcocertech.com/&lt;/a>&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/details>
&lt;p>They all plugged into these &lt;strong>2 lovely equations&lt;/strong>:&lt;/p>
&lt;p>$$
P \times V \times GM \times OM \times IF \times T
$$&lt;/p>
&lt;p>The value equation&lt;/p>
&lt;blockquote>
&lt;p>What needs to happen or which % do people assign to some obvious offers? or why do they go for clear non-go ones?&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>Dont explain it from rationallity or you&amp;rsquo;ll be lost. Consider psyc!&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;p>From where you can create a tier of services with &lt;em>some sort of sense&lt;/em>: &lt;em>yea, the &lt;a href="https://jalcocert.github.io/JAlcocerT/shopify-business-data-analytics/#how-is-this-been-shaped" target="_blank" rel="noopener">value ladder&lt;/a>!&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone /slubnechwile
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#3bodies OSS&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#slider crank OSS / mbsd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /VideoEditionRemotion&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /poc #with prompts and ctas :)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /jalcocertech-services #all in one repo :)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://webaudit.jalcocertech.com/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#entreagujaypunto eaypv3&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Some videos&amp;hellip;specially after the mech and remotion tinker sessions:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Among all of them, I think that instead of doing mass produced via matplotlib or a remotion one script sizes all&amp;hellip;&lt;/p>
&lt;p>its better to take the &lt;del>effort&lt;/del> tokens and ask claude code for specific comments of what we are visualizing: &lt;em>like this example with gold&lt;/em>&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/hTz2J4EgNOs" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Let it be CC + nanobanana&lt;/p>
&lt;!--
https://www.youtube.com/watch?v=TZUTe7s11-I
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/TZUTe7s11-I" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Or CC with google stitch 2.0:&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=1aI7pAlkz4w -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/1aI7pAlkz4w" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>&lt;strong>Life is short.&lt;/strong>&lt;/p>
&lt;p>So is your audience attention.&lt;/p>
&lt;p>Dont waste it with the wrong website:&lt;/p>
&lt;pre class="mermaid mt-6">flowchart LR
%% --- Styles ---
classDef free fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20;
classDef low fill:#FFF9C4,stroke:#FBC02D,stroke-width:2px,color:#FBC02D;
classDef mid fill:#FFE0B2,stroke:#F57C00,stroke-width:2px,color:#F57C00;
classDef high fill:#FFCDD2,stroke:#C62828,stroke-width:2px,color:#C62828;
classDef bridge fill:#E3F2FD,stroke:#1565C0,stroke-width:3px,color:#0D47A1;
%% --- Nodes ---
L0("Free Content&lt;br/>($0)"):::free
L1("AuditMagnet 🛡️&lt;br/>(Free Web Audit )"):::free
L11(" Blog/Youtube"):::free
L12(" ebooks"):::free
L2("DIY&lt;br/>(Optimization Guides) $"):::low
L3("Done With You&lt;br/>(Consulting) $$"):::mid
L4("Done For You&lt;br/>(Full Service) $$$"):::high
L44("GenBI&lt;br/>Shopify PoC"):::bridge
L45("Real Estate&lt;br/>Funnel Bot"):::bridge
%% --- Connections ---
L0 --> L1
L0 --> L2
L0 --> L11
L0 --> L12
L2 --> L3
L3 --> L4
L44 -->|Enhancing| L4
L45 -->|Enhancing| L4&lt;/pre>&lt;p>Anyways, make sure to go through &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-and-opportunities-health-check/#business-idea-checklist" target="_blank" rel="noopener">the business ideas checklist&lt;/a> and as cheap as code is now, make sure you &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution-after-learning/#questions" target="_blank" rel="noopener">ask questions&lt;/a> before you start prompting.&lt;/p>
&lt;p>For me, lately its all about &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution-with-dao/#for-vibe-coders" target="_blank" rel="noopener">this greenfield prompt&lt;/a> or this other tech stack.&lt;/p>
&lt;p>Combined with the best BRD / PRD / FRD / Project Charter / CRQ practices ever&amp;hellip;&lt;/p>
&lt;p>You can build your PoC in an afternoon and the &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-and-opportunities-health-check/#building-a-how-with-sense" target="_blank" rel="noopener">MVP in a week with some sense&lt;/a>&lt;/p>
&lt;p>When interested on creating with potential financial incentives, &lt;strong>focus on prospecting&lt;/strong>, then define a proper WHY and WHAT.&lt;/p>
&lt;p>If you just care about creating for the sake of it / tinkering, you are good to go with the why and what to get a working how.&lt;/p>
&lt;p>In that case, just enjoy dont expect money to flow.&lt;/p>
&lt;p>Around those concepts, Ive been playing with:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">whois leadarchitect.org&lt;span class="p">|&lt;/span> grep -i -E &lt;span class="s2">&amp;#34;(creation|created|registered)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#nslookup leadarchitect.org&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dig slubnechwile.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dig entreagujaypunto.com&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Some of which I will let go if they dont kick off before the domain renewal.&lt;/p>
&lt;p>The good thing about &amp;rsquo;not caring&amp;rsquo; about people churning, is that you can &lt;strong>white-label solutions&lt;/strong> with the expertise you have adquired building &lt;a href="https://jalcocert.github.io/JAlcocerT/white-label-real-estate-solution/#why-this-pricing" target="_blank" rel="noopener">those underpriced solutions&lt;/a>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://realestate.jalcocertech.com&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://genbi.jalcocertech.com&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://webaudit.jalcocertech.com/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#mbsd...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># f1...&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/uptime-kuma" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Uptime Kuma | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/kener" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Kener | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#programmatic uptime kuma monitoring of my services&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Most likely objections are not about pricing, but perceived value.&lt;/p>
&lt;p>Make sure to understand that selling is 20% about the thing and &lt;a href="https://jalcocert.github.io/JAlcocerT/how-is-for-agents-what-and-why-for-you/#psyco" target="_blank" rel="noopener">80% about people and psyco&lt;/a>&lt;/p>
&lt;p>It just the right time to admit that &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution-after-learning/#the-right-value-prop" target="_blank" rel="noopener">wrong client selection has consequences&lt;/a> and despite &lt;em>paying with my own pocket&lt;/em> B2C tend to see costs (instead of potential ROI when a problem is solved for B2B) and chances of churning are high.&lt;/p>
&lt;p>You should now the drill by now: &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution-after-learning/#attract-convert-deliver" target="_blank" rel="noopener">attract, convert, deliver&lt;/a>.&lt;/p>
&lt;p>If you got here from a technical background: dont overcomplicate&lt;/p>
&lt;p>You&amp;rsquo;ll probably know how to deliver&lt;/p>
&lt;p>And most likely dont know how to attract and convert.&lt;/p>
&lt;p>Thats why some people have 10k ig followers - 2k in a telegram group - and 200 into a smaller tg group ready to buy them a vibe/life mentory which gross delivery is 1k+ $/h&lt;/p>
&lt;blockquote>
&lt;p>only for the 30 lucky selected ppl who can pay 500$ each for 10h, ofc&lt;/p>
&lt;/blockquote>
&lt;p>Pretty interesting value proposition, ah?&lt;/p>
&lt;p>It works, our opinion doesnt really matter.&lt;/p>
&lt;p>Curioous about how does my &lt;strong>value ladder&lt;/strong> looks like as of today?&lt;/p>
&lt;pre class="mermaid mt-6">flowchart LR
%% --- Styles ---
classDef free fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20;
classDef low fill:#FFF9C4,stroke:#FBC02D,stroke-width:2px,color:#FBC02D;
classDef mid fill:#FFE0B2,stroke:#F57C00,stroke-width:2px,color:#F57C00;
classDef high fill:#FFCDD2,stroke:#C62828,stroke-width:2px,color:#C62828;
%% --- Nodes ---
L0("Free Content&lt;br/>($0)"):::free
L1("AuditMagnet 🛡️&lt;br/>(Free Web Audit )"):::free
L11(" Blog/Youtube"):::free
L12(" ebooks"):::free
L2("DIY&lt;br/>(Optimization Guides) $"):::low
L3("Done With You&lt;br/>(Consulting) $$"):::mid
L4("Done For You&lt;br/>(Full Service) $$$"):::high
%% --- Connections ---
L0 --> L1
L0 --> L2
L0 --> L11
L0 --> L12
L2 --> L3
L3 --> L4&lt;/pre>&lt;h3>Interesting Articles&lt;span class="absolute -mt-20" id="interesting-articles">&lt;/span>
&lt;a href="#interesting-articles" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://knowledge.insead.edu/strategy/who-killed-nokia-nokia-did" target="_blank" rel="noopener">https://knowledge.insead.edu/strategy/who-killed-nokia-nokia-did&lt;/a>
&lt;ul>
&lt;li>Old post about N95 vs iphone: &lt;code>https://forocoches.com/foro/showthread.php?t=995246&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://newsletter.pragmaticengineer.com/p/ai-tooling-2026" target="_blank" rel="noopener">https://newsletter.pragmaticengineer.com/p/ai-tooling-2026&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>This all relates with &lt;a href="#whats-open-devops" >speed and stability&lt;/a> of the upcoming software.&lt;/p>
&lt;h3>Whats left for us?&lt;span class="absolute -mt-20" id="whats-left-for-us">&lt;/span>
&lt;a href="#whats-left-for-us" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Coding is gone.&lt;/p>
&lt;p>Mech engineering is gone.&lt;/p>
&lt;p>Enabling others via showing / teaching / on boarding ?&lt;/p>
&lt;p>Simple with markdown and notebookLLM.&lt;/p>
&lt;p>Marketing?&lt;/p>
&lt;p>All those customer life cycle value, ROIs, hypothesis formation of:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>How each factor affects peformance (conversions)?
What contributes more to the win?
what are the relatibe contributions? paid ads? promotions? webinars?&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Data exploration: base line &amp;amp; seasonality/holidays, external factors like salary week,competitor activities or internal activieis like channel distribution, product changes&amp;hellip;&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>All that need to know important variables for the business. Gone.&lt;/p>
&lt;p>I mean&amp;hellip;you can do them assisted by AI.&lt;/p>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>My favourite prompts&lt;span class="absolute -mt-20" id="my-favourite-prompts">&lt;/span>
&lt;a href="#my-favourite-prompts" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I tried to migrate &lt;a href="https://jalcocert.github.io/JAlcocerT/websites-themes-2024/#photo-galleries" target="_blank" rel="noopener">eayp from HUGO v1&lt;/a> to &lt;a href="https://jalcocert.github.io/JAlcocerT/do-your-instagram/" target="_blank" rel="noopener">v2a/b here&lt;/a>.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/entreagujaypunto-next-gallery" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
EAyP v2a Next Gallery ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/entreagujaypunto-astro-payload" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
EAyP v2b Astro Gallery ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>The World &lt;em>Still&lt;/em> Belongs To The Builders.&lt;/p>
&lt;p>As im proving with the &lt;a href="#eayp-v3" >eayp v3 at this section&lt;/a>.&lt;/p>
&lt;p>Wanted to collect the &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution-with-dao/#for-vibe-coders" target="_blank" rel="noopener">best UI prompts&lt;/a> I got to see: &lt;em>bc there are some &lt;a href="https://jalcocert.github.io/JAlcocerT/diy-landing-boilerplate/#what-should-a-landing-have" target="_blank" rel="noopener">things that all landing pages should have&lt;/a>, like proper ATF.&lt;/em>&lt;/p>
&lt;p>Bc &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution/#creating-with-ai" target="_blank" rel="noopener">creating with AI in your SDLC workflow&lt;/a> is about the right procedural knowledge from now:&lt;/p>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">Vibe Coding | Setup 📌&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;p>&lt;code>Do you think that these requirements are clear enough?&lt;/code>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">I need Landing Page based with a cool and modern UI.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Create also a makefile with the following commands:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">*&lt;/span> &lt;span class="sb">`make help`&lt;/span> - Show available commands
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">*&lt;/span> &lt;span class="sb">`make install`&lt;/span> - Prepare the dependencies for local development
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">*&lt;/span> &lt;span class="sb">`make dev`&lt;/span> - Run development server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Create the &lt;span class="sb">`z-development-plan.md`&lt;/span> with independent and testable phases that can be completed sequentially.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">When it is completed, create a &lt;span class="sb">`z-walkthrough.md`&lt;/span> with the steps to deploy the application and what each part of the tech stack does on a high level to bring the features to life.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The full copy od the landing, has to be goberned by a single &lt;span class="sb">`site.md`&lt;/span> file.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Consider adding a Terms of Service / &lt;span class="gs">**terms and conditions and privacy policy**&lt;/span> to the website, which will be governed by two separated markdown files.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Add also a faq section, that instead of been controlled via a json, lets have it controlled as per the frontmatter and content of separated markdown files inside the folder &lt;span class="sb">`faq`&lt;/span>. &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Go to [AntiGravity IDE] and ask if the &lt;code>brd.md&lt;/code> refined already with Gemini is clear enough.&lt;/p>
&lt;p>If it is clear define the &lt;code>z-development-plan.md&lt;/code> and proceed with the development phases.&lt;/p>
&lt;p>As you will need to iterate across features, do it like a pro with change-requests:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo apt install gh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gh auth login
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#gh repo create make-xyz --private --source=. --remote=origin --push&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git init &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git add . &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git commit -m &lt;span class="s2">&amp;#34;Initial commit: simple landing website&amp;#34;&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> gh repo create make-xyz --private --source&lt;span class="o">=&lt;/span>. --remote&lt;span class="o">=&lt;/span>origin --push
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">###du -sh .&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker stop $(docker ps -a -q) #stop all&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker system df&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;strong>Technical Stack and Design Requirements&lt;/strong>&lt;/p>
&lt;p>To develop a &lt;strong>modern, secure, and scalable landing page with modular astro components&lt;/strong> for getting leads via formbricks.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Requirement&lt;/th>
&lt;th style="text-align:left">Specification&lt;/th>
&lt;th style="text-align:left">Clarification / Decision&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Frontend Framework&lt;/strong>&lt;/td>
&lt;td style="text-align:left">React (Astro/Vite)&lt;/td>
&lt;td style="text-align:left">Chosen for low latency and modern &amp;ldquo;Island&amp;rdquo; architecture.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Styling/UI Library&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Tailwind CSS v4 + Framer Motion&lt;/td>
&lt;td style="text-align:left">Custom &amp;ldquo;Deep Night&amp;rdquo; &lt;strong>GlassMorphism theme&lt;/strong> for a premium look.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Deployment&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Firebase hosting&lt;/td>
&lt;td style="text-align:left">Serverless.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/details>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">Gemini Green field | Cinematic Landing Page Builder x 🚀&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">&lt;span class="gh"># Cinematic Landing Page Builder
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gh">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## Role
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Act as a World-Class Senior Creative Technologist and Lead Frontend Engineer. You build high-fidelity, cinematic &amp;#34;1:1 Pixel Perfect&amp;#34; landing pages.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Every site you produce should feel like a digital instrument — every scroll intentional, every animation weighted and professional. Eradicate all generic AI patterns.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## Agent Flow — MUST FOLLOW
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">When the user asks to build a site (or this file is loaded into a fresh project), immediately ask &lt;span class="gs">**exactly these questions**&lt;/span> using AskUserQuestion in a single call, then build the full site from the answers. Do not ask follow-ups. Do not over-discuss. Build.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### Questions (all in one AskUserQuestion call)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">1.&lt;/span> &lt;span class="ge">**&lt;/span>&amp;#34;What&amp;#39;s the brand name and one-line purpose?&amp;#34;** — Free text. Example: &amp;#34;Nura Health — precision longevity medicine powered by biological data.&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">2.&lt;/span> &lt;span class="ge">**&lt;/span>&amp;#34;Pick an aesthetic direction&amp;#34;** — Single-select from the presets below. Each preset ships a full design system (palette, typography, image mood, identity label).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">3.&lt;/span> &lt;span class="ge">**&lt;/span>&amp;#34;What are your 3 key value propositions?&amp;#34;** — Free text. Brief phrases. These become the Features section cards.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">4.&lt;/span> &lt;span class="ge">**&lt;/span>&amp;#34;What should visitors do?&amp;#34;** — Free text. The primary CTA. Example: &amp;#34;Join the waitlist&amp;#34;, &amp;#34;Book a consultation&amp;#34;, &amp;#34;Start free trial&amp;#34;.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">---
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## Aesthetic Presets
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Each preset defines: &lt;span class="sb">`palette`&lt;/span>, &lt;span class="sb">`typography`&lt;/span>, &lt;span class="sb">`identity`&lt;/span> (the overall feel), and &lt;span class="sb">`imageMood`&lt;/span> (Unsplash search keywords for hero/texture images).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### Preset A — &amp;#34;Organic Tech&amp;#34; (Clinical Boutique)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>&lt;span class="k">-&lt;/span> **Identity:** A bridge between a biological research lab and an avant-garde luxury magazine.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Palette:** Moss &lt;span class="sb">`#2E4036`&lt;/span> (Primary), Clay &lt;span class="sb">`#CC5833`&lt;/span> (Accent), Cream &lt;span class="sb">`#F2F0E9`&lt;/span> (Background), Charcoal &lt;span class="sb">`#1A1A1A`&lt;/span> (Text/Dark)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Typography:** Headings: &amp;#34;Plus Jakarta Sans&amp;#34; + &amp;#34;Outfit&amp;#34; (tight tracking). Drama: &amp;#34;Cormorant Garamond&amp;#34; Italic. Data: &lt;span class="sb">`&amp;#34;IBM Plex Mono&amp;#34;`&lt;/span>.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Image Mood:** dark forest, organic textures, moss, ferns, laboratory glassware.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Hero line pattern:** &amp;#34;[Concept noun] is the&amp;#34; (Bold Sans) / &amp;#34;[Power word].&amp;#34; (Massive Serif Italic)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### Preset B — &amp;#34;Midnight Luxe&amp;#34; (Dark Editorial)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>&lt;span class="k">-&lt;/span> **Identity:** A private members&amp;#39; club meets a high-end watchmaker&amp;#39;s atelier.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Palette:** Obsidian &lt;span class="sb">`#0D0D12`&lt;/span> (Primary), Champagne &lt;span class="sb">`#C9A84C`&lt;/span> (Accent), Ivory &lt;span class="sb">`#FAF8F5`&lt;/span> (Background), Slate &lt;span class="sb">`#2A2A35`&lt;/span> (Text/Dark)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Typography:** Headings: &amp;#34;Inter&amp;#34; (tight tracking). Drama: &amp;#34;Playfair Display&amp;#34; Italic. Data: &lt;span class="sb">`&amp;#34;JetBrains Mono&amp;#34;`&lt;/span>.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Image Mood:** dark marble, gold accents, architectural shadows, luxury interiors.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Hero line pattern:** &amp;#34;[Aspirational noun] meets&amp;#34; (Bold Sans) / &amp;#34;[Precision word].&amp;#34; (Massive Serif Italic)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### Preset C — &amp;#34;Brutalist Signal&amp;#34; (Raw Precision)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>&lt;span class="k">-&lt;/span> **Identity:** A control room for the future — no decoration, pure information density.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Palette:** Paper &lt;span class="sb">`#E8E4DD`&lt;/span> (Primary), Signal Red &lt;span class="sb">`#E63B2E`&lt;/span> (Accent), Off-white &lt;span class="sb">`#F5F3EE`&lt;/span> (Background), Black &lt;span class="sb">`#111111`&lt;/span> (Text/Dark)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Typography:** Headings: &amp;#34;Space Grotesk&amp;#34; (tight tracking). Drama: &amp;#34;DM Serif Display&amp;#34; Italic. Data: &lt;span class="sb">`&amp;#34;Space Mono&amp;#34;`&lt;/span>.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Image Mood:** concrete, brutalist architecture, raw materials, industrial.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Hero line pattern:** &amp;#34;[Direct verb] the&amp;#34; (Bold Sans) / &amp;#34;[System noun].&amp;#34; (Massive Serif Italic)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### Preset D — &amp;#34;Vapor Clinic&amp;#34; (Neon Biotech)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>&lt;span class="k">-&lt;/span> **Identity:** A genome sequencing lab inside a Tokyo nightclub.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Palette:** Deep Void &lt;span class="sb">`#0A0A14`&lt;/span> (Primary), Plasma &lt;span class="sb">`#7B61FF`&lt;/span> (Accent), Ghost &lt;span class="sb">`#F0EFF4`&lt;/span> (Background), Graphite &lt;span class="sb">`#18181B`&lt;/span> (Text/Dark)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Typography:** Headings: &amp;#34;Sora&amp;#34; (tight tracking). Drama: &amp;#34;Instrument Serif&amp;#34; Italic. Data: &lt;span class="sb">`&amp;#34;Fira Code&amp;#34;`&lt;/span>.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Image Mood:** bioluminescence, dark water, neon reflections, microscopy.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Hero line pattern:** &amp;#34;[Tech noun] beyond&amp;#34; (Bold Sans) / &amp;#34;[Boundary word].&amp;#34; (Massive Serif Italic)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">---
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## Fixed Design System (NEVER CHANGE)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">These rules apply to ALL presets. They are what make the output premium.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### Visual Texture
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>&lt;span class="k">-&lt;/span> Implement a global CSS noise overlay using an inline SVG &lt;span class="sb">`&amp;lt;feTurbulence&amp;gt;`&lt;/span> filter at &lt;span class="gs">**0.05 opacity**&lt;/span> to eliminate flat digital gradients.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> Use a &lt;span class="sb">`rounded-[2rem]`&lt;/span> to &lt;span class="sb">`rounded-[3rem]`&lt;/span> radius system for all containers. No sharp corners anywhere.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### Micro-Interactions
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>&lt;span class="k">-&lt;/span> All buttons must have a &lt;span class="ge">**&lt;/span>&amp;#34;magnetic&amp;#34; feel**: subtle &lt;span class="sb">`scale(1.03)`&lt;/span> on hover with &lt;span class="sb">`cubic-bezier(0.25, 0.46, 0.45, 0.94)`&lt;/span>.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> Buttons use &lt;span class="sb">`overflow-hidden`&lt;/span> with a sliding background &lt;span class="sb">`&amp;lt;span&amp;gt;`&lt;/span> layer for color transitions on hover.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> Links and interactive elements get a &lt;span class="sb">`translateY(-1px)`&lt;/span> lift on hover.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### Animation Lifecycle
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>&lt;span class="k">-&lt;/span> Use &lt;span class="sb">`gsap.context()`&lt;/span> within &lt;span class="sb">`useEffect`&lt;/span> for ALL animations. Return &lt;span class="sb">`ctx.revert()`&lt;/span> in the cleanup function.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> Default easing: &lt;span class="sb">`power3.out`&lt;/span> for entrances, &lt;span class="sb">`power2.inOut`&lt;/span> for morphs.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> Stagger value: &lt;span class="sb">`0.08`&lt;/span> for text, &lt;span class="sb">`0.15`&lt;/span> for cards/containers.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">---
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## Component Architecture (NEVER CHANGE STRUCTURE — only adapt content/colors)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### A. NAVBAR — &amp;#34;The Floating Island&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>A &lt;span class="sb">`fixed`&lt;/span> pill-shaped container, horizontally centered.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Morphing Logic:** Transparent with light text at hero top. Transitions to &lt;span class="sb">`bg-[background]/60 backdrop-blur-xl`&lt;/span> with primary-colored text and a subtle &lt;span class="sb">`border`&lt;/span> when scrolled past the hero. Use &lt;span class="sb">`IntersectionObserver`&lt;/span> or ScrollTrigger.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> Contains: Logo (brand name as text), 3-4 nav links, CTA button (accent color).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### B. HERO SECTION — &amp;#34;The Opening Shot&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>&lt;span class="k">-&lt;/span> &lt;span class="sb">`100dvh`&lt;/span> height. Full-bleed background image (sourced from Unsplash matching preset&amp;#39;s &lt;span class="sb">`imageMood`&lt;/span>) with a heavy &lt;span class="gs">**primary-to-black gradient overlay**&lt;/span> (`bg-gradient-to-t`).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Layout:** Content pushed to the &lt;span class="gs">**bottom-left third**&lt;/span> using flex + padding.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Typography:** Large scale contrast following the preset&amp;#39;s hero line pattern. First part in bold sans heading font. Second part in massive serif italic drama font (3-5x size difference).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Animation:** GSAP staggered &lt;span class="sb">`fade-up`&lt;/span> (y: 40 → 0, opacity: 0 → 1) for all text parts and CTA.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> CTA button below the headline, using the accent color.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### C. FEATURES — &amp;#34;Interactive Functional Artifacts&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>Three cards derived from the user&amp;#39;s 3 value propositions. These must feel like &lt;span class="gs">**functional software micro-UIs**&lt;/span>, not static marketing cards. Each card gets one of these interaction patterns:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gs">**Card 1 — &amp;#34;Diagnostic Shuffler&amp;#34;:**&lt;/span> 3 overlapping cards that cycle vertically using &lt;span class="sb">`array.unshift(array.pop())`&lt;/span> logic every 3 seconds with a spring-bounce transition (`cubic-bezier(0.34, 1.56, 0.64, 1)`). Labels derived from user&amp;#39;s first value prop (generate 3 sub-labels).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gs">**Card 2 — &amp;#34;Telemetry Typewriter&amp;#34;:**&lt;/span> A monospace live-text feed that types out messages character-by-character related to the user&amp;#39;s second value prop, with a blinking accent-colored cursor. Include a &amp;#34;Live Feed&amp;#34; label with a pulsing dot.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gs">**Card 3 — &amp;#34;Cursor Protocol Scheduler&amp;#34;:**&lt;/span> A weekly grid (S M T W T F S) where an animated SVG cursor enters, moves to a day cell, clicks (visual &lt;span class="sb">`scale(0.95)`&lt;/span> press), activates the day (accent highlight), then moves to a &amp;#34;Save&amp;#34; button before fading out. Labels from user&amp;#39;s third value prop.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">All cards: &lt;span class="sb">`bg-[background]`&lt;/span> surface, subtle border, &lt;span class="sb">`rounded-[2rem]`&lt;/span>, drop shadow. Each card has a heading (sans bold) and a brief descriptor.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### D. PHILOSOPHY — &amp;#34;The Manifesto&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>&lt;span class="k">-&lt;/span> Full-width section with the &lt;span class="gs">**dark color**&lt;/span> as background.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> A parallaxing organic texture image (Unsplash, &lt;span class="sb">`imageMood`&lt;/span> keywords) at low opacity behind the text.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Typography:** Two contrasting statements. Pattern:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">-&lt;/span> &amp;#34;Most [industry] focuses on: [common approach].&amp;#34; — neutral, smaller.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">-&lt;/span> &amp;#34;We focus on: [differentiated approach].&amp;#34; — massive, drama serif italic, accent-colored keyword.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Animation:** GSAP &lt;span class="sb">`SplitText`&lt;/span>-style reveal (word-by-word or line-by-line fade-up) triggered by ScrollTrigger.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### E. PROTOCOL — &amp;#34;Sticky Stacking Archive&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>3 full-screen cards that stack on scroll.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Stacking Interaction:** Using GSAP ScrollTrigger with &lt;span class="sb">`pin: true`&lt;/span>. As a new card scrolls into view, the card underneath scales to &lt;span class="sb">`0.9`&lt;/span>, blurs to &lt;span class="sb">`20px`&lt;/span>, and fades to &lt;span class="sb">`0.5`&lt;/span>.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Each card gets a unique canvas/SVG animation:**
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">1.&lt;/span> A slowly rotating geometric motif (double-helix, concentric circles, or gear teeth).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">2.&lt;/span> A scanning horizontal laser-line moving across a grid of dots/cells.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">3.&lt;/span> A pulsing waveform (EKG-style SVG path animation using &lt;span class="sb">`stroke-dashoffset`&lt;/span>).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> Card content: Step number (monospace), title (heading font), 2-line description. Derive from user&amp;#39;s brand purpose.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### F. MEMBERSHIP / PRICING
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>&lt;span class="k">-&lt;/span> Three-tier pricing grid. Card names: &amp;#34;Essential&amp;#34;, &amp;#34;Performance&amp;#34;, &amp;#34;Enterprise&amp;#34; (adjust to fit brand).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Middle card pops:** Primary-colored background with an accent CTA button. Slightly larger scale or &lt;span class="sb">`ring`&lt;/span> border.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> If pricing doesn&amp;#39;t apply, convert this into a &amp;#34;Get Started&amp;#34; section with a single large CTA.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### G. FOOTER
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>&lt;span class="k">-&lt;/span> Deep dark-colored background, &lt;span class="sb">`rounded-t-[4rem]`&lt;/span>.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> Grid layout: Brand name + tagline, navigation columns, legal links.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **&amp;#34;System Operational&amp;#34; status indicator** with a pulsing green dot and monospace label.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">---
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## Technical Requirements (NEVER CHANGE)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Stack:** React 19, Tailwind CSS v3.4.17, GSAP 3 (with ScrollTrigger plugin), Lucide React for icons.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Fonts:** Load via Google Fonts &lt;span class="sb">`&amp;lt;link&amp;gt;`&lt;/span> tags in &lt;span class="sb">`index.html`&lt;/span> based on the selected preset.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Images:** Use real Unsplash URLs. Select images matching the preset&amp;#39;s &lt;span class="sb">`imageMood`&lt;/span>. Never use placeholder URLs.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **File structure:** Single &lt;span class="sb">`App.jsx`&lt;/span> with components defined in the same file (or split into &lt;span class="sb">`components/`&lt;/span> if &amp;gt;600 lines). Single &lt;span class="sb">`index.css`&lt;/span> for Tailwind directives + noise overlay + custom utilities.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **No placeholders.** Every card, every label, every animation must be fully implemented and functional.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">-&lt;/span> **Responsive:** Mobile-first. Stack cards vertically on mobile. Reduce hero font sizes. Collapse navbar into a minimal version.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">---
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## Build Sequence
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">After receiving answers to the 4 questions:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">1.&lt;/span> Map the selected preset to its full design tokens (palette, fonts, image mood, identity).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">2.&lt;/span> Generate hero copy using the brand name + purpose + preset&amp;#39;s hero line pattern.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">3.&lt;/span> Map the 3 value props to the 3 Feature card patterns (Shuffler, Typewriter, Scheduler).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">4.&lt;/span> Generate Philosophy section contrast statements from the brand purpose.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">5.&lt;/span> Generate Protocol steps from the brand&amp;#39;s process/methodology.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">6.&lt;/span> Scaffold the project: &lt;span class="sb">`npm create vite@latest`&lt;/span>, install deps, write all files.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">7.&lt;/span> Ensure every animation is wired, every interaction works, every image loads.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gs">**Execution Directive:**&lt;/span> &amp;#34;Do not build a website; build a digital instrument. Every scroll should feel intentional, every animation should feel weighted and professional. Eradicate all generic AI patterns.&amp;#34;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/details>
&lt;!-- https://github.com/JAlcocerT/Slider-Crank/blob/main/landing/Screenshot%202026-05-01%20080420.png -->
&lt;p>&lt;img src="https://raw.githubusercontent.com/JAlcocerT/Slider-Crank/main/landing/Screenshot%202026-05-01%20080420.png" alt="Slider-Crank screenshot" loading="lazy" />&lt;/p>
&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">Vite x Tailwind x Framer Motion Glassmorphism 🚀&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Requirement&lt;/th>
&lt;th style="text-align:left">Specification&lt;/th>
&lt;th style="text-align:left">Clarification / Decision&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Frontend Framework&lt;/strong>&lt;/td>
&lt;td style="text-align:left">React (Vite)&lt;/td>
&lt;td style="text-align:left">Chosen for low latency and modern developer experience.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Styling/UI Library&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Tailwind CSS v4 + Framer Motion&lt;/td>
&lt;td style="text-align:left">Custom &amp;ldquo;Deep Night&amp;rdquo; &lt;strong>glassmorphism&lt;/strong> theme for a premium look.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>&lt;a href="https://jalcocert.github.io/JAlcocerT/docs/dev/fe-vs-be/" target="_blank" rel="noopener">Backend&lt;/a>/Database&lt;/strong>&lt;/td>
&lt;td style="text-align:left">FastAPI + PostgreSQL/DuckDB&lt;/td>
&lt;td style="text-align:left">High performance with Pydantic validation; SQLAlchemy for DB agnostic engine.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>AI Intelligence&lt;/strong>&lt;/td>
&lt;td style="text-align:left">BAML (GPT-4o)&lt;/td>
&lt;td style="text-align:left">Type-safe inference for SQL generation and visualization classification.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>&lt;a href="https://jalcocert.github.io/JAlcocerT/docs/dev/authentication/" target="_blank" rel="noopener">Authentication&lt;/a>&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Environment Secrets (&lt;code>.env&lt;/code>)&lt;/td>
&lt;td style="text-align:left">Managed via local environment for isolated deployment; ready for JWT integration.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/details>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/AIBI/vite-baml-genbi.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;h3>Whats Open DevOps?&lt;span class="absolute -mt-20" id="whats-open-devops">&lt;/span>
&lt;a href="#whats-open-devops" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Ive heard this year about &lt;a href="https://dora.dev/guides/dora-metrics/" target="_blank" rel="noopener">DORA&lt;/a>.&lt;/p>
&lt;p>Which maps with &lt;a href="https://jalcocert.github.io/JAlcocerT/lean/" target="_blank" rel="noopener">Lean&lt;/a> (via VSM) and DevOps: &lt;a href="https://www.atlassian.com/devops/frameworks/dora-metrics" target="_blank" rel="noopener">https://www.atlassian.com/devops/frameworks/dora-metrics&lt;/a>&lt;/p>
&lt;p>DORA is a &lt;strong>metrics framework&lt;/strong> (not a rigid toolset)—a set of four standard KPIs from Google&amp;rsquo;s &lt;strong>DevOps Research and Assessment&lt;/strong> team to benchmark software delivery.&lt;/p>
&lt;blockquote>
&lt;p>DORA = &lt;em>how good are companies at shipping software?&lt;/em>&lt;/p>
&lt;/blockquote>
&lt;p>There are two key clusters of data inside &lt;strong>DORA: Velocity and Stability&lt;/strong>.&lt;/p>
&lt;p>The DORA framework is focused on keeping them in context with each other, as a whole, rather than as independent variables, making the data more challenging to misinterpret or abuse.&lt;/p>
&lt;p>Within &lt;strong>velocity&lt;/strong> are two core metrics:&lt;/p>
&lt;ul>
&lt;li>Deployment Frequency (DF): &lt;em>Number of successful deployments to production, how rapidly is your team releasing to users?&lt;/em>&lt;/li>
&lt;li>Lead Time for Changes (LTC): *How long does it take from commit to the code running in production?&lt;/li>
&lt;/ul>
&lt;p>This is important, as it reflects how quickly your team can respond to user requirements.&lt;/p>
&lt;p>&lt;strong>Stability&lt;/strong> is composed of two core metrics:&lt;/p>
&lt;ul>
&lt;li>Change Failure Rate (Change Success Rate): &lt;em>How often are your deployments causing a failure?&lt;/em>&lt;/li>
&lt;li>Median Time to Restore Service (MTTR): &lt;em>How long does it take the team to properly recover from a failure once it is identified?&lt;/em>&lt;/li>
&lt;/ul>
&lt;p>However, MTTR is replaced by Failed Deployment Recovery Time from the 2023 DORA report.&lt;/p>
&lt;p>This metric measures the finish time of a deployment to the resolution of the incident caused by the deployment.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://devlake.apache.org/assets/images/dora-intro-e3847646d8dbe47220e6c8347ab14f7b.png" target="_blank" rel="noopener">https://devlake.apache.org/assets/images/dora-intro-e3847646d8dbe47220e6c8347ab14f7b.png&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>DevLake: Incubating Apache project for SDLC metrics (e.g., DORA), data ingestion/visualization from dev tools; uses Go, Grafana; no relation to big data storage.&lt;/p>
&lt;p>Delta Lake: Open-format (Databricks-led, Apache-compatible via Spark) for ACID transactions, time travel in data lakes; unrelated to engineering metrics.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Metric&lt;/th>
&lt;th>What It Measures&lt;/th>
&lt;th>Elite Benchmark &lt;a href="https://www.atlassian.com/devops/frameworks/dora-metrics" target="_blank" rel="noopener">atlassian&lt;/a>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Deployment Frequency&lt;/strong>&lt;/td>
&lt;td>How often code deploys to prod&lt;/td>
&lt;td>Multiple per day&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Lead Time for Changes&lt;/strong>&lt;/td>
&lt;td>Commit to deploy time&lt;/td>
&lt;td>&amp;lt;1 day&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Change Failure Rate&lt;/strong>&lt;/td>
&lt;td>% of deploys causing failures&lt;/td>
&lt;td>0-15%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Time to Restore&lt;/strong>&lt;/td>
&lt;td>MTTR from failure&lt;/td>
&lt;td>&amp;lt;1 hour&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4>Argo and Jenkins?&lt;span class="absolute -mt-20" id="argo-and-jenkins">&lt;/span>
&lt;a href="#argo-and-jenkins" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>If you care enough about DORA, speed stability, doing more for your clients&amp;hellip;&lt;/p>
&lt;p>For sure you have heard about CI/CD, particularly jenkins and argo :)&lt;/p>
&lt;p>Think of it this way: Jenkins is the &lt;strong>builder&lt;/strong>, and Argo CD is the &lt;strong>delivery driver&lt;/strong> who makes sure the house stays exactly as the blueprint intended.&lt;/p>
&lt;p>&lt;strong>What is Argo CD?&lt;/strong>&lt;/p>
&lt;p>Argo CD is a &lt;strong>declarative, GitOps continuous delivery (CD) tool&lt;/strong> specifically built for Kubernetes.&lt;/p>
&lt;p>The core idea is simple: You define what your application environment should look like (the &amp;ldquo;Desired State&amp;rdquo;) in a Git repository. Argo CD monitors that repository and compares it to what is actually running in your Kubernetes cluster (the &amp;ldquo;Live State&amp;rdquo;).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Syncing:&lt;/strong> If you change your code in Git, Argo CD automatically updates Kubernetes to match.&lt;/li>
&lt;li>&lt;strong>Self-Healing:&lt;/strong> If someone accidentally deletes a component in Kubernetes, Argo CD notices the &amp;ldquo;drift&amp;rdquo; and automatically recreates it to match Git.&lt;/li>
&lt;/ul>
&lt;p>Does it relate to &lt;strong>Jenkins?&lt;/strong>&lt;/p>
&lt;p>Yes, but they aren&amp;rsquo;t competitors; they are usually &lt;strong>teammates&lt;/strong>.&lt;/p>
&lt;p>While Jenkins is a &amp;ldquo;do-it-all&amp;rdquo; automation engine, it wasn&amp;rsquo;t originally built for the cloud-native, containerized world of Kubernetes. Here is how they relate:&lt;/p>
&lt;ol>
&lt;li>The Hand-off (The CI/CD Pipeline)&lt;/li>
&lt;/ol>
&lt;p>In a typical workflow, Jenkins handles the &lt;strong>Continuous Integration (CI)&lt;/strong> and Argo CD handles the &lt;strong>Continuous Delivery (CD)&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Jenkins:&lt;/strong> Takes your source code, runs tests, and builds a Docker image. It then pushes that image to a registry and updates a YAML file in your Git repo.&lt;/li>
&lt;li>&lt;strong>Argo CD:&lt;/strong> Sees that the YAML file has changed and pulls that new Docker image into your Kubernetes cluster.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Push vs. Pull&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>Jenkins (Push Model):&lt;/strong> Jenkins usually &amp;ldquo;reaches out&amp;rdquo; and tells Kubernetes to run a command. This requires Jenkins to have high-level security credentials for your cluster.&lt;/li>
&lt;li>&lt;strong>Argo CD (Pull Model):&lt;/strong> Argo CD sits &lt;em>inside&lt;/em> your cluster. It watches Git and &amp;ldquo;pulls&amp;rdquo; changes in. This is generally considered more secure and stable for Kubernetes environments.&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Feature&lt;/th>
&lt;th>Jenkins&lt;/th>
&lt;th>Argo CD&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Primary Goal&lt;/strong>&lt;/td>
&lt;td>General automation &amp;amp; CI (Building/Testing)&lt;/td>
&lt;td>Kubernetes Deployment &amp;amp; CD (Deploying)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Philosophy&lt;/strong>&lt;/td>
&lt;td>Script-based (Jenkinsfile)&lt;/td>
&lt;td>GitOps-based (Declarative YAML)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Environment&lt;/strong>&lt;/td>
&lt;td>Runs anywhere&lt;/td>
&lt;td>Runs on Kubernetes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Best Used For&lt;/strong>&lt;/td>
&lt;td>Compiling code, running unit tests&lt;/td>
&lt;td>Ensuring the cluster matches the Git repo&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>&lt;strong>The Bottom Line:&lt;/strong> Use Jenkins to turn your code into an image, and use Argo CD to put that image into production.&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>Both can be helpful for HFAD which relate with DORA metrics!!&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;p>A great article: You rolled out coding agents. Engineers are faster. PRs flood in.&lt;/p>
&lt;p>Yet, cycle time doesn&amp;rsquo;t budge.&lt;/p>
&lt;p>DORA metrics &lt;a href="https://github.com/apache/incubator-devlake/pull/8746" target="_blank" rel="noopener">stored at DevLake&lt;/a> are flat.&lt;/p>
&lt;p>The backlog grows.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://background-agents.com/" target="_blank" rel="noopener">https://background-agents.com/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.latent.space/p/reviews-dead" target="_blank" rel="noopener">https://www.latent.space/p/reviews-dead&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>And an awsome web UI/X that now you can simply clone with google stitch&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/full-stack-vibe-coding-google-ai-studio/" target="_blank" rel="noopener">https://blog.google/innovation-and-ai/technology/developers-tools/full-stack-vibe-coding-google-ai-studio/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.google/innovation-and-ai/models-and-research/google-labs/stitch-ai-ui-design/" target="_blank" rel="noopener">https://blog.google/innovation-and-ai/models-and-research/google-labs/stitch-ai-ui-design/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://stitch.withgoogle.com/" target="_blank" rel="noopener">https://stitch.withgoogle.com/&lt;/a> - Figman but better&lt;/li>
&lt;li>&lt;a href="https://github.com/pbakaus/impeccable" target="_blank" rel="noopener">https://github.com/pbakaus/impeccable&lt;/a> - The design language that makes your AI harness better at design.&lt;/li>
&lt;li>&lt;a href="https://aistudio.google.com/app/apps?source=" target="_blank" rel="noopener">https://aistudio.google.com/app/apps?source=&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Just in case you dont want to vibe code in &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution-with-dao/#for-vibe-coders" target="_blank" rel="noopener">the &lt;em>old fashion way&lt;/em> from last month&lt;/a>.&lt;/p>
&lt;p>I guess&amp;hellip;Web devs be like:&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/memes/barney.gif" alt="dont cry for me" loading="lazy" />&lt;/p>
&lt;p>Well, at least those that dont work for the public sector and &lt;a href="https://www.youtube.com/watch?v=hKFB3pUNefE" target="_blank" rel="noopener">bill 250k for a website&lt;/a>&lt;/p>
&lt;p>Isnt it this already CONTEXT ENGINEERING?&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/dev/vibe-coding.png" alt="Vibe Coding - Simpsons Halloween S2" loading="lazy" />&lt;/p>
&lt;h3>EayP v3&lt;span class="absolute -mt-20" id="eayp-v3">&lt;/span>
&lt;a href="#eayp-v3" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>This setup was not enough:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/entreagujaypunto-next-gallery" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Next Gallery AgujayPunto ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/imgproxy" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">N8N | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>Lately I got to know:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-13">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/foldergram&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-13"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Some people still have my free time to get this kind of things running:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/foldergram" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Foldergram | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/filebrowser" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Filebrowser | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>Yep, im cooking some upgrades: &lt;a href="https://ebooks.jalcocertech.com/books/servers/" target="_blank" rel="noopener">https://ebooks.jalcocertech.com/books/servers/&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-14">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/Home-Lab
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lazydocker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker system df
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker stop $(docker ps -a -q) #stop all&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker system prune -a&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-14"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>It plays very well together with filebrowser:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-15">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#move the local photos to your server&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#spin the stack&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-15"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>How hard would be to make finally a one time editable, cool, &lt;strong>photo gallery&lt;/strong> that superseeds eayp HUGO v1 and both v2 failed trials at the end of last year?&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/create-your-website/#select-the-deployment-method" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Web Deployment methods | Docs ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>Well&amp;hellip;its just a few CLI&amp;rsquo;s away :)&lt;/p></description></item><item><title>The physics of motor/bi cycles</title><link>https://JAlcocerT.github.io/JAlcocerT/3d-mbsd-bicycle/</link><pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/3d-mbsd-bicycle/</guid><description>
&lt;p>&lt;strong>TL;DR&lt;/strong>&lt;/p>
&lt;p>Some &lt;a href="https://jalcocert.github.io/JAlcocerT/algebra-101/" target="_blank" rel="noopener">algebra&lt;/a>, &lt;a href="https://jalcocert.github.io/JAlcocerT/calculus-101/" target="_blank" rel="noopener">calculus&lt;/a>, physics put together to create.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/mbsd" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
MBSD | Repo&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/3Design" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
3Design | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>The kind of thing that you put together in &lt;em>few afternoons&lt;/em> nowadays.&lt;/p>
&lt;p>You thought that your 9-5 is killing you?&lt;/p>
&lt;p>Is your 5pm-9pm giving you some life?&lt;/p>
&lt;p>Have you ever thought about &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution-with-dao/#about-ikigai" target="_blank" rel="noopener">whats Ikigai for you&lt;/a>?&lt;/p>
&lt;p>Ops, wrong post to talk about this.&lt;/p>
&lt;p>Let me go back: 3D mechanisms!&lt;/p>
&lt;p>YES!&lt;/p>
&lt;p>Here it goes all that &lt;em>unseen talent&lt;/em> that the world was &lt;a href="#mbsd-x-web-dev" >eager to consume&lt;/a>.&lt;/p>
&lt;h2>About MBSD&lt;span class="absolute -mt-20" id="about-mbsd">&lt;/span>
&lt;a href="#about-mbsd" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Code is law, specially for multibody system dynamics.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/mbsd&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/mbsd" target="_blank" rel="noreferrer">&lt;img
alt="NEW MBSD"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">NEW MBSD&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Source Code of a Python fwk to simulate mechanisms&lt;/div>&lt;/a>
&lt;/div>
&lt;p>The next sections will be theoretical, but they will be a &lt;a href="#conclusions" >base to simulate cool thingies&lt;/a>.&lt;/p>
&lt;h3>2D MBSD is cool but&lt;span class="absolute -mt-20" id="2d-mbsd-is-cool-but">&lt;/span>
&lt;a href="#2d-mbsd-is-cool-but" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>With &lt;em>just&lt;/em> 2D kinematics in place you can create very nice 3D renders.&lt;/p>
&lt;p>For example, this geneva drive:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./3Design/mbsd-to-render/geneva-drive
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make help&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make all
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rsync -avP jalcocert@192.168.1.2:/home/jalcocert/3Design/mbsd-to-render/geneva-drive/render/geneva_drive.mp4 .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mpv geneva_drive.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Or this Scotch&amp;hellip;the pantograph&amp;hellip;you name it:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./3Design/mbsd-to-render/scotch-yoke
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make all
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rsync -avP jalcocert@192.168.1.2:/home/jalcocert/3Design/mbsd-to-render/scotch-yoke/render/scotch_yoke.mp4 .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mpv scotch_yoke.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./3Design/mbsd-to-render/pantograph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make all
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rsync -avP jalcocert@192.168.1.2:/home/jalcocert/3Design/mbsd-to-render/pantograph/render/pantograph.mp4 .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mpv scotch_yoke.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>With the ffmpeg trick:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /home/jalcocert/Desktop/3Design/mbsd-to-render
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">printf&lt;/span> &lt;span class="s2">&amp;#34;file &amp;#39;%s&amp;#39;\n&amp;#34;&lt;/span> *.mp4 &amp;gt; concat.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg -f concat -safe &lt;span class="m">0&lt;/span> -i concat.txt -c copy all_mechanisms.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mpv all_mechanisms.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://youtu.be/KA7HloE6IQY -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/KA7HloE6IQY" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h3>CAD x Blender&lt;span class="absolute -mt-20" id="cad-x-blender">&lt;/span>
&lt;a href="#cad-x-blender" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I was using a simple slider-crank to test that its possible to go from a ~mbsd to STL&amp;rsquo;s and blender renders.&lt;/p>
&lt;p>Call it &lt;a href="https://jalcocert.github.io/JAlcocerT/using-blender-with-ai/#blender-as-a-code" target="_blank" rel="noopener">blender as a code&lt;/a> or &lt;a href="https://jalcocert.github.io/JAlcocerT/cad-design-mbsd/" target="_blank" rel="noopener">how to bring mechanisms to life&lt;/a>.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/3Design
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./3Design/z-cadquery
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make check &lt;span class="c1">#make help&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make scene-ui #this starts blender UI&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make all&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s cad &lt;span class="s2">&amp;#34;make all&amp;#34;&lt;/span> &lt;span class="c1">#if you will be leaving this for the night&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux attach-session -t cad #to see hows going&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#rsync -avP jalcocert@192.168.1.2:/home/jalcocert/3Design/z-cadquery/render/slider_crank.mp4 .&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#mpv slider_crank.mp4&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Even though&amp;hellip;&lt;/p>
&lt;p>bringing them to life would be to manufacture them, right?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone git clone https://github.com/JAlcocerT/mbsd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./mbsd/z-cad-render&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Well&amp;hellip;give me some time for that :)&lt;/p>
&lt;h3>Real Time Bike Simulator in Python&lt;span class="absolute -mt-20" id="real-time-bike-simulator-in-python">&lt;/span>
&lt;a href="#real-time-bike-simulator-in-python" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>A 9-DOF multibody dynamics simulator for a bicycle, ported from MATLAB to Python.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./mbsd/bike-real-time-simulator/Python_version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Install tkinter (system dependency for matplotlib GUI)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install python3-tk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Install Python dependencies&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#pip install -r requirements.txt&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Yea&amp;hellip;this is also 3D :)&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-yellow-100 bg-yellow-50 text-yellow-900 dark:border-yellow-200/30 dark:bg-yellow-700/30 dark:text-yellow-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
⚠️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
No way you can capture the reality of a bike with 2D!
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>Just that it does not uses the reference coordinate system&lt;/p>
&lt;p>Why?&lt;/p>
&lt;p>Because this had to be solved in real time back in the days.&lt;/p>
&lt;p>For that, i needed to think (surprise) and optimize the model: &lt;em>at the cost of not being using the plug and play coordinate system&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv init --no-readme .&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Add packages from requirements.txt one-shot&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv add numpy matplotlib pynput&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip install -r requirements.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv sync&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Basic run — bicycle rolls forward at ~10 m/s with 3D animation&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#python3 main.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># With keyboard steering&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#python3 main.py --keyboard&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run main.py --keyboard
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Without animation (faster, plots results at the end)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#python3 main.py --no-animate&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Keyboard Controls (with &lt;code>--keyboard&lt;/code>)&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Key&lt;/th>
&lt;th>Action&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Left / Right arrows&lt;/td>
&lt;td>Steer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Up / Down arrows&lt;/td>
&lt;td>Pedal / Brake&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ctrl+C&lt;/td>
&lt;td>Stop simulation early&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Project Structure&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>File&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>main.py&lt;/code>&lt;/td>
&lt;td>Entry point, RK2 integrator, equations of motion&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>parameters.py&lt;/code>&lt;/td>
&lt;td>All physical parameters and system data structure&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>kinematics.py&lt;/code>&lt;/td>
&lt;td>Rotation matrices, positions, and Jacobians (12 functions)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>forces.py&lt;/code>&lt;/td>
&lt;td>Mass matrix, gravity, Coriolis, aerodynamic drag, tire-ground contact&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>visualization.py&lt;/code>&lt;/td>
&lt;td>Real-time 3D matplotlib animation&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Execution flow:&lt;/strong>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-8">main.py → run_simulation()
│
├── MBodySystem() [parameters.py]
├── runge_kutta_2() [main.py]
│ └── equations_of_motion() at each step
│ ├── mass_matrix() [forces.py]
│ ├── gravity_forces() [forces.py]
│ ├── coriolis_forces()[forces.py]
│ ├── aero_forces() [forces.py]
│ ├── contact_forces() [forces.py]
│ │ └── A2, A5, H2, H5, H2p, H5p [kinematics.py]
│ └── G2g, G4g [kinematics.py]
└── BicycleAnimator.update() [visualization.py] (every 2 steps)&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The theoretical basis for this is at: &lt;a href="https://github.com/JAlcocerT/Bike_dynamic_simulator" target="_blank" rel="noopener">https://github.com/JAlcocerT/Bike_dynamic_simulator&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>Dont forget about the &lt;em>steer to the fall&lt;/em> concept!&lt;/p>
&lt;/blockquote>
&lt;p>It computes how the vehicle moves over time under the influence of gravity, aerodynamic drag, &lt;strong>tire-ground contact forces&lt;/strong>, and externally applied steering/pedaling torques.&lt;/p>
&lt;p>The Python code is &lt;a href="#bike-multibody-model" >a direct port&lt;/a> of the original MATLAB simulator (&lt;code>Matlab_version/&lt;/code>).&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>This has been quite a lot of tinkering.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/mbsd" target="_blank" rel="noreferrer">&lt;img
alt="MBSD"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">MBSD&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Source Code of a MBSD framework in Python&lt;/div>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/VideoEditingRemotion&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd remotion-cc&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Also at:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/3Design&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./3Design/mbsd-to-render&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You see how I write about many different stuff?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">find ./content/blog -maxdepth &lt;span class="m">1&lt;/span> -type f -name &lt;span class="s2">&amp;#34;*.md&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> wc -l &lt;span class="c1">#this post is 350+ and 80+ expected for this year!&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">find content/blog -name &lt;span class="s1">&amp;#39;*.md&amp;#39;&lt;/span> -print0 &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">xargs -0 awk &lt;span class="s1">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> FNR==1 {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> post_date=&amp;#34;&amp;#34;;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> printed=0
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> /^date:/ &amp;amp;&amp;amp; !printed {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> gsub(/^date:[[:space:]]*/, &amp;#34;&amp;#34;, $0)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> post_date = substr($0, 1, 10)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> if (post_date &amp;gt;= &amp;#34;2019-01-01&amp;#34; &amp;amp;&amp;amp; post_date &amp;lt;= &amp;#34;2026-03-31&amp;#34;) {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> print FILENAME &amp;#34;: &amp;#34; post_date
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> printed=1
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> count++
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> END {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> print &amp;#34;TOTAL:&amp;#34;, count+0
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> }&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>If any of the things I wrote about catches your attention and you want to get stuff done:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/tiersofservice/dwi/selfh-landing-astro-fastapi-bot.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/shipping/dna-1ton-ebook.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks to enable you to create&lt;/div>&lt;/a>
&lt;/div>
&lt;p>Upcoming topics with 3D mechanics:&lt;/p>
&lt;ol>
&lt;li>Engine configuration analysis&lt;/li>
&lt;li>Suspensions: Double Wishbone, macpherson&amp;hellip;&lt;/li>
&lt;/ol>
&lt;!-- https://youtu.be/y-ANdaUthxg -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/y-ANdaUthxg" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h3>MBSD x Web Dev&lt;span class="absolute -mt-20" id="mbsd-x-web-dev">&lt;/span>
&lt;a href="#mbsd-x-web-dev" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Because if mechanism 3D dynamics its kind of trivial now.&lt;/p>
&lt;p>So is web development.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/Slider-Crank&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./Slider-Crank/landing &lt;span class="c1">#https://multibodysystemdynamics.pages.dev/&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Interactivity&lt;span class="absolute -mt-20" id="interactivity">&lt;/span>
&lt;a href="#interactivity" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://brm.io/matter-js/" target="_blank" rel="noopener">https://brm.io/matter-js/&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Matter.js is a 2D physics engine for the web&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>ThreeJS has been interesting and D3JS promising for D&amp;amp;A&lt;/li>
&lt;/ul>
&lt;h3>Bike MultiBody Model&lt;span class="absolute -mt-20" id="bike-multibody-model">&lt;/span>
&lt;a href="#bike-multibody-model" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The bicycle is modelled as &lt;strong>4 rigid bodies&lt;/strong> connected by joints: &lt;em>just 9 degrees of freedom remaining!&lt;/em>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Body&lt;/th>
&lt;th>Label&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Joints&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>Rear wheel&lt;/td>
&lt;td>Spins freely about its axle&lt;/td>
&lt;td>Pin joint to frame&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>Frame + rider&lt;/td>
&lt;td>Main rigid body&lt;/td>
&lt;td>Free in space (3 translation + 3 rotation DOFs)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>Handlebar + fork&lt;/td>
&lt;td>Steerable assembly&lt;/td>
&lt;td>Revolute joint to frame about head tube axis&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>Front wheel&lt;/td>
&lt;td>Spins freely about its axle&lt;/td>
&lt;td>Pin joint to fork&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The simulator uses &lt;strong>multibody dynamics in generalized coordinates&lt;/strong> — a classical analytical mechanics approach where the system state is described by the minimum set of independent coordinates that fully describe its configuration.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Fundamental Assumption&lt;/th>
&lt;th>Implication&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>All four bodies are &lt;strong>perfectly rigid&lt;/strong>&lt;/td>
&lt;td>No structural deformation; mass distribution is fixed in each body frame&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ground is a &lt;strong>flat infinite plane&lt;/strong> at z = 0&lt;/td>
&lt;td>No road irregularities, no slope, no banking&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Tire cross-section is a &lt;strong>toroid with elliptical profile&lt;/strong>&lt;/td>
&lt;td>Contact point shifts with lean angle; no flat-spot approximation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Wheel-ground contact is &lt;strong>elastic (soft constraint)&lt;/strong>&lt;/td>
&lt;td>Modelled as a spring-damper; no kinematic non-penetration constraint&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Aerodynamics act &lt;strong>only at the frame CoG&lt;/strong>&lt;/td>
&lt;td>No lift, no side force, no pressure distribution over the bike geometry&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Gravitational field is &lt;strong>uniform&lt;/strong>&lt;/td>
&lt;td>&lt;code>g = 10 m/s²&lt;/code> downward (−z direction)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Air is &lt;strong>still&lt;/strong> (zero wind)&lt;/td>
&lt;td>Aerodynamic force depends only on body velocity&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Tire friction is a &lt;strong>combined slip bristle model&lt;/strong>&lt;/td>
&lt;td>No temperature dependence, no progressive wear&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>The bicycle is &lt;strong>symmetric&lt;/strong> about its plane of travel&lt;/td>
&lt;td>All &lt;code>y&lt;/code>-offsets of CoGs are zero&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Joints are &lt;strong>ideal&lt;/strong> (no friction, no compliance)&lt;/td>
&lt;td>Pin joints at axles transmit forces perfectly&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>What the model does &lt;strong>NOT capture&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>Road camber, bumps, or surface roughness&lt;/li>
&lt;li>Tire sidewall dynamics or pneumatic pressure effects&lt;/li>
&lt;li>Structural flexibility (frame flex, fork flex)&lt;/li>
&lt;li>Suspension (no spring/damper between wheel and frame)&lt;/li>
&lt;li>Rider body dynamics (rider is rigidly attached to frame, body 3)&lt;/li>
&lt;li>Wind, rain, or temperature effects&lt;/li>
&lt;li>Motor/drivetrain dynamics (pedaling torque is applied directly as a generalized force)&lt;/li>
&lt;/ul>
&lt;p>Each rigid body has its own local frame, whose orientation relative to the global frame is given by a rotation matrix &lt;code>Aᵢ(q)&lt;/code>.&lt;/p>
&lt;p>Body frames are &lt;strong>right-handed&lt;/strong> and aligned with the principal axes of inertia when at zero lean/pitch/steer.&lt;/p>
&lt;p>&lt;strong>Angular rotation convention&lt;/strong>: Euler angles are applied in this sequence for the frame body (body 3).&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Roll&lt;/strong> &lt;code>φ&lt;/code> (phi) — rotation about the X axis (lean)&lt;/li>
&lt;li>&lt;strong>Yaw&lt;/strong> &lt;code>ψ&lt;/code> (psi) — rotation about the Z axis (heading change)&lt;/li>
&lt;li>&lt;strong>Pitch&lt;/strong> &lt;code>θ&lt;/code> (theta) — rotation about the Y axis (tilt forward/back)&lt;/li>
&lt;/ol>
&lt;p>The resulting rotation matrix A3 maps body-frame vectors to global-frame vectors:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-13">r_global = A3(q) · r_body&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-13"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Each body has:&lt;/p>
&lt;ul>
&lt;li>A &lt;strong>mass&lt;/strong> &lt;code>mᵢ&lt;/code>&lt;/li>
&lt;li>A &lt;strong>center of gravity (CoG)&lt;/strong> position expressed in body-frame coordinates&lt;/li>
&lt;li>A &lt;strong>3×3 inertia tensor&lt;/strong> &lt;code>Iᵢ&lt;/code> in body frame&lt;/li>
&lt;/ul>
&lt;p>The system has &lt;strong>9 generalized coordinates&lt;/strong> &lt;code>q ∈ ℝ⁹&lt;/code> (0-indexed in Python):&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Index&lt;/th>
&lt;th>Symbol&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;th>Unit&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>0&lt;/td>
&lt;td>Rx3&lt;/td>
&lt;td>translation&lt;/td>
&lt;td>X position of frame reference point&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>Ry3&lt;/td>
&lt;td>translation&lt;/td>
&lt;td>Y position of frame reference point&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>Rz3&lt;/td>
&lt;td>translation&lt;/td>
&lt;td>Z position of frame reference point&lt;/td>
&lt;td>m&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>φ (phi)&lt;/td>
&lt;td>rotation&lt;/td>
&lt;td>Roll angle of frame (lean)&lt;/td>
&lt;td>rad&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>ψ (psi)&lt;/td>
&lt;td>rotation&lt;/td>
&lt;td>Yaw angle of frame (heading)&lt;/td>
&lt;td>rad&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>θ (theta)&lt;/td>
&lt;td>rotation&lt;/td>
&lt;td>Pitch angle of frame&lt;/td>
&lt;td>rad&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6&lt;/td>
&lt;td>γ (gamma)&lt;/td>
&lt;td>rotation&lt;/td>
&lt;td>Steering angle (handlebar about head tube axis)&lt;/td>
&lt;td>rad&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>7&lt;/td>
&lt;td>ε (epsilon)&lt;/td>
&lt;td>rotation&lt;/td>
&lt;td>Front wheel spin angle&lt;/td>
&lt;td>rad&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8&lt;/td>
&lt;td>ν (nu)&lt;/td>
&lt;td>rotation&lt;/td>
&lt;td>Rear wheel spin angle&lt;/td>
&lt;td>rad&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The frame reference point (Rx3, Ry3, Rz3) is a point fixed to body 3 near the bottom bracket.&lt;/p>
&lt;p>It is &lt;strong>not&lt;/strong> the CoG of body 3 — the CoG is offset by &lt;code>[XG3, 0, ZG3] = [0.20, 0, 0.10]&lt;/code> in the body frame.&lt;/p>
&lt;p>The full state vector is &lt;code>y = [q; q̇] ∈ ℝ¹⁸&lt;/code>, where &lt;code>q̇&lt;/code> are the generalized velocities.&lt;/p>
&lt;p>Why these coordinates?&lt;/p>
&lt;ul>
&lt;li>The 3 translational DOFs &lt;code>(Rx3, Ry3, Rz3)&lt;/code> locate the bicycle in space.&lt;/li>
&lt;li>Roll &lt;code>φ&lt;/code>, yaw &lt;code>ψ&lt;/code>, pitch &lt;code>θ&lt;/code> orient the frame. This ordering produces a rotation matrix without singularities at the operating angles of interest.&lt;/li>
&lt;li>Steering &lt;code>γ&lt;/code> is relative to the frame — it is the handlebar rotation about the (tilted) head tube axis.&lt;/li>
&lt;li>Wheel spin angles &lt;code>ε&lt;/code> and &lt;code>ν&lt;/code> are needed to compute tire slip and gyroscopic forces.&lt;/li>
&lt;/ul>
&lt;h4>Equations of Motion&lt;span class="absolute -mt-20" id="equations-of-motion">&lt;/span>
&lt;a href="#equations-of-motion" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>The dynamics follow the &lt;strong>Newton-Euler formulation in generalized coordinates&lt;/strong>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-14">M(q) · q̈ = Q(q, q̇)&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-14"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Where:&lt;/p>
&lt;ul>
&lt;li>&lt;code>q&lt;/code> — 9-element generalized coordinate vector&lt;/li>
&lt;li>&lt;code>M(q)&lt;/code> — 9×9 symmetric positive-definite mass matrix (configuration-dependent)&lt;/li>
&lt;li>&lt;code>Q(q, q̇)&lt;/code> — 9-element generalized force vector (sum of all forces)&lt;/li>
&lt;/ul>
&lt;p>&lt;code>Q&lt;/code> is assembled from four independent contributions:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-15">Q = Q_grav &amp;#43; Q_coriolis &amp;#43; Q_aero &amp;#43; Q_contact &amp;#43; Q_steer &amp;#43; Q_pedal&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-15"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;strong>Mass Matrix&lt;/strong>&lt;/p>
&lt;p>Computed using the &lt;strong>composite rigid body algorithm&lt;/strong>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-16">M = Σᵢ [ mᵢ · Jvᵢᵀ Jvᵢ &amp;#43; Jwᵢᵀ · Iᵢ_global · Jwᵢ ]&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-16"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Where &lt;code>Jvᵢ&lt;/code> and &lt;code>Jwᵢ&lt;/code> are the translational and angular Jacobians of body &lt;code>i&lt;/code>, and &lt;code>Iᵢ_global = Aᵢ · Iᵢ_body · Aᵢᵀ&lt;/code> transforms the body-frame inertia tensor to global frame.&lt;/p>
&lt;p>Jacobians are computed &lt;strong>numerically via central finite differences&lt;/strong> on the rotation matrices and CoG position functions (step size &lt;code>ε = 1e-7&lt;/code>).&lt;/p>
&lt;p>This avoids translating 590 lines of symbolic MATLAB code at the cost of ~18 extra &lt;code>mass_matrix()&lt;/code> calls per Coriolis evaluation.&lt;/p>
&lt;p>&lt;strong>Coriolis &amp;amp; Centrifugal Forces&lt;/strong>&lt;/p>
&lt;p>Computed from &lt;strong>Christoffel symbols of the first kind&lt;/strong>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-17">Qvᵢ = -Σⱼₖ Γᵢⱼₖ · q̇ⱼ · q̇ₖ
Γᵢⱼₖ = ½ (∂Mᵢⱼ/∂qₖ &amp;#43; ∂Mᵢₖ/∂qⱼ − ∂Mⱼₖ/∂qᵢ)&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-17"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;code>∂M/∂qₖ&lt;/code> is evaluated numerically (central finite differences on &lt;code>mass_matrix()&lt;/code>).&lt;/p>
&lt;p>&lt;strong>Tire-Ground Contact&lt;/strong>&lt;/p>
&lt;p>Each wheel uses an &lt;strong>elastic contact model&lt;/strong>:&lt;/p>
&lt;p>&lt;strong>Normal force&lt;/strong> — spring-damper with indentation &lt;code>δ&lt;/code>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-18">Fn = Kn · |δ| &amp;#43; c_damp · δ̇ · δ (active when δ &amp;lt; 0)&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-18"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;strong>Tangential force&lt;/strong> — piecewise linear (bristle model) saturated by a friction ellipse:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-19">Longitudinal: Fx = μx · Fn · (κ / κc) if |κ| ≤ κc
Fx = μx · Fn · sign(κ) otherwise
Lateral: Fy = μy · Fn · (α / αc) if |α| ≤ αc
Fy = μy · Fn · sign(α) otherwise&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-19"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>With elliptic saturation: if &lt;code>(Fx/μx)² + (Fy/μy)² ≥ Fn²&lt;/code>, both components are scaled back onto the friction ellipse.&lt;/p>
&lt;ul>
&lt;li>&lt;code>κ&lt;/code> = longitudinal slip ratio (wheel slip vs. rolling speed)&lt;/li>
&lt;li>&lt;code>α&lt;/code> = slip angle (angle between wheel heading and velocity vector)&lt;/li>
&lt;li>&lt;code>κc&lt;/code>, &lt;code>αc&lt;/code> = critical slip thresholds (both default to 0.12 rad)&lt;/li>
&lt;li>&lt;code>μx = μy = 0.9&lt;/code> — friction coefficients&lt;/li>
&lt;/ul>
&lt;p>The contact point geometry accounts for the &lt;strong>toroidal tire cross-section&lt;/strong> (ellipse semi-axes &lt;code>a_n = b_n = 0.02 m&lt;/code>), which shifts the effective contact radius with lean angle.&lt;/p>
&lt;p>&lt;strong>Applied Torques&lt;/strong>&lt;/p>
&lt;p>Steering and pedaling torques are projected into generalized coordinates using the angular Jacobians &lt;code>G4g&lt;/code> (handlebar) and &lt;code>G2g&lt;/code> (rear wheel):&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-20">Q_steer = G4gᵀ · [0, 0, τ_steer]
Q_pedal = G2gᵀ · [0, τ_pedal, 0]&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-20"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>State Vector &amp;amp; Generalized Coordinates&lt;/p>
&lt;p>The state vector &lt;code>y&lt;/code> has 18 elements: &lt;code>y = [q; q̇]&lt;/code>&lt;/p>
&lt;p>&lt;strong>Generalized Coordinates &lt;code>q&lt;/code> (indices 0–8)&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Index&lt;/th>
&lt;th>Symbol&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>0&lt;/td>
&lt;td>Rx3&lt;/td>
&lt;td>Frame origin — x position (m)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>Ry3&lt;/td>
&lt;td>Frame origin — y position (m)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>Rz3&lt;/td>
&lt;td>Frame origin — z position (m)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>φ (phi)&lt;/td>
&lt;td>Roll angle — lean (rad)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>ψ (psi)&lt;/td>
&lt;td>Yaw angle — heading (rad)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>θ (theta)&lt;/td>
&lt;td>Pitch angle (rad)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6&lt;/td>
&lt;td>γ (gamma)&lt;/td>
&lt;td>Steering angle — handlebar rotation (rad)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>7&lt;/td>
&lt;td>ε (epsilon)&lt;/td>
&lt;td>Front wheel spin angle (rad)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8&lt;/td>
&lt;td>ν (nu)&lt;/td>
&lt;td>Rear wheel spin angle (rad)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Generalized Velocities &lt;code>q̇&lt;/code> (indices 9–17)&lt;/strong>&lt;/p>
&lt;p>Same ordering as coordinates. Initial conditions:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-21">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">q0&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">0.97&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="c1"># starts at 0.97 m height&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">v0&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mf">0.34&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mf">0.34&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="c1"># 10 m/s forward, wheels spinning&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-21"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>References&lt;span class="absolute -mt-20" id="references">&lt;/span>
&lt;a href="#references" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3></description></item><item><title>OSS-AI Generated Videos with Remotion</title><link>https://JAlcocerT.github.io/JAlcocerT/video-creation-with-remotion/</link><pubDate>Fri, 27 Mar 2026 11:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/video-creation-with-remotion/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>From code to video with Remotion.&lt;/p>
&lt;p>&lt;em>Not just animations, racing charts are coming&lt;/em>&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>A video is just a function of &lt;strong>images over time&lt;/strong>.&lt;/p>
&lt;p>Some time ago I got to know about remotion:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/deg8bOoziaE" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>But lately, I have been doing a come back to mechanisms.&lt;/p>
&lt;p>Matplotlib impressed me last year, but being able to use ThreeJS to create even nicer augmented reality simulators is fantastic.&lt;/p>
&lt;p>Also, for D&amp;amp;A we have D3js to bring cool data driven graphs alive&lt;/p>
&lt;p>We also have blender for the renders&amp;hellip;&lt;/p>
&lt;p>But what if you just want a pure video?&lt;/p>
&lt;p>Does it need to be that complex?&lt;/p>
&lt;p>React can describe UI&amp;rsquo;s that change overtime.&lt;/p>
&lt;p>We already saw how to create presentations and CV&amp;rsquo;s with React&amp;hellip;&lt;/p>
&lt;p>&amp;hellip;even invoices with React!&lt;/p>
&lt;!-- open-source-curriculum
create-ppt-with-code -->
&lt;p>So&amp;hellip; WHY NOT using &lt;strong>React to create videos&lt;/strong>?&lt;/p>
&lt;h2>The Remotion Project&lt;span class="absolute -mt-20" id="the-remotion-project">&lt;/span>
&lt;a href="#the-remotion-project" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Remotion is a framework for creating &lt;strong>videos programmatically&lt;/strong> using React.&lt;/p>
&lt;p>Because you know, video is one of th emany things that you can make as a code.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/remotion-dev/remotion" target="_blank" rel="noopener">https://github.com/remotion-dev/remotion&lt;/a>&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>🎥 Make videos programmatically with React&lt;/p>
&lt;/blockquote>
&lt;p>If we can use web tech to make presentations or CVs&amp;hellip;&lt;/p>
&lt;p>How come the same tech would not be able to make &lt;code>mp4&lt;/code> videos.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://www.remotion.dev/docs" target="_blank" rel="noopener">https://www.remotion.dev/docs&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://www.npmjs.com/package/remotion" target="_blank" rel="noopener">https://www.npmjs.com/package/remotion&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://www.remotion.dev/templates" target="_blank" rel="noopener">https://www.remotion.dev/templates&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;a href="https://star-history.com/remotion-dev/remotion&amp;amp;Date" target="_blank" rel="noopener">&lt;img src="https://api.star-history.com/svg?repos=remotion-dev/remotion&amp;amp;type=Date" alt="Star History Chart" loading="lazy" />&lt;/a>&lt;/p>
&lt;p>Wonder what has happened to get that spike in stars?&lt;/p>
&lt;h3>How to Setup Remotion Project&lt;span class="absolute -mt-20" id="how-to-setup-remotion-project">&lt;/span>
&lt;a href="#how-to-setup-remotion-project" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I have been wondering around RemotionJS for some posts already:&lt;/p>
&lt;p>But so far, what it worked best for me to create animations was Matplotlib.&lt;/p>
&lt;p>Which kind?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /DataInMotion&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv run animate_sequential_compare_price_evolution_flex_custom.py MC.PA RMS.PA 2010-01-01 10 short&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>How about actually getting started with RemotionJS?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npm init video&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>There are &lt;strong>Examples&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/wcandillon/remotion-fireship" target="_blank" rel="noopener">https://github.com/wcandillon/remotion-fireship&lt;/a>
&lt;ul>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=deg8bOoziaE&amp;amp;t=58s" target="_blank" rel="noopener">https://www.youtube.com/watch?v=deg8bOoziaE&amp;t=58s&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3>RemotionJS x Claude Code&lt;span class="absolute -mt-20" id="remotionjs-x-claude-code">&lt;/span>
&lt;a href="#remotionjs-x-claude-code" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>But Im not going to use pre-made examples.&lt;/p>
&lt;p>Neither to care about reading the docs: &lt;a href="https://www.remotion.dev/docs/ai/claude-code" target="_blank" rel="noopener">https://www.remotion.dev/docs/ai/claude-code&lt;/a>&lt;/p>
&lt;p>Im going to use CC for this, as im paying the PRO sub right now.&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=y-pxNV0IyTY -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/y-pxNV0IyTY" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Just that this old repo that I tried in Q42024&amp;hellip;&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/VideoEditingRemotion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> remotion-cc&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Is going to have a new friend.&lt;/p>
&lt;p>Claude skills&amp;hellip;its just about &lt;code>SKILL.md&lt;/code> and the remotion team has put one together at &lt;code>claude-code-remotion&lt;/code>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.remotion.dev/docs/ai/skills" target="_blank" rel="noopener">https://www.remotion.dev/docs/ai/skills&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/vercel-labs/skills" target="_blank" rel="noopener">https://github.com/vercel-labs/skills&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npx create-video@latest
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx skills add remotion-dev/skills
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx skills list &lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The magic happens at &lt;code>.claude/skills/remotion-best-practices&lt;/code>&lt;/p>
&lt;p>&lt;strong>The remotion App&lt;/strong>: will help you make edits via UI if you&amp;rsquo;d want to.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx create-video@latest .&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm i
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run dev&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Go to &lt;code>localhost:3000&lt;/code>&lt;/p>
&lt;p>When you are done with it&amp;hellip;you render it&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">time&lt;/span> npx remotion render GoldPrice gold-price.mp4 &lt;span class="c1">#just 20seconds&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Going from &lt;a href="https://youtu.be/xqtzYbHIrMo" target="_blank" rel="noopener">this skeleton video&lt;/a>, to something way more pro:&lt;/p>
&lt;!--
https://youtu.be/hTz2J4EgNOs
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/hTz2J4EgNOs" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h4>YFinance x RemotionJS&lt;span class="absolute -mt-20" id="yfinance-x-remotionjs">&lt;/span>
&lt;a href="#yfinance-x-remotionjs" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>How about&amp;hellip;&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=NTfXwQ85suw -->
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/DataInMotion" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
DataInMotion | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/DataInMotion.git&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd DataInMotion &amp;amp;&amp;amp; branch libreportfolio&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run tests/plot_historical_gweiss.py mc.pa --start 2000-01-01 --brand &lt;span class="s2">&amp;#34;@LibrePortfolio&amp;#34;&lt;/span> --warmup-days &lt;span class="m">400&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/NTfXwQ85suw" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>After this one, you learn &lt;a href="https://www.remotion.dev/docs/the-fundamentals#compositions" target="_blank" rel="noopener">about &lt;strong>compositions&lt;/strong>&lt;/a>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx remotion compositions&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv init
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv add yfinance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#python scripts/fetch_ticker.py --ticker BTC-USD --name btc --start 2015-01-01 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run scripts/fetch_ticker.py --ticker BTC-USD --name btc --start 2015-01-01
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python scripts/generate_ts_data.py --name btc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># → creates src/btcData.ts with BTC_ANNUAL, KEY_EVENTS, COMMENTARY &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># → then create src/BtcComposition.tsx (copy GoldComposition, swap imports + props) &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># → add &amp;lt;Series.Sequence&amp;gt; in MarketRecapComposition.tsx &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Render only bitcoin (once added)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx remotion render Bitcoin bitcoin.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Render the full sequential reel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx remotion render MarketRecap market-recap.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!--
https://youtu.be/VMuCkckE5fw
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/VMuCkckE5fw" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>And then&amp;hellip;you just bring whatever matplotlib logic you had for the magic to happen:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npx remotion render AdpGweiss adp_gweiss.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Add another ticker (e.g. Coca-Cola) &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#python3 scripts/compute_gweiss.py --ticker KO --name ko --start 1990-01-01&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://youtu.be/JkDwY4onep4 -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/JkDwY4onep4" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Oh, Yep, its happenning.&lt;/p>
&lt;pre class="mermaid mt-6">flowchart LR
%% Styles
classDef state fill:#E3F2FD,stroke:#1565C0,stroke-width:2px,color:#0D47A1;
classDef start fill:#43A047,stroke:#1B5E20,stroke-width:2px,color:white;
%% Nodes
Start((Start)):::start --> More
More(Doing MORE):::state
Better(Doing BETTER):::state
Newer(Doing NEWER):::state
%% Internal Feedback Loops (The Grind)
More -- "Scale Up" --> More
Better -- "Refine" --> Better
Newer -- "Test" --> Newer
%% The Progression Journey
More -- "Capacity Hit" --> Better
Better -- "Optimized" --> Newer
%% The Upward Spiral
Newer -- "New Baseline" --> More&lt;/pre>&lt;p>Also that.&lt;/p>
&lt;p>My videos are not so horrible.&lt;/p>
&lt;p>But I mean&amp;hellip;&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npx remotion render SoftwareDrawdown software-drawdown.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://youtu.be/MZTt8ICeF0Y -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/MZTt8ICeF0Y" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>how could you think that making this kind of ~~video as a ~~code so cheap had no deflationary consecuencies?&lt;/p>
&lt;p>&lt;strong>PS&lt;/strong>: price is not current earnings, but current + estimated discounted cash flows&lt;/p>
&lt;p>Will the future hold so stable?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx remotion render DividendRace renders/dividend-race.mp4 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make help&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-dividend-race
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make data-marketcap-race &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make render-marketcap-race-short&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-sector-race &lt;span class="c1"># re-fetch &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-sector-race-short &lt;span class="c1"># full render (~55 s) &lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!--
https://youtu.be/OL5UQaZc97E -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/OL5UQaZc97E" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>The big insight: entry price matters as much as dividend growth&lt;/p>
&lt;p>O and TROW were cheap in 2000 and bought many more shares&lt;/p>
&lt;p>which amplified every subsequent dividend raise :)&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/G7u_KuvKK24" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://youtube.com/shorts/G7u_KuvKK24 -->
&lt;h4>F1 Data x RemotionJS&lt;span class="absolute -mt-20" id="f1-data-x-remotionjs">&lt;/span>
&lt;a href="#f1-data-x-remotionjs" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>By any chance can this formula 1 videos/shorts get more traction?&lt;/p>
&lt;p>Oh, the racing data charts are already in the yfinance section above&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make render-divrace-growth-race&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make render-total-return-race-short&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make render-gdp-race&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make render-population-race&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make render-gdppc-race&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ake render-purchasing-power-short&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#make data-ticker-invest Fetch MCD from 2000 (default) via yfinance&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make render-ticker-invest-short Render single-ticker invest reveal Short (~28 s)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#Custom: python3 scripts/compute_ticker_invest.py --ticker AAPL --start 2005-01-01&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#To use a different stock:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#python3 scripts/compute_ticker_invest.py --ticker AAPL --start 2005-01-01 --label &amp;#34;Apple&amp;#34; --color &amp;#34;#3b82f6&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#npx remotion render TickerInvest renders/ticker-invest-short.mp4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make render-yield-curve&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make render-inflation-fedrate&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/G7u_KuvKK24" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>But this is&amp;hellip;&lt;strong>racing&lt;/strong> as in&amp;hellip;going fast through circuits around the world:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/eda-f1" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Py EDA F1 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-13">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/eda-f1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd eda-f1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make help&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-13"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Or so it was&amp;hellip;until 2026 cars are &lt;a href="https://jalcocert.github.io/JAlcocerT/f1-data-animated/#conclusions" target="_blank" rel="noopener">clipping so hard&lt;/a>.&lt;/p>
&lt;p>In China between 6-9% of the lap:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-14">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make clipping_detector&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make clipping_detector &lt;span class="nv">ARGS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;2026 2 ANT&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make clipping_detector &lt;span class="nv">ARGS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;2026 2 ALO&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-14"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/ai-scripts-and-animated-data/" target="_blank" rel="noreferrer">&lt;img
alt="A Summary of Animations"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">A Summary of Animations&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Post with animated F1, Real Estate, yfinance&amp;hellip;&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/f1-data-animated/" target="_blank" rel="noreferrer">&lt;img
alt="F1 Animated Data"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/karting/long_g_trace_L4.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">F1 Animated Data&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Creating animations around F1 Data | Post&lt;/div>&lt;/a>
&lt;/div>
&lt;p>Why are my &lt;a href="https://jalcocert.github.io/JAlcocerT/f1-data-animated/" target="_blank" rel="noopener">amazing F1 shorts&lt;/a> not getting &lt;em>the hate&lt;/em> they deserve?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-15">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">uv run f1_deep_analysis.py &lt;span class="c1">#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mpv deep_analysis_2026_2_ANT_hud.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mpv deep_analysis_2025_2_PIA_hud.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#printf &amp;#34;file &amp;#39;deep_analysis_2026_1_RUS_hud.mp4&amp;#39;\nfile &amp;#39;deep_analysis_2025_1_1_hud.mp4&amp;#39;&amp;#34; &amp;gt; concat_list.txt &amp;amp;&amp;amp; ffmpeg -f concat -safe 0 -i concat_list.txt -c copy deep_analysis_joined.mp4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run f1_session_summary.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">printf&lt;/span> &lt;span class="s2">&amp;#34;file &amp;#39;deep_analysis_2026_1_RUS_hud.mp4&amp;#39;\nfile &amp;#39;outro_2026.mp4&amp;#39;\nfile &amp;#39;deep_analysis_2025_1_NOR_hud.mp4&amp;#39;\nfile &amp;#39;outro_2025.mp4&amp;#39;&amp;#34;&lt;/span> &amp;gt; cinematic_review_list.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg -f concat -safe &lt;span class="m">0&lt;/span> -i cinematic_review_list.txt -c copy f1_cinematic_review.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-15"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The Chinese GP was not so bad for this new gen cars: &lt;em>,just&amp;rsquo; 1:30:641 vs 1:32:064&lt;/em>: more time full throtle, but not there is clipping and more time to load batteries.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-16">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">========================================
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">📊 PERFORMANCE SUMMARY: ANT @ Chinese Grand Prix 2026
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">========================================
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">🟢 Full Throttle: 52.9%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">🔴 Braking: 22.5%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">🟡 Coasting: 3.0%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">🔵 DRS Active: 0.0%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">⚡ Max G-Force: 5.00 G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">🛑 Max De-accel: -5.00 G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">========================================
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">========================================
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">📊 PERFORMANCE SUMMARY: PIA @ Chinese Grand Prix 2025
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">========================================
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">🟢 Full Throttle: 39.7%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">🔴 Braking: 16.3%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">🟡 Coasting: 7.6%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">🔵 DRS Active: 18.5%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">⚡ Max G-Force: 2.41 G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">🛑 Max De-accel: -5.00 G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">========================================&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-16"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Lets have a look whats going on at &lt;strong>Suzuka&lt;/strong>: &lt;em>and compare it with last year, just to trol a litte bit&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-17">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv run f1_deep_analysis.py #china&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make deep_analysis ARGS=&amp;#34;2026 2 ANT 2 y&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv run f1_deep_analysis.py 2026 2 ANT 2 y&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make deep_analysis &lt;span class="nv">ARGS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;2026 3 RUS 2 n&amp;#34;&lt;/span> &lt;span class="c1">#ANT telemetry has some anomaly that tells is breaking where its not :)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make deep_analysis &lt;span class="nv">ARGS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;2026 3 ALO 2 n&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make clipping_detector &lt;span class="nv">ARGS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;2026 3 RUS&amp;#34;&lt;/span> &lt;span class="c1">#this is for qualifying&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-17"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/karting/clipping_analysis_2026_3_ALO.png" alt="suzuka 2026 f1 clipping qualifying ALO" loading="lazy" />&lt;/p>
&lt;p>Now clipping&amp;hellip;goes from 11.4% to 14.4%, all 130R :(&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-18">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">========================================
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">📊 CLIPPING SUMMARY: RUS
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">========================================
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">🟣 Clipping Detected: 11.4% of lap
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">⚡ Max Speed Reached: 329.0 km/h
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">📉 Longest Clipping: 22 samples
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">========================================
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">========================================
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">📊 PERFORMANCE SUMMARY: ALO @ Japanese Grand Prix
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">========================================
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">🟢 Full Throttle: 56.4%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">🔴 Braking: 13.8%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">🟡 Coasting: 7.1%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">🔵 DRS Active: 0.0%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">⚡ Max G-Force: 5.00 G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">🛑 Max De-accel: -4.84 G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">========================================&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-18"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>I could not resist to add a remotion folder to this &lt;code>eda-f1&lt;/code> project:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-19">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd remotion-f1 #but the magic happens at VideoEditingRemotion/remotion-cc anyways&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install fastf1 pandas
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make render-f1-telemetry&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Fetch Alonso&amp;#39;s Suzuka 2026 qualifying lap &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-f1-telemetry &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2026&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">3&lt;/span> &lt;span class="nv">F1_DRIVER&lt;/span>&lt;span class="o">=&lt;/span>ALO
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Render it → renders/f1-telemetry-2026-r3-ALO-Q.mp4 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-f1-telemetry &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2026&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">3&lt;/span> &lt;span class="nv">F1_DRIVER&lt;/span>&lt;span class="o">=&lt;/span>ALO &lt;span class="c1">#generated in ~1min 20s&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-19"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://youtu.be/QiTwSpgumwQ -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/QiTwSpgumwQ" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Crazy &lt;a href="https://youtu.be/KVzzp4NHR50" target="_blank" rel="noopener">how far from mercedes&lt;/a> they are.&lt;/p>
&lt;p>Or a race lap instead of qualifying:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-20">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make data-f1-telemetry &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2024&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">8&lt;/span> &lt;span class="nv">F1_DRIVER&lt;/span>&lt;span class="o">=&lt;/span>LEC &lt;span class="nv">F1_SESSION&lt;/span>&lt;span class="o">=&lt;/span>R
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-f1-telemetry &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2024&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">8&lt;/span> &lt;span class="nv">F1_DRIVER&lt;/span>&lt;span class="o">=&lt;/span>LEC &lt;span class="nv">F1_SESSION&lt;/span>&lt;span class="o">=&lt;/span>R
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># → renders/f1-telemetry-2024-r8-LEC-R.mp4 &lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-20"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Its surprising that the rendering goes faster than the original matplotlib one!&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/G7u_KuvKK24" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-21">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Monaco tends to be interesting — tight circuit, lots of ERS deployment zones &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-f1-clipping &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2024&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-f1-clipping-short &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2024&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># → renders/f1-clipping-2024-r8-Q.mp4 &lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-21"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/G7u_KuvKK24" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-22">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make data-f1-championship &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make render-f1-championship &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-22"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/G7u_KuvKK24" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-23">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># F1-D: Sector delta duel &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-f1-delta &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2024&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>VER &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>NOR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-f1-delta-short &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2024&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>VER &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>NOR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># F1-D: Sector delta duel &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-f1-delta &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2026&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">3&lt;/span> &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>ANT &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>RUS &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make render-f1-delta-short &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2026&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">3&lt;/span> &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>ANT &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>RUS
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-f1-delta &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2026&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">3&lt;/span> &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>RUS &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>ALO &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> make render-f1-delta-short &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2026&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">3&lt;/span> &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>RUS &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>ALO &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-23"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/G7u_KuvKK24" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-24">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make data-f1-delta &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2021&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">22&lt;/span> &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>VER &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>HAM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-f1-delta-short &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2021&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">22&lt;/span> &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>VER &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>HAM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># → renders/f1-delta-2021-r22-VER-HAM-Q.mp4 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># FastF1 has full telemetry back to 2018. First run will fetch 2021 Abu Dhabi Q from the API (may take a minute), &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># subsequent runs use cache. &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#You could also do the race lap instead of qualifying — that weekend&amp;#39;s race is the iconic one where HAM led most of &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># the race before the safety car controversy in the final laps:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-f1-delta &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2021&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">22&lt;/span> &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>VER &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>HAM &lt;span class="nv">F1_SESSION&lt;/span>&lt;span class="o">=&lt;/span>R
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-f1-delta-short &lt;span class="nv">F1_YEAR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">2021&lt;/span> &lt;span class="nv">F1_ROUND&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">22&lt;/span> &lt;span class="nv">F1_D1&lt;/span>&lt;span class="o">=&lt;/span>VER &lt;span class="nv">F1_D2&lt;/span>&lt;span class="o">=&lt;/span>HAM &lt;span class="nv">F1_SESSION&lt;/span>&lt;span class="o">=&lt;/span>R
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># → renders/f1-delta-2021-r22-VER-HAM-R.mp4 &lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-24"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h5>Kart Overlays?&lt;span class="absolute -mt-20" id="kart-overlays">&lt;/span>
&lt;a href="#kart-overlays" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h5>&lt;p>As long as you have your video at &lt;code>./public&lt;/code>, remotion can do the trick&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-25">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make data-gopro &lt;span class="c1"># re-extract (already done) &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-gopro &lt;span class="c1"># → renders/gopro-hud-GH030417.mp4 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Different video: &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-gopro &lt;span class="nv">GOPRO_VIDEO&lt;/span>&lt;span class="o">=&lt;/span>public/GH020417.MP4 &lt;span class="nv">GOPRO_LAP_START&lt;/span>&lt;span class="o">=&lt;/span>49.5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-gopro &lt;span class="nv">GOPRO_VIDEO&lt;/span>&lt;span class="o">=&lt;/span>public/GX010001.MP4 &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-25"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Not bad for being a copy of the matplotlib (not the Go desktop one):&lt;/p>
&lt;!-- https://youtu.be/it1D1qqWMfA -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/it1D1qqWMfA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;blockquote>
&lt;p>PS: Im in love with the &lt;strong>deceleration zones&lt;/strong> idea&lt;/p>
&lt;/blockquote>
&lt;p>it&amp;rsquo;s a resource configuration problem. Here&amp;rsquo;s the full picture: &lt;br>
Why it failed by default:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Remotion spawns 8 Chrome instances in parallel (concurrency=8)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Each Chrome instance decodes the 4K video frame-by-frame into a raw pixel buffer&lt;/p>
&lt;/li>
&lt;li>
&lt;p>4K frame = 3840×2160×3 bytes = ~25 MB per frame in RAM&lt;/p>
&lt;/li>
&lt;li>
&lt;p>8 instances × multiple buffered frames = Chrome exhausting available memory mid-render &lt;br>
How to use 4K natively with Remotion:&lt;/p>
&lt;ol>
&lt;li>Reduce concurrency — &amp;ndash;concurrency=1 or &amp;ndash;concurrency=2 keeps RAM usage manageable: &lt;br>
npx remotion render GoProHud out.mp4 &amp;ndash;concurrency=1&lt;/li>
&lt;li>Works fine, just slower (8–10× slower than the default).&lt;/li>
&lt;li>More RAM — If your machine had 32+ GB RAM, concurrency=8 with 4K would work. At 14 GB with 8 GB already used, you were left with ~6 GB free, which isn&amp;rsquo;t enough for 8 concurrent 4K decoders.&lt;/li>
&lt;li>Render at native 4K composition size — Set width={3840} height={2160} in Root.tsx, keep concurrency=1. Remotion handles it; Chrome just needs the RAM headroom.&lt;/li>
&lt;/ol>
&lt;p>The pre-transcode approach we used is actually the right choice for this specific case:&lt;/p>
&lt;ul>
&lt;li>The HUD canvas is 1920×1080 — rendering a 4K background into a 1080p output gives you zero visual benefit&lt;/li>
&lt;li>The transcoded clip also encodes faster and produces a smaller output file&lt;/li>
&lt;/ul>
&lt;p>TL;DR: 4K + Remotion works, but requires either &amp;ndash;concurrency=1 or enough RAM (32 GB+) for parallel instances. For a 1920×1080 HUD composition, downscaling to 1080p before rendering is the right call regardless.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-26">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npx remotion render GoProHudB renders/gopro-hud-GH020417.mp4 --concurrency&lt;span class="o">=&lt;/span>&lt;span class="m">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#GOPRO_VIDEO=public/GX010001.MP4 GOPRO_LAP_START=8.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx remotion render GoProHud out.mp4 --concurrency=2&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-26"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/coolresources/video/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Video | Docs ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/coolresources/race/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Racing | Docs ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;h4>Mechanisms x RemotionJS&lt;span class="absolute -mt-20" id="mechanisms-x-remotionjs">&lt;/span>
&lt;a href="#mechanisms-x-remotionjs" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Having the Python + &lt;a href="https://jalcocert.github.io/JAlcocerT/cad-design-mbsd/" target="_blank" rel="noopener">CadQuery&lt;/a> + &lt;a href="https://jalcocert.github.io/JAlcocerT/using-blender-with-ai/" target="_blank" rel="noopener">Blender&lt;/a> way is amazing.&lt;/p>
&lt;p>But maybe&amp;hellip;&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/3Design" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
3Design | Repo&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/mbsd" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
MBSD | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;p>is there a better way to just create videos about mechanisms?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-27">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make render-mech-a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># → renders/mech-a-slider_crank-10rpm.mp4 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mpv renders/mech-a-slider_crank-10rpm.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Or at a faster crank speed: &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make data-mech-a &lt;span class="nv">MECH_RPM&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">30&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-mech-a &lt;span class="nv">MECH_RPM&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">30&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># → renders/mech-a-slider_crank-30rpm.mp4 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/mbsd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd mbsd/&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-27"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-28">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make render-mech-b
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># → renders/mech-b-slider_crank-10rpm.mp4 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Or regenerate data + render both in one go: &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make data-mech-a &amp;amp;&amp;amp; make render-mech-a &amp;amp;&amp;amp; make render-mech-b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-mech-c
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-mech-d&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-28"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Phase 1 — full run through the simulation with velocity arrows only (Mech-B style: cyan→orange→red), link gradients keyed to speed&lt;/p>
&lt;p>Transition card (1.5 s) — dark overlay with &amp;ldquo;PHASE 1: VELOCITY → PHASE 2: ACCELERATION&amp;rdquo; label showing both color palettes&lt;/p>
&lt;p>Phase 2 — runs through the simulation again with both layers simultaneously:&lt;/p>
&lt;ul>
&lt;li>Velocity arrows fade to 40% opacity (still visible, dimmed)&lt;/li>
&lt;li>Acceleration arrows fade in at full brightness with stronger glow indigo→violet→amber)&lt;/li>
&lt;li>Link gradients switch to the acceleration palette&lt;/li>
&lt;li>Trail colour flips to acceleration&lt;/li>
&lt;li>HUD shows both m/s and m/s² readouts per tracked point&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-29">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo apt update &amp;amp;&amp;amp; sudo apt install ffmpeg&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ls *.mp4 &lt;span class="p">|&lt;/span> sed &lt;span class="s2">&amp;#34;s/^/file &amp;#39;/; s/&lt;/span>$&lt;span class="s2">/&amp;#39;/&amp;#34;&lt;/span> &amp;gt; file_list.txt &lt;span class="c1">#add .mp4 of current folder to a list&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ffmpeg -f concat -safe &lt;span class="m">0&lt;/span> -i file_list.txt -c copy output_video.mp4 &lt;span class="c1">#original audio&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#ffmpeg -f concat -safe 0 -i file_list.txt -c:v copy -an silenced_output_video.mp4 #silenced video&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-29"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://youtu.be/cFHyobRjcK0 -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/cFHyobRjcK0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Remotion has integration with &lt;a href="https://www.remotion.dev/docs/videos/as-threejs-texture" target="_blank" rel="noopener">https://www.remotion.dev/docs/videos/as-threejs-texture&lt;/a>&lt;/p>
&lt;p>Which I have been convering recently for the &lt;a href="https://jalcocert.github.io/JAlcocerT/2d-mbsd/" target="_blank" rel="noopener">2D simulator&lt;/a>.&lt;/p>
&lt;p>And also&amp;hellip;&lt;/p>
&lt;p>React Three Fiber ~ Three JS?&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://r3f.docs.pmnd.rs/getting-started/introduction" target="_blank" rel="noopener">https://r3f.docs.pmnd.rs/getting-started/introduction&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://r3f.docs.pmnd.rs/getting-started/examples" target="_blank" rel="noopener">https://r3f.docs.pmnd.rs/getting-started/examples&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>You can also add: &lt;a href="https://www.remotion.dev/docs/captions/displaying" target="_blank" rel="noopener">https://www.remotion.dev/docs/captions/displaying&lt;/a>&lt;/p>
&lt;p>And add video sequences: &lt;a href="https://www.remotion.dev/docs/videos/" target="_blank" rel="noopener">https://www.remotion.dev/docs/videos/&lt;/a>&lt;/p>
&lt;h5>Websites to&amp;hellip;RemotionJS?&lt;span class="absolute -mt-20" id="websites-toremotionjs">&lt;/span>
&lt;a href="#websites-toremotionjs" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h5>&lt;p>We said that remotionJS uses react.&lt;/p>
&lt;p>Like&amp;hellip;that &lt;a href="https://github.com/JAlcocerT/btc-powerlaw/blob/master/tech-stack.md" target="_blank" rel="noopener">quick &lt;strong>Vite+FastAPI&lt;/strong> stack&lt;/a> that generates this &lt;a href="https://jalcocert.github.io/JAlcocerT/ideas-to-execution-with-dao/#for-vibe-coders" target="_blank" rel="noopener">btc power law thingy&lt;/a> you can create to test a &lt;a href="https://github.com/JAlcocerT/btc-powerlaw/blob/master/GEMINI.md" target="_blank" rel="noopener">gemini prompt&lt;/a>&lt;/p>
&lt;p>Can it be static?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-30">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">this has been amazing and im impressed about the UI/X im just questioning if we really need this FE and BE, as the data is a snapshot. So could we do a folder that makes the static-website with same look and feel just that CSR? we should not touch current functionality&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-30"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-31">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> static-app
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run preview&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make static-build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make static-deploy &lt;span class="c1">#npx wrangler@latest pages deploy static-app/dist/ --project-name btc-powerlaw&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-31"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And&amp;hellip;here it goes: &lt;code>http://btc-powerlaw.pages.dev/&lt;/code>&lt;/p>
&lt;p>Yep, Vite+React nice look and feel thanks to this prompt and &lt;a href="https://jalcocert.github.io/JAlcocerT/powerlaw-and-series-with-python/" target="_blank" rel="noopener">the power law idea&lt;/a>.&lt;/p>
&lt;p>Even beter, can it generate a video with remotion out of it as it used react?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-32">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ../remotion-promo-video&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make data-btc-powerlaw &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make render-btc-powerlaw&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-32"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Does that mean that if your website already uses React then Claude Code has a much easier job to undertand your branding?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-33">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /slider-crank #this is exactly what im talking about&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-33"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This is resonating a lot for me to promote all those &lt;code>realestate.&lt;/code>, &lt;code>webaudit.&lt;/code> etc etc etc services :)&lt;/p>
&lt;p>You can make quick promo videos or showcase of the web/apps you &lt;del>create&lt;/del> vibe code.&lt;/p>
&lt;p>does this mean&amp;hellip;that in one year we have gone from repository to docs&amp;hellip;&lt;/p>
&lt;p>to a repository to explanatory video with the look and feel plugged in?&lt;/p>
&lt;p>ok&amp;hellip;we are done then :)&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Now you have three options: &lt;a href="https://jalcocert.github.io/JAlcocerT/things-as-a-code/" target="_blank" rel="noopener">everything as a code&lt;/a>.&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/ai-scripts-and-animated-data/" target="_blank" rel="noopener">Keep matplotlib&lt;/a> with certain cool custom logic&lt;/li>
&lt;li>Go the &lt;a href="https://jalcocert.github.io/JAlcocerT/using-blender-with-ai/" target="_blank" rel="noopener">python - blender&lt;/a> route&lt;/li>
&lt;li>NEW: Use&amp;hellip;remotion to create videos as a code based on your existing code base!&lt;/li>
&lt;/ol>
&lt;p>Now clear yet on the how to?&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/VideoEditingRemotion" target="_blank" rel="noreferrer">&lt;img
alt="Remotion x Video Edition"
loading="lazy"
decoding="async"
src="https://github.com/JAlcocerT/local-deep-researcher/raw/main/local-research-sample.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Remotion x Video Edition&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Ollama x DDG Search x LangGraph&lt;/div>&lt;/a>
&lt;/div>
&lt;p>Its all about having the right SKILLS~~.md~~&lt;/p>
&lt;!--
https://www.youtube.com/watch?v=BC4xJzNqutc
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/BC4xJzNqutc" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>You dont have to run anywhere to make your dream project.&lt;/p>
&lt;pre class="mermaid mt-6">flowchart LR
%% --- Styles ---
classDef free fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20;
classDef low fill:#FFF9C4,stroke:#FBC02D,stroke-width:2px,color:#F57F17;
classDef mid fill:#FFE0B2,stroke:#F57C00,stroke-width:2px,color:#E65100;
classDef high fill:#FFCDD2,stroke:#C62828,stroke-width:2px,color:#B71C1C;
%% --- Nodes ---
L1("Free Content&lt;br/>(Blog/YT $0)"):::free
L2("DIY&lt;br/>(Templates / Platform) $"):::low
L3("Done With You&lt;br/>(Consulting) $$"):::mid
L4("Done For You&lt;br/>(Services) $$$"):::high
%% --- Connections ---
L1 --> L2
L2 --> L3
L3 --> L4&lt;/pre>&lt;p>You can get it done:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/tiersofservice/dwi/selfh-landing-astro-fastapi-bot.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/shipping/dna-1ton-ebook.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks to enable you to create&lt;/div>&lt;/a>
&lt;/div>
&lt;p>Or just keep reading to get more ideas :)&lt;/p>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Adding AI Generated Audio to RemotionJS Videos&lt;span class="absolute -mt-20" id="adding-ai-generated-audio-to-remotionjs-videos">&lt;/span>
&lt;a href="#adding-ai-generated-audio-to-remotionjs-videos" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Because a video without a nice audio is half a video.&lt;/p>
&lt;h3>What&amp;rsquo;s Motion Desing?&lt;span class="absolute -mt-20" id="whats-motion-desing">&lt;/span>
&lt;a href="#whats-motion-desing" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>No, nothing to do with mechanisms and blender&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/1WzRJM8HVKg" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>But&amp;hellip;&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/MAhkbZHcbLA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!--
https://www.youtube.com/watch?v=MAhkbZHcbLA
-->
&lt;h3>My Fav ways to create video animations&lt;span class="absolute -mt-20" id="my-fav-ways-to-create-video-animations">&lt;/span>
&lt;a href="#my-fav-ways-to-create-video-animations" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>Matplotlib &lt;del>plotly&lt;/del> - Because its more custom and quicker than you thought&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The Python cadquery and then blender flow&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Now&amp;hellip;apparently remotionJS!&lt;/p>
&lt;/li>
&lt;/ol></description></item><item><title>2D Kinematics and Dynamics</title><link>https://JAlcocerT.github.io/JAlcocerT/2d-mbsd/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/2d-mbsd/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>A summary of 2D mechanics for multibody systems.&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>I vibecoded in one shot a static cool page about multibody: &lt;a href="https://multibodysystemdynamics.pages.dev/" target="_blank" rel="noopener">https://multibodysystemdynamics.pages.dev/&lt;/a>&lt;/p>
&lt;p>And ended up taking back mbsd where I left it during &lt;a href="https://jalcocert.github.io/JAlcocerT/slider-crank-mechanism/" target="_blank" rel="noopener">spring of 2023&lt;/a>.&lt;/p>
&lt;p>How much things have changed since then&amp;hellip;&lt;/p>
&lt;p>I mean, same physics.&lt;/p>
&lt;p>But&amp;hellip;&lt;/p>
&lt;p>Lets say that now migration from Matlab to Python is waaay faster.&lt;/p>
&lt;h2>About MBSD&lt;span class="absolute -mt-20" id="about-mbsd">&lt;/span>
&lt;a href="#about-mbsd" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Code is law, specially for multibody system dynamics.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone git clone https://github.com/JAlcocerT/mbsd&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/mbsd" target="_blank" rel="noreferrer">&lt;img
alt="NEW MBSD"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">NEW MBSD&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Source Code of a MBSD framework in Python&lt;/div>&lt;/a>
&lt;/div>
&lt;p>This is obviously superseeding:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/JAlcocerT/Slider-Crank" target="_blank" rel="noopener">https://github.com/JAlcocerT/Slider-Crank&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/JAlcocerT/mechanism" target="_blank" rel="noopener">https://github.com/JAlcocerT/mechanism&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3>Kinematics&lt;span class="absolute -mt-20" id="kinematics">&lt;/span>
&lt;a href="#kinematics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>With &lt;em>just kinematics&lt;/em> and the learnings inside the 3D-Design repository&amp;hellip;&lt;/p>
&lt;p>You can do cool stuff already.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./3D-Design/mbsd-to-render/bicycle_leg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make help&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Once rendered at my x300, I bring it to my x13 via &lt;strong>rsync&lt;/strong>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make all
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rsync -avP jalcocert@192.168.1.2:/home/jalcocert/3Design/mbsd-to-render/bicycle-leg/render/bicycle_leg.mp4 .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mpv bicycle_leg.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/PBFRIEC9aB8" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://youtu.be/PBFRIEC9aB8 -->
&lt;p>This is the flow:&lt;/p>
&lt;pre class="mermaid mt-6">flowchart LR
A[q₀ initial guess] --> B[Position solve:&lt;br/>C q,t = 0&lt;br/>Newton-Raphson]
B --> C[Velocity solve:&lt;br/>Cq·v = -Ct]
C --> D[Acceleration solve:&lt;br/>Cq·a = -DCq·v + Ctt]
D --> E[Store q, v, a at tᵢ]
E --> F{Next t?}
F -->|yes, q₀ := q| B
F -->|no| G[Done]&lt;/pre>&lt;h4>Implemented 2D Constrains&lt;span class="absolute -mt-20" id="implemented-2d-constrains">&lt;/span>
&lt;a href="#implemented-2d-constrains" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>A &lt;strong>holonomic&lt;/strong> constraint is an equation of the form &lt;code>C(q, t) = 0&lt;/code> that
must hold at every time.&lt;/p>
&lt;p>&amp;ldquo;Holonomic&amp;rdquo; means it depends only on positions (and possibly explicit time), not on velocities.&lt;/p>
&lt;p>All the joints in this series are holonomic.&lt;/p>
&lt;p>Common &lt;strong>2D joint types&lt;/strong> and the number of equations each contributes:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Joint&lt;/th>
&lt;th>Geometric meaning&lt;/th>
&lt;th>Equations&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Revolute (pin)&lt;/td>
&lt;td>Two body-fixed points coincide in world&lt;/td>
&lt;td>2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Prismatic (slider)&lt;/td>
&lt;td>Same angle + one point stays on a fixed line&lt;/td>
&lt;td>2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Point-on-line&lt;/td>
&lt;td>One body-fixed point stays on a line defined by another body&lt;/td>
&lt;td>1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cam/Leva&lt;/td>
&lt;td>Two parameterised surfaces stay in tangent contact&lt;/td>
&lt;td>3 (+ 2 extra coords per joint)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Gear&lt;/td>
&lt;td>&lt;code>θ_i − τ·θ_j = 0&lt;/code> (fixed transmission ratio)&lt;/td>
&lt;td>1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>User&lt;/td>
&lt;td>Any scalar equation &lt;code>C_user(q, t) = 0&lt;/code> (driving motion, locks, …)&lt;/td>
&lt;td>1 or more&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Plus three equations pinning the ground body at &lt;code>x_0 = y_0 = θ_0 = 0&lt;/code>.&lt;/p>
&lt;p>Stacking all constraint equations gives the &lt;strong>constraint vector&lt;/strong> &lt;code>C(q, t) ∈ ℝ^{n_restr}&lt;/code>. The system&amp;rsquo;s physical &lt;strong>degrees of freedom&lt;/strong> are&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-4">n_DOF = n_coord − n_restr&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>For a slider-crank driven by a user constraint that prescribes the crank
angle, &lt;code>n_DOF = 0&lt;/code> — the mechanism&amp;rsquo;s motion is completely determined.&lt;/p>
&lt;blockquote>
&lt;p>Without that user constraint, &lt;code>n_DOF = 1&lt;/code> — the crank can spin freely.&lt;/p>
&lt;/blockquote>
&lt;h3>Dynamics&lt;span class="absolute -mt-20" id="dynamics">&lt;/span>
&lt;a href="#dynamics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Understand &lt;strong>constrained dynamics&lt;/strong> and how to simulate real mechanisms with 2D motions.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./mbsd/2D-Dynamics&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;code>Video Sequence in _all.mp4&lt;/code>&lt;/p>
&lt;p>The combined video now shows the complete causality chain:&lt;/p>
&lt;ul>
&lt;li>Forces (gravity + applied torque)&lt;/li>
&lt;li>Constraints (gravity vs constraint forces) ← NEW!&lt;/li>
&lt;li>Accelerations (F = ma)&lt;/li>
&lt;li>Velocities (∫a dt)&lt;/li>
&lt;li>Energy Flow (validation)&lt;/li>
&lt;/ul>
&lt;p>See a diagram of &lt;a href="https://mermaid.live/edit#pako:eNptU91u0zAUfpUjXzEt7fqbrRUdmloQAk1oP1ekpfJit7WU2IntZCtVpYkLJG4Rr8ALjAsuuNsD8BB7Eo6dtgg2S0n8ne87x8df7BWJFeOkT2aJuo4XVFu4HI0l4LiwiJ5F-cOn2wBKfMPD7TdIC2PBUCvMbAlDcCwMoDHZg1rtGC64LbLIxCJb1o1KSj4VZfb8Sh8ca6uSQZPXegHQzbTZnGxWcllVvuVZdP6204VMq0wZbsCKlBsMb7U49dLz1xcRW0qaithM9QKFAeRBibJKiLzXvVI65iY6m1plaQID383ZdK5pKewS9jfYZFrIudnhWElLY7vDheH6Ue1Takx0CrnXpAggpVaLG4-FjJO661fIJ1KHeTSc5pB7U9_QWF0JKn0ew_gBs55wmwfGtSgr6v5uiNT9nSdbklXcrni118pJyljCq7Br81FwmP8T2rjrUTQmEZyCH9jMh0uYQAQU34DfrZMT31LkFE7Y8HIn_P0LPwM3-VHV2EgRDqA2Gub3P0uoYZ61YzKpunBnJZJZPRGSJvPq7Oy25dnqp-NJ0TJi3qABbFwpK0T_muxlPuOE0cyuXmqtNIjKYDx-XFMZ8xfrSu41qAapdqfwP2a5sfWElS4zwt_z-SvYfWYnW6UnvGikJF-h4st3sFMu2XYdF39ymS2xXeVdYbPC3T2wgHcPrO9bSVeuROvnWrDJHgmIm5C-1QUPSMp1Sh0kK1d1TOyCp3xM-jhlfEaLBO0eyzWmZVS-VyrdZmpVzBekP6OJQVRkjFo-EhSvSLqLatwH10NVSEv67cOWL0L6K3KDsFvvHXUO8Wk3272wc9QJyJL0O2G92w0b4VGn1eg0G81uuA7IR79uq95uhO2wddgLcWDe-g8VPHGZ" target="_blank" rel="noopener">the dynamics flow&lt;/a>&lt;/p>
&lt;h4>Physics x Lagrangian&lt;span class="absolute -mt-20" id="physics-x-lagrangian">&lt;/span>
&lt;a href="#physics-x-lagrangian" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>The Physics: Constrained Lagrangian Mechanics&lt;/p>
&lt;p>M·a = Q_total = Q_gravity + Q_constraint + Q_applied&lt;/p>
&lt;p>&lt;strong>The Equation We Solve&lt;/strong>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-6">M(q) @ a &amp;#43; ∇V(q) = Q_ext &amp;#43; C_q^T @ λ&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Where:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>M(q)&lt;/strong> = Mass matrix (constant in reference coordinates)&lt;/li>
&lt;li>&lt;strong>a&lt;/strong> = Acceleration vector (what we compute)&lt;/li>
&lt;li>&lt;strong>∇V(q)&lt;/strong> = Potential energy gradient (gravity effects)&lt;/li>
&lt;li>&lt;strong>Q_ext&lt;/strong> = External forces (torques, springs, user input)&lt;/li>
&lt;li>&lt;strong>C_q^T @ λ&lt;/strong> = Constraint reaction forces (the hidden part!)&lt;/li>
&lt;li>&lt;strong>λ&lt;/strong> = Lagrange multipliers (automatic, varies with config)&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>The Constraint Equations&lt;/strong>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;pre>&lt;code id="code-block-7">C(q, t) = 0 ← Joint constraint (position)
C_q @ v = ∂C/∂t ← Velocity constraint (automatic)
C_q @ a = -dC_q @ v - d²C/dt² ← Acceleration constraint&lt;/code>&lt;/pre>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h4>The Mathematical Recipe for 2D Dynamics&lt;span class="absolute -mt-20" id="the-mathematical-recipe-for-2d-dynamics">&lt;/span>
&lt;a href="#the-mathematical-recipe-for-2d-dynamics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>This is a high-level summary of the mathematical &amp;ldquo;recipe&amp;rdquo; used to solve the dynamics&lt;/p>
&lt;p>To move from a static description of a mechanism to a living simulation, we follow a four-step mathematical process rooted in &lt;strong>Lagrangian Mechanics&lt;/strong>.&lt;/p>
&lt;ol>
&lt;li>Define the System State&lt;/li>
&lt;/ol>
&lt;p>We represent every rigid body $i$ using three coordinates: $q_i = [x, y, \theta]^T$.&lt;/p>
&lt;p>For a system of $n$ bodies, the global state vector is:&lt;/p>
&lt;p>$$q = [q_1, q_2, \dots, q_n]^T$$&lt;/p>
&lt;ol start="2">
&lt;li>Apply Geometric Constraints&lt;/li>
&lt;/ol>
&lt;p>Physical joints (pins, sliders, gears) are represented as algebraic equations that must equal zero:&lt;/p>
&lt;p>$$C(q, t) = 0$$&lt;/p>
&lt;p>To solve for motion, we must know how these constraints change as the bodies move.&lt;/p>
&lt;p>We find the &lt;strong>Jacobian&lt;/strong> ($C_q$) by taking the partial derivative of the constraints with respect to the coordinates:&lt;/p>
&lt;p>$$C_q = \frac{\partial C}{\partial q}$$&lt;/p>
&lt;ol start="3">
&lt;li>Assemble the Equations of Motion&lt;/li>
&lt;/ol>
&lt;p>Using the Principle of Virtual Work and the Lagrange Multiplier method, we combine Newton&amp;rsquo;s second law ($F = ma$) with our constraints.&lt;/p>
&lt;p>This results in the &lt;strong>Saddle-Point System&lt;/strong>:&lt;/p>
&lt;p>$$\begin{bmatrix} M(q) &amp;amp; C_q^T \ C_q &amp;amp; 0 \end{bmatrix} \begin{bmatrix} a \ \lambda \end{bmatrix} = \begin{bmatrix} Q_{total} \ \gamma \end{bmatrix}$$&lt;/p>
&lt;ul>
&lt;li>&lt;strong>$M(q)$&lt;/strong>: The mass and inertia of all bodies.&lt;/li>
&lt;li>&lt;strong>$a$&lt;/strong>: The unknown accelerations we want to find.&lt;/li>
&lt;li>&lt;strong>$\lambda$&lt;/strong>: The unknown &lt;strong>Lagrange Multipliers&lt;/strong> (the reaction forces at the joints).&lt;/li>
&lt;li>&lt;strong>$Q_{total}$&lt;/strong>: External forces like gravity, springs, and motor torques.&lt;/li>
&lt;li>&lt;strong>$\gamma$&lt;/strong>: The &amp;ldquo;acceleration RHS,&amp;rdquo; which handles the inertial effects of the constraints ($C_q \cdot a = \gamma$).&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>Integrate or Extract&lt;/li>
&lt;/ol>
&lt;p>Depending on the goal, we use the results of that matrix solve in two ways:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Forward Dynamics:&lt;/strong> We take the accelerations ($a$), add them to the current velocities, and update the positions using a time-integrator (like Runge-Kutta). This &amp;ldquo;plays&amp;rdquo; the simulation forward.&lt;/li>
&lt;li>&lt;strong>Inverse Dynamics:&lt;/strong> If the motion is already prescribed (e.g., we know the crank must spin at 10 RPM), we solve for $\lambda$ to find out exactly how much torque the motor needs to provide and how much stress the bearings are under.&lt;/li>
&lt;/ul>
&lt;p>By repeating this solve hundreds of times per second, we capture the high-frequency vibrations and inertial &amp;ldquo;shakes&amp;rdquo; characteristic of complex mechanical systems.&lt;/p>
&lt;h4>2D Direct Mechanics&lt;span class="absolute -mt-20" id="2d-direct-mechanics">&lt;/span>
&lt;a href="#2d-direct-mechanics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Given certain forces - where does the mbsd position evolve over time?&lt;/p>
&lt;h4>2D Inverse Mechanics&lt;span class="absolute -mt-20" id="2d-inverse-mechanics">&lt;/span>
&lt;a href="#2d-inverse-mechanics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Given a defined trajectory - what are the forces that make it possible?&lt;/p>
&lt;p>Thats not a problem, see this script for a slider crank rotating at constant speed.&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mec/inverse_slider_crank.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;p>Given a kinematically-driven trajectory (mechanism with &lt;code>DOF = 0&lt;/code> thanks to
user constraints), compute the &lt;strong>Lagrange multipliers = constraint reaction
forces&lt;/strong> at every time step.&lt;/p>
&lt;p>No integration — just a kinematic sweep plus the saddle-point solve.&lt;/p>
&lt;p>The classic ME use case: &amp;ldquo;I need my crankshaft to rotate at 10 RPM — what
driving torque do I supply, and what loads do the bearings see through the
cycle?&amp;rdquo;&lt;/p>
&lt;h2>A 2D MBSD Simulator&lt;span class="absolute -mt-20" id="a-2d-mbsd-simulator">&lt;/span>
&lt;a href="#a-2d-mbsd-simulator" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>As Im preparing for 3D, just thought that matplotlib could be insufficient.&lt;/p>
&lt;p>I got to know about &lt;strong>3JS&lt;/strong>: &lt;code>https://threejs.org/&lt;/code>&lt;/p>
&lt;p>Just tweaked the architecture and made it hybrid&amp;hellip;&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/mbsd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /home/jalcocert/Desktop/mbsd/2D-Dynamics &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">source&lt;/span> venv/bin/activate &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> python3 examples/export_for_viewer.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cp /home/jalcocert/Desktop/mbsd/2D-Dynamics/viewer/data/slider-crank*.json /home/jalcocert/Desktop/mbsd/2D-Simulator/viewer/data/ &amp;amp;&amp;amp; ls -lh /home/jalcocert/Desktop/mbsd/2D-Simulator/viewer/data/*.json&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>That will generate a JSON export with what the mechanism do.&lt;/p>
&lt;p>Meaning snapshots of its position defined overtime&lt;/p>
&lt;p>To visualize whats coming: &lt;em>and debug&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ./mbsd/2D-Dynamics&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /home/jalcocert/Desktop/mbsd/2D-Simulator
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python3 visualize_json.py viewer/data/slider-crank-no-gravity.json --frame &lt;span class="m">0&lt;/span> --output reference_frame_0.png
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Visualize frame 0 (initial position)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python3 visualize_json.py viewer/data/slider-crank-no-gravity.json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Visualize a specific frame and save as PNG&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python3 visualize_json.py viewer/data/slider-crank-no-gravity.json --frame &lt;span class="m">50&lt;/span> --output frame_50.png
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Works with any mechanism JSON&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python3 visualize_json.py viewer/data/slider-crank.json --frame &lt;span class="m">100&lt;/span> --output gravity_frame.png&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Now to visualize it: &lt;em>thanks to threeJS, we have some kind of augmented reality :)&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./mbsd/2D-Simulator
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This installs:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Three.js&lt;/strong> - 3D WebGL rendering library&lt;/li>
&lt;li>&lt;strong>Vite&lt;/strong> - Fast development server&lt;/li>
&lt;li>&lt;strong>dat.gui&lt;/strong> - UI controls (for future enhancements)&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm run dev&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>We already capture all this data in the JSON:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="err">trajectory_data&lt;/span> &lt;span class="err">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;time&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="err">float(t)&lt;/span> &lt;span class="err">for&lt;/span> &lt;span class="err">t&lt;/span> &lt;span class="err">in&lt;/span> &lt;span class="err">t_dyn&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;positions&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="err">...&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;velocities&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="err">...&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="err">#&lt;/span> &lt;span class="err">←&lt;/span> &lt;span class="err">Already&lt;/span> &lt;span class="err">have&lt;/span> &lt;span class="err">this&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;accelerations&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="err">...&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="err">#&lt;/span> &lt;span class="err">←&lt;/span> &lt;span class="err">Already&lt;/span> &lt;span class="err">have&lt;/span> &lt;span class="err">this&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;tau_applied&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="err">...&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="err">#&lt;/span> &lt;span class="err">←&lt;/span> &lt;span class="err">Constraint&lt;/span> &lt;span class="err">forces&lt;/span> &lt;span class="err">at&lt;/span> &lt;span class="err">joints&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;energy&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="err">#&lt;/span> &lt;span class="err">←&lt;/span> &lt;span class="err">Already&lt;/span> &lt;span class="err">computing&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;kinetic&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="err">...&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;potential&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="err">...&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;total&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="err">...&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>What we could visualize (Phase 2):&lt;/p>
&lt;ul>
&lt;li>Velocity vectors — arrows at joints showing speed magnitude/direction&lt;/li>
&lt;li>Acceleration vectors — arrows showing acceleration at points&lt;/li>
&lt;li>Force vectors — arrows at constraint points showing internal forces&lt;/li>
&lt;li>Color-coded bars — bars colored by velocity/acceleration magnitude&lt;/li>
&lt;li>Energy flow — animate kinetic↔potential energy transfers&lt;/li>
&lt;li>Vector trails — show historical path of joint motion&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>A mechanism is an &lt;code>MBody&lt;/code> object with:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Attribute&lt;/th>
&lt;th>Contents&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>bodies&lt;/code>&lt;/td>
&lt;td>list of &lt;code>Body(name, mass, inertia, rG)&lt;/code>; body 0 is always ground&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>rev_joints&lt;/code>&lt;/td>
&lt;td>list of &lt;code>RevJoint(i, j, ri, rj)&lt;/code> — revolute pair between body i and j at local points ri, rj&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>prism_joints&lt;/code>&lt;/td>
&lt;td>&lt;code>PrismJoint(i, j, ri, rj, hi)&lt;/code> — prismatic, &lt;code>hi&lt;/code> defines sliding direction normal&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>punto_linea_joints&lt;/code>&lt;/td>
&lt;td>&lt;code>PuntoLineaJoint(i, j, ri, rj, hi)&lt;/code> — point on line&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>leva_joints&lt;/code>&lt;/td>
&lt;td>&lt;code>LevaJoint(i, j, geom_i, geom_j, ri, rj)&lt;/code> — surface-surface CAM contact (3 eqs, adds 2 extra coords per joint)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>gear_joints&lt;/code>&lt;/td>
&lt;td>&lt;code>GearJoint(i, j, tau)&lt;/code> — fixed transmission ratio&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>user_constraints&lt;/code>&lt;/td>
&lt;td>list of &lt;code>UserConstraint&lt;/code> — arbitrary user-written scalar equations (driving, locking, etc.)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
For 2D, this is a consolidation &lt;a href="https://github.com/JAlcocerT/mbsd/blob/master/2D-mbsd/z-py-mindmap.md" target="_blank" rel="noopener">wiki doc&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;pre class="mermaid mt-6">mindmap
root((2D MBSD&lt;br/>Python&lt;br/>Examples))
Direct MATLAB Ports
Slider-Crank
slider_crank.py
dynamic_slider_crank.py
Cam-Follower
cam_follower_angular.py
Terrain-Wheel-SuspMass
dynamic_terrain_wheel.py
dynamic_terrain_wheel_rolling.py
dynamic_terrain_wheel_polygonal.py
Variants built on ports
dynamic_slider_crank_gravity.py
dynamic_slider_crank_no_gravity.py
dynamic_cam_follower.py
New Classical Kinematics
four_bar.py
four_bar_linkage.py
four_bar_bicycle.py
geneva_drive.py
pantograph.py
scotch_yoke.py
New Classical Dynamics
dynamic_pendulum.py
dynamic_double_pendulum.py
dynamic_mass_spring_damper.py
dynamic_four_bar.py
dynamic_scotch_yoke.py
dynamic_bicycle_leg.py&lt;/pre>&lt;blockquote>
&lt;p>You can do more cool thing with geometry, like &lt;a href="https://jalcocert.github.io/JAlcocerT/knitting-pattern-calculator/" target="_blank" rel="noopener">knitting patterns&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;p>Some people say that we could be doing our passions only if there would be some kind of magic that pay for it.&lt;/p>
&lt;p>Not sure about you, but I dont believe in magic.&lt;/p>
&lt;p>And if you want my time you can rent it below: &lt;em>for that price signal i&amp;rsquo;d stop doing this and start caring about your problems&lt;/em>&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/tiersofservice/dwi/selfh-landing-astro-fastapi-bot.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/shipping/dna-1ton-ebook.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks to enable you to create&lt;/div>&lt;/a>
&lt;/div>
&lt;p>Selfish?&lt;/p>
&lt;p>There are people who would thank you for the compliment!&lt;/p>
&lt;p>If you are here for the free goodies, you can have them at the time of writing at the ebooks site.&lt;/p>
&lt;p>Enjoy!&lt;/p>
&lt;h3>MBSD 2D x CC Skills&lt;span class="absolute -mt-20" id="mbsd-2d-x-cc-skills">&lt;/span>
&lt;a href="#mbsd-2d-x-cc-skills" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>How about&amp;hellip;&lt;/p>
&lt;p>documenting the framework in a way that claude code or any other agent could understand it from now on?&lt;/p>
&lt;h3>MBSD 2D x Excalidraw and MermaidJS&lt;span class="absolute -mt-20" id="mbsd-2d-x-excalidraw-and-mermaidjs">&lt;/span>
&lt;a href="#mbsd-2d-x-excalidraw-and-mermaidjs" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Both can be generating diagrams as a code.&lt;/p>
&lt;p>I thought that excalidraw accepted mermaid code and that was it.&lt;/p>
&lt;p>But actually&amp;hellip;it has its own json that can be understood.&lt;/p>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Phase Portrait Analysis&lt;span class="absolute -mt-20" id="phase-portrait-analysis">&lt;/span>
&lt;a href="#phase-portrait-analysis" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>In the context of your bicycle simulator—or any complex dynamical system—a &lt;strong>phase portrait&lt;/strong> is a visual map of all possible behaviors of the system.&lt;/p>
&lt;p>Instead of plotting a variable (like lean angle) against &lt;strong>time&lt;/strong>, you plot the state variables against &lt;strong>each other&lt;/strong> (typically position vs. velocity).&lt;/p>
&lt;ol>
&lt;li>The State Space&lt;/li>
&lt;/ol>
&lt;p>For a bicycle, the &amp;ldquo;state&amp;rdquo; at any second is defined by its coordinates $q$ and their rates of change $\dot{q}$.&lt;/p>
&lt;p>A phase portrait usually picks two critical variables to show stability.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>X-axis:&lt;/strong> Position (e.g., Lean Angle $\phi$)&lt;/li>
&lt;li>&lt;strong>Y-axis:&lt;/strong> Velocity (e.g., Lean Rate $\dot{\phi}$)&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Key Components of the Map&lt;/li>
&lt;/ol>
&lt;p>When you look at a phase portrait, you aren&amp;rsquo;t just looking at one simulation run; you are looking at the &amp;ldquo;flow&amp;rdquo; of the entire mathematical universe of that system:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Trajectories:&lt;/strong> The lines or curves. Each line represents one possible &amp;ldquo;story&amp;rdquo; of the bicycle from a specific starting point.&lt;/li>
&lt;li>&lt;strong>Equilibrium Points (Fixed Points):&lt;/strong> These are the &amp;ldquo;resting&amp;rdquo; spots where the system doesn&amp;rsquo;t change ($\dot{q} = 0$).
&lt;ul>
&lt;li>&lt;strong>Stable (Sink):&lt;/strong> If the trajectories spiral inward toward the center, the bike is self-stabilizing.&lt;/li>
&lt;li>&lt;strong>Unstable (Source/Saddle):&lt;/strong> If the trajectories veer away, the bike is falling over.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Limit Cycles:&lt;/strong> A closed loop. In a bicycle, this might represent a steady, wobbling &amp;ldquo;weave&amp;rdquo; where the bike doesn&amp;rsquo;t fall but oscillates forever.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Why it Matters for Your Simulator&lt;/li>
&lt;/ol>
&lt;p>Phase portraits are the ultimate &amp;ldquo;litmus test&amp;rdquo; for your physics engine.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Stability Detection:&lt;/strong> You mentioned the bike is stable at 10 m/s. In a phase portrait of $\phi$ vs. $\dot{\phi}$, you would see a &amp;ldquo;basin of attraction&amp;rdquo;—a region where, even if you push the bike, the lines eventually curve back to $(0,0)$ (upright and still).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Bifurcations:&lt;/strong> As you lower the speed in your simulator from 10 m/s to 2 m/s, the phase portrait will physically change. The stable &amp;ldquo;sink&amp;rdquo; at the center might split or vanish, visually showing you exactly at what speed the gyroscopic and caster effects are no longer enough to keep the bike upright.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Sensitivity to Initial Conditions:&lt;/strong> It helps you see how much &amp;ldquo;lean&amp;rdquo; is too much. The portrait will show a clear boundary (a &lt;strong>separatrix&lt;/strong>) where one trajectory leads back to upright and the one right next to it leads to a crash.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Mathematical Connection&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>In your documentation, you solve for $\ddot{q} = M(q)^{-1} \cdot Q(q, \dot{q})$.&lt;/p>
&lt;p>To create the phase portrait, you take that $\ddot{q}$ and use it to draw the &lt;strong>vector field&lt;/strong> (the little arrows) that tell the state which way to move at every point in the graph.&lt;/p>
&lt;p>In common conversation, people often use the terms interchangeably, but in technical physics and engineering, they actually refer to two different things.&lt;/p>
&lt;p>The Key Difference&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Phase Portrait (Dynamics):&lt;/strong> This is what relates to your bicycle simulator. it maps the &lt;strong>state&lt;/strong> of a system (position vs. velocity) over time. It shows how a single system moves, oscillates, or crashes.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Phase Diagram (Thermodynamics/Chemistry):&lt;/strong> This maps the &lt;strong>state of matter&lt;/strong> (Solid, Liquid, Gas) based on external conditions like Pressure and Temperature.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Why the confusion happens&lt;/p>
&lt;p>In the broader field of &lt;strong>Non-linear Dynamics&lt;/strong>, some researchers use the term &amp;ldquo;Phase Diagram&amp;rdquo; to describe a map of &lt;strong>Stability Regions&lt;/strong>.&lt;/p>
&lt;p>For your bicycle model, a &amp;ldquo;Phase Diagram&amp;rdquo; might look like this:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>X-axis:&lt;/strong> Forward Velocity ($v$)&lt;/li>
&lt;li>&lt;strong>Y-axis:&lt;/strong> Lean Angle ($\phi$)&lt;/li>
&lt;li>&lt;strong>The Map:&lt;/strong> Shows colored regions where the bike is &amp;ldquo;Self-Stable,&amp;rdquo; &amp;ldquo;Unstable (Capsize),&amp;rdquo; or &amp;ldquo;Unstable (Weave).&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>In this specific context, the diagram isn&amp;rsquo;t showing a single &amp;ldquo;trip&amp;rdquo; or trajectory; it’s showing the &lt;strong>boundary&lt;/strong> where the physics of the bike changes fundamentally.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Feature&lt;/th>
&lt;th style="text-align:left">Phase Portrait&lt;/th>
&lt;th style="text-align:left">Phase Diagram&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Primary Use&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Mechanical/Dynamical Systems&lt;/td>
&lt;td style="text-align:left">Materials Science/Thermodynamics&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Axes&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Position vs. Velocity ($q$ vs. $\dot{q}$)&lt;/td>
&lt;td style="text-align:left">Pressure vs. Temperature ($P$ vs. $T$)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>What it shows&lt;/strong>&lt;/td>
&lt;td style="text-align:left">A &amp;ldquo;Path&amp;rdquo; or &amp;ldquo;Trajectory&amp;rdquo;&lt;/td>
&lt;td style="text-align:left">A &amp;ldquo;Region&amp;rdquo; or &amp;ldquo;State&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Bicycle Context&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Does &lt;em>this specific&lt;/em> bike fall over?&lt;/td>
&lt;td style="text-align:left">At &lt;em>what speeds&lt;/em> is this bike design stable?&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>You can potentially see how the &amp;ldquo;Self-Stability&amp;rdquo; region of your bicycle changes if you alter the mass of the front wheel ($m_5$)&lt;/p>
&lt;/blockquote></description></item><item><title>The hidden Mechanism behind Cyclying</title><link>https://JAlcocerT.github.io/JAlcocerT/cycling-and-the-4-bars-mechanism/</link><pubDate>Sun, 22 Mar 2026 08:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/cycling-and-the-4-bars-mechanism/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Is the &lt;strong>4 bar mechanism&lt;/strong> everywhere?&lt;/p>
&lt;p>Or is it just &lt;del>my head&lt;/del> deployed at &lt;a href="https://multibodysystemdynamics.pages.dev/" target="_blank" rel="noopener">this CSR&lt;/a>?&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Some math, some physics, some mechanics.&lt;/p>
&lt;p>And some &lt;a href="#about-mbsd" >personal journey&lt;/a> for starters before going all in with MBSD.&lt;/p>
&lt;p>Some economist say that time does not matter.&lt;/p>
&lt;p>In this post, &lt;a href="#from-concepts-to-equations" >times does matter for the model&lt;/a>.&lt;/p>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
It also assumes that solids are infinitely rigid!
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p>Otherwise&amp;hellip;how could we describe reality?&lt;/p>
&lt;p>In fact, this can be simulated in real-time without problems: &lt;a href="https://link.springer.com/book/10.1007/978-1-4612-2600-0" target="_blank" rel="noopener">https://link.springer.com/book/10.1007/978-1-4612-2600-0&lt;/a>&lt;/p>
&lt;p>4 bars: leg-leg-biela bicicleta&lt;/p>
&lt;p>Its all about 4 bars and&amp;hellip; being a 100% Rigid Solid.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/get-started-with-flask/" target="_blank" rel="noreferrer">&lt;img
alt="Flask Intro"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/flask-nginx-duckdns.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Flask Intro&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Deployed a Flask WebApp with https and NGINX to Hertzner&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/" target="_blank" rel="noreferrer">&lt;img
alt="Data Chat Repo"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Data Chat Repo&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Source Code on Github&lt;/div>&lt;/a>
&lt;/div>
&lt;h2>About MBSD&lt;span class="absolute -mt-20" id="about-mbsd">&lt;/span>
&lt;a href="#about-mbsd" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>How&amp;hellip;have I arrived here?&lt;/p>
&lt;p>Its a long story.&lt;/p>
&lt;p>I got sold on been a good student.&lt;/p>
&lt;p>Wanted to have a career on sth solid, so went for engineering instead of physics.&lt;/p>
&lt;p>Decisions taken on verbal information - &lt;em>like a pro, w/o validating / cross-checking&lt;/em>&lt;/p>
&lt;div class="steps ml-4 mb-12 border-l border-gray-200 pl-6 dark:border-neutral-800 [counter-reset:step]">
&lt;h3>Some Math Wont Hurt&lt;span class="absolute -mt-20" id="some-math-wont-hurt">&lt;/span>
&lt;a href="#some-math-wont-hurt" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Spent time understanding calculus and algebra.&lt;/p>
&lt;p>Again: understanding, not operating.&lt;/p>
&lt;h3>Love for physics&lt;span class="absolute -mt-20" id="love-for-physics">&lt;/span>
&lt;a href="#love-for-physics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>When it became something morethan vomiting non-sense formulas&lt;/p>
&lt;h3>Bike Dynamics Thesis&lt;span class="absolute -mt-20" id="bike-dynamics-thesis">&lt;/span>
&lt;a href="#bike-dynamics-thesis" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>How could i not go all in on real time 3d motion simulation for bicycles?&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/JAlcocerT/Bike_dynamic_simulator" target="_blank" rel="noopener">https://github.com/JAlcocerT/Bike_dynamic_simulator&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>They are crazy efficient in &lt;a href="https://jalcocert.github.io/JAlcocerT/buying-bicycle-through-data-analytics/" target="_blank" rel="noopener">$/km terms&lt;/a>&lt;/p>
&lt;h3>D&amp;amp;A has real demand&lt;span class="absolute -mt-20" id="da-has-real-demand">&lt;/span>
&lt;a href="#da-has-real-demand" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>And thats why I pivoted to D&amp;amp;A career.&lt;/p>
&lt;p>The dev part was just to sell at scale&lt;/p>
&lt;h3>Found Mechanism Project&lt;span class="absolute -mt-20" id="found-mechanism-project">&lt;/span>
&lt;a href="#found-mechanism-project" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Forked it and created a personal PoC from scratch:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/JAlcocerT/Slider-Crank" target="_blank" rel="noopener">https://github.com/JAlcocerT/Slider-Crank&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/JAlcocerT/mechanism" target="_blank" rel="noopener">https://github.com/JAlcocerT/mechanism&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>and put together some 101 with the equations with &lt;a href="#about-python-sympy" >python sympy&lt;/a>&lt;/p>
&lt;h3>Today&lt;span class="absolute -mt-20" id="today">&lt;/span>
&lt;a href="#today" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Fast-forward until today.&lt;/p>
&lt;p>Because from 2023 it has all been learn/do/learn/do around AI.&lt;/p>
&lt;/div>
&lt;h2>Suspension&lt;span class="absolute -mt-20" id="suspension">&lt;/span>
&lt;a href="#suspension" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Long ago I was reading the book:&lt;/p>
&lt;p>Among the suspension types, you can understand Double Wishbone Suspension System with the 4B:&lt;/p>
&lt;!--
https://www.youtube.com/watch?v=XTM4Mqa617o
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/XTM4Mqa617o" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Another fantastic rendering of the suspension:&lt;/p>
&lt;!--
https://www.youtube.com/watch?v=_wUSd-OVZX8
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/_wUSd-OVZX8" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Which is much cooler &lt;a href="https://www.youtube.com/watch?v=X6JejXjGQiQ" target="_blank" rel="noopener">than mcpherson&lt;/a>, isnt it?&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Some time ago, I was wondering if: Julia: optimization, eq solver, symbolic algebra, jump library would be the way to go.&lt;/p>
&lt;p>Would Python be the best approach to find the math behind mechanism that cant block along their movement?&lt;/p>
&lt;p>Some kind of automated mechanism synthesis&amp;hellip;.&lt;/p>
&lt;p>Matlab &amp;mdash;&amp;gt; a python – programa sintesis mec generalizado.&lt;/p>
&lt;p>The passion of your live is to create such systems?&lt;/p>
&lt;!-- https://www.youtube.com/shorts/bJBk09S7HQM -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/bJBk09S7HQM" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Stay with me for the series about MBSD.&lt;/p>
&lt;p>Because this is no longer about wondering.&lt;/p>
&lt;p>Just about shipping and sharing:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/mbsd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> mbsd/2D-Kinematics
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#python examples/slider_crank.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python examples/four_bar.py&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://youtu.be/AgXeUzNkarM -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/AgXeUzNkarM" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">python examples/four_bar_bicycle.py&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>e. The new four_bar_bicycle.py models a cyclist&amp;rsquo;s right leg as a four-bar linkage with realistic dimensions:&lt;/p>
&lt;p>Link Part Length
Crank Pedal arm 170 mm
Coupler Lower leg (ankle → knee) 440 mm
Rocker Upper leg (knee → hip) 400 mm
Ground Frame (BB → hip) 618 mm
Grashof check passes (0.788 ≤ 0.840) so the crank makes full rotations
60 RPM cadence (comfortable pedaling speed)
Tracks pedal, knee, and shin midpoint for velocity/acceleration analysis
Generates all 7 outputs (2 PNGs + 5 MP4s) including the combined video&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/lx4uvi-Aa40" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://youtu.be/lx4uvi-Aa40 -->
&lt;p>I know, its cycling reversed.&lt;/p>
&lt;p>Imagine its the same vectors&amp;hellip;just going back in time.&lt;/p>
&lt;p>You get the idea :)&lt;/p>
&lt;p>Another idea that you should get is: stay, because renders are coming:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/PBFRIEC9aB8" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h3>All Those 2D Moving&lt;span class="absolute -mt-20" id="all-those-2d-moving">&lt;/span>
&lt;a href="#all-those-2d-moving" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>In mechanical engineering, a &lt;strong>2D (planar) mechanism&lt;/strong> is a collection of rigid bodies (links) connected by joints that constrain their motion to a single plane.&lt;/p>
&lt;p>These are the fundamental &amp;ldquo;building blocks&amp;rdquo; of machines, from car engines to window wipers.&lt;/p>
&lt;p>Here are the top 10 most popular 2D mechanisms based on their prevalence in industrial design and daily life:&lt;/p>
&lt;ol>
&lt;li>The Four-Bar Linkage&lt;/li>
&lt;/ol>
&lt;p>The &amp;ldquo;king&amp;rdquo; of mechanisms. It consists of four links connected in a loop by four pin joints. By varying the lengths of the links, it can perform a massive variety of tasks, from opening a car hood to stabilizing a camera.&lt;/p>
&lt;ol start="2">
&lt;li>Slider-Crank Mechanism&lt;/li>
&lt;/ol>
&lt;p>This is the heart of the internal combustion engine.&lt;/p>
&lt;p>It converts &lt;strong>rotary motion&lt;/strong> (the crankshaft) into &lt;strong>reciprocating linear motion&lt;/strong> (the piston) or vice versa.&lt;/p>
&lt;p>You’ll find it in air compressors, pumps, and steam engines.&lt;/p>
&lt;ol start="4">
&lt;li>Geneva Drive (Maltese Cross)&lt;/li>
&lt;/ol>
&lt;p>This mechanism converts continuous rotation into &lt;strong>intermittent&lt;/strong> rotary motion.&lt;/p>
&lt;p>It’s famously used in movie projectors to advance the film frame-by-frame and in automated assembly lines for indexing parts.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">python examples/geneva_drive.py&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="5">
&lt;li>Scotch Yoke&lt;/li>
&lt;/ol>
&lt;p>Similar to the slider-crank but produces a &lt;strong>purely sinusoidal&lt;/strong> motion.&lt;/p>
&lt;p>It’s often used in control valve actuators and high-pressure gas compressors where smooth, harmonic motion is required.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">python examples/four_bar_bicycle.py&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="7">
&lt;li>Pantograph&lt;/li>
&lt;/ol>
&lt;p>Based on a parallelogram linkage, the pantograph is used to &lt;strong>scale motion&lt;/strong>.&lt;/p>
&lt;p>If you move one point, another point follows the exact same path but larger or smaller.&lt;/p>
&lt;p>It’s used in engraving machines and for power collection on electric trains.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">python examples/pantograph.py&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="8">
&lt;li>Quick-Return Mechanism (Whitworth)&lt;/li>
&lt;/ol>
&lt;p>Designed for machines like shapers or grinders, this mechanism allows a tool to move slowly during a &amp;ldquo;working stroke&amp;rdquo; and then snap back quickly during the &amp;ldquo;return stroke&amp;rdquo; to save time and increase efficiency.&lt;/p>
&lt;ol start="9">
&lt;li>Bell Crank&lt;/li>
&lt;/ol>
&lt;p>A simple but vital three-link mechanism that &lt;strong>changes the direction&lt;/strong> of a force, usually by 90°.&lt;/p>
&lt;p>You see these in bicycle brake systems, aircraft flight controls, and throttle linkages.&lt;/p>
&lt;ol start="10">
&lt;li>Ratchet and Pawl&lt;/li>
&lt;/ol>
&lt;p>This mechanism allows motion in only &lt;strong>one direction&lt;/strong> while preventing it in the other.&lt;/p>
&lt;p>It is the core of every socket wrench, zip tie, and heavy-duty winch.&lt;/p>
&lt;p>Comparison Table: Motion Types&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Mechanism&lt;/th>
&lt;th>Input&lt;/th>
&lt;th>Output&lt;/th>
&lt;th>Common Use&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Four-Bar&lt;/strong>&lt;/td>
&lt;td>Rotation&lt;/td>
&lt;td>Oscillation/Path&lt;/td>
&lt;td>Windshield wipers&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Slider-Crank&lt;/strong>&lt;/td>
&lt;td>Rotation&lt;/td>
&lt;td>Linear&lt;/td>
&lt;td>Car pistons&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Cam &amp;amp; Follower&lt;/strong>&lt;/td>
&lt;td>Rotation&lt;/td>
&lt;td>Custom Linear&lt;/td>
&lt;td>Engine valves&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Geneva Drive&lt;/strong>&lt;/td>
&lt;td>Rotation&lt;/td>
&lt;td>Intermittent&lt;/td>
&lt;td>Watchmaking&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Rack &amp;amp; Pinion&lt;/strong>&lt;/td>
&lt;td>Rotation&lt;/td>
&lt;td>Linear&lt;/td>
&lt;td>Steering&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Maximum piston speed with formula&lt;span class="absolute -mt-20" id="maximum-piston-speed-with-formula">&lt;/span>
&lt;a href="#maximum-piston-speed-with-formula" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>You can demonstrate it step by step:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/EhOl9Uh_nyw" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- https://youtu.be/EhOl9Uh_nyw?t=83 -->
&lt;p>Or&amp;hellip;simulate it: &lt;em>under the hood its just same hypothesis and equations&lt;/em>&lt;/p>
&lt;h3>From Concepts to Equations&lt;span class="absolute -mt-20" id="from-concepts-to-equations">&lt;/span>
&lt;a href="#from-concepts-to-equations" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I extracted knowledge from pdf to txt so that models can play with it:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./mbsd/jalon-theory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Extract text from any file to text format&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uvx kreuzberg extract Chapter01.pdf &amp;gt; output.txt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uvx &amp;#39;kreuzberg[cli]&amp;#39; extract jira-estimation.pdf &amp;gt; output.txt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> f in Chapter*.pdf&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> uvx kreuzberg extract &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &amp;gt; &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">f&lt;/span>&lt;span class="p">%.pdf&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">.txt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">###with container even better!&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#docker run -p 8027:8000 goldziher/kreuzberg&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#curl -X POST -F &amp;#34;file=@jira-estimation.pdf&amp;#34; http://localhost:8027/extract&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Yep, using claude:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#curl -fsSL https://claude.ai/install.sh | bash&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude --help&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The work I put in the prompts: &lt;em>not huge, i know&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">see the bicycle simulator inside the matlab folder, do you understand how it works?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">could you make an equivalent of that in python on the other folder of the repository?&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Quote again: AI does not apply to me / my industry&lt;/p>
&lt;p>Yea&amp;hellip;sure :)&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~/Desktop/Bike_dynamic_simulator/Python_version &lt;span class="c1">#migrated from matlab in 2 prompts&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python3 -m venv venv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> venv/bin/activate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install -r requirements.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python3 main.py --keyboard&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/kreuzberg" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Kreuzberg | Docker Config 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>This is also&amp;hellip;&lt;strong>REAL TIME!&lt;/strong>&lt;/p>
&lt;!-- https://youtu.be/0CLNWADDrtY -->
&lt;p>Only that this time, than with python, not with Matlab:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/0CLNWADDrtY" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>When you are done, it generates this historical data of the path you followed:&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/simulation_results_bicycle.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;h3>About python SymPy&lt;span class="absolute -mt-20" id="about-python-sympy">&lt;/span>
&lt;a href="#about-python-sympy" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>When I was using matlab back in the days, their simbolic extension was a killer feature.&lt;/p>
&lt;p>Now, we have it in python for free:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#rm -rf .git&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git init &amp;amp;&amp;amp; git add . &amp;amp;&amp;amp; git commit -m &amp;#34;Initial commit: MultiBody&amp;#34; &amp;amp;&amp;amp; gh repo create mbsd --private --source=. --remote=origin --push&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make install &amp;amp;&amp;amp; make dev #requires .env.local&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div></description></item><item><title>Programatic Mechanisms</title><link>https://JAlcocerT.github.io/JAlcocerT/about-constrained-mechanism/</link><pubDate>Sat, 21 Mar 2026 06:20:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/about-constrained-mechanism/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Same inputs, same outputs.&lt;/p>
&lt;p>What&amp;rsquo;s stopping you to do programmatic mechanism analysis?&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>A multibody dynamics simulation framework written in MATLAB.&lt;/p>
&lt;p>It solves the equations of motion for constrained mechanical systems — assemblies of rigid bodies connected by joints, acted upon by forces, and potentially in contact with surfaces.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/mbsd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> mbsd/2D-Kinematics
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#python examples/slider_crank.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd examples&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># echo -e &amp;#34;file &amp;#39;p1.mp4&amp;#39;\nfile &amp;#39;p2.mp4&amp;#39;&amp;#34; &amp;gt; list.txt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># # 2. Join them&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># mpv &amp;#34;output.mp4&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python examples/pantograph.py&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>If you have been following my latest post about blender and bringin to life mechanism&amp;hellip;&lt;/p>
&lt;p>You could imagine that it was a matter of time for me to join these 2 worlds.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/3Design" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
3Design | Repo&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/mbsd" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
MBSD | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;p>But first, as I have wood PCs, I needed to install &lt;strong>tmux on my x300&lt;/strong> to leave it thinking during the night via termix:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">sudo apt update &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo apt install tmux -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#nano ~/.tmux.conf&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">loginctl enable-linger &lt;span class="nv">$USER&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux new -s cad_mbsd_render&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/Termix" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Termix with Docker 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/3Design
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./3Design/z-cadquery
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make check &lt;span class="c1">#make help&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make scene-ui #this starts blender UI&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make all&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmux new-session -d -s cad &lt;span class="s2">&amp;#34;make all&amp;#34;&lt;/span> &lt;span class="c1">#if you will be leaving this for the night&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#tmux attach-session -t cad #to see hows going&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>After having the x300 processing at 100% and consuming 80-90W&amp;hellip;&lt;/p>
&lt;p>Then just some &lt;strong>rsync magic&lt;/strong> will bring the generated files home:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">rsync -avP jalcocert@192.168.1.2:/home/jalcocert/3Design/z-cadquery/render/slider_crank.mp4 .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Then play it:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mpv slider_crank.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://youtu.be/1WzRJM8HVKg -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/1WzRJM8HVKg" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>So&amp;hellip;&lt;/p>
&lt;p>How hard is to make this work for any of the 2D kinematics I got ready?&lt;/p>
&lt;h2>2D Kinematics x Blender&lt;span class="absolute -mt-20" id="2d-kinematics-x-blender">&lt;/span>
&lt;a href="#2d-kinematics-x-blender" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>As mentioned before, its about bridging the 2 worlds.&lt;/p>
&lt;p>Why would this be impossible, if we are just stating:&lt;/p>
&lt;ol>
&lt;li>A solid is infinitely rigid and 2 points always keep their distance constant&lt;/li>
&lt;li>&lt;del>F=ma&lt;/del> actually not yet. &lt;a href="#2d-dynamics-for-mbsd" >But later&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>The &lt;code>blender_scene.py&lt;/code> is the one doing the cool rendered end result&lt;/p>
&lt;p>One line to rule them all: change PRESET = &amp;ldquo;preview&amp;rdquo; to PRESET = &amp;ldquo;final&amp;rdquo; and the whole render pipeline switches (resolution, samples, motion blur, quality)&lt;/p>
&lt;ul>
&lt;li>FPS and FRAME_COUNT are now top-level variables alongside the file paths&lt;/li>
&lt;li>The render settings section now just reads from _p[&amp;hellip;] — no more buried comments saying &amp;ldquo;change this for final render&amp;rdquo;&lt;/li>
&lt;li>Added a print line so you can confirm what preset is active when the script runs&lt;/li>
&lt;/ul>
&lt;p>Three presets now:&lt;/p>
&lt;p>┌────────────┬────────────┬─────────┬─────────────┬───────────────────┐
│ Preset │ Resolution │ Samples │ Motion blur │ Use case │
├────────────┼────────────┼─────────┼─────────────┼───────────────────┤
│ preview │ 1280×720 │ 8 │ off │ Quick local test │
├────────────┼────────────┼─────────┼─────────────┼───────────────────┤
│ production │ 1920×1080 │ 16 │ off │ Overnight on x300 │
├────────────┼────────────┼─────────┼─────────────┼───────────────────┤
│ final │ 3840×2160 │ 64 │ on │ Cinematic 4K&lt;/p>
&lt;p>After some tinkering with blender, this was quite easy to do wit the fwk im building:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/3D-Design&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./3D-Design/mbsd-to-render
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-md" data-lang="md">&lt;span class="line">&lt;span class="cl">i love this workflow and it works great for one example that we have for the slider crank. Could you now look at the folder mbsd-to-render where I have brought a 2d
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> kinematics simulator for any mechanism and write a wiki-integration-cadquery.md with your understanding on how it works and what would be required to make there
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> equivalents scripts that will interact with cadquery and blender programatically?&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>How mbsd works — coordinate system, constraint types, solving pipeline, all 6 example mechanisms&lt;/p>
&lt;ol start="2">
&lt;li>The existing slider-crank pipeline — what data.json contract looks like today&lt;/li>
&lt;li>What needs to be built per mechanism — 3 scripts each:&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>export_&lt;name>.py — runs the mbsd solver, converts 2D coords to 3D and writes data.json&lt;/li>
&lt;li>cad_parts_&lt;name>.py — CadQuery parametric parts → STLs&lt;/li>
&lt;li>blender_scene_&lt;name>.py — Blender scene builder (mostly copy of existing one)&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>Per-mechanism notes — four-bar, Geneva drive, Scotch yoke, pantograph specifics&lt;/li>
&lt;li>Suggested folder layout and a shared/blender_utils.py idea to avoid duplication&lt;/li>
&lt;li>The data contract — the data.json schema everything must agree on&lt;/li>
&lt;li>Gap analysis table — what exists vs what needs building&lt;/li>
&lt;/ol>
&lt;p>The key insight is that the mbsd solver is already generic — you just need the 3 glue scripts per mechanism, using slider-crank as the template.&lt;/p>
&lt;p>Will it work for any mechanism? Yes, with one caveat per mechanism type:&lt;/p>
&lt;p>┌─────────────────────────┬───────────────────────────────────────────────────┐
│ Aspect │ Status │
├─────────────────────────┼───────────────────────────────────────────────────┤
│ Kinematics solving │ ✅ fully generic, no changes needed │
├─────────────────────────┼───────────────────────────────────────────────────┤
│ Velocity + acceleration │ ✅ same │
├─────────────────────────┼───────────────────────────────────────────────────┤
│ data.json export │ ✅ same loop, just different body names │
├─────────────────────────┼───────────────────────────────────────────────────┤
│ CadQuery parts │ ⚠️ manual per mechanism — each body needs a shape │
├─────────────────────────┼───────────────────────────────────────────────────┤
│ Blender scene │ ⚠️ mostly copy-paste, just tune camera/lighting │
├─────────────────────────┼───────────────────────────────────────────────────┤
│ 2D → 3D mapping │ ⚠️ same formula for all planar mechanisms │
└─────────────────────────┴───────────────────────────────────────────────────┘&lt;/p>
&lt;p>So the only creative work per mechanism is:&lt;/p>
&lt;ol>
&lt;li>Defining the geometry (link lengths, cross sections) for CadQuery&lt;/li>
&lt;li>Tuning the camera in Blender to frame it well&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./3D-Design/mbsd-to-render/four-bar
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make help&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make scene-ui &lt;span class="c1">#just to open blender UI and see whats coming on the laptop&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And this also worked at the x300, generating:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./3D-Design
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git pull&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./mbsd-to-render/four-bar
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make all
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rsync -avP jalcocert@192.168.1.2:/home/jalcocert/3Design/mbsd-to-render/four-bar/render/four_bar.mp4 .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mpv four_bar.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://youtu.be/B1OhJFeKmqU -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/B1OhJFeKmqU" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h2>2D Dynamics for MBSD&lt;span class="absolute -mt-20" id="2d-dynamics-for-mbsd">&lt;/span>
&lt;a href="#2d-dynamics-for-mbsd" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Its time for some: F=ma&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./mbsd/2D-Dynamics
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make help&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make run-four-bar &lt;span class="c1">#make run-all&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd /home/jalcocert/Desktop/mbsd/2D-Dynamics &amp;amp;&amp;amp; timeout 120 bash -c &amp;#39;cd examples &amp;amp;&amp;amp; ../venv/bin/python dynamic_slider_crank.py 2&amp;gt;&amp;amp;1&amp;#39; | head -80&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/dynamic_slider_crank_detailed_analysis.png" alt="Slider Speeds and Accelerations" loading="lazy" />&lt;/p>
&lt;p>Just at 60rpm or 1 rev per second, the slider goes as fast as ~23km/h for some instants of time.&lt;/p>
&lt;p>This one uses Lagrange, particularly: Constrained Lagrangian Mechanics&lt;/p>
&lt;p>The Equation We Solve: M(q) @ a + ∇V(q) = Q_ext + C_q^T @ λ&lt;/p>
&lt;p>Where:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>M(q)&lt;/strong> = Mass matrix (constant in reference coordinates)&lt;/li>
&lt;li>&lt;strong>a&lt;/strong> = Acceleration vector (what we compute)&lt;/li>
&lt;li>&lt;strong>∇V(q)&lt;/strong> = Potential energy gradient (gravity effects)&lt;/li>
&lt;li>&lt;strong>Q_ext&lt;/strong> = External forces (torques, springs, user input)&lt;/li>
&lt;li>&lt;strong>C_q^T @ λ&lt;/strong> = Constraint reaction forces (the hidden part!)&lt;/li>
&lt;li>&lt;strong>λ&lt;/strong> = Lagrange multipliers (automatic, varies with config)&lt;/li>
&lt;/ul>
&lt;p>Having said that, how about we forget about gravity for a sec?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv init --no-readme .&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Add packages from requirements.txt one-shot&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip install -r requirements.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#uv sync&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make run-slider-crank-no-gravity&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!--
https://youtu.be/iNl3s09BLoA -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/iNl3s09BLoA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>No 3D speeds and 3D forces for the mbsd model so far.&lt;/p>
&lt;p>But dont worry, they are coming.&lt;/p>
&lt;p>Only that you have to provide the right prompts to create these.&lt;/p>
&lt;p>Its easy&amp;hellip;but not that easy.&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=fO_4eN-IyOo -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/fO_4eN-IyOo" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>That one even has some fluid mechanics going on&amp;hellip;&lt;/p>
&lt;p>What would be the problem? :)&lt;/p>
&lt;p>Upcoming questions to be resolved:&lt;/p>
&lt;ol>
&lt;li>Whats the best angle for each V shape engine based on the vibrations?&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>V8 tend to be at 90 degrees, why?&lt;/p>
&lt;/blockquote>
&lt;ol start="2">
&lt;li>The dynamics of the hip thrust exercise&amp;hellip;.&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/mechanics/v8.jpg" alt="V* engine with AI" loading="lazy" />&lt;/p>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>The Lagrangian is Awesome&lt;span class="absolute -mt-20" id="the-lagrangian-is-awesome">&lt;/span>
&lt;a href="#the-lagrangian-is-awesome" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The Lagrangian is one of the most elegant concepts in physics. Here&amp;rsquo;s why it&amp;rsquo;s genius for obtaining equations of motion:&lt;/p>
&lt;p>What is the Lagrangian?&lt;/p>
&lt;p>The Lagrangian &lt;strong>L&lt;/strong> is defined as:&lt;/p>
&lt;p>$$L = T - V$$&lt;/p>
&lt;p>where &lt;strong>T&lt;/strong> is kinetic energy and &lt;strong>V&lt;/strong> is potential energy.&lt;/p>
&lt;p>Why It&amp;rsquo;s Genius&lt;/p>
&lt;p>&lt;strong>1. Unified Framework&lt;/strong>&lt;/p>
&lt;p>Instead of tracking forces directly (which requires vector decomposition and can get messy with constraints), the Lagrangian uses &lt;em>energy&lt;/em>—a scalar quantity. Scalars are simpler to work with than vectors.&lt;/p>
&lt;p>&lt;strong>2. Automatic Handling of Constraints&lt;/strong>&lt;/p>
&lt;p>This is the real power. When you have constraints (like a pendulum fixed at one point, or a bead sliding on a wire), the Lagrangian naturally incorporates them through your choice of &lt;strong>generalized coordinates&lt;/strong>.&lt;/p>
&lt;p>You don&amp;rsquo;t need to calculate constraint forces explicitly—they disappear from the equations.&lt;/p>
&lt;p>&lt;strong>3. Elegant Mathematical Structure&lt;/strong>&lt;/p>
&lt;p>The equations of motion come from the &lt;strong>Euler-Lagrange equation&lt;/strong>:&lt;/p>
&lt;p>$$\frac{d}{dt}\left(\frac{\partial L}{\partial \dot{q}}\right) - \frac{\partial L}{\partial q} = 0$$&lt;/p>
&lt;p>This works for &lt;em>any&lt;/em> coordinate system. Cartesian, polar, spherical, or some weird generalized coordinate—same equation.&lt;/p>
&lt;p>&lt;strong>4. Works in Any Reference Frame&lt;/strong>&lt;/p>
&lt;p>Since energy is frame-independent (more precisely, frame-invariant for the dynamics we care about), you get equations of motion that are valid regardless of your choice of coordinates.&lt;/p>
&lt;p>Simple Example: Pendulum&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Force approach&lt;/strong>: Calculate tension T, gravity components, resolve perpendicular to the rod → complicated&lt;/li>
&lt;li>&lt;strong>Lagrangian approach&lt;/strong>: Use angle θ as your coordinate, write $L = \frac{1}{2}m\ell^2\dot{\theta}^2 - mg\ell(1-\cos\theta)$, apply Euler-Lagrange → done, you get the equation immediately&lt;/li>
&lt;/ul>
&lt;h4>Why for Constrained Systems?&lt;span class="absolute -mt-20" id="why-for-constrained-systems">&lt;/span>
&lt;a href="#why-for-constrained-systems" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>When you have constraints, the Lagrangian automatically &amp;ldquo;knows&amp;rdquo; which degrees of freedom matter.&lt;/p>
&lt;p>You only have as many equations as you have actual degrees of freedom—constraint forces never appear in the equations.&lt;/p>
&lt;p>This is exactly what makes it perfect for multibody dynamics like MBSD.&lt;/p>
&lt;h3>Systematic Choices for Computer Implementation&lt;span class="absolute -mt-20" id="systematic-choices-for-computer-implementation">&lt;/span>
&lt;a href="#systematic-choices-for-computer-implementation" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The Lagrangian is genius, but it can&amp;rsquo;t be fully automated—&lt;strong>a human must choose the generalized coordinates and define the system&lt;/strong>.&lt;/p>
&lt;p>A computer can&amp;rsquo;t magically know what degrees of freedom matter.&lt;/p>
&lt;h4>Generalized Coordinates: The Key Choice&lt;span class="absolute -mt-20" id="generalized-coordinates-the-key-choice">&lt;/span>
&lt;a href="#generalized-coordinates-the-key-choice" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>For every rigid body in your system, you need to choose coordinates that describe its configuration. Some examples:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Slider-crank mechanism&lt;/strong>: Use crank angle θ, slider position x, or maybe just θ if you enforce the kinematic constraint&lt;/li>
&lt;li>&lt;strong>Pendulum&lt;/strong>: Use angle θ (1 DOF instead of 2 for x, y)&lt;/li>
&lt;li>&lt;strong>Free-falling box&lt;/strong>: Use center of mass position (x, y) and orientation angle φ&lt;/li>
&lt;/ul>
&lt;h4>What About Kinetic and Potential Energy?&lt;span class="absolute -mt-20" id="what-about-kinetic-and-potential-energy">&lt;/span>
&lt;a href="#what-about-kinetic-and-potential-energy" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Once you&amp;rsquo;ve chosen your coordinates, the rule is actually systematic:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Kinetic Energy T&lt;/strong>: Always comes from the &lt;em>center of mass&lt;/em> velocity of each body, plus rotational motion
$$T = \sum_i \left(\frac{1}{2}m_i v_{cm,i}^2 + \frac{1}{2}I_i \omega_i^2\right)$$&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Potential Energy V&lt;/strong>: Comes from the &lt;em>center of mass&lt;/em> height in gravity field, plus any other potential fields
$$V = \sum_i m_i g h_{cm,i} + V_{springs}$$&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>So &lt;strong>yes, always center of gravity&lt;/strong> (center of mass).&lt;/p>
&lt;p>This is not a choice—it&amp;rsquo;s the only systematic way that works for rigid bodies.&lt;/p>
&lt;h4>What the Computer Does&lt;span class="absolute -mt-20" id="what-the-computer-does">&lt;/span>
&lt;a href="#what-the-computer-does" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Once you&amp;rsquo;ve defined:&lt;/p>
&lt;ol>
&lt;li>Which generalized coordinates to use&lt;/li>
&lt;li>The mass and inertia of each body&lt;/li>
&lt;li>The constraints (if any)&lt;/li>
&lt;/ol>
&lt;p>Then the computer can:&lt;/p>
&lt;ol>
&lt;li>Express T and V in terms of your coordinates&lt;/li>
&lt;li>Compute the Lagrangian L = T - V symbolically&lt;/li>
&lt;li>Apply Euler-Lagrange to get the differential equations automatically&lt;/li>
&lt;/ol>
&lt;p>This is exactly what tools like &lt;strong>SymPy&lt;/strong> do in MBSD—you describe the system structure, and the computer derives the equations.&lt;/p>
&lt;h3>Why Reference Coordinates?&lt;span class="absolute -mt-20" id="why-reference-coordinates">&lt;/span>
&lt;a href="#why-reference-coordinates" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Simple: because they are sistematic.&lt;/p>
&lt;p>I dont want to leave the program subject to human errors of mechanism understanding&lt;/p>
&lt;p>At the cost of having to resolve more coordinates &lt;em>and equations&lt;/em>.&lt;/p>
&lt;h3>Equations of Motion: What They Are and How to Solve Them&lt;span class="absolute -mt-20" id="equations-of-motion-what-they-are-and-how-to-solve-them">&lt;/span>
&lt;a href="#equations-of-motion-what-they-are-and-how-to-solve-them" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h4>What Makes an Equation an &amp;ldquo;Equation of Motion&amp;rdquo;?&lt;span class="absolute -mt-20" id="what-makes-an-equation-an-equation-of-motion">&lt;/span>
&lt;a href="#what-makes-an-equation-an-equation-of-motion" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>An equation of motion is any differential equation that describes &lt;strong>how a system evolves in time&lt;/strong>.&lt;/p>
&lt;p>More specifically:&lt;/p>
&lt;p>&lt;strong>1st order&lt;/strong>: $\frac{dx}{dt} = f(x, t)$ (velocity defined by position)&lt;/p>
&lt;p>&lt;strong>2nd order&lt;/strong>: $\frac{d^2x}{dt^2} = f(x, \dot{x}, t)$ (acceleration defined by position and velocity)&lt;/p>
&lt;p>For mechanical systems, Newton&amp;rsquo;s 2nd law gives us &lt;strong>2nd-order differential equations&lt;/strong>:
$$m\ddot{x} = F(x, \dot{x}, t)$$&lt;/p>
&lt;p>The Lagrangian approach gives us these same equations, but derived automatically from energy rather than force:
$$\frac{d}{dt}\left(\frac{\partial L}{\partial \dot{q}}\right) - \frac{\partial L}{\partial q} = 0$$&lt;/p>
&lt;p>This is still a &lt;strong>2nd-order differential equation&lt;/strong> in disguise.&lt;/p>
&lt;h4>Why 2nd Order?&lt;span class="absolute -mt-20" id="why-2nd-order">&lt;/span>
&lt;a href="#why-2nd-order" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Physics requires two initial conditions: &lt;strong>position&lt;/strong> and &lt;strong>velocity&lt;/strong>.&lt;/p>
&lt;p>Once you know where something is and how fast it&amp;rsquo;s moving, the future is determined.&lt;/p>
&lt;p>Hence: 2nd-order equations.&lt;/p>
&lt;p>Methods to Solve Equations of Motion&lt;/p>
&lt;p>&lt;strong>1. Analytical (Symbolic)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Use&lt;/strong>: Simple systems (pendulum, spring-mass)&lt;/li>
&lt;li>&lt;strong>Method&lt;/strong>: Solve the differential equations by hand or with SymPy&lt;/li>
&lt;li>&lt;strong>Pro&lt;/strong>: Exact closed-form solutions&lt;/li>
&lt;li>&lt;strong>Con&lt;/strong>: Only works for special cases (linear, simple geometries)&lt;/li>
&lt;li>&lt;strong>Example&lt;/strong>: $\ddot{\theta} + \frac{g}{\ell}\sin\theta = 0$ → solution involves elliptic integrals&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. Numerical Integration&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Use&lt;/strong>: Complex systems, nonlinear dynamics, constraints&lt;/li>
&lt;li>&lt;strong>Methods&lt;/strong>:
&lt;ul>
&lt;li>&lt;strong>Runge-Kutta (RK4)&lt;/strong>: Good balance of accuracy and speed&lt;/li>
&lt;li>&lt;strong>Symplectic integrators&lt;/strong>: Preserve energy over long simulations (important for mechanics!)&lt;/li>
&lt;li>&lt;strong>Implicit methods&lt;/strong>: For stiff systems where explicit methods become unstable&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Pro&lt;/strong>: Works for any system&lt;/li>
&lt;li>&lt;strong>Con&lt;/strong>: Accumulates numerical error, requires small timesteps&lt;/li>
&lt;li>&lt;strong>Example&lt;/strong>: MBSD uses numerical integration to simulate your mechanisms frame-by-frame&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>3. Linearization (for Small Motions)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Use&lt;/strong>: When oscillations are small (θ ≈ 0)&lt;/li>
&lt;li>&lt;strong>Method&lt;/strong>: $\sin\theta \approx \theta$, solve the simplified linear system&lt;/li>
&lt;li>&lt;strong>Pro&lt;/strong>: Analytical solutions possible&lt;/li>
&lt;li>&lt;strong>Con&lt;/strong>: Only valid near equilibrium&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>4. Energy Conservation (Special Cases)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Use&lt;/strong>: Systems without friction or external damping&lt;/li>
&lt;li>&lt;strong>Method&lt;/strong>: Use $E = T + V = \text{constant}$ to reduce problem dimension&lt;/li>
&lt;li>&lt;strong>Pro&lt;/strong>: Reduces 2nd-order to 1st-order&lt;/li>
&lt;li>&lt;strong>Con&lt;/strong>: Only works when energy is actually conserved&lt;/li>
&lt;/ul>
&lt;p>Why MBSD Uses Numerical Integration&lt;/p>
&lt;p>For multibody systems with &lt;strong>constraints, multiple degrees of freedom, and complex geometries&lt;/strong>, analytical solutions are impossible.&lt;/p>
&lt;p>Numerical integration is the only practical approach:&lt;/p>
&lt;ol>
&lt;li>Lagrangian formulation gives you the differential equations&lt;/li>
&lt;li>Numerical integrator steps through time: $q(t+\Delta t) = q(t) + \Delta t \cdot \dot{q}(t) + \ldots$&lt;/li>
&lt;li>At each timestep, you evaluate accelerations from the equations of motion&lt;/li>
&lt;li>Blender renders each timestep as a frame&lt;/li>
&lt;/ol>
&lt;p>This pipeline is why MBSD + Blender can animate any 2D mechanism you throw at it.&lt;/p></description></item><item><title>Optimum Path x HUD - Desktop</title><link>https://JAlcocerT.github.io/JAlcocerT/gopro-telemetry-desktop-with-go/</link><pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/gopro-telemetry-desktop-with-go/</guid><description>
&lt;p>&lt;strong>TL;DR&lt;/strong>&lt;/p>
&lt;p>I was not expecting to do cool desktop apps.&lt;/p>
&lt;p>Nor using &lt;strong>Go Lang&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>You forgot about LRV and THM already.&lt;/p>
&lt;p>The juice is at those MP4 from the gopros.&lt;/p>
&lt;p>The last time I tinkered with this &lt;a href="https://jalcocert.github.io/JAlcocerT/ai-scripts-and-animated-data/#kart-on-boards" target="_blank" rel="noopener">here&lt;/a>&lt;/p>
&lt;p>But I wanted to package this into some desktop app, not to think anymore about dependencies.&lt;/p>
&lt;p>Basically to close the features, just bring me those GPH9 or GPH13 videos and lets enjoy the result.&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/coolresources/race/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Racing | Docs ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/optimum-path" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Optimum Path | Repo Section&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/optimum-path&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd optimum-path/overlay&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run gopro_h9_h13_hud_fastlap.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#mpv &amp;#34;flying_lap_79.50s.mp4&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git init &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git add . &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git commit -m &lt;span class="s2">&amp;#34;Initial commit: simple go desktop app for karting videos&amp;#34;&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> gh repo create go-karting --private --source&lt;span class="o">=&lt;/span>. --remote&lt;span class="o">=&lt;/span>origin --push
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/go-karting
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">claude --remote-control &lt;span class="s2">&amp;#34;Go Karting&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#/mobile&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/go-karting" target="_blank" rel="noreferrer">&lt;img
alt="NEW Go Karting"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">NEW Go Karting&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Source Code of a Go desktop app for HUD overlays for GoPros&lt;/div>&lt;/a>
&lt;/div>
&lt;p>I made this one alive with claude code.&lt;/p>
&lt;p>But I guess you could have with Kilo Code, &lt;a href="https://github.com/zed-industries/zed" target="_blank" rel="noopener">Zed&lt;/a>, Antigravity, Void&amp;hellip;&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#curl -f https://zed.dev/install.sh | sh &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#wget https://github.com/voideditor/binaries/releases/download/v1.0.2/Void-x86_64.AppImage ~./Applications&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Why not Python desktop?&lt;/p>
&lt;p>I tried it &lt;a href="https://jalcocert.github.io/JAlcocerT/gopro-telemetry-desktop-python/" target="_blank" rel="noopener">here with tkinter&lt;/a>, but was not convinced about the concept.&lt;/p>
&lt;p>The feature of the optimum path given the telemetry and &lt;a href="https://jalcocert.github.io/JAlcocerT/kart-optimum-path/" target="_blank" rel="noopener">the Gradient descent&lt;/a> would be a nice thing to have also in GO, isnt it?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="o">(&lt;/span>snap info go 2&amp;gt;/dev/null &lt;span class="p">|&lt;/span> grep &lt;span class="s2">&amp;#34;latest/stable&amp;#34;&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;snap not available or no go snap&amp;#34;&lt;/span> apt-cache show golang-go 2&amp;gt;/dev/null &lt;span class="p">|&lt;/span> grep Version &lt;span class="p">|&lt;/span> head -3&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo snap install go --classic
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;export PATH=/snap/bin:$HOME/go/bin:$PATH&amp;#39;&lt;/span> &amp;gt;&amp;gt; ~/.bashrc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> ~/.bashrc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">go version &lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install -y libgtk-3-dev libwebkit2gtk-4.1-dev build-essential
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">go install github.com/wailsapp/wails/v3/cmd/wails3@latest
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;export PATH=$PATH:$HOME/go/bin&amp;#39;&lt;/span> &amp;gt;&amp;gt; ~/.bashrc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> ~/.bashrc&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>github.com/u2takey/ffmpeg-go&lt;/li>
&lt;li>&lt;a href="https://wails.io/docs/introduction" target="_blank" rel="noopener">https://wails.io/docs/introduction&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ./go-karting/glasshud
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make dev &lt;span class="c1">#this spins the Go Desktop App&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/karting/go-desktop-glasshud.png" alt="GoLang gopro telemetry extractor" loading="lazy" />&lt;/p>
&lt;p>After a while&amp;hellip;.&lt;/p>
&lt;p>You can just join them: &lt;em>this was ~x3 slower than real time for my x13&lt;/em>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">ffmpeg -i output/flying_lap_78.47s.mp4 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -i output/hud_flying_lap.mp4 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -filter_complex &lt;span class="s2">&amp;#34;[1:v]scale=3840:2160,format=rgba,colorkey=0x000000:0.1:0.1[ck];[0:v][ck]overlay=0:0&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -codec:a copy -preset superfast &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> output/flying_lap_with_hud_go_desktop.mp4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mpv &lt;span class="s2">&amp;#34;flying_lap_with_hud_go_desktop.mp4&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://youtu.be/M03HU4DWhyE -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/M03HU4DWhyE" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h3>Why Go and Wails&lt;span class="absolute -mt-20" id="why-go-and-wails">&lt;/span>
&lt;a href="#why-go-and-wails" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>In 2026, &lt;strong>Go (Golang)&lt;/strong> occupies a very specific niche in the desktop world.&lt;/p>
&lt;p>While it isn&amp;rsquo;t the first choice for high-end creative suites (like Photoshop) or flashy consumer apps (like Airbnb), it is the &lt;strong>unrivaled king of &amp;ldquo;Developer Tools&amp;rdquo; and Infrastructure Apps.&lt;/strong>&lt;/p>
&lt;p>If you are building something that &amp;ldquo;does work&amp;rdquo; in the background—like a local server, a file-syncing tool, or a cloud management dashboard—Go is your best friend.&lt;/p>
&lt;hr>
&lt;h3>Go&amp;rsquo;s &amp;ldquo;Superpowers&amp;rdquo; for Desktop&lt;span class="absolute -mt-20" id="gos-superpowers-for-desktop">&lt;/span>
&lt;a href="#gos-superpowers-for-desktop" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;h4>1. The &amp;ldquo;Invisible&amp;rdquo; App&lt;span class="absolute -mt-20" id="1-the-invisible-app">&lt;/span>
&lt;a href="#1-the-invisible-app" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Go is at its best when the app doesn&amp;rsquo;t need to be a giant window on your screen.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Best Use Case:&lt;/strong> System tray icons, background services, and local proxies.&lt;/li>
&lt;li>&lt;strong>Why:&lt;/strong> Go&amp;rsquo;s runtime is very efficient at idling. It won&amp;rsquo;t eat your RAM while it sits in the background waiting for a task.&lt;/li>
&lt;/ul>
&lt;h4>2. The Single-Binary Advantage&lt;span class="absolute -mt-20" id="2-the-single-binary-advantage">&lt;/span>
&lt;a href="#2-the-single-binary-advantage" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Unlike Python (which needs a folder of files) or C (which needs DLLs), Go compiles into &lt;strong>one single file&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Benefit:&lt;/strong> You can send a friend a single &lt;code>.exe&lt;/code> file via Discord or Slack, and it just runs. No &amp;ldquo;installing Python,&amp;rdquo; no &amp;ldquo;missing .NET framework,&amp;rdquo; no installer needed.&lt;/li>
&lt;/ul>
&lt;h4>3. Concurrency (The &amp;ldquo;Goroutine&amp;rdquo;)&lt;span class="absolute -mt-20" id="3-concurrency-the-goroutine">&lt;/span>
&lt;a href="#3-concurrency-the-goroutine" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>Go was built by Google to handle thousands of things at once.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Best Use Case:&lt;/strong> An app that needs to download 50 files at once, or a local log-parser that scans 1,000 files in seconds.&lt;/li>
&lt;li>&lt;strong>Why:&lt;/strong> While Rust is also fast, Go&amp;rsquo;s &amp;ldquo;Goroutines&amp;rdquo; are much easier to write and manage for 90% of developers.&lt;/li>
&lt;/ul>
&lt;p>Yes, &lt;strong>Go can absolutely use VueJS&lt;/strong>, and in 2026, this is one of the most popular ways to build desktop apps with the language.&lt;/p>
&lt;p>The &amp;ldquo;magic&amp;rdquo; that makes this possible is a framework called &lt;strong>Wails&lt;/strong>.&lt;/p>
&lt;h3>How Go + VueJS Works (The Wails Approach)&lt;span class="absolute -mt-20" id="how-go--vuejs-works-the-wails-approach">&lt;/span>
&lt;a href="#how-go--vuejs-works-the-wails-approach" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Wails acts as a bridge. It allows you to write your &amp;ldquo;Frontend&amp;rdquo; (everything the user sees) in &lt;strong>VueJS&lt;/strong> and your &amp;ldquo;Backend&amp;rdquo; (file system access, database logic, heavy processing) in &lt;strong>Go&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Communication:&lt;/strong> Wails automatically generates TypeScript/JavaScript &amp;ldquo;bindings.&amp;rdquo; This means you can call a Go function directly from your Vue component as if it were just another JavaScript function.&lt;/li>
&lt;li>&lt;strong>Performance:&lt;/strong> Because Go handles the heavy lifting and the UI is rendered by the system&amp;rsquo;s native web engine (WebView2 on Windows, WebKit on Mac), the app stays very fast and lightweight (~15MB starting size).&lt;/li>
&lt;/ul>
&lt;p>Yes, the &lt;strong>Vue&lt;/strong> part is exactly where you would handle the &amp;ldquo;cool graphs.&amp;rdquo;&lt;/p>
&lt;p>In a &lt;strong>Go + Vue&lt;/strong> (Wails) or &lt;strong>Rust + Vue&lt;/strong> (Tauri) setup, you have access to the entire world of modern web data visualization. Since these apps run in a browser engine (WebView), any high-end charting library that works on a website will work in your desktop app.&lt;/p>
&lt;p>Here is how you would use Vue to create those visuals in 2026:&lt;/p>
&lt;ol>
&lt;li>The Best Libraries for Vue Graphs
Depending on what kind of &amp;ldquo;cool&amp;rdquo; you&amp;rsquo;re looking for, you have three main paths:&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>ApexCharts (The &amp;ldquo;Easy &amp;amp; Modern&amp;rdquo; Choice):&lt;/strong> Best for clean, interactive dashboards. It has beautiful animations out of the box and a very simple Vue wrapper (&lt;code>vue3-apexcharts&lt;/code>).&lt;/li>
&lt;li>&lt;strong>Apache ECharts (The &amp;ldquo;Powerful&amp;rdquo; Choice):&lt;/strong> If you need to show &lt;strong>thousands of data points&lt;/strong> or complex 3D globes and heatmaps without the app lagging, this is the industry standard.&lt;/li>
&lt;li>&lt;strong>Chart.js (The &amp;ldquo;Lightweight&amp;rdquo; Choice):&lt;/strong> Perfect for simple, elegant line or bar charts that just need to look professional and load instantly.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>
&lt;p>How the &amp;ldquo;Go + Vue&amp;rdquo; Workflow Works
In a desktop app, the data usually lives in &lt;strong>Go&lt;/strong> (your backend), but the &amp;ldquo;drawing&amp;rdquo; happens in &lt;strong>Vue&lt;/strong> (your frontend).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Go&lt;/strong> fetches the data (e.g., from a local SQLite database or a system sensor).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Go&lt;/strong> &amp;ldquo;pushes&amp;rdquo; that data to the frontend, or Vue &amp;ldquo;asks&amp;rdquo; Go for the latest numbers.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Vue&lt;/strong> receives the data as a simple JSON object and passes it into your chart component.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Example Logic:&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Hey Go, give me the CPU usage for the last 60 seconds.&amp;rdquo;&lt;br>
&lt;em>Go sends back a list of numbers.&lt;/em> &amp;gt; &lt;strong>Vue&lt;/strong> instantly updates a smooth, flowing line graph.&lt;/p>
&lt;/blockquote>
&lt;ol start="3">
&lt;li>Why Vue is better than &amp;ldquo;Native&amp;rdquo; for Graphs&lt;/li>
&lt;/ol>
&lt;p>If you were using &lt;strong>Pure C&lt;/strong> or &lt;strong>Pure Go&lt;/strong> (without Vue), making a graph look &amp;ldquo;cool&amp;rdquo; is incredibly difficult.&lt;/p>
&lt;p>You would have to manually calculate where every line and pixel goes.&lt;/p>
&lt;p>With &lt;strong>Vue&lt;/strong>, you get:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Interactivity:&lt;/strong> Users can hover over bars to see tooltips, zoom into timeframes, or click legends to hide data.&lt;/li>
&lt;li>&lt;strong>Theming:&lt;/strong> You can easily match your graphs to the &amp;ldquo;Dark Mode&amp;rdquo; of the user&amp;rsquo;s operating system using CSS.&lt;/li>
&lt;li>&lt;strong>Responsiveness:&lt;/strong> If the user resizes the desktop window, the graphs will automatically scale to fit the new size.&lt;/li>
&lt;/ul>
&lt;p>Summary Table: Which Charting Library?&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Library&lt;/th>
&lt;th style="text-align:left">Best For&lt;/th>
&lt;th style="text-align:left">&amp;ldquo;Cool&amp;rdquo; Factor&lt;/th>
&lt;th style="text-align:left">Performance&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>ApexCharts&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Dashboards &amp;amp; SaaS tools&lt;/td>
&lt;td style="text-align:left">⭐⭐⭐⭐⭐&lt;/td>
&lt;td style="text-align:left">🚀 Good&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>ECharts&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Big Data / Scientific / 3D&lt;/td>
&lt;td style="text-align:left">⭐⭐⭐⭐&lt;/td>
&lt;td style="text-align:left">⚡ Elite&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Chart.js&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Simple, clean reports&lt;/td>
&lt;td style="text-align:left">⭐⭐⭐&lt;/td>
&lt;td style="text-align:left">🚀 Good&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>D3.js&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Custom-built art/visuals&lt;/td>
&lt;td style="text-align:left">⭐⭐⭐⭐⭐+&lt;/td>
&lt;td style="text-align:left">🐢 Hard to learn&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h3>Why use Vue with Go?&lt;span class="absolute -mt-20" id="why-use-vue-with-go">&lt;/span>
&lt;a href="#why-use-vue-with-go" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>Professional UI:&lt;/strong> You can use any Vue library (like &lt;strong>Tailwind CSS&lt;/strong>, &lt;strong>Vuetify&lt;/strong>, or &lt;strong>PrimeVue&lt;/strong>) to make an app that looks like a modern SaaS product rather than a clunky 90s utility.&lt;/li>
&lt;li>&lt;strong>Type Safety:&lt;/strong> Wails v3 (the current standard in 2026) creates TypeScript models for your Go structs. If you change a data field in Go, your Vue code will immediately show an error if it doesn&amp;rsquo;t match.&lt;/li>
&lt;li>&lt;strong>Live Development:&lt;/strong> You get the &amp;ldquo;Web Dev&amp;rdquo; experience. When you change a Vue file, the desktop app updates instantly (Hot Reload) without you having to restart the Go backend.&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h3>Comparison: Vue + Go vs. Vue + Rust (Tauri)&lt;span class="absolute -mt-20" id="comparison-vue--go-vs-vue--rust-tauri">&lt;/span>
&lt;a href="#comparison-vue--go-vs-vue--rust-tauri" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Since both use web technologies for the UI, the choice usually comes down to the backend language:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Wails (Go + Vue):&lt;/strong> Use this if you want &lt;strong>maximum development speed&lt;/strong>. Go is much easier to write than Rust, and the &amp;ldquo;glue&amp;rdquo; between the UI and the backend is more automated in Wails.&lt;/li>
&lt;li>&lt;strong>Tauri (Rust + Vue):&lt;/strong> Use this if you need &lt;strong>maximum security and performance&lt;/strong>. Rust offers finer control over memory and slightly smaller binaries, but it will take you longer to write the code.&lt;/li>
&lt;/ul>
&lt;p>Summary&lt;/p>
&lt;p>If you already know a bit of Vue.js frontend, &lt;strong>Wails is likely your best path&lt;/strong>.&lt;/p>
&lt;p>It turns Go into a &amp;ldquo;super-powered&amp;rdquo; backend for your web skills, allowing you to ship a single, professional &lt;code>.exe&lt;/code> or &lt;code>.app&lt;/code> file that feels native to the user.&lt;/p>
&lt;hr>
&lt;h3>How to build for Desktop with Go in 2026&lt;span class="absolute -mt-20" id="how-to-build-for-desktop-with-go-in-2026">&lt;/span>
&lt;a href="#how-to-build-for-desktop-with-go-in-2026" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>You generally have two paths, and they couldn&amp;rsquo;t be more different:&lt;/p>
&lt;p>&lt;strong>Path A: Wails (The &amp;ldquo;Modern/Beautiful&amp;rdquo; Way)&lt;/strong>&lt;/p>
&lt;p>Wails is effectively &amp;ldquo;Go&amp;rsquo;s version of Tauri.&amp;rdquo;&lt;/p>
&lt;ul>
&lt;li>&lt;strong>How it works:&lt;/strong> Your backend logic is in Go, but you write the UI in whatever web framework you like (React, Vue, Svelte).&lt;/li>
&lt;li>&lt;strong>Why use it:&lt;/strong> This is the best way to make a Go app look like a modern 2026 app. It’s lightweight because it uses the system&amp;rsquo;s built-in web browser (WebView2/Safari).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Path B: Fyne (The &amp;ldquo;Pure Go&amp;rdquo; Way)&lt;/strong>&lt;/p>
&lt;p>Fyne is a toolkit where everything—even the buttons—is written in Go.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>How it works:&lt;/strong> It uses the computer&amp;rsquo;s graphics card (OpenGL) to draw its own UI.&lt;/li>
&lt;li>&lt;strong>Why use it:&lt;/strong> It is incredibly fast to develop. You can go from &amp;ldquo;zero&amp;rdquo; to a working window with buttons in 10 lines of code. It looks the same on every OS, though it has a distinct &amp;ldquo;utilitarian&amp;rdquo; look.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>Comparison: When to pick Go over Rust?&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Situation&lt;/th>
&lt;th style="text-align:left">Pick &lt;strong>Go&lt;/strong>&lt;/th>
&lt;th style="text-align:left">Pick &lt;strong>Rust&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Learning Curve&lt;/strong>&lt;/td>
&lt;td style="text-align:left">You can learn the basics in a weekend.&lt;/td>
&lt;td style="text-align:left">It might take months to master.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Development Speed&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Very fast; &amp;ldquo;get it done&amp;rdquo; attitude.&lt;/td>
&lt;td style="text-align:left">Slower; &amp;ldquo;get it perfect&amp;rdquo; attitude.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Safety&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Very safe (it has a Garbage Collector).&lt;/td>
&lt;td style="text-align:left">Perfectly safe (no Garbage Collector).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Best For&amp;hellip;&lt;/strong>&lt;/td>
&lt;td style="text-align:left">CLIs, Internal tools, Network tools.&lt;/td>
&lt;td style="text-align:left">High-perf engines, Security software.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Summary: Go is best at &amp;ldquo;The Functional Tool&amp;rdquo;&lt;/p>
&lt;p>If you want to build a &lt;strong>local database manager&lt;/strong>, a &lt;strong>custom file backup utility&lt;/strong>, or a &lt;strong>VPN client&lt;/strong>, Go is arguably better than Rust because you will finish the project 3x faster with 95% of the same performance.&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Packing Go&lt;span class="absolute -mt-20" id="packing-go">&lt;/span>
&lt;a href="#packing-go" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">make &lt;span class="nb">help&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make deb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make appimage (will require the deps installed) build/linux/appimage/build/glasshud-x86_64.AppImage&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp bin/glasshud-x86_64.AppImage ~/Applications/ &lt;span class="c1">#this is picked up by appimagelauncher&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The size difference is the key trade-off in practice: the AppImage bundles GTK + shared libraries (118 MB), while the .deb is tiny (4.4 MB) because it relies on the system
having those libraries already.&lt;/p>
&lt;p>For your friend:&lt;/p>
&lt;ul>
&lt;li>Send glasshud-x86_64.AppImage → they run chmod +x glasshud-x86_64.AppImage &amp;amp;&amp;amp; ./glasshud-x86_64.AppImage, then install ffmpeg + exiftool if missing&lt;/li>
&lt;li>Send glasshud.deb → they run sudo apt install ./glasshud.deb and apt handles everything including ffmpeg and exiftool automatically&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">time&lt;/span> make exe&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>bin/glasshud.exe — 11 MB, built from Linux with no Docker needed.&lt;/p>
&lt;p>make exe is ready. What your Windows friend needs to do:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Install ffmpeg and exiftool (one-time)
winget install Gyan.FFmpeg &lt;br>
winget install OliverBetz.ExifTool&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Double-click glasshud.exe — WebView2 (Edge) is already built into Windows 10/11 so the UI works out of the box.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Yes, absolutely. In 2026, all four languages—&lt;strong>Rust, Python, Go, and C&lt;/strong>—can be shipped cross-platform (Windows, macOS, and Linux) from a single codebase.&lt;/p>
&lt;p>However, &amp;ldquo;how&amp;rdquo; they achieve this varies significantly.&lt;/p>
&lt;p>Some feel like a natural part of the OS, while others feel like a &amp;ldquo;web page in a box.&amp;rdquo;&lt;/p>
&lt;h3>Cross-Platform Comparison (2026)&lt;span class="absolute -mt-20" id="cross-platform-comparison-2026">&lt;/span>
&lt;a href="#cross-platform-comparison-2026" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Language&lt;/th>
&lt;th style="text-align:left">Primary Frameworks&lt;/th>
&lt;th style="text-align:left">Distribution Difficulty&lt;/th>
&lt;th style="text-align:left">Resulting Experience&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Rust&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Tauri&lt;/strong>, Iced, Slint&lt;/td>
&lt;td style="text-align:left">🟢 Easy (Single binary)&lt;/td>
&lt;td style="text-align:left">Professional, tiny, and very fast.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Python&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>PySide6 (Qt)&lt;/strong>, Kivy&lt;/td>
&lt;td style="text-align:left">🔴 Hard (Packaging is messy)&lt;/td>
&lt;td style="text-align:left">High-quality but &amp;ldquo;heavy&amp;rdquo; apps.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Go&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Fyne&lt;/strong>, Wails&lt;/td>
&lt;td style="text-align:left">🟢 Easy (Single binary)&lt;/td>
&lt;td style="text-align:left">Functional, but often looks &amp;ldquo;non-native.&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>C&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Qt&lt;/strong>, GTK&lt;/td>
&lt;td style="text-align:left">🟡 Medium (Compiling is a chore)&lt;/td>
&lt;td style="text-align:left">The gold standard for &amp;ldquo;Native&amp;rdquo; look.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol>
&lt;li>Rust: The Modern Champion&lt;/li>
&lt;/ol>
&lt;p>Rust is currently the favorite for cross-platform desktop apps because of &lt;strong>Tauri&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>How it works:&lt;/strong> It uses the &amp;ldquo;Webview&amp;rdquo; already installed on your computer (Edge on Windows, Safari on Mac). This means you don&amp;rsquo;t have to ship a whole browser with your app.&lt;/li>
&lt;li>&lt;strong>Shipping:&lt;/strong> You get a single &lt;code>.exe&lt;/code> or &lt;code>.app&lt;/code> file that is often under 10MB.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Python: Great UI, Deployment Headaches&lt;/li>
&lt;/ol>
&lt;p>Python uses &lt;strong>Qt&lt;/strong> (via PySide or PyQt), which is the most powerful UI toolkit in the world.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Problem:&lt;/strong> Python code isn&amp;rsquo;t &amp;ldquo;compiled.&amp;rdquo; To ship it, you have to use tools like &lt;code>PyInstaller&lt;/code> to bundle the Python interpreter, all your libraries, and the UI toolkit into one giant folder.&lt;/li>
&lt;li>&lt;strong>The Result:&lt;/strong> Even a &amp;ldquo;Hello World&amp;rdquo; app can be 100MB+. It works on all platforms, but it feels clunky to distribute.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Go: The Practical Choice&lt;/li>
&lt;/ol>
&lt;p>Go is great if you want to build a tool quickly and don&amp;rsquo;t care about &amp;ldquo;fancy&amp;rdquo; animations.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Fyne:&lt;/strong> Uses its own rendering engine (like a game). It looks the same on every OS, which is good for consistency but means it doesn&amp;rsquo;t look like a &amp;ldquo;real&amp;rdquo; Windows or Mac app.&lt;/li>
&lt;li>&lt;strong>Wails:&lt;/strong> The Go version of Tauri. It’s excellent for web-based UIs with a Go backend.&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>C/C++: The Industrial Standard&lt;/li>
&lt;/ol>
&lt;p>Most &amp;ldquo;big&amp;rdquo; apps (Adobe Photoshop, Microsoft Office) are written in C++.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Qt Framework:&lt;/strong> This is the most mature cross-platform tool. It has been around for 30 years.&lt;/li>
&lt;li>&lt;strong>The Catch:&lt;/strong> You have to set up a &amp;ldquo;build pipeline&amp;rdquo; for every OS. Compiling a C app for Mac while you are on Windows is notoriously difficult.&lt;/li>
&lt;/ul>
&lt;p>Which should you choose?&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Choose Rust (Tauri)&lt;/strong> if you want the best &amp;ldquo;modern&amp;rdquo; experience: small files, high security, and easy to design with web tools.&lt;/li>
&lt;li>&lt;strong>Choose Python (PySide)&lt;/strong> if you are building an internal tool for work where file size doesn&amp;rsquo;t matter and you need a massive library of ready-made widgets.&lt;/li>
&lt;li>&lt;strong>Choose Go (Wails)&lt;/strong> if you already know Go and want to throw a UI onto a cloud or networking tool.&lt;/li>
&lt;/ul>
&lt;h3>About PM&lt;span class="absolute -mt-20" id="about-pm">&lt;/span>
&lt;a href="#about-pm" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>In project management, what you are describing is known as the &lt;strong>Iron Triangle&lt;/strong> (or the Triple Constraint). While they aren&amp;rsquo;t &amp;ldquo;blockers&amp;rdquo; in the sense of a technical bug, they are the &lt;strong>four fundamental constraints&lt;/strong> that constantly push against each other.&lt;/p>
&lt;p>If you change one, at least one other must be adjusted to keep the project from collapsing.&lt;/p>
&lt;h4>1. Scope (The &amp;ldquo;What&amp;rdquo;)&lt;span class="absolute -mt-20" id="1-scope-the-what">&lt;/span>
&lt;a href="#1-scope-the-what" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>This is the list of deliverables and features.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Conflict:&lt;/strong> When scope increases (&amp;ldquo;Scope Creep&amp;rdquo;) without adding more time or money, quality usually drops because the team is stretched too thin.&lt;/li>
&lt;li>&lt;strong>PM Reality:&lt;/strong> You have to protect the boundaries. If a stakeholder wants more features, they must accept a later date or a higher bill.&lt;/li>
&lt;/ul>
&lt;h4>2. Speed / Time (The &amp;ldquo;When&amp;rdquo;)&lt;span class="absolute -mt-20" id="2-speed--time-the-when">&lt;/span>
&lt;a href="#2-speed--time-the-when" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>This is your schedule and deadline.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Conflict:&lt;/strong> Crashing a schedule (trying to do it faster) almost always increases &lt;strong>Price&lt;/strong> (hiring more people, paying overtime) or risks &lt;strong>Quality&lt;/strong> (cutting corners on testing).&lt;/li>
&lt;li>&lt;strong>PM Reality:&lt;/strong> Time is often the most &amp;ldquo;fixed&amp;rdquo; constraint. If the deadline is a hard wall, you must be aggressive about cutting Scope.&lt;/li>
&lt;/ul>
&lt;h4>3. Quality (The &amp;ldquo;How Well&amp;rdquo;)&lt;span class="absolute -mt-20" id="3-quality-the-how-well">&lt;/span>
&lt;a href="#3-quality-the-how-well" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>This is the standard the work must meet.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Conflict:&lt;/strong> Quality is often the &amp;ldquo;silent victim.&amp;rdquo; When a project is over-budget and behind schedule, teams feel pressured to skip reviews or documentation to catch up.&lt;/li>
&lt;li>&lt;strong>PM Reality:&lt;/strong> Lowering quality creates &amp;ldquo;technical debt,&amp;rdquo; which blocks you later in the form of bugs and rework.&lt;/li>
&lt;/ul>
&lt;h4>4. Price / Cost (The &amp;ldquo;How Much&amp;rdquo;)&lt;span class="absolute -mt-20" id="4-price--cost-the-how-much">&lt;/span>
&lt;a href="#4-price--cost-the-how-much" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>This is the budget, including salaries, tools, and resources.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Conflict:&lt;/strong> A tight budget limits your &lt;strong>Speed&lt;/strong> (you can&amp;rsquo;t hire more help) and your &lt;strong>Scope&lt;/strong> (you can&amp;rsquo;t afford the materials/hours for extra features).&lt;/li>
&lt;li>&lt;strong>PM Reality:&lt;/strong> Money can sometimes buy speed, but only to a point (as the saying goes: &amp;ldquo;Nine women can&amp;rsquo;t make a baby in one month&amp;rdquo;).&lt;/li>
&lt;/ul>
&lt;h4>The &amp;ldquo;Pick Two&amp;rdquo; Rule&lt;span class="absolute -mt-20" id="the-pick-two-rule">&lt;/span>
&lt;a href="#the-pick-two-rule" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>There is a famous PM adage that summarizes these trade-offs perfectly:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>&amp;ldquo;Fast, Cheap, or Good: Pick two.&amp;rdquo;&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>&lt;strong>Fast + Cheap&lt;/strong> = Low Quality (it’ll be messy).&lt;/li>
&lt;li>&lt;strong>Fast + Good&lt;/strong> = Expensive (you need top-tier talent and overtime).&lt;/li>
&lt;li>&lt;strong>Good + Cheap&lt;/strong> = Slow (it will take a long time to get there with limited resources).&lt;/li>
&lt;/ul>
&lt;p>Other &amp;ldquo;Real-World&amp;rdquo; Blockers&lt;/p>
&lt;p>While the Iron Triangle defines the constraints, actual &lt;strong>blockers&lt;/strong> that stop work entirely often include:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Dependencies:&lt;/strong> Waiting on another team to finish their part.&lt;/li>
&lt;li>&lt;strong>Stakeholder Indecision:&lt;/strong> &amp;ldquo;Decision paralysis&amp;rdquo; where a lack of approval halts progress.&lt;/li>
&lt;li>&lt;strong>Resource Availability:&lt;/strong> A key developer gets sick or a specialized tool breaks.&lt;/li>
&lt;/ul></description></item><item><title>Using Blender</title><link>https://JAlcocerT.github.io/JAlcocerT/using-blender-with-ai/</link><pubDate>Fri, 20 Mar 2026 08:00:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/using-blender-with-ai/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Blender vs FreeCAD vs OpenSCAD&lt;/p>
&lt;!-- https://youtu.be/r7H60u0kHRA?si= -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/r7H60u0kHRA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/coolresources/engineering/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Engineering | Docs ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/mbsd" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
MBSD | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Last year, I saw a very cool video about &lt;strong>design patterns&lt;/strong>.&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=8UAsN9wvePE -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/8UAsN9wvePE" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>And there is something about designs that have always captivate me.&lt;/p>
&lt;p>Whats does make something so good, that it lasts the beats of time?&lt;/p>
&lt;p>How can we create someting that is valued by people?&lt;/p>
&lt;p>Even from totally different generations:&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/outro/porsche.png" alt="Porsche design" loading="lazy" />&lt;/p>
&lt;p>I belive you would agree that the 911 design is one of those.&lt;/p>
&lt;p>But&amp;hellip;I want to create stuff.&lt;/p>
&lt;p>Real stuff.&lt;/p>
&lt;h2>Using Blender&lt;span class="absolute -mt-20" id="using-blender">&lt;/span>
&lt;a href="#using-blender" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Blender is an absolute powerhouse for &amp;ldquo;design-as-code,&amp;rdquo; but it is a &lt;strong>mesh-based&lt;/strong> tool, which makes it fundamentally different from the &lt;strong>CAD-based&lt;/strong> tools like CadQuery or OpenSCAD.&lt;/p>
&lt;p>Here is the breakdown of how Blender fits into an &amp;ldquo;agentic&amp;rdquo; workflow:&lt;/p>
&lt;ol>
&lt;li>Can Blender be driven by Python?&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Yes, deeply.&lt;/strong> Blender is essentially a Python application with a C++ kernel.&lt;/p>
&lt;p>Almost every button you click in the UI triggers a Python command behind the scenes.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>The &lt;code>bpy&lt;/code> Module:&lt;/strong> This is the main API. An agent can create objects, move vertices, apply textures, and set up lighting entirely through code.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>The &amp;ldquo;Info&amp;rdquo; Panel Trick:&lt;/strong> If you want to see what code an agent needs to write, you can open the &amp;ldquo;Info&amp;rdquo; editor in Blender. It logs the Python equivalent of every manual action you take, making it a great &amp;ldquo;cheat sheet&amp;rdquo; for training agents.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Agent Advantage:&lt;/strong> Blender allows agents to do things CAD tools can&amp;rsquo;t easily do, like &lt;strong>procedural textures, physics simulations, and high-end rendering.&lt;/strong>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Blender vs. CAD (The &amp;ldquo;Topology&amp;rdquo; Problem)&lt;/li>
&lt;/ol>
&lt;p>While an agent &lt;em>can&lt;/em> design a mechanical part in Blender using Python, there is a catch:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>CAD (CadQuery/OpenSCAD):&lt;/strong> Uses mathematical solids (BREP/CSG). If an agent tells a CAD tool to &amp;ldquo;drill a hole,&amp;rdquo; the hole is a perfect circle.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Blender:&lt;/strong> Uses a &amp;ldquo;mesh&amp;rdquo; (vertices and faces). If an agent tells Blender to &amp;ldquo;drill a hole,&amp;rdquo; it has to cut into a grid of triangles or quads. This often creates &amp;ldquo;messy&amp;rdquo; geometry that is hard for an agent to fix if things go wrong.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;strong>The Verdict:&lt;/strong> If your agent is designing &lt;strong>mechanical/precision parts&lt;/strong>, use &lt;strong>CadQuery&lt;/strong>. If your agent is designing &lt;strong>visual assets, characters, or environments&lt;/strong>, use &lt;strong>Blender&lt;/strong>.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;ol start="3">
&lt;li>Using CAD Outputs in Blender (The &amp;ldquo;Hybrid&amp;rdquo; Workflow)&lt;/li>
&lt;/ol>
&lt;p>The most sophisticated AI agent setups actually use &lt;strong>both&lt;/strong>.&lt;/p>
&lt;p>You let the agent design the &amp;ldquo;skeleton&amp;rdquo; in a CAD tool and then &amp;ldquo;beautify&amp;rdquo; it in Blender.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Workflow Step&lt;/th>
&lt;th style="text-align:left">Tool Used&lt;/th>
&lt;th style="text-align:left">Why?&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>1. Precision Modeling&lt;/strong>&lt;/td>
&lt;td style="text-align:left">CadQuery / OpenSCAD&lt;/td>
&lt;td style="text-align:left">Agent writes code to define exact dimensions and holes.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>2. Export&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>STL&lt;/strong> or &lt;strong>STEP&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Standard formats that bridge the two worlds.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>3. Import to Blender&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;code>bpy.ops.import_mesh.stl&lt;/code>&lt;/td>
&lt;td style="text-align:left">The agent uses Python to bring the CAD file into a Blender scene.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>4. Rendering &amp;amp; FX&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Blender (Python)&lt;/td>
&lt;td style="text-align:left">The agent applies materials, adds &amp;ldquo;wear and tear,&amp;rdquo; and renders a photo-realistic image.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="4">
&lt;li>Recent Innovations (2026 Context)&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Blender MCP (Model Context Protocol):&lt;/strong> There are now &amp;ldquo;MCP Servers&amp;rdquo; for Blender. These allow an AI agent to &amp;ldquo;live&amp;rdquo; inside Blender, seeing the viewport and executing code in real-time rather than just generating a script and hoping it works.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Geometry Nodes:&lt;/strong> This is Blender&amp;rsquo;s version of &amp;ldquo;visual coding.&amp;rdquo; Agents are becoming very good at generating &amp;ldquo;Geo Nodes&amp;rdquo; trees, which are parametric and much more &amp;ldquo;CAD-like&amp;rdquo; than traditional mesh editing.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3>Installing Blender&lt;span class="absolute -mt-20" id="installing-blender">&lt;/span>
&lt;a href="#installing-blender" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I was consolidating &lt;a href="https://jalcocert.github.io/Linux/docs/debian/foss_engineering/#blender" target="_blank" rel="noopener">here&lt;/a> some OSS Tools for engineering and how ti install them with Ubuntu.&lt;/p>
&lt;p>Among them, Blender, we just need:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#choco install blender --version=4.2.2 -y &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#5.1.0 &amp;gt;4.0.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://www.blender.org/download/release/Blender4.3/blender-4.3.1-linux-x64.tar.xz/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo snap install blender --classic &lt;span class="c1">#it might be lower, like 4.3.1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sudo snap install blender --channel=4.3/stable --classic&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You can always download your desired blender versions from: &lt;a href="https://www.blender.org/download/" target="_blank" rel="noopener">https://www.blender.org/download/&lt;/a>&lt;/p>
&lt;h3>Blender as a Code&lt;span class="absolute -mt-20" id="blender-as-a-code">&lt;/span>
&lt;a href="#blender-as-a-code" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>I know i might sound lazy.&lt;/p>
&lt;p>BUT&lt;/p>
&lt;p>Drag and drop on an interface&amp;hellip;is something that id like to have automated for me.&lt;/p>
&lt;p>And I heard about &lt;strong>Blender with Python Scripting&lt;/strong>.&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/mJU7owctel4" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Thanks to &lt;a href="https://github.com/CGArtPython/blender_plus_python/tree/main" target="_blank" rel="noopener">https://github.com/CGArtPython/blender_plus_python/tree/main&lt;/a>&lt;/p>
&lt;p>Not only heard, but actually&amp;hellip;just did sth &lt;a href="https://jalcocert.github.io/JAlcocerT/cad-design-mbsd/" target="_blank" rel="noopener">with it and a slider crank here&lt;/a>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">snap info blender
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#choco install blender --version=4.2.2 -y &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/3Design
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> z-cadquery
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make all
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make render # renders all 180 PNGs&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make video # assembles them into render/output.mp4 via ffmpeg&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Telling blender what to run on its internal engine can be a thing:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">blender -b --python my_script.py&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>To install &lt;strong>Blender 4.2.2&lt;/strong> (or the latest patch in the 4.2 LTS series) using the portable &amp;ldquo;Tarball&amp;rdquo; method, follow these exact steps in your terminal.&lt;/p>
&lt;p>This approach is perfect for your HUD project because it keeps Blender&amp;rsquo;s Python isolated and fully customizable.&lt;/p>
&lt;ol>
&lt;li>Create the Directory&lt;/li>
&lt;/ol>
&lt;p>First, let&amp;rsquo;s create a clean home for this specific version so it doesn&amp;rsquo;t get mixed up with other apps.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mkdir -p ~/Applications/Blender4.2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~/Applications/Blender4.2&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="2">
&lt;li>Download Blender 4.2.2
We&amp;rsquo;ll use &lt;code>wget&lt;/code> to pull the specific Linux 64-bit archive directly from the official Blender foundation servers.&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">wget https://download.blender.org/release/Blender4.2/blender-4.2.2-linux-x64.tar.xz&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="3">
&lt;li>Extract the Archive
Now we unpack it. We&amp;rsquo;ll use the &lt;code>--strip-components=1&lt;/code> flag so that the files go directly into your &lt;code>Blender4.2&lt;/code> folder instead of creating &lt;em>another&lt;/em> sub-folder inside it.&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">tar -xvf blender-4.2.2-linux-x64.tar.xz --strip-components&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="4">
&lt;li>Clean Up (Optional)&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">rm blender-4.2.2-linux-x64.tar.xz&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="5">
&lt;li>Launch and Verify&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">./blender&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>To check which &lt;strong>Python version&lt;/strong> this specific Blender is using (important for your script imports), run this:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">./4.2/python/bin/python3.11 --version&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Blender with AI&lt;span class="absolute -mt-20" id="blender-with-ai">&lt;/span>
&lt;a href="#blender-with-ai" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Image generations models are really interesting.&lt;/p>
&lt;p>&lt;a href="https://jalcocert.github.io/JAlcocerT/stable-difussion-free-generation/" target="_blank" rel="noopener">On this post&lt;/a> I have reviewed recently the latest tools to use them.&lt;/p>
&lt;p>With controlnet and flux&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.reddit.com/r/comfyui/comments/1ekv3tx/poseable_humans_with_flux_blender_playbook/" target="_blank" rel="noopener">https://www.reddit.com/r/comfyui/comments/1ekv3tx/poseable_humans_with_flux_blender_playbook/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>But i want control on the generation.&lt;/p>
&lt;p>That it can be achieved via:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">claude&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>If you still got a live, its over: &lt;a href="https://code.claude.com/docs/en/remote-control#interactive-session" target="_blank" rel="noopener">https://code.claude.com/docs/en/remote-control#interactive-session&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">claude --remote-control &lt;span class="s2">&amp;#34;My Project&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h4>ControlNet vs&lt;span class="absolute -mt-20" id="controlnet-vs">&lt;/span>
&lt;a href="#controlnet-vs" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>With Control net, we can provide more than a text prompt to get the desired results from the T2I models.&lt;/p>
&lt;p>I mean, we can provide images as prompts!&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/o7N6Fbtg84E" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Can we do such animations with blender?&lt;/p>
&lt;!-- https://youtu.be/58C8dWL36GM -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/58C8dWL36GM" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;ul>
&lt;li>&lt;a href="https://docs.linuxserver.io/images/docker-cura/" target="_blank" rel="noopener">https://docs.linuxserver.io/images/docker-cura/&lt;/a>&lt;/li>
&lt;li>FREE CAD&lt;/li>
&lt;/ul>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="#conclusions" >&lt;img
alt="MultiChat UI"
loading="lazy"
decoding="async"
src="https://raw.githubusercontent.com/JAlcocerT/Streamlit-MultiChat/main/streamlit-multichat.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">MultiChat UI&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">How the final multichat UI looks like&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/3Design" target="_blank" rel="noreferrer">&lt;img
alt="3D Design Repository"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">3D Design Repository&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Source Code of scripts for Blender, OpenSCAD and more&lt;/div>&lt;/a>
&lt;/div>
&lt;h3>The Blender Project&lt;span class="absolute -mt-20" id="the-blender-project">&lt;/span>
&lt;a href="#the-blender-project" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>While primarily known as a 3D modeling and rendering software, Blender also includes robust animation capabilities.&lt;/p>
&lt;p>It&amp;rsquo;s one of the most comprehensive open-source animation suites available, offering features for 3D animation, rigging, modeling, simulation, rendering, and more.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.blender.org/" target="_blank" rel="noopener noreferrer">The Blender Official Site&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/blender/blender" target="_blank" rel="noopener noreferrer">The Uptime Blender Code at Github&lt;/a>
&lt;ul>
&lt;li>License: &lt;a href="https://github.com/blender/blender?tab=License-1-ov-file#readme" target="_blank" rel="noopener noreferrer">GNU GPL&lt;/a> ✅&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;!-- https://www.youtube.com/watch?v=r7H60u0kHRA -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/r7H60u0kHRA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;ul>
&lt;li>&lt;a href="https://gitmcp.io/blender/blender/chat" target="_blank" rel="noopener">https://gitmcp.io/blender/blender/chat&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;mcpServers&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;gitmcp&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;serverUrl&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;https://gitmcp.io/blender/blender&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;context7&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;command&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;npx&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;args&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;-y&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;@upstash/context7-mcp&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Blender API - With Python&lt;span class="absolute -mt-20" id="blender-api---with-python">&lt;/span>
&lt;a href="#blender-api---with-python" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>If you&amp;rsquo;ve been wondering&amp;hellip;&lt;/p>
&lt;!-- * https://www.youtube.com/watch?v=cyt0O7saU4Q&amp;list=PLFtLHTf5bnym_wk4DcYIMq1DkjqB7kDb- -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/cyt0O7saU4Q" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://docs.blender.org/api/current/" target="_blank" rel="noopener">https://docs.blender.org/api/current/&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://docs.blender.org/api/current/info_overview.html" target="_blank" rel="noopener">https://docs.blender.org/api/current/info_overview.html&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://docs.blender.org/manual/en/dev/advanced/blender_directory_layout.html#blender-directory-layout" target="_blank" rel="noopener">https://docs.blender.org/manual/en/dev/advanced/blender_directory_layout.html#blender-directory-layout&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://pypi.org/project/bpy/" target="_blank" rel="noopener">https://pypi.org/project/bpy/&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3>Examples&lt;span class="absolute -mt-20" id="examples">&lt;/span>
&lt;a href="#examples" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;details class="last-of-type:mb-0 rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2 mt-4 group" >
&lt;summary class="flex items-center cursor-pointer select-none list-none p-1 rounded transition-colors hover:bg-gray-100 dark:hover:bg-neutral-800 before:mr-1 before:inline-block before:transition-transform before:content-[''] dark:before:invert rtl:before:rotate-180 group-open:before:rotate-90">
&lt;strong class="text-lg">Create a sphere: 👇&lt;/strong>
&lt;/summary>
&lt;div class="p-2 overflow-hidden">
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#import bpy&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#bpy.data.objects[&amp;#34;Cube&amp;#34;].data.vertices[0].co.x += 1.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">bpy&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Add a UV Sphere&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">bpy&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ops&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mesh&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">primitive_uv_sphere_add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">radius&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">location&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">segments&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">32&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ring_count&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Select the newly created sphere&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">sphere&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">bpy&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">context&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">object&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Optionally, you can give the sphere a material&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Create a new material&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">material&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">bpy&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">materials&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">new&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;Sphere Material&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Assign a color to the material (e.g., red in RGBA format)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">material&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">diffuse_color&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># (R, G, B, A)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Assign the material to the sphere&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">sphere&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">materials&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">material&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/details>
&lt;h2>Render with Stable Diffusion&lt;span class="absolute -mt-20" id="render-with-stable-diffusion">&lt;/span>
&lt;a href="#render-with-stable-diffusion" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h2>Blender for Video Editing&lt;span class="absolute -mt-20" id="blender-for-video-editing">&lt;/span>
&lt;a href="#blender-for-video-editing" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;!-- https://www.youtube.com/watch?v=9tWEsqIgeDY -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/9tWEsqIgeDY" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>You can even use it to bring custom &lt;a href="https://jalcocert.github.io/JAlcocerT/photo-video-tinkering/#color-grading" target="_blank" rel="noopener">LUT&lt;/a> to videos, apparently!&lt;/p>
&lt;h2>CAD for Agents&lt;span class="absolute -mt-20" id="cad-for-agents">&lt;/span>
&lt;a href="#cad-for-agents" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>For developing AI agents that design &amp;ldquo;as-code,&amp;rdquo; the best open-source CAD program is &lt;strong>CadQuery&lt;/strong>, with &lt;strong>OpenSCAD&lt;/strong> being a strong runner-up depending on the complexity of your geometry.&lt;/p>
&lt;p>While many traditional CAD tools (like FreeCAD) have Python APIs, they are often &amp;ldquo;wrappers&amp;rdquo; around a visual interface.&lt;/p>
&lt;p>For an agent to &amp;ldquo;think&amp;rdquo; in code, you want a library where the code &lt;em>is&lt;/em> the model.&lt;/p>
&lt;hr>
&lt;ol>
&lt;li>Top Recommendation: CadQuery &lt;a href="https://github.com/cadquery/cadquery" target="_blank" rel="noopener">https://github.com/cadquery/cadquery&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>CadQuery is a Python-based library that treats CAD like a standard software engineering task.&lt;/p>
&lt;p>It is currently the &amp;ldquo;gold standard&amp;rdquo; for programmatic design because it uses a &lt;strong>BREP (Boundary Representation)&lt;/strong> kernel (OpenCASCADE), the same high-end engine used by professional tools like SolidWorks.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Why it&amp;rsquo;s best for Agents:&lt;/strong>
&lt;ul>
&lt;li>&lt;strong>Standard Python:&lt;/strong> Agents can use standard Python libraries (math, NumPy, etc.) and IDE features like linting and debugging.&lt;/li>
&lt;li>&lt;strong>&amp;ldquo;Fluent&amp;rdquo; API:&lt;/strong> It uses a chainable syntax (e.g., &lt;code>.box(10,10,10).faces(&amp;quot;&amp;gt;Z&amp;quot;).hole(2)&lt;/code>) which is highly readable and easy for LLMs to generate accurately.&lt;/li>
&lt;li>&lt;strong>Design Intent:&lt;/strong> You can select parts of a model by their features (e.g., &amp;ldquo;the top face&amp;rdquo; or &amp;ldquo;all edges longer than 5mm&amp;rdquo;) rather than hard-coding coordinates.&lt;/li>
&lt;li>&lt;strong>STEP Support:&lt;/strong> Unlike simpler tools, it exports to STEP files, which are required for professional manufacturing and CNC.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Best for Simple Geometry: OpenSCAD
OpenSCAD is the &amp;ldquo;original&amp;rdquo; code-based CAD. It uses a custom functional language and a &lt;strong>CSG (Constructive Solid Geometry)&lt;/strong> approach.&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>Pros:&lt;/strong> It is extremely lightweight and has a massive library of community-made parts (like &amp;ldquo;BOSL2&amp;rdquo;). It is very stable and difficult to &amp;ldquo;break&amp;rdquo; with bad code.&lt;/li>
&lt;li>&lt;strong>Cons:&lt;/strong> It is famously bad at fillets (rounded edges) and chamfers. It also doesn&amp;rsquo;t support STEP export natively (it mostly exports STL), making it less &amp;ldquo;professional&amp;rdquo; for engineering.&lt;/li>
&lt;li>&lt;strong>Agent Fit:&lt;/strong> Use this if your agent is doing simple 3D printing tasks or grid-based modular designs.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>Comparison at a Glance&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Feature&lt;/th>
&lt;th style="text-align:left">&lt;strong>CadQuery&lt;/strong>&lt;/th>
&lt;th style="text-align:left">&lt;strong>OpenSCAD&lt;/strong>&lt;/th>
&lt;th style="text-align:left">&lt;strong>FreeCAD (Python)&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Language&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Python (Standard)&lt;/td>
&lt;td style="text-align:left">Custom (OpenSCAD)&lt;/td>
&lt;td style="text-align:left">Python (API Wrapper)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Kernel&lt;/strong>&lt;/td>
&lt;td style="text-align:left">OpenCASCADE (Professional)&lt;/td>
&lt;td style="text-align:left">CGAL (Basic)&lt;/td>
&lt;td style="text-align:left">OpenCASCADE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Philosophy&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Selection &amp;amp; Feature based&lt;/td>
&lt;td style="text-align:left">Adding/Subtracting Shapes&lt;/td>
&lt;td style="text-align:left">Visual-first, Scriptable&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Best For&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Complex engineering/Agents&lt;/td>
&lt;td style="text-align:left">Hobbyist 3D printing&lt;/td>
&lt;td style="text-align:left">Manual design + Automation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Export Formats&lt;/strong>&lt;/td>
&lt;td style="text-align:left">STEP, STL, GLTF, DXF&lt;/td>
&lt;td style="text-align:left">STL, OFF, DXF&lt;/td>
&lt;td style="text-align:left">All standard formats&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;ol start="3">
&lt;li>The &amp;ldquo;Deep Learning&amp;rdquo; Alternative: Build123d &lt;a href="https://github.com/gumyr/build123d" target="_blank" rel="noopener">https://github.com/gumyr/build123d&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>If you want the absolute latest tech, check out &lt;strong>Build123d&lt;/strong>.&lt;/p>
&lt;p>It is a successor/alternative to CadQuery that is designed to be even more &amp;ldquo;Pythonic&amp;rdquo; and solves some of the internal complexities of CadQuery.&lt;/p>
&lt;p>It is gaining a lot of traction in the &amp;ldquo;CAD as Code&amp;rdquo; developer community.&lt;/p>
&lt;p>Summary for your Agent&lt;/p>
&lt;p>If you want your agent to produce &lt;strong>manufacturable, professional-grade parts&lt;/strong>, build your agent&amp;rsquo;s toolset around &lt;strong>CadQuery&lt;/strong>.&lt;/p>
&lt;p>If you want the agent to quickly &amp;ldquo;sketch&amp;rdquo; &lt;strong>simple 3D printable objects&lt;/strong>, &lt;strong>OpenSCAD&lt;/strong> is easier to implement and has more training data available in LLMs.&lt;/p>
&lt;p>I saw recently this video:&lt;/p>
&lt;!--
https://www.youtube.com/watch?v=8n7LfHpgn2M
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/8n7LfHpgn2M" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>And could not resist to try that with the 2D mechanism that I have ready in Python.&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>If you dont like KDEnlive for video editing&lt;/p>
&lt;p>You can also use Blender:
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/99ZdOuJMrao" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=99ZdOuJMrao -->
&lt;p>The level of some people creating animations:&lt;/p>
&lt;!-- https://www.youtube.com/watch?v=_nR1-J676ao -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/_nR1-J676ao" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;div class="overflow-x-auto mt-6 flex rounded-lg border py-2 ltr:pr-4 rtl:pl-4 contrast-more:border-current contrast-more:dark:border-current border-blue-200 bg-blue-100 text-blue-900 dark:border-blue-200/30 dark:bg-blue-900/30 dark:text-blue-200">
&lt;div class="ltr:pl-3 ltr:pr-2 rtl:pr-3 rtl:pl-2">&lt;div class="select-none text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">
ℹ️
&lt;/div>&lt;/div>
&lt;div class="w-full min-w-0 leading-7">
&lt;div class="mt-6 leading-7 first:mt-0">
With Python &lt;strong>MoviePy&lt;/strong>, as covered on &lt;a href="https://jalcocert.github.io/JAlcocerT/my-youtube-ai-workflow/#quick-vlogs-as-a-code" target="_blank" rel="noopener">this post&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>Using Blender with AI for Home Design&lt;span class="absolute -mt-20" id="using-blender-with-ai-for-home-design">&lt;/span>
&lt;a href="#using-blender-with-ai-for-home-design" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Can Blender be some kind of &lt;strong>homestyler, but F/OSS&lt;/strong>?&lt;/p>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Other Design Resources&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Great video comparing &lt;a href="https://www.youtube.com/watch?v=8UAsN9wvePE&amp;amp;t=645s" target="_blank" rel="noopener">western vs eastern design&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://blendermarket.com/" target="_blank" rel="noopener">https://blendermarket.com/&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://www.blender.org/" target="_blank" rel="noopener">https://www.blender.org/&lt;/a>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/blender/blender" target="_blank" rel="noopener">https://github.com/blender/blender&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/gd3kr/BlenderGPT" target="_blank" rel="noopener">https://github.com/gd3kr/BlenderGPT&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Blender Add-ons&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/agmmnn/awesome-blender" target="_blank" rel="noopener">https://github.com/agmmnn/awesome-blender&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://awesome-blender.netlify.app/" target="_blank" rel="noopener">https://awesome-blender.netlify.app/&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/benrugg/AI-Render" target="_blank" rel="noopener">https://github.com/benrugg/AI-Render&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3>Blender Ad-ons&lt;span class="absolute -mt-20" id="blender-ad-ons">&lt;/span>
&lt;a href="#blender-ad-ons" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>BlendAI: A versatile suite of AI tools, including image-to-3D, text-to-3D, and more.  &lt;/p>
&lt;p>BlendAI Library Pro: Another powerful collection of AI tools, offering features like image-to-3D, text-to-HDRI, and text-to-PBR.  &lt;/p>
&lt;p>Autodepth AI: Creates depth maps from images, crucial for many AI-powered 3D workflows.  &lt;/p>
&lt;p>3D AI Studio: A comprehensive suite of AI tools for 3D artists, covering a wide range of tasks.  &lt;/p>
&lt;h3>Benchmarks with Blender&lt;span class="absolute -mt-20" id="benchmarks-with-blender">&lt;/span>
&lt;a href="#benchmarks-with-blender" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://opendata.blender.org/" target="_blank" rel="noopener">https://opendata.blender.org/&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3>More Design as a Code&lt;span class="absolute -mt-20" id="more-design-as-a-code">&lt;/span>
&lt;a href="#more-design-as-a-code" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://wiki.freecad.org/Python_scripting_tutorial" target="_blank" rel="noopener">https://wiki.freecad.org/Python_scripting_tutorial&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Bringing Mechanisms to Life</title><link>https://JAlcocerT.github.io/JAlcocerT/cad-design-mbsd/</link><pubDate>Thu, 19 Mar 2026 07:00:21 +0100</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/cad-design-mbsd/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>A workflow around: Python 2D ~ mbsd + CadQuery + blender&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/coolresources/engineering/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Engineering | Docs ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/mbsd" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
MBSD | Repo&lt;/span>&lt;/a>
&lt;/div>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Its been a while since I read/studied &lt;em>Ingenieria del automovil: sistemas y comportamiento dinamico&lt;/em>.&lt;/p>
&lt;p>How about making a come back?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/3Design
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/mbsd&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This is the flow:&lt;/p>
&lt;pre class="mermaid mt-6">graph TD
%% Node Definitions
SIM[Python Kinematic Simulator]
CQ[CadQuery Script]
DATA[Motion Data: JSON/CSV]
STEP[High-Res STEP/STL Files]
BLENDER[Blender Python Script]
PRINT[3D Printer / Slicer]
RENDER[Final Cinematic Animation]
%% Flow
subgraph "Phase 1: Logic &amp; Engineering"
SIM -->|Calculates Kinematics| DATA
DATA -->|Feeds coordinates| CQ
CQ -->|Generates Geometry| STEP
end
subgraph "Phase 2: Manufacturing"
STEP -->|Export Static Parts| PRINT
end
subgraph "Phase 3: Visuals &amp; Hand-off"
STEP -->|Import Geometry| BLENDER
DATA -->|Apply Keyframes| BLENDER
BLENDER -->|Materials &amp; Lighting| RENDER
end
%% Styling
style SIM fill:#f9f,stroke:#333,stroke-width:2px
style CQ fill:#bbf,stroke:#333,stroke-width:2px
style RENDER fill:#bfb,stroke:#333,stroke-width:4px
style PRINT fill:#bfb,stroke:#333,stroke-width:4px&lt;/pre>&lt;p>You can do it via:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">###make creative #read the post to understand this :)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Step 1 — build the scene&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">~/Applications/Blender4.2/blender --background --python blender_scene_creative.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Runs the Python script to build the scene — imports STLs, sets up materials, lighting, camera, bakes keyframes, and saves slider_crank_creative.blend. This is equivalent to make scene.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Step 2 — render it&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">~/Applications/Blender4.2/blender --background slider_crank_creative.blend --render-anim
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#blender --background slider_crank_creative.blend --render-anim&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#Opens the already-built .blend file and renders all frames to video. This is equivalent to make render.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#rsync -avP jalcocert@192.168.1.2:/home/jalcocert/3Design/z-cadquery/render/slider_crank_creative.mp4 .&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mpv slider_crank_creative.mp4&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>This is what it got rendered after a while:&lt;/p>
&lt;!-- https://youtu.be/0fmFl3hVgaA
-->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/0fmFl3hVgaA" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>This workflow replies to:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>How does the mechanism move and what are the forces involved? Aka will it break while it operates?&lt;/p>
&lt;/li>
&lt;li>
&lt;p>How can I manufacture it? (Optional)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Before even manufacturing&amp;hellip;does someone wants this new shiny invention? Aka: see how cool it renders&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2>The Ecosystem&lt;span class="absolute -mt-20" id="the-ecosystem">&lt;/span>
&lt;a href="#the-ecosystem" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>To get precision parts that are &amp;ldquo;ready to print&amp;rdquo; while also achieving &amp;ldquo;cool and realistic&amp;rdquo; animations, you are looking at a &lt;strong>Hybrid Pipeline&lt;/strong>.&lt;/p>
&lt;p>The industry-standard approach for an agent is to generate the geometry in a &lt;strong>CAD-based (BREP/CSG)&lt;/strong> environment and then &amp;ldquo;hand off&amp;rdquo; that model to a &lt;strong>Mesh-based (Blender)&lt;/strong> environment for the cinematic treatment.&lt;/p>
&lt;h3>BREP/CSG vs. Mesh: The Technical Divide&lt;span class="absolute -mt-20" id="brepcsg-vs-mesh-the-technical-divide">&lt;/span>
&lt;a href="#brepcsg-vs-mesh-the-technical-divide" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Understanding the difference is crucial for an AI agent, as the &amp;ldquo;logic&amp;rdquo; it uses to build the object changes entirely depending on the format.&lt;/p>
&lt;p>&lt;strong>BREP (Boundary Representation)&lt;/strong>&lt;/p>
&lt;p>Used by: &lt;strong>CadQuery&lt;/strong>, &lt;strong>FreeCAD&lt;/strong>, SolidWorks.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Concept:&lt;/strong> Objects are defined by their mathematical boundaries. A cylinder isn&amp;rsquo;t a collection of points; it is a mathematical instruction: &lt;em>&amp;ldquo;A surface with radius R and height H.&amp;rdquo;&lt;/em>&lt;/li>
&lt;li>&lt;strong>Best for Precision:&lt;/strong> Because it’s math, you can zoom in infinitely and it’s always a perfect curve.&lt;/li>
&lt;li>&lt;strong>Ready to Print?&lt;/strong> Yes. You can export to STEP (for CNC/molding) or high-density STL (for 3D printing).&lt;/li>
&lt;li>&lt;strong>Agent Logic:&lt;/strong> &amp;ldquo;Find the face at $Z=10$ and drill a $5\text{mm}$ hole at the center.&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>CSG (Constructive Solid Geometry)&lt;/strong>&lt;/p>
&lt;p>Used by: &lt;strong>OpenSCAD&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Concept:&lt;/strong> Objects are created by Boolean operations (Union, Difference, Intersection) on simple primitives (cubes, spheres).&lt;/li>
&lt;li>&lt;strong>Best for Simplicity:&lt;/strong> It is very &amp;ldquo;logical.&amp;rdquo; To make a pipe, you subtract a small cylinder from a large cylinder.&lt;/li>
&lt;li>&lt;strong>Ready to Print?&lt;/strong> Yes, but curves are often &amp;ldquo;faceted&amp;rdquo; (made of flat segments) unless you set the resolution very high.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Mesh (Polygonal Modeling)&lt;/strong>&lt;/p>
&lt;p>Used by: &lt;strong>Blender&lt;/strong>, Game Engines.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Concept:&lt;/strong> The object is a shell made of thousands of tiny triangles or squares (quads).&lt;/li>
&lt;li>&lt;strong>Best for Visuals:&lt;/strong> This is how you do &amp;ldquo;cool and realistic.&amp;rdquo; You can distort the mesh, add &amp;ldquo;sculpted&amp;rdquo; details, or use &amp;ldquo;shaders&amp;rdquo; to make it look like rusted metal or glass.&lt;/li>
&lt;li>&lt;strong>Ready to Print?&lt;/strong> Only if the mesh is &amp;ldquo;watertight&amp;rdquo; (no holes). Agents often struggle to keep meshes &amp;ldquo;non-manifold&amp;rdquo; (error-free for printing).&lt;/li>
&lt;/ul>
&lt;h3>The Ideal Workflow for an Agent&lt;span class="absolute -mt-20" id="the-ideal-workflow-for-an-agent">&lt;/span>
&lt;a href="#the-ideal-workflow-for-an-agent" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>If you want the best of both worlds, set your agent up with this two-step process:&lt;/p>
&lt;p>&lt;strong>Step A: The Engineering (CadQuery)&lt;/strong>&lt;/p>
&lt;p>The agent writes a CadQuery script.&lt;/p>
&lt;p>This ensures the part is perfectly dimensioned and the holes align for 3D printing.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-3">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Agent-generated CadQuery snippet&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">cadquery&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">cq&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">cq&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Workplane&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;XY&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">.&lt;/span>&lt;span class="n">box&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">50&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">50&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">.&lt;/span>&lt;span class="n">faces&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&amp;gt;Z&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">workplane&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">.&lt;/span>&lt;span class="n">hole&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Export for printing&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">cq&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exporters&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">export&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;part.stl&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-3"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;strong>Step B: The Animation (Blender)&lt;/strong>&lt;/p>
&lt;p>The agent then runs a Python script inside Blender to import that STL and make it &amp;ldquo;cool.&amp;rdquo;&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Smoothing:&lt;/strong> Apply a &amp;ldquo;Remesh&amp;rdquo; or &amp;ldquo;Subdivision Surface&amp;rdquo; modifier to hide the facets.&lt;/li>
&lt;li>&lt;strong>Materials:&lt;/strong> Apply a &amp;ldquo;PBR&amp;rdquo; (Physically Based Rendering) material (e.g., Anodized Aluminum).&lt;/li>
&lt;li>&lt;strong>Physics:&lt;/strong> Add a &amp;ldquo;Rigid Body&amp;rdquo; simulation so the parts clank together realistically.&lt;/li>
&lt;/ul>
&lt;h3>Why Not Just Use Blender for Everything?&lt;span class="absolute -mt-20" id="why-not-just-use-blender-for-everything">&lt;/span>
&lt;a href="#why-not-just-use-blender-for-everything" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>If an agent tries to design a precision bolt-hole pattern in Blender using only mesh commands, it will eventually &amp;ldquo;break&amp;rdquo; the geometry.&lt;/p>
&lt;p>If it needs to change the hole size later, it has to move hundreds of vertices manually.&lt;/p>
&lt;p>In &lt;strong>CadQuery&lt;/strong>, it just changes a single variable: &lt;code>hole_dia = 5&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Here you have the working pipeline to bring mechanisms to live:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">choco install blender --version&lt;span class="o">=&lt;/span>4.2.2 -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#5.1.0 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#wget https://download.blender.org/release/Blender4.2/blender-4.2.2-linux-x64.tar.xz &lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Oh, not a data pipeline &lt;a href="#outro" >this time&lt;/a>.&lt;/p>
&lt;p>There is &amp;ldquo;Pro&amp;rdquo; way to handle this.&lt;/p>
&lt;p>We have the &lt;strong>Logic&lt;/strong> (Py mbsd Simulator)&lt;/p>
&lt;p>Now you need the &lt;strong>Geometry&lt;/strong> (CAD), and finally the &lt;strong>Cinematics&lt;/strong> (Blender).&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#https://github.com/JAlcocerT/3Design/tree/main/z-cadquery&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> z-cadquery
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;amp;&lt;/span> &lt;span class="s2">&amp;#34;C:\Program Files\Blender Foundation\Blender 4.2\blender.exe&amp;#34;&lt;/span> --python blender_scene.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;amp;&lt;/span> &lt;span class="s2">&amp;#34;C:\Program Files\Blender Foundation\Blender 4.2\blender.exe&amp;#34;&lt;/span> --background slider_crank.blend&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;!-- https://youtu.be/1WzRJM8HVKg -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/1WzRJM8HVKg" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>If you dont have a powerful GPU, you can consider &lt;a href="https://www.youtube.com/watch?v=D0vvWMbur_o" target="_blank" rel="noopener">such colab x blender combo&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://colab.research.google.com/github/JAlcocerT/Data-Chat/blob/main/LangChain/web/langchain-chroma-repo-readme.ipynb" target="_blank" rel="noopener">&lt;img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open in Google Colab" loading="lazy" />&lt;/a>&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/hCOSqf4dXqc" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Since the kinematics are already resolved in Python, &lt;strong>CadQuery&lt;/strong> is your best bridge because it lives in the same Python ecosystem.&lt;/p>
&lt;p>We can import your simulator as a library directly into your CadQuery script.&lt;/p>
&lt;p>The Three-Stage &lt;em>3D Design&lt;/em> Pipeline&amp;hellip;&lt;/p>
&lt;ol>
&lt;li>The Geometry Engine (CadQuery)&lt;/li>
&lt;/ol>
&lt;p>Instead of hard-coding dimensions, you map your simulator&amp;rsquo;s variables to CadQuery parameters.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Variable Mapping:&lt;/strong> If your simulator says &lt;code>joint_a&lt;/code> is at $(10, 5, 0)$, the agent writes a CadQuery function that places a bracket at those coordinates.&lt;/li>
&lt;li>&lt;strong>Assembly:&lt;/strong> CadQuery has an &lt;code>Assembly&lt;/code> class. You can define each part once and then use your simulator&amp;rsquo;s output (arrays of coordinates and rotations) to &amp;ldquo;pose&amp;rdquo; the parts for each frame.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>The Bridge (STL/STEP)&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>For 3D Printing:&lt;/strong> Export the &amp;ldquo;Static&amp;rdquo; parts (the ones at rest) as high-resolution &lt;strong>STLs&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>For Animation:&lt;/strong> You have two choices:
&lt;ul>
&lt;li>&lt;strong>Batch Export:&lt;/strong> Export an STL for every frame of the simulation (heavy, but foolproof).&lt;/li>
&lt;li>&lt;strong>Single Export + Transform:&lt;/strong> Export each unique part once, and let Blender handle the movement using your simulator&amp;rsquo;s data.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>The Visual Engine (Blender)&lt;/li>
&lt;/ol>
&lt;p>This is where you make it &amp;ldquo;look cool.&amp;rdquo;&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Data-Driven Animation:&lt;/strong> You don&amp;rsquo;t need to manually animate. You can feed your simulator&amp;rsquo;s CSV or JSON output into a Blender Python script (&lt;code>bpy&lt;/code>).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>The &amp;ldquo;Realism&amp;rdquo; Pass:&lt;/strong> * &lt;strong>Beveling:&lt;/strong> In CAD, edges are mathematically sharp. In Blender, you add a &amp;ldquo;Bevel Modifier&amp;rdquo; to catch highlights, which is the secret to making 3D objects look &amp;ldquo;real.&amp;rdquo;&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Motion Blur:&lt;/strong> Since you have the kinematic vectors, Blender can calculate perfect motion blur for the moving parts.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Comparison of Logic Flow&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Feature&lt;/th>
&lt;th style="text-align:left">&lt;strong>Simulator (Math)&lt;/strong>&lt;/th>
&lt;th style="text-align:left">&lt;strong>CadQuery (Geometry)&lt;/strong>&lt;/th>
&lt;th style="text-align:left">&lt;strong>Blender (Visuals)&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Data Type&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Vectors / Matrices&lt;/td>
&lt;td style="text-align:left">BREP Solids&lt;/td>
&lt;td style="text-align:left">Meshes / Shaders&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Output&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Coordinate Arrays&lt;/td>
&lt;td style="text-align:left">STL / STEP Files&lt;/td>
&lt;td style="text-align:left">MP4 / EXR Frames&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Role&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&amp;ldquo;Where is it?&amp;rdquo;&lt;/td>
&lt;td style="text-align:left">&amp;ldquo;What is it?&amp;rdquo;&lt;/td>
&lt;td style="text-align:left">&amp;ldquo;How does it look?&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Understanding the Data Hand-off&lt;/p>
&lt;p>To understand why this works, it helps to visualize how the data transforms from a &amp;ldquo;Point&amp;rdquo; to a &amp;ldquo;Solid&amp;rdquo; to a &amp;ldquo;Render.&amp;rdquo;&lt;/p>
&lt;p>A Simple &amp;ldquo;Agentic&amp;rdquo; Workflow Strategy:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>The Simulator&lt;/strong> outputs a JSON file: &lt;code>{&amp;quot;frame_1&amp;quot;: {&amp;quot;arm_angle&amp;quot;: 45.0, &amp;quot;base_pos&amp;quot;: [0,0,0]}}&lt;/code>.&lt;/li>
&lt;li>&lt;strong>CadQuery&lt;/strong> reads the JSON to generate the STL of the arm at that specific 45° angle for a 3D print check.&lt;/li>
&lt;li>&lt;strong>Blender&lt;/strong> reads the same JSON. It takes a generic &amp;ldquo;Arm.stl&amp;rdquo;, places it at &lt;code>[0,0,0]&lt;/code>, rotates it &lt;code>45.0&lt;/code> degrees, applies a &amp;ldquo;Scratched Steel&amp;rdquo; material, and hits &lt;strong>Render&lt;/strong>.&lt;/li>
&lt;/ol>
&lt;h3>Outro&lt;span class="absolute -mt-20" id="outro">&lt;/span>
&lt;a href="#outro" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Why would you be doing D&amp;amp;A when agents are taking over?&lt;/p>
&lt;p>Not sure if you are aware, but any of the models in the arena leaderboard understand perfectly &lt;code>pbip&lt;/code> files, lookML or simply&amp;hellip;&lt;/p>
&lt;p>create awsome full stack web apps with FastAPI and Vite if you care enough just to put clear BRD/requirements.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/JAlcocerT/PBi" target="_blank" rel="noopener">https://github.com/JAlcocerT/PBi&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>No more excuses with DBs&amp;hellip;Please&lt;/p>
&lt;p>We have &lt;a href="https://jalcocert.github.io/JAlcocerT/audio-recap/#the-fastapi-speech-rater" target="_blank" rel="noopener">ChartDB&lt;/a>, DBGate, &amp;hellip;&lt;/p>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/DA/sql/dbchart3.png" alt="alt text" loading="lazy" />&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">docker run -e &lt;span class="nv">OPENAI_API_KEY&lt;/span>&lt;span class="o">=&lt;/span>&amp;lt;YOUR_OPEN_AI_KEY&amp;gt; -p 8080:80 ghcr.io/chartdb/chartdb:latest
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># sqlite3 &amp;lt;database_file_path&amp;gt; #sqlite3 ./users.db #sqlite3 ./stock_cache.db&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># .dump &amp;gt; &amp;lt;output_file_path&amp;gt; &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#example&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#sqlite3 ./stock_cache.db &amp;#34;.dump&amp;#34; &amp;gt; schema_export.sql &amp;amp;&amp;amp; cat schema_export.sql&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/stonks/" target="_blank" rel="noreferrer">&lt;img
alt="PyStonks Post sqlite section with DBChart"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/DA/sql/dbchart-sqlite-schema.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">PyStonks Post sqlite section with DBChart&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">DBChart Working with the PyStonks Schema&lt;/div>&lt;/a>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Home-Lab/tree/main/chartdb" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">ChartDB | Docker Config Setup 🐋 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>And specially:&lt;/p>
&lt;ul>
&lt;li>&lt;code>https://background-agents.com/&lt;/code> - Individual speed !+ organizational velocity :)&lt;/li>
&lt;li>&lt;code>https://arena.ai/leaderboard&lt;/code>&lt;/li>
&lt;li>&lt;code>https://status.claude.com/&lt;/code> - Imagine the day that you&amp;rsquo;d be obsolete when this is down&lt;/li>
&lt;/ul>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">claude
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#/resume&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#/remote-control&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Isnt it time to do the mechanical engineering you always wanted to?&lt;/p>
&lt;p>Or at least&amp;hellip;to reflect whats the gas we are so concerned about now?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">uv run tests/plot_historical_gweiss.py HESM --start 2015-01-01 --brand &lt;span class="s2">&amp;#34;@LibrePortfolio&amp;#34;&lt;/span> --warmup-days &lt;span class="m">400&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Wasnt it just a Time travel machine to consume energy that left the sun ~250/300M years ago?&lt;/p>
&lt;p>Isnt it just crazy&amp;hellip;?&lt;/p>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Why CadQuery?&lt;span class="absolute -mt-20" id="why-cadquery">&lt;/span>
&lt;a href="#why-cadquery" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;a href="https://github.com/cadquery/cadquery" target="_blank" rel="noopener">https://github.com/cadquery/cadquery&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>The choice between these three usually comes down to whether you want a &lt;strong>GUI-first&lt;/strong>, &lt;strong>Logic-first&lt;/strong>, or &lt;strong>Code-first&lt;/strong> workflow.&lt;/p>
&lt;p>For an AI agent driven by a Python simulator, &lt;strong>CadQuery&lt;/strong> wins because it lives natively in the Python ecosystem, whereas the others require &amp;ldquo;handshakes&amp;rdquo; or custom languages.&lt;/p>
&lt;p>Here is the direct comparison of why CadQuery is the superior choice for your specific &amp;ldquo;Simulator-to-CAD&amp;rdquo; pipeline:&lt;/p>
&lt;ol>
&lt;li>CadQuery vs. OpenSCAD (The &amp;ldquo;Logic&amp;rdquo; Gap)&lt;/li>
&lt;/ol>
&lt;p>OpenSCAD is great for hobbyists, but it is a &amp;ldquo;walled garden.&amp;rdquo;&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Language Barrier:&lt;/strong> OpenSCAD uses its own functional language. To connect it to your Python simulator, you have to write a Python script that generates a &lt;code>.scad&lt;/code> text file, saves it, and then tells OpenSCAD to render it. This is &amp;ldquo;clunky&amp;rdquo; for an agent.&lt;/li>
&lt;li>&lt;strong>The &amp;ldquo;Fillet&amp;rdquo; Nightmare:&lt;/strong> In OpenSCAD, rounding an edge (a fillet) is incredibly difficult and computationally expensive. In CadQuery, it is a simple &lt;code>.fillet(2)&lt;/code> command.&lt;/li>
&lt;li>&lt;strong>Kernel Power:&lt;/strong> OpenSCAD uses &lt;strong>CSG&lt;/strong> (Constructive Solid Geometry). It’s basically just adding and subtracting blocks. CadQuery uses &lt;strong>BREP&lt;/strong> (the same engine as SolidWorks), which understands &amp;ldquo;faces,&amp;rdquo; &amp;ldquo;edges,&amp;rdquo; and &amp;ldquo;vertices&amp;rdquo; as distinct mathematical objects.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>CadQuery vs. FreeCAD (The &amp;ldquo;API&amp;rdquo; Gap)&lt;/li>
&lt;/ol>
&lt;p>FreeCAD actually uses the same geometry engine as CadQuery (OpenCASCADE), but their philosophies are opposites.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>GUI vs. Headless:&lt;/strong> FreeCAD is designed for a human to sit at a desk and click buttons. While it has a Python API, it is notoriously messy and &amp;ldquo;verbose&amp;rdquo; because it’s trying to manage a 3D interface at the same time.&lt;/li>
&lt;li>&lt;strong>State Management:&lt;/strong> FreeCAD uses a &amp;ldquo;Document&amp;rdquo; model. You have to create a document, add an object, recompute the document, and manage the UI state. CadQuery is a &lt;strong>stateless library&lt;/strong>; you just write code, and it outputs a model.&lt;/li>
&lt;li>&lt;strong>Agent Friendliness:&lt;/strong> It is much easier for an LLM/Agent to learn the &amp;ldquo;Fluent API&amp;rdquo; of CadQuery (e.g., &lt;code>model.faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().hole(5)&lt;/code>) than the complex object-tree manipulation required by FreeCAD&amp;rsquo;s Python console.&lt;/li>
&lt;/ul>
&lt;p>Comparison Table: The &amp;ldquo;Agent&amp;rdquo; Perspective&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Feature&lt;/th>
&lt;th style="text-align:left">&lt;strong>CadQuery&lt;/strong>&lt;/th>
&lt;th style="text-align:left">&lt;strong>OpenSCAD&lt;/strong>&lt;/th>
&lt;th style="text-align:left">&lt;strong>FreeCAD&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Integration&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Direct Import:&lt;/strong> Just &lt;code>import cadquery&lt;/code>.&lt;/td>
&lt;td style="text-align:left">&lt;strong>External:&lt;/strong> Must write/read &lt;code>.scad&lt;/code> files.&lt;/td>
&lt;td style="text-align:left">&lt;strong>Heavy:&lt;/strong> Requires the full FreeCAD app/libs.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Geometry Engine&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Professional (BREP/OpenCASCADE).&lt;/td>
&lt;td style="text-align:left">Basic (CSG/CGAL).&lt;/td>
&lt;td style="text-align:left">Professional (BREP/OpenCASCADE).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Readability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">High (Chainable Python).&lt;/td>
&lt;td style="text-align:left">Medium (C-like syntax).&lt;/td>
&lt;td style="text-align:left">Low (Complex API calls).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Fillets/Chamfers&lt;/strong>&lt;/td>
&lt;td style="text-align:left">One-line command.&lt;/td>
&lt;td style="text-align:left">Hard/Experimental.&lt;/td>
&lt;td style="text-align:left">Standard, but API-complex.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Best For&lt;/strong>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Automated Pipelines &amp;amp; Agents.&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Quick 3D Printing hacks.&lt;/td>
&lt;td style="text-align:left">Manual Human Design.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol start="3">
&lt;li>The &amp;ldquo;Secret Sauce&amp;rdquo;: The CadQuery Fluent API&lt;/li>
&lt;/ol>
&lt;p>Because your simulator already knows where the &amp;ldquo;Joints&amp;rdquo; are, CadQuery allows your agent to use &lt;strong>selectors&lt;/strong>.&lt;/p>
&lt;p>Instead of telling the CAD tool:&lt;/p>
&lt;blockquote>
&lt;p>&lt;em>&amp;ldquo;Place a hole at $x=10.5, y=20.2$,&amp;rdquo;&lt;/em> The agent can tell CadQuery:
&lt;em>&amp;ldquo;Find the face pointing in the $+Z$ direction and put a hole at its center.&amp;rdquo;&lt;/em>&lt;/p>
&lt;/blockquote>
&lt;p>This makes the code much more robust.&lt;/p>
&lt;p>If the simulator changes the size of a part, the hole &amp;ldquo;follows&amp;rdquo; the face automatically because it was defined by &lt;strong>intent&lt;/strong> rather than &lt;strong>coordinates&lt;/strong>.&lt;/p>
&lt;p>So&amp;hellip;&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Use OpenSCAD&lt;/strong> only if you need a very tiny, lightweight script and don&amp;rsquo;t care about &amp;ldquo;professional&amp;rdquo; file formats like STEP.&lt;/li>
&lt;li>&lt;strong>Use FreeCAD&lt;/strong> if you want to manually open the file later and tweak it with a mouse.&lt;/li>
&lt;li>&lt;strong>Use CadQuery&lt;/strong> if you want a seamless, pure-Python pipeline where your simulator and your CAD model share the same variables in real-time.&lt;/li>
&lt;/ul>
&lt;h3>About Euler Angles&lt;span class="absolute -mt-20" id="about-euler-angles">&lt;/span>
&lt;a href="#about-euler-angles" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>In the world of 3D design and robotics, these are simply two different mathematical languages used to describe how an object is oriented in space.&lt;/p>
&lt;p>Think of them as &lt;strong>Directions&lt;/strong> vs. &lt;strong>Rotations&lt;/strong>.&lt;/p>
&lt;ol>
&lt;li>Euler Angles: The &amp;ldquo;Human&amp;rdquo; Way&lt;/li>
&lt;/ol>
&lt;p>Euler angles describe a rotation as a sequence of three movements around the $X$, $Y$, and $Z$ axes.&lt;/p>
&lt;p>You probably know them as &lt;strong>Roll, Pitch, and Yaw&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>How they work:&lt;/strong> You rotate by $x$ degrees, then $y$ degrees, then $z$ degrees.&lt;/li>
&lt;li>&lt;strong>The Order Matters:&lt;/strong> Rotating $X$ then $Y$ results in a different orientation than $Y$ then $X$. This is called &amp;ldquo;Rotation Order&amp;rdquo; (e.g., XYZ vs. ZYX).&lt;/li>
&lt;li>&lt;strong>The Problem (Gimbal Lock):&lt;/strong> This is the &amp;ldquo;deal-breaker&amp;rdquo; for complex simulators. If you rotate one axis by $90^\circ$ so that it aligns with another axis, you lose a degree of freedom. The &amp;ldquo;gimbals&amp;rdquo; lock together, and the math breaks down because the computer doesn&amp;rsquo;t know which way is &amp;ldquo;up&amp;rdquo; anymore.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Quaternions: The &amp;ldquo;Computer&amp;rdquo; Way&lt;/li>
&lt;/ol>
&lt;p>Quaternions are much harder for humans to visualize but are the &amp;ldquo;gold standard&amp;rdquo; for 3D engines like Blender, Unity, and high-end physics simulators.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Concept:&lt;/strong> Instead of three angles, a Quaternion uses four numbers $(w, x, y, z)$. It represents a single rotation around a specific vector (an imaginary line) in 3D space.&lt;/li>
&lt;li>&lt;strong>Why they are better for Agents:&lt;/strong>
&lt;ul>
&lt;li>&lt;strong>No Gimbal Lock:&lt;/strong> They never &amp;ldquo;lock up,&amp;rdquo; no matter how crazy the rotation is.&lt;/li>
&lt;li>&lt;strong>Smooth Interpolation:&lt;/strong> If your simulator has data for Frame 1 and Frame 10, Quaternions allow Blender to calculate the &amp;ldquo;in-between&amp;rdquo; frames perfectly (this is called SLERP).&lt;/li>
&lt;li>&lt;strong>Computational Efficiency:&lt;/strong> They are faster for a computer to process than complex trigonometric Euler matrices.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Feature&lt;/th>
&lt;th style="text-align:left">&lt;strong>Euler Angles&lt;/strong>&lt;/th>
&lt;th style="text-align:left">&lt;strong>Quaternions&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Format&lt;/strong>&lt;/td>
&lt;td style="text-align:left">3 numbers $(X, Y, Z)$&lt;/td>
&lt;td style="text-align:left">4 numbers $(W, X, Y, Z)$&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Readability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">High (e.g., $90^\circ$ turn)&lt;/td>
&lt;td style="text-align:left">Low (Non-intuitive decimals)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Reliability&lt;/strong>&lt;/td>
&lt;td style="text-align:left">Risk of Gimbal Lock&lt;/td>
&lt;td style="text-align:left">Mathematically &amp;ldquo;Immune&amp;rdquo;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>Usage&lt;/strong>&lt;/td>
&lt;td style="text-align:left">UI inputs, simple hinges&lt;/td>
&lt;td style="text-align:left">Physics engines, robotic arms&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Which one should a Simulator use?&lt;/p>
&lt;ul>
&lt;li>&lt;strong>If your mechanism stays in a single plane&lt;/strong> (like a 2D scissor lift or a simple car steering): &lt;strong>Euler Angles&lt;/strong> are fine and much easier for you to debug.&lt;/li>
&lt;li>&lt;strong>If your mechanism moves in 3D&lt;/strong> (like a 6-axis robot arm or a drone): You &lt;strong>must&lt;/strong> use &lt;strong>Quaternions&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;p>In Python, you don&amp;rsquo;t have to do the heavy math yourself.&lt;/p>
&lt;p>Libraries like &lt;code>scipy.spatial.transform&lt;/code> or &lt;code>mathutils&lt;/code> (inside Blender) can convert between the two instantly:&lt;/p>
&lt;h3>Rendering on a mac M2&lt;span class="absolute -mt-20" id="rendering-on-a-mac-m2">&lt;/span>
&lt;a href="#rendering-on-a-mac-m2" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The first 2 steps are pretty straight forward on my &lt;a href="https://jalcocert.github.io/JAlcocerT/laptop-lenovo-thinkpad-x13-benchmark/" target="_blank" rel="noopener">x13 laptop&lt;/a>.&lt;/p>
&lt;p>But the rendering was taking ~8 min per image, despite dropping the resolution from 4k to 1080p at the script calling blender.&lt;/p>
&lt;p>Luckily, a friend recently got a mac and I put the hands on it.&lt;/p>
&lt;p>Like a geek, first thing I learn was how to open the terminal: &lt;del>&lt;code>CTRL+T&lt;/code>&lt;/del> &lt;code>cmd&lt;/code>&lt;/p>
&lt;p>Then I installed brew:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Node and Python followed:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And after: *coudlnt resist to try &lt;a href="https://github.com/CodeEditApp/CodeEdit" target="_blank" rel="noopener">CodeEdit&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-11">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm install -g @openai/codex #https://github.com/openai/codex/releases/tag/rust-v0.118.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install @openai/codex
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cat &lt;span class="s">&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; &amp;gt; package.json
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> &amp;#34;private&amp;#34;: true,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> &amp;#34;dependencies&amp;#34;: {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> &amp;#34;@openai/codex&amp;#34;: &amp;#34;^0.118.0&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> },
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> &amp;#34;scripts&amp;#34;: {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> &amp;#34;codex&amp;#34;: &amp;#34;codex&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">codex
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#/models&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#/skilss&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-11"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Remember about: &lt;code>https://skills.sh/&lt;/code>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-12">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm install -g @anthropic-ai/claude-code #https://claude.ai/new&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/login
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/resume
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#claude --dangerously-skip-permissions -p &amp;#34;promptwhateverrrr&amp;#34; #yolo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#gemini --prompt &amp;#34;are you able to be queried with non interactive mode?&amp;#34; -m gemini-2.5-flash --yolo --debug&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-12"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>To get you from a fresh Mac to a professional, Linux-style dev environment, follow these steps in order. Open your default Terminal (found in &lt;code>/Applications/Utilities&lt;/code>) and run these.&lt;/p>
&lt;ol>
&lt;li>Install Xcode Command Line Tools&lt;/li>
&lt;/ol>
&lt;p>Before Homebrew can work, it needs the basic Apple compiler tools.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-13">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">xcode-select --install&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-13"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;em>A popup will appear; click &lt;strong>Install&lt;/strong>.&lt;/em>&lt;/p>
&lt;hr>
&lt;ol start="2">
&lt;li>Install Homebrew&lt;/li>
&lt;/ol>
&lt;p>This is your primary package manager.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-14">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">/bin/bash -c &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-14"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;strong>Important:&lt;/strong> After it finishes, look at the terminal output. It will give you 2-3 lines of code to run to add Homebrew to your &lt;code>PATH&lt;/code>. They look like this (but copy the ones from &lt;em>your&lt;/em> terminal):&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-15">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;eval &amp;#34;$(/opt/homebrew/bin/brew shellenv)&amp;#34;&amp;#39;&lt;/span> &amp;gt;&amp;gt; ~/.zprofile
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">eval&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>/opt/homebrew/bin/brew shellenv&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-15"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="3">
&lt;li>Install Git &amp;amp; Basic Utilities&lt;/li>
&lt;/ol>
&lt;p>Now that &lt;code>brew&lt;/code> is ready, grab the essentials.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-16">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">brew install git gh wget jq&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-16"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="4">
&lt;li>Install Language Managers (The Clean Way)&lt;/li>
&lt;/ol>
&lt;p>Instead of installing Node/Python directly, we’ll install the managers to keep your system clean.&lt;/p>
&lt;p>For Node.js (via &lt;code>fnm&lt;/code>):&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-17">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">brew install fnm
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Add fnm to your shell config&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;eval &amp;#34;$(fnm env --use-on-cd)&amp;#34;&amp;#39;&lt;/span> &amp;gt;&amp;gt; ~/.zshrc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> ~/.zshrc&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-17"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>For Python (via &lt;code>uv&lt;/code>):&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-18">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">brew install uv&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-18"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="5">
&lt;li>Install a Better Terminal &amp;amp; Editor&lt;/li>
&lt;/ol>
&lt;p>Since you want minimal and OSS, let&amp;rsquo;s grab &lt;strong>Ghostty&lt;/strong> (the current favorite fast/minimal terminal) and &lt;strong>Zed&lt;/strong>.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-19">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">brew install --cask ghostty zed&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-19"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;ol start="6">
&lt;li>Verify Your Setup&lt;/li>
&lt;/ol>
&lt;p>Run these to make sure everything is linked correctly:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-20">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Check Git&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git --version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Install and check Node (LTS version)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">fnm install --lts
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">node -v
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Check Python (via uv)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv --version&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-20"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Pro-Tip: The &amp;ldquo;Mise&amp;rdquo; Alternative&lt;/p>
&lt;p>If you prefer &lt;strong>one&lt;/strong> tool to manage Python, Node, and everything else (very popular with Linux power users), run this instead of step 4:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-21">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">brew install mise
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;eval &amp;#34;$(mise activate zsh)&amp;#34;&amp;#39;&lt;/span> &amp;gt;&amp;gt; ~/.zshrc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> ~/.zshrc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Then install versions easily:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mise use --global node@lts
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mise use --global python@latest&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-21"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>To run &lt;strong>docker in mac&lt;/strong> we will need something like &lt;a href="https://jalcocert.github.io/JAlcocerT/testing-nix-os/" target="_blank" rel="noopener">QEMU&lt;/a> or &lt;a href="https://jalcocert.github.io/JAlcocerT/web-for-phd-researcher/#conclusions" target="_blank" rel="noopener">wsl for Windows&lt;/a>&lt;/p>
&lt;p>yea&amp;hellip;a VM, as it cant run natively&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-22">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-22"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div></description></item><item><title>If I would have known - Web Apps edition</title><link>https://JAlcocerT.github.io/JAlcocerT/learnt-while-building-web-apps/</link><pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate><guid>https://JAlcocerT.github.io/JAlcocerT/learnt-while-building-web-apps/</guid><description>
&lt;p>&lt;strong>Tl;DR&lt;/strong>&lt;/p>
&lt;p>Just create.&lt;/p>
&lt;p>It&amp;rsquo;s easier than ever.&lt;/p>
&lt;p>&lt;strong>Intro&lt;/strong>&lt;/p>
&lt;p>Let me start with a story.&lt;/p>
&lt;p>About my steps into the ITsunami.&lt;/p>
&lt;div class="steps ml-4 mb-12 border-l border-gray-200 pl-6 dark:border-neutral-800 [counter-reset:step]">
&lt;h3>R Shiny&lt;span class="absolute -mt-20" id="r-shiny">&lt;/span>
&lt;a href="#r-shiny" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Thanks to a yearly subscription I got to datacamp.&lt;/p>
&lt;p>and to be very much invested with R language for consumer intelligence application back in the days&lt;/p>
&lt;p>I got to know R Shiny for dashboarding and kind of quick web app prototyping&lt;/p>
&lt;p>I was not expecting back in the days that in general a full dashboard should involved a team of 5 and that they end up been expansive as f*&lt;/p>
&lt;p>the excuse back then had to be that googling and reading stackoverflow is not for everyone&lt;/p>
&lt;p>today?&lt;/p>
&lt;p>I guess&amp;hellip;&lt;/p>
&lt;p>well, i dont know whats the excuse&lt;/p>
&lt;h3>Python DASH&lt;span class="absolute -mt-20" id="python-dash">&lt;/span>
&lt;a href="#python-dash" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>
&lt;p>How to develop a python dash app inside a running docker container&lt;/p>
&lt;ul>
&lt;li>Docker and Docker extension&lt;/li>
&lt;li>DevContainer extension&lt;/li>
&lt;li>Attach to running container&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/RamiKrispin/vscode-python" target="_blank" rel="noopener">https://github.com/RamiKrispin/vscode-python&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/RamiKrispin/shinylive" target="_blank" rel="noopener">https://github.com/RamiKrispin/shinylive&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://www.dataquest.io/blog/install-package-r/" target="_blank" rel="noopener">https://www.dataquest.io/blog/install-package-r/&lt;/a>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>In the meantime, he built this &lt;a href="https://github.com/LinkedInLearning/data-pipeline-automation-with-github-actions-4503382" target="_blank" rel="noopener">https://github.com/LinkedInLearning/data-pipeline-automation-with-github-actions-4503382&lt;/a>&lt;/p>
&lt;h3>Streamlit&lt;span class="absolute -mt-20" id="streamlit">&lt;/span>
&lt;a href="#streamlit" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>But streamlit is a big tentation if you are in D&amp;amp;A.&lt;/p>
&lt;p>For quick web apps, data centered for PoCs, this is still my go to.&lt;/p>
&lt;p>Leave the distraction and super custom things for the MVP stage.&lt;/p>
&lt;h3>Full Stack Web Apps&lt;span class="absolute -mt-20" id="full-stack-web-apps">&lt;/span>
&lt;a href="#full-stack-web-apps" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The last ones I have been confortable enought to have Python as BE and keep JS/TS for the FE.&lt;/p>
&lt;p>Because its 2026.&lt;/p>
&lt;p>And when you do some repetitions with AI&lt;/p>
&lt;p>Which basically mean you learn how to aks for things to get done by algorithms consuming energy somewhere in the world&lt;/p>
&lt;/div>
&lt;p>The outcome?&lt;/p>
&lt;p>See how this 3 bodies web app looks and this data driven formula one web app feels:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/ThreeBodies" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
ThreeBodies Github ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Slider-Crank" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Slider-Crank Github ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>yea, ive re-bumped the old slider crank repo started here with Codex CLI x Claude&lt;/p>
&lt;p>Just that this time im aware of:&lt;/p>
&lt;ol>
&lt;li>very cool prompts to impress via my landings&lt;/li>
&lt;li>CSR can do a lot&amp;hellip;&lt;/li>
&lt;/ol>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-0">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">codex
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#3bodies OSS!&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/ThreeBodies/ &lt;span class="c1">#root has a DASH version&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd ThePoincareLab #here there is sth more interesting :)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-0"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Until that point I got it working here as you can see on &lt;a href="https://www.youtube.com/watch?v=b35XuJI98kI" target="_blank" rel="noopener">this video&lt;/a>.&lt;/p>
&lt;p>But I said about CSR, right?&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-1">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> landing&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-1"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-2">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">claude
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#slider crank OSS / mbsd &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> landing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx wrangler pages project create &lt;span class="c1">#this will install the wrangler CLI package&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npx wrangler pages project list # See the projects you already have&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run build #build the file manually&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npx wrangler pages deploy dist &lt;span class="c1"># normally will be dist, but whatever &amp;lt;BUILD_OUTPUT_DIRECTORY&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ping multibodysystemdynamics.pages.dev&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-2"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>btw, if you pay attention to the repo, there is some sympy and computational mechanics in it&lt;/p>
&lt;/blockquote>
&lt;p>&lt;a href="https://colab.research.google.com/github/JAlcocerT/Data-Chat/blob/main/LangChain/web/langchain-chroma-repo-readme.ipynb" target="_blank" rel="noopener">&lt;img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open in Google Colab" loading="lazy" />&lt;/a>&lt;/p>
&lt;p>Enjoy the static deployment: &lt;a href="https://multibodysystemdynamics.pages.dev/" target="_blank" rel="noopener">https://multibodysystemdynamics.pages.dev/&lt;/a>&lt;/p>
&lt;p>You wont have to trust my selfhosting skills to maintain this service up :)&lt;/p>
&lt;hr>
&lt;h2>Conclusions&lt;span class="absolute -mt-20" id="conclusions">&lt;/span>
&lt;a href="#conclusions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Creating (supply digital products) is easier than ever.&lt;/p>
&lt;p>Distribution is most likely your constrain today - &lt;em>aka demand for what you create&lt;/em>.&lt;/p>
&lt;p>You know&amp;hellip;the attract and convert thingy that if you dont get right you wont get $&amp;rsquo;s.&lt;/p>
&lt;p>When I starting the draft for this post, my aim was to focus on a python webapps recap&lt;/p>
&lt;p>Like how cool streamlit is for PoCs, maybe consider fastAPI or pocketbase for backend&amp;hellip;&lt;/p>
&lt;p>Reality: now you have a greenfield full stack web app with one shot prompt that makes the animations way cooler and statically deployed&lt;/p>
&lt;p>How will this look in a year?&lt;/p>
&lt;p>Im not sure.&lt;/p>
&lt;p>What I know is that I will be adding interesting stuff:&lt;/p>
&lt;pre class="mermaid mt-6">flowchart LR
%% --- Styles ---
classDef free fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20;
classDef low fill:#FFF9C4,stroke:#FBC02D,stroke-width:2px,color:#FBC02D;
classDef mid fill:#FFE0B2,stroke:#F57C00,stroke-width:2px,color:#F57C00;
classDef high fill:#FFCDD2,stroke:#C62828,stroke-width:2px,color:#C62828;
classDef bridge fill:#E3F2FD,stroke:#1565C0,stroke-width:3px,color:#0D47A1;
%% --- Nodes ---
L0("Free Content&lt;br/>($0)"):::free
L1("AuditMagnet 🛡️&lt;br/>(Free Web Audit )"):::free
L11(" Blog/Youtube"):::free
L12(" ebooks"):::free
L2("DIY&lt;br/>(Optimization Guides) $"):::low
L3("Done With You&lt;br/>(Consulting) $$"):::mid
L4("Done For You&lt;br/>(Full Service) $$$"):::high
L44("GenBI&lt;br/>Shopify PoC"):::bridge
L45("Real Estate&lt;br/>Funnel Bot"):::bridge
%% --- Connections ---
L0 --> L1
L0 --> L2
L0 --> L11
L0 --> L12
L2 --> L3
L3 --> L4
L44 -->|Enhancing| L4
L45 -->|Enhancing| L4&lt;/pre>&lt;p>Wanna see how good is what you create?&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/poc_webs_magnet" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Web Audit Magnet | Github ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>You can get things moving:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://consulting.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="Consulting Services"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/entrepre/tiersofservice/dwi/selfh-landing-astro-fastapi-bot.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Consulting Services&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Consulting - Tier of Service&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://ebooks.jalcocertech.com" target="_blank" rel="noreferrer">&lt;img
alt="DIY via ebooks"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/shipping/dna-1ton-ebook.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">DIY via ebooks&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Distilled knowledge via web/ooks to enable you to create&lt;/div>&lt;/a>
&lt;/div>
&lt;p>If you were lucky, you saw me presenting what I wrote &lt;a href="https://jalcocert.github.io/JAlcocerT/a-diy-boilerplate-to-ship/" target="_blank" rel="noopener">here&lt;/a>:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-4">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/selfhosted-landing&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd y2026-tech-talks/2- ba-brd-development&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run dev &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/langchain-db-ui
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> langchain-db-ui
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd langchain-db-ui/Z_PGSQL-GenBI #not foooor now&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make help&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd langchain-db-ui/Z_PGSQL-GenBI&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make install
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make demo-db
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#duckdb /home/jalcocert/Desktop/langchain-db-ui/backend/demo.duckdb&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#./venv/bin/duckdb /home/jalcocert/Desktop/langchain-db-ui/backend/demo.duckdb&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#SELECT * FROM customers;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Then in the prompt:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># SELECT * FROM customers;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make dev &lt;span class="c1">#curl http://localhost:8000/docs&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-4"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-5">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/selfhosted-landing&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd y2026-tech-talks/2- ba-brd-development&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run dev &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/langchain-db-ui
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> langchain-db-ui
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd langchain-db-ui/Z_PGSQL-GenBI #not foooor now&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#make help&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd langchain-db-ui/Z_PGSQL-GenBI&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make install
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make demo-db
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#./venv/bin/duckdb /home/jalcocert/Desktop/langchain-db-ui/backend/demo.duckdb&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#SELECT * FROM customers;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Then in the prompt:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># SELECT * FROM customers;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#.tables&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make dev &lt;span class="c1">#curl http://localhost:8000/docs&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#./venv/bin/uvicorn main:app --reload --port 8000 #./venv/bin/uvicorn main:app --reload --port 8000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#npm run dev&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker compose up --build&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-5"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Use &lt;code>duckdb:////home/jalcocert/Desktop/langchain-db-ui/backend/demo.duckdb&lt;/code> or &lt;code>duckdb:////app/data/demo.duckdb&lt;/code> for container&lt;/p>
&lt;p>I showed the &lt;strong>Vite x fast api&lt;/strong> one, but there will be more coming &lt;a href="https://jalcocert.github.io/JAlcocerT/using-baml-to-query-a-database/" target="_blank" rel="noopener">with BAML&lt;/a> and &lt;a href="https://jalcocert.github.io/JAlcocerT/creating-a-generative-bi-solution/" target="_blank" rel="noopener">PGSQL:)&lt;/a>&lt;/p>
&lt;p>In the meantime, things are getting interesting:&lt;/p>
&lt;!--
https://www.youtube.com/watch?v=Ii99RU3mOJM -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/Ii99RU3mOJM" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>With containers just:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-6">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">cp .env.sample .env
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make docker-up
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker ps -a --filter &lt;span class="s2">&amp;#34;name=langchain-db-ui-frontend-1&amp;#34;&lt;/span> &lt;span class="c1">#vite 5173 or 5175 if you have kenering&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker ps -a --filter &lt;span class="s2">&amp;#34;name=langchain-db-ui-backend-1&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-6"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;blockquote>
&lt;p>&lt;code>http://192.168.1.2:5175/&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;p>The tech talk?&lt;/p>
&lt;!-- https://youtu.be/PMw83OwFbGg -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/PMw83OwFbGg" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>Finally after 2 months of the concept creation: &lt;em>and after a funnel manifesting as 100 &amp;gt; 15 &amp;gt; 2 &amp;gt; &amp;hellip;1 person acting on the discussed content?&lt;/em>&lt;/p>
&lt;!--
https://www.youtube.com/watch?v=qf-oNNNDXS0 -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/qf-oNNNDXS0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;p>For this one, Ive been using notebookLLM as a ppt creator, from my slidev prepared .md.&lt;/p>
&lt;p>I showed the &lt;strong>Vite x fast api&lt;/strong> one, but there will be more coming &lt;a href="https://jalcocert.github.io/JAlcocerT/using-baml-to-query-a-database/" target="_blank" rel="noopener">with BAML&lt;/a> and &lt;a href="https://jalcocert.github.io/JAlcocerT/creating-a-generative-bi-solution/" target="_blank" rel="noopener">PGSQL:)&lt;/a>&lt;/p>
&lt;p>In the meantime, things are getting interesting:&lt;/p>
&lt;!--
https://www.youtube.com/watch?v=Ii99RU3mOJM -->
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/Ii99RU3mOJM" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;h3>Collecting cool prompts for BluePrints&lt;span class="absolute -mt-20" id="collecting-cool-prompts-for-blueprints">&lt;/span>
&lt;a href="#collecting-cool-prompts-for-blueprints" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>As I have been collecting nice BRDs, tech stacks and green field prompts, im placing them all at:&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-7">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone /pbi&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-7"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>A veeeery &lt;em>secret&lt;/em> place.&lt;/p>
&lt;h3>Creating PoCs as of 2026&lt;span class="absolute -mt-20" id="creating-pocs-as-of-2026">&lt;/span>
&lt;a href="#creating-pocs-as-of-2026" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Less than a year ago Id tell you to go with Python Streamlit for PoCs.&lt;/p>
&lt;p>But if you are going to let the vibe flow&amp;hellip;&lt;/p>
&lt;p>FastAPI + VITE is a very reasonable approach.&lt;/p>
&lt;p>Whether you are in OPS, in &lt;a href="https://jalcocert.github.io/JAlcocerT/fmcg-concepts-101/" target="_blank" rel="noopener">fmcg&lt;/a>, &lt;a href="https://jalcocert.github.io/JAlcocerT/improving-healthcare-analytics/" target="_blank" rel="noopener">healthcare&lt;/a> or within &lt;a href="https://jalcocert.github.io/JAlcocerT/telecom-concepts-101/" target="_blank" rel="noopener">telco&lt;/a> environment.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-8">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">git clone https://github.com/JAlcocerT/poc&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-8"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>A place to go from streamlit pocs to full stack ones, with concepts like graph databases or with context for agents like &lt;a href="https://github.com/volcengine/OpenViking" target="_blank" rel="noopener">https://github.com/volcengine/OpenViking&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>OpenViking is an &lt;strong>open-source context database&lt;/strong> designed specifically for AI Agents(such as openclaw). OpenViking unifies the management of context (memory, resources, and skills) that Agents need through a file system paradigm, enabling hierarchical context delivery and self-evolving.&lt;/p>
&lt;/blockquote>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/poc" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Proof of Concepts ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://github.com/JAlcocerT/Streamlit_PoC" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg fill="currentColor" viewBox="3 3 18 18">
&lt;path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z">&lt;/path>
&lt;/svg>
Streamlit PoCs ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>Oh, and how cool is to:&lt;/p>
&lt;ol>
&lt;li>get requirements + fireflies&lt;/li>
&lt;li>idea definition + vibe with claude code&lt;/li>
&lt;li>generate a slides.md with the creation&lt;/li>
&lt;li>feed the .md to notebookllm and get a ppt created&lt;/li>
&lt;/ol>
&lt;p>If you got the request by 10am, at 1pm you can be done with that PoC&lt;/p>
&lt;p>Or, you can still wait for this to be easier.&lt;/p>
&lt;p>We are past the point of AI assisted delivery&lt;/p>
&lt;p>Would full AI delivery would be enough?&lt;/p>
&lt;hr>
&lt;h2>FAQ&lt;span class="absolute -mt-20" id="faq">&lt;/span>
&lt;a href="#faq" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>What have you created?&lt;span class="absolute -mt-20" id="what-have-you-created">&lt;/span>
&lt;a href="#what-have-you-created" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Some time &lt;a href="https://jalcocert.github.io/JAlcocerT/R-Stocks/" target="_blank" rel="noopener">ago&lt;/a>, I made this one &lt;a href="https://jalcocert.github.io/JAlcocerT/web-for-phd-researcher/" target="_blank" rel="noopener">with a friend&lt;/a>: &lt;em>my very first published web app with R Shiny&lt;/em>.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/useful-r-stuff/" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/useful-r-stuff/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jalcocert.github.io/JAlcocerT/useful-python-stuff/" target="_blank" rel="noopener">https://jalcocert.github.io/JAlcocerT/useful-python-stuff/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>How can you contribute?&lt;/p>
&lt;p>The code is accesible from &lt;a href="https://github.com/JAlcocerT/R_Stocks" title="R Stocks Github {rel=&amp;#39;nofollow&amp;#39;}"target="_blank" rel="noopener">my Github Repository of R/Stocks&lt;/a>&lt;/p>
&lt;p>Please feel free to fork the repository and experiment with the code.&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-9">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl"> fossengineer/rstocks_shiny:latest
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> docker run --name stocksubuntu -p 3836:3838 --detach fossengineer/rstocks_rbase2:latest
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># you may need log out first `docker logout` ref. https://stackoverflow.com/a/53835882/248616 docker login&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker tag firstimage YOUR_DOCKERHUB_NAME/firstimage
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker push YOUR_DOCKERHUB_NAME/firstimage
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker run --name py_trip_planner --network tunnel -p 8050:8050 --detach py_trip_planner
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker run --name py_trip_planner --network tunnel -p 8050:8050 --detach fossengineer/trip_planner:arm64
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">MANIFEST: to detect that is arm64 directly -&amp;gt; multi-image &lt;span class="o">(&lt;/span>?&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">https://hub.docker.com/r/fossengineer/trip_planner:arm64&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-9"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>But why contributing to that when you can create your own!&lt;/p>
&lt;p>Specially with lovable&amp;hellip;cursor&amp;hellip;etc etc&lt;/p>
&lt;p>All those tools that you might have heard of, but havent really bother to install and try.&lt;/p>
&lt;h3>Python use cases&lt;span class="absolute -mt-20" id="python-use-cases">&lt;/span>
&lt;a href="#python-use-cases" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Python and its 288 use cases&lt;/p>
&lt;p>This year I have been surprised by Python language (one more time).&lt;/p>
&lt;p>And using uv as package manager has been a revelation:&lt;/p>
&lt;p>If we are ready&amp;hellip;what are those cool use cases?&lt;/p>
&lt;h4>Photo and Video&lt;span class="absolute -mt-20" id="photo-and-video">&lt;/span>
&lt;a href="#photo-and-video" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;ul>
&lt;li>&lt;a href="https://www.geeksforgeeks.org/python-pillow-creating-a-watermark/" target="_blank" rel="noopener">https://www.geeksforgeeks.org/python-pillow-creating-a-watermark/&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/web-apps-with-python" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Streamlit 101 ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;p>For editing video, I prefer to use directly FFMPEG.&lt;/p>
&lt;p>TO create videos with Python, for now, I have tried &lt;a href="#animations" >data driven animations&lt;/a>, which can be exported to &lt;code>.mp4&lt;/code>&lt;/p>
&lt;h4>Plots&lt;span class="absolute -mt-20" id="plots">&lt;/span>
&lt;a href="#plots" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>For WebApps, I try to go with Plotly, to get interactivity out of the box.&lt;/p>
&lt;p>You can also bring to your Python Apps: ChartJS, ApexCharts&amp;hellip;as seen &lt;a href="https://github.com/JAlcocerT/Streamlit_PoC" target="_blank" rel="noopener">here&lt;/a>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://handhikayp.medium.com/real-time-data-visualizations-using-python-library-plotly-12e0e5b48240" target="_blank" rel="noopener">https://handhikayp.medium.com/real-time-data-visualizations-using-python-library-plotly-12e0e5b48240&lt;/a>&lt;/li>
&lt;/ul>
&lt;h4>QR Generation&lt;span class="absolute -mt-20" id="qr-generation">&lt;/span>
&lt;a href="#qr-generation" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>To generate &lt;a href="https://github.com/JAlcocerT/JAlcocerT/blob/main/Z_TestingLanguages/Z_Python/QR_generation.ipynb" target="_blank" rel="noopener">&lt;strong>QR&amp;rsquo;s with logo&lt;/strong> thanks to Python&lt;/a>&lt;/p>
&lt;p>And your QR generator can be embedded into WebApps, as seen &lt;a href="https://github.com/JAlcocerT/Streamlit_PoC/blob/main/Utils/QR_Gen.py" target="_blank" rel="noopener">here&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>It can be done as well with Inkscape, or &lt;a href="https://github.com/nayuki/QR-Code-generator" target="_blank" rel="noopener">with QR-Code-Generator&lt;/a> or with &lt;a href="https://emn178.github.io/online-tools/qr-code/generator/" target="_blank" rel="noopener">emn178&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;blockquote>
&lt;p>And applied with &lt;a href="https://jalcocert.github.io/JAlcocerT/building-in-public-wedding-photo-galleries/" target="_blank" rel="noopener">slubne&lt;/a> :)&lt;/p>
&lt;/blockquote>
&lt;/blockquote>
&lt;p>&lt;a href="https://colab.research.google.com/github/JAlcocerT/JAlcocerT/blob/main/Z_TestingLanguages/Z_Python/QR_generation.ipynb" target="_blank" rel="noopener">&lt;img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open in Google Colab" loading="lazy" />&lt;/a>&lt;/p>
&lt;p>I got to learn this during &lt;a href="https://jalcocert.github.io/JAlcocerT/software-for-weddings/#what-i-learnt" target="_blank" rel="noopener">this wedding post&lt;/a>!&lt;/p>
&lt;h4>Infographics&lt;span class="absolute -mt-20" id="infographics">&lt;/span>
&lt;a href="#infographics" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;!-- ![alt text](/blog_img/karting/track_top_curvature_peaks.png) -->
&lt;p>Infographics are one of those things can be &lt;a href="https://jalcocert.github.io/JAlcocerT/things-as-a-code/#infographics-as-a-code" target="_blank" rel="noopener">done as code&lt;/a>: &lt;em>with python ofc&lt;/em>&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/cool-ebooks/#infographics" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Infographics | Docs ↗&lt;/span>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900"href="https://jalcocert.github.io/JAlcocerT/docs/entrepreneur/" target="_blank" rel="noreferrer">&lt;span class="flex font-semibold items-start gap-2 p-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">&lt;svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true">&lt;path stroke-linecap="round" stroke-linejoin="round" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>&lt;/svg>Entrepreneur | Docs ↗&lt;/span>&lt;/a>
&lt;/div>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/python-financial-data-with-yfinance/#with-dividend-reinvestment" target="_blank" rel="noreferrer">&lt;img
alt="Animating yfinance"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/data-experiments/MCD_dividends_pct_12m.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Animating yfinance&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">YFinance for Python, cool plots and animations | Post&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/genetic-algorithm-for-racing/#discrete-to-continuum" target="_blank" rel="noreferrer">&lt;img
alt="Track Infographic"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/karting/track_top_curvature_peaks.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">Track Infographic&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Matplotlib x Race track x Curvature | GA Post&lt;/div>&lt;/a>
&lt;/div>
&lt;p>See this sample script: &lt;a href="https://github.com/JAlcocerT/DataInMotion/blob/main/tests/plot_total_return_from_yfinance.py" target="_blank" rel="noopener">https://github.com/JAlcocerT/DataInMotion/blob/main/tests/plot_total_return_from_yfinance.py&lt;/a>&lt;/p>
&lt;div class="code-block relative mt-6 first:mt-0 group/code">&lt;div id="code-block-10">&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#git clone https://github.com/JAlcocerT/DataInMotion.git&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#cd DataInMotion &amp;amp;&amp;amp; branch libreportfolio&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run tests/plot_historical_gweiss.py CAT --start 2005-01-01 --brand &lt;span class="s2">&amp;#34;@LibrePortfolio&amp;#34;&lt;/span> --warmup-days &lt;span class="m">400&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="opacity-0 transition group-hover/code:opacity-100 flex gap-1 absolute m-[11px] right-0 top-0">
&lt;button
class="code-copy-btn group/copybtn transition-all active:opacity-50 bg-primary-700/5 border border-black/5 text-gray-600 hover:text-gray-900 rounded-md p-1.5 dark:bg-primary-300/10 dark:border-white/10 dark:text-gray-400 dark:hover:text-gray-50"
title="Copy code"
data-clipboard-target="#code-block-10"
>
&lt;div class="group-[.copied]/copybtn:hidden copy-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;div class="hidden group-[.copied]/copybtn:block success-icon pointer-events-none h-4 w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>But for &lt;em>not just yfinance&lt;/em> based, I created:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/UnfoldingData" target="_blank" rel="noreferrer">&lt;img
alt="UnfoldingData Repo"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">UnfoldingData Repo&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Source Code of UnfoldingData plots and animations for Youtube Channel&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://github.com/JAlcocerT/UnfoldingData" target="_blank" rel="noreferrer">&lt;img
alt="UnfoldingData Repo"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">UnfoldingData Repo&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Source Code of UnfoldingData plots and animations for Youtube Channel&lt;/div>&lt;/a>
&lt;/div>
&lt;h4>Animations&lt;span class="absolute -mt-20" id="animations">&lt;/span>
&lt;a href="#animations" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h4>&lt;p>I got very much surprised couple of years ago with &lt;a href="https://github.com/gabemorris12/mechanism" target="_blank" rel="noopener">the mechanism project&lt;/a>.&lt;/p>
&lt;p>Which I finally got the change to write about on &lt;a href="https://jalcocert.github.io/JAlcocerT/gabemorris12-mechanism-project-setup/" target="_blank" rel="noopener">this post&lt;/a>.&lt;/p>
&lt;p>The project has a great application of Python animations.&lt;/p>
&lt;p>That I could not resist to tinker with some time back&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/JAlcocerT/Slider-Crank" target="_blank" rel="noopener">https://github.com/JAlcocerT/Slider-Crank&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/JAlcocerT/mechanism" target="_blank" rel="noopener">https://github.com/JAlcocerT/mechanism&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/JAlcocerT/Streamlit_PoC/tree/main/Animations" target="_blank" rel="noopener">https://github.com/JAlcocerT/Streamlit_PoC/tree/main/Animations&lt;/a> - Just some &lt;strong>matplotlib animations&lt;/strong> for various use cases&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/dev/503.gif" alt="Sample animation Gif" loading="lazy" />&lt;/p>
&lt;p>And here are the references:&lt;/p>
&lt;div class="hextra-cards mt-4 gap-4 grid not-prose" style="--rows: 3;">
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/ai-scripts-and-animated-data/" target="_blank" rel="noreferrer">&lt;img
alt="A Summary of Animations"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/apps/gh-jalcocert.svg"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">A Summary of Animations&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Post with animated F1, Real Estate, yfinance&amp;hellip;&lt;/div>&lt;/a>
&lt;a
class="hextra-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-gray-100 shadow dark:border-neutral-700 dark:bg-neutral-800 dark:text-gray-50 hover:shadow-lg dark:hover:border-neutral-500 dark:hover:bg-neutral-700"href="https://jalcocert.github.io/JAlcocerT/f1-data-animated/" target="_blank" rel="noreferrer">&lt;img
alt="F1 Animated Data"
loading="lazy"
decoding="async"
src="https://JAlcocerT.github.io/JAlcocerT/JAlcocerT/blog_img/karting/long_g_trace_L4.png"
/>&lt;span class="flex font-semibold items-start gap-2 pt-4 px-4 text-gray-700 hover:text-gray-900 dark:text-neutral-200 dark:hover:text-neutral-50">F1 Animated Data&lt;/span>&lt;div class="line-clamp-3 text-sm font-normal text-gray-500 dark:text-gray-400 px-4 mb-4 mt-2">Creating animations around F1 Data | Post&lt;/div>&lt;/a>
&lt;/div>
&lt;p>And&amp;hellip;animations of mechanisms are also getting cooked:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/hCOSqf4dXqc" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div></description></item></channel></rss>