<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rainbowbreeze</title>
	<atom:link href="https://rainbowbreeze.it/feed/" rel="self" type="application/rss+xml" />
	<link>https://rainbowbreeze.it/</link>
	<description>Alfredo Morresi&#039;s digital harbor</description>
	<lastBuildDate>Sun, 16 Nov 2025 01:20:04 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
<site xmlns="com-wordpress:feed-additions:1">31315628</site>	<item>
		<title>Shell tools to improve productivity</title>
		<link>https://rainbowbreeze.it/shell-tools-to-improve-productivity/</link>
					<comments>https://rainbowbreeze.it/shell-tools-to-improve-productivity/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo]]></dc:creator>
		<pubDate>Sat, 15 Nov 2025 23:36:17 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Terminal]]></category>
		<guid isPermaLink="false">https://rainbowbreeze.it/?p=11135</guid>

					<description><![CDATA[<p>I love working in the terminal. I&#8217;m not a shortcut wizard, I barely remember a few, but I still love working in the terminal. Here is the list of apps and configurations I made over time to improve my shell. Bat Need to read the content of a file? Bat helps with with syntax highlighting, &#8230; <a href="https://rainbowbreeze.it/shell-tools-to-improve-productivity/" class="more-link">Continue reading <span class="screen-reader-text">Shell tools to improve productivity</span> <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://rainbowbreeze.it/shell-tools-to-improve-productivity/">Shell tools to improve productivity</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>I love working in the terminal. I&#8217;m not a shortcut wizard, I barely remember a few, but I still love working in the terminal. Here is the list of apps and configurations I made over time to improve my shell.</p>



<h3 class="wp-block-heading">Bat</h3>



<p>Need to read the content of a file? <a href="https://github.com/sharkdp/bat">Bat</a> helps with with syntax highlighting, line numbers, git integration, and many other options.</p>



<h3 class="wp-block-heading">Colored logs</h3>



<p>Reading log files is part of every dev life, but why not making the task simpler with syntax highlighting? <a href="https://github.com/bensadeh/tailspin">Tailspin</a> to the rescue. <code>docker logs -f &lt;containter_name> | tspin</code></p>



<h3 class="wp-block-heading">Easier file searches</h3>



<p><code>find</code> is a powerful tool, but the syntax is quite complex for simple search tasks. <a href="https://github.com/sharkdp/fd">fd</a> makes search simpler as typing <code>fd specs</code> to find all files and directories containing the word specs in current dir and subdirs, case insensitive. Or <code>fd -e md</code> to search for all the files ending with a <code>.md</code> in current dir and subdirs.</p>



<h3 class="wp-block-heading">List files and dirs</h3>



<p><a href="https://github.com/eza-community/eza">eza</a> replaces ls with syntax highlighting and git status out of the box, the possibility to see files and dirs and a tree format, order files by different attributes (name is the default, but then size, extension, etc). <code>eza -T</code> generates a nice tree view of all files and subdirs in the current path.</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="887" height="498" src="https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/11/20251115-eza.jpg" alt="eza output" class="wp-image-11137" srcset="https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/11/20251115-eza.jpg 887w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/11/20251115-eza-300x168.jpg 300w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/11/20251115-eza-200x112.jpg 200w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/11/20251115-eza-768x431.jpg 768w" sizes="(max-width: 887px) 100vw, 887px" /></figure>



<p>With a simple <code>alias l="eza -l"</code> and <code>alias lt="eza -lT"</code> navigating the filesystem will be much easier!</p>



<h3 class="wp-block-heading">Who is using disk space?</h3>



<p>Wondering how the disk space is used? <a href="https://github.com/bootandy/dust">dust</a> replaces du and make the discovery very easy. For example, <code>dust -z 1G</code> searches for all files and folder better than 1Gb in the current dir.</p>



<p>For a file-system level overview, duf</p>



<p><a href="https://github.com/rofl0r/ncdu">ncdu</a> offers interactive browsing of directories, and the possibility to remove files and dirs on-the-fly.</p>
<p>The post <a href="https://rainbowbreeze.it/shell-tools-to-improve-productivity/">Shell tools to improve productivity</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rainbowbreeze.it/shell-tools-to-improve-productivity/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">11135</post-id>	</item>
		<item>
		<title>Open WebUI and mcpo to use all kinds of MCP servers</title>
		<link>https://rainbowbreeze.it/openwebui-mcpo-for-mpc-sdio-sse-http/</link>
					<comments>https://rainbowbreeze.it/openwebui-mcpo-for-mpc-sdio-sse-http/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo]]></dc:creator>
		<pubDate>Sun, 26 Oct 2025 19:54:10 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[MCP]]></category>
		<category><![CDATA[OpenWebUI]]></category>
		<guid isPermaLink="false">https://rainbowbreeze.it/?p=11097</guid>

					<description><![CDATA[<p>The integration of the Model Context Protocol (MCP) servers within Open WebUI significantly extends its functionality, by allowing access to external capabilities. Open WebUI both leverage native support for MCP server offering the HTTP streamable format, and usage of the mcpo (MCP-to-OpenAPI proxy server) for broader compatibility. This article explains how to configure MPCO to &#8230; <a href="https://rainbowbreeze.it/openwebui-mcpo-for-mpc-sdio-sse-http/" class="more-link">Continue reading <span class="screen-reader-text">Open WebUI and mcpo to use all kinds of MCP servers</span> <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://rainbowbreeze.it/openwebui-mcpo-for-mpc-sdio-sse-http/">Open WebUI and mcpo to use all kinds of MCP servers</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>The integration of the <strong>Model Context Protocol (MCP)</strong> servers within Open WebUI significantly extends its functionality, by allowing access to external capabilities. Open WebUI both leverage native support for MCP server offering the HTTP streamable format, and usage of the <strong><a href="https://github.com/open-webui/mcpo">mcpo (MCP-to-OpenAPI proxy server)</a></strong> for broader compatibility.</p>



<p>This article explains how to configure <a href="https://github.com/open-webui/mcpo">MPCO</a> to leverage all kinds of MCP servers: local via sdio, or remote via SSE (Server-Sent Events), or Streamable HTTP. While <a href="/openwebui-mcp-http/">this other article</a> explains native support of HTTP streamable MCP servers in Open WebUI (<em>added at the end of Sept 2025</em>).</p>



<h3 class="wp-block-heading">What is MCP?</h3>



<p><strong>MCP</strong> is an open standard that functions as a universal communication bridge, connecting LLMs to external tools and data sources. This protocol enables AI assistants to access real-time information and perform tasks on a variety of different areas.</p>



<p>MCP servers communicate with clients (the LLMs) using three primary channels: <code><strong>stdio</strong></code> (standard input/output), <strong>SSE</strong> (Server-Sent Events), or <strong>Streamable HTTP</strong>.</p>



<p>Because of the core architecture of Open WebUI, which is a web-based, multi-tenant environment, not a local desktop process, and because long-lived stdio or SSE connections are difficult to maintain securely across users and sessions, Open WebUI team decided to create <a href="https://github.com/open-webui/mcpo"></a><strong><a href="https://github.com/open-webui/mcpo">mcpo (MCP-to-OpenAPI proxy server)</a></strong> &#8211; an open-source proxy that translates stdio, SSE-based or streamable HTTP MCP servers into OpenAPI-compatible endpoints.</p>



<p>In addition, mcpo automatically discovers MCP tools dynamically, generates REST endpoints, and creates interactive, human-readable OpenAPI documentation accessible at <code>http://localhost:8000/docs</code>.</p>



<h3 class="wp-block-heading">Configure a mcpo server</h3>



<p>mcpo can run MCP servers written as npm packages via <a href="https://docs.npmjs.com/cli/v8/commands/npx">npx</a>, python packages via <a href="https://pypi.org/project/uvx/">uvx</a>, and can also wrap calls to SSE or Streamable HTTP MCP servers.</p>



<p>When launched from the command line, it&#8217;s possible to specify both an MCP server mcpo will run, or a configuration file which defines the MCP servers it will manage, their exposed names, etc. The <a href="https://github.com/open-webui/mcpo">project page</a> has a lot examples on how to configure the different servers.</p>



<p>This article will use docker compose to launch mcpo, and a configuration file to define the MCP servers to expose. A simple <code>docker-compose.yaml</code> file follows:</p>



<pre class="wp-block-code"><code>services:
  mcpo:
    container_name: mcpo
    image: ghcr.io/open-webui/mcpo:main
    restart: unless-stopped
    volumes:
      # Map your local config directory to /app/config inside MCPO container
      - /Volumes/Data/development/open-webui/volumes/mcpo:/app/config
    ports:
      - 8000:8000
    # Command to launch MCPO using the mounted config file, with hot-reload enabled
    command: --config /app/config/config.json --hot-reload</code></pre>



<p>In this example, the configuration file is created under <code>/Volumes/Data/development/open-webui/volumes/mcpo/config.json</code> on the host running Docker, which maps to <code>/app/config/config.json</code> in the command line passed to mcpo.</p>



<p>Four MCP servers are exposed via mcpo using the following config file:</p>



<pre class="wp-block-code"><code>{
  "mcpServers": {
    "time": {
      "command": "uvx",
      "args": &#91;"mcp-server-time", "--local-timezone=America/New_York"]
    },
    "youtube-transcript": {
      "command": "uvx",
      "args": &#91;
        "--from",
        "git+https://github.com/jkawamoto/mcp-youtube-transcript",
        "mcp-youtube-transcript"
      ]
    },
    "open-meteo": {
      "command": "npx",
      "args": &#91;"open-meteo-mcp-server"]
    }
    "coingecko": {
      "type": "streamable-http",
      "url": "https://mcp.api.coingecko.com/mcp"
  }
}</code></pre>



<ul class="wp-block-list">
<li><code>time</code> is a <a href="https://github.com/modelcontextprotocol/servers/tree/main/src/time">MCP server offering time information</a>, created using a python package</li>



<li><code>youtube-transcript</code> is another python <a href="https://github.com/jkawamoto/mcp-youtube-transcript">MCP server to transcribe YouTube videos</a>, created directly from its github repo.</li>



<li><code>open-meteo</code> is a nodejs <a href="https://github.com/cmer81/open-meteo-mcp">MCP server offering weather forecasts</a> via Open-Meteo APIs.</li>



<li><code>coingecko</code> is the same <a href="https://docs.coingecko.com/docs/mcp-server">CoinGecko streamable HTTP MCP server</a> used in <a href="/openwebui-mcp-http/">the other article</a> about MCP and Open WebUI, this time exposed via mcpo.
<ul class="wp-block-list">
<li>When possible, I prefer to use native support to MCP servers directly, to avoid wrapping calls into another service.</li>
</ul>
</li>
</ul>



<p>Easy to spot, the configurations to add to the <code>config.json</code> file uses the same format of Gemini CLI, Claude, Visual Studio, or other MCP server clients.</p>



<p>Once changed the configuration, it&#8217;s possible to check if they&#8217;re correct looking at the mcpo container logs, using <code>docker logs -f mcpo</code> command. For example:</p>



<pre class="wp-block-code"><code>2025-10-26 15:12:07,498 - INFO - Config file modified: /app/config/config.json
2025-10-26 15:12:08,011 - INFO - Adding servers: &#91;'coingecko_mcp_streamable_http']
2025-10-26 15:12:10,158 - INFO - HTTP Request: POST https://mcp.api.coingecko.com/mcp "HTTP/1.1 200 OK"
2025-10-26 15:12:10,159 - INFO - Received session ID: 7a3c7019bf4ec1aaa7b213d017cd968ca1c609ee6bb5612622a0d4ad41b8579d
2025-10-26 15:12:10,162 - INFO - Negotiated protocol version: 2025-06-18
2025-10-26 15:12:10,736 - INFO - HTTP Request: POST https://mcp.api.coingecko.com/mcp "HTTP/1.1 202 Accepted"
2025-10-26 15:12:10,806 - INFO - HTTP Request: GET https://mcp.api.coingecko.com/mcp "HTTP/1.1 404 Not Found"
2025-10-26 15:12:11,204 - INFO - HTTP Request: POST https://mcp.api.coingecko.com/mcp "HTTP/1.1 200 OK"
2025-10-26 15:12:12,038 - INFO - Successfully connected to new server: 'coingecko'
2025-10-26 15:12:12,038 - INFO - Config reload completed successfully</code></pre>



<p>Otherwise, an <code>ERROR</code> log instance will be present.</p>



<p>The list of the MCP servers exposed, and their docs (what the LLM sees) can be browsed at <code>http://localhost:8000/docs</code>.</p>



<h3 class="wp-block-heading">Connect to mcpo in Open WebUI</h3>



<p>There are two ways to connect to mcpo in Open WebUI: via a <strong>User Tool Server</strong> in the User Settings, and via a <strong>Global Tool Server</strong> in the Admin Settings.</p>



<ul class="wp-block-list">
<li><strong>User Tool Servers</strong> utilize the client-side (your browser) to make the connection.
<ul class="wp-block-list">
<li>Ideal for accessing highly specific, local, or private development endpoints on your machine, as the resource exposure is isolated only to your session.</li>



<li>It would be possible to launch an mcpo server instance on the local machine and connect to it, while having Open WebUI running on another, remote, server, which was not configured to use the MCP, and for which the user has no admin privileges.</li>



<li>For example, a filesystem MCP can access files accessible only from the local machine where mcpo runs, while the Open WebUI server doesn&#8217;t have access to them.</li>
</ul>
</li>



<li><strong>Global Tool Servers</strong> utilize the server-side (Open WebUI&#8217;s backend) to make the connection.
<ul class="wp-block-list">
<li>This means the tool must be reachable from the server environment, typically using internal Docker network names or the host alias (<code>host.docker.internal</code>). It&#8217;s also possible to access to a mcpo running on another server / remotely, and reachable by the Open WebUI host machines.</li>



<li>For example, a fileserver MCP can access files present on the server, and not accessible to the user.</li>



<li>It would be possible to configure authentication credential shared among all the Open WebUI users, like the same Bearer token or sessions.</li>



<li>Once configured on the Open WebUI server, the MCP could be made available to all the users. </li>
</ul>
</li>
</ul>



<p>Of course, distinctions from these two options fade away if both Open WebUI and mcpo are launched on the same local machine, used to connect to Open WebUI. But it&#8217;s important to keep this distinction in mind.</p>



<p>Each server exposed by mcpo has to be configured separately.</p>



<p>For configuring <strong>Global Tool Servers</strong>, using the time server as example:</p>



<ol class="wp-block-list">
<li>Navigate to <strong>Admin Panel</strong> -&gt; <strong>Settings</strong> -&gt; <strong>External Tools</strong>.</li>



<li>Click &#8220;<strong>+</strong>&#8220;<em> (Add Connection)</em>.</li>



<li>Set the <strong>Type</strong> to <strong>OpenAPI</strong>.</li>



<li>Set the <strong>URL</strong> to <code>http://host.docker.internal:8000/time</code>
<ul class="wp-block-list">
<li>If Open WebUI and mcpo are in the same docker network,  <code>http://mcpo:8000/time</code> can be used, assuming the mcpo image has the name <code>mcpo</code>, like in the docker compose file used above. </li>
</ul>
</li>



<li>Set <strong>OpenAPI Spec</strong> to <strong>URL</strong>, and <strong>openapi.json</strong>.</li>



<li>Set <strong>Auth</strong> to <strong>None</strong>.</li>



<li>Set <strong>ID</strong> to <code>time_mcp_mcpo</code>.
<ul class="wp-block-list">
<li>This is the string used in the logs to identity the MCP tool call.</li>
</ul>
</li>



<li>Set <strong>Name</strong> to <code>Time MCP via mcpo</code>.
<ul class="wp-block-list">
<li>This is the string used in the UI to configure the available tools and MCP servers for the model (see below).</li>
</ul>
</li>



<li>Set <strong>Description</strong> to <code>Get the current time and date</code></li>
</ol>



<p>For configuring <strong>User Tools Servers</strong>, instead:</p>



<ol class="wp-block-list">
<li>Navigate to <strong>Settings</strong> -&gt; <strong>External Tools</strong>.</li>



<li>Click &#8220;<strong>+</strong>&#8220;<em> (Add Connection)</em>.</li>



<li>Set the <strong>URL</strong> to <code>http://localhost:8000/time</code>
<ul class="wp-block-list">
<li><code>localhost</code> because the mcpo server is accessible from the browser user session using <code>localhost</code>, or <code>127.0.0.1</code> address. </li>



<li><code>http://host.docker.internal:8000/time</code> or <code><code>http://mcpo:8000/time</code></code> won&#8217;t work, as they refer to docker-network specific addresses, which are not available in the browser user session of the local machine   </li>
</ul>
</li>



<li>Set <strong>OpenAPI Spec</strong> to <strong>URL</strong>, and <strong>openapi.json</strong>.</li>



<li>Set <strong>Auth</strong> to <strong>None</strong>.</li>
</ol>



<p>The time MCP server is now available inside Open WebUI, with two different names:  <code>Time MCP via mcpo</code> if configured as Global Tool Server, or <code>mcp-time</code> if configured as User Tool Server. </p>



<h3 class="wp-block-heading">Create an agent which uses MCP</h3>



<p>To be sure the MCP call is considered, and then executed, by the LLM, ensure the model <a href="https://ollama.com/search?c=tools">has tools support</a>, and that <strong>Function Calling</strong> parameter set to <strong>Native</strong> in the Advanced Params section of the model configuration.</p>



<p>Here an example to create a specialized agent to return the current time, using the MCP server.</p>



<ol class="wp-block-list">
<li>Navigate to <strong>Workspace</strong> -&gt; <strong>Models</strong> -&gt; <strong>New Model</strong>.</li>



<li>Set <strong>Model Name</strong> to <code>Qwen3-Assistant</code>.</li>



<li>Set <strong>Base Model</strong> to <code>qwen3:8b</code>.
<ul class="wp-block-list">
<li>Or any other model supporting tools calling</li>
</ul>
</li>



<li>Set <strong>Description</strong> to <code>Return the current time</code>.</li>



<li>No need to set any <strong>System Prompt</strong>.</li>



<li><strong>Advanced Params</strong> -&gt; <strong>Show</strong>.
<ul class="wp-block-list">
<li>Set <strong>Function Calling</strong> to <strong>Native</strong>.</li>
</ul>
</li>



<li>In the <strong>Tools</strong>, check <strong>Time MCP via mcpo</strong> or <strong>mcp-time</strong>.</li>
</ol>



<p>Save and start chatting with the agent, for example asking <code>What's the current time?</code>. Here what the result could be, where the result of the time MCP is expanded for additional clarity:</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="878" src="https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/10/image-1024x878.png" alt="Open WebUI chat window" class="wp-image-11110" srcset="https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/10/image-1024x878.png 1024w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/10/image-300x257.png 300w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/10/image-200x171.png 200w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/10/image-768x658.png 768w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/10/image-1100x943.png 1100w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/10/image.png 1290w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Example of an Open WebUI agent using a local MCP time server exposed via mcpo</figcaption></figure>



<p></p>
<p>The post <a href="https://rainbowbreeze.it/openwebui-mcpo-for-mpc-sdio-sse-http/">Open WebUI and mcpo to use all kinds of MCP servers</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rainbowbreeze.it/openwebui-mcpo-for-mpc-sdio-sse-http/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">11097</post-id>	</item>
		<item>
		<title>Open WebUI and native MCP integration</title>
		<link>https://rainbowbreeze.it/openwebui-mcp-http/</link>
					<comments>https://rainbowbreeze.it/openwebui-mcp-http/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo]]></dc:creator>
		<pubDate>Sun, 26 Oct 2025 14:22:58 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[MCP]]></category>
		<category><![CDATA[OpenWebUI]]></category>
		<guid isPermaLink="false">https://rainbowbreeze.it/?p=11095</guid>

					<description><![CDATA[<p>The integration of the Model Context Protocol (MCP) servers within Open WebUI significantly extends its functionality, by allowing access to external capabilities. Open WebUI both leverage native support for MCP server offering the HTTP streamable format, and usage of the mcpo (MCP-to-OpenAPI proxy server) for broader compatibility. This article explains how to configure Open WebUI&#8217;s &#8230; <a href="https://rainbowbreeze.it/openwebui-mcp-http/" class="more-link">Continue reading <span class="screen-reader-text">Open WebUI and native MCP integration</span> <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://rainbowbreeze.it/openwebui-mcp-http/">Open WebUI and native MCP integration</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>The integration of the <strong>Model Context Protocol (MCP)</strong> servers within Open WebUI significantly extends its functionality, by allowing access to external capabilities. Open WebUI both leverage native support for MCP server offering the HTTP streamable format, and usage of the <strong><a href="https://github.com/open-webui/mcpo">mcpo (MCP-to-OpenAPI proxy server)</a></strong> for broader compatibility.</p>



<p>This article explains how to configure Open WebUI&#8217;s native support for remove MCP servers offering HTTP streamable capabilities. For a guide on how to configure <a href="https://github.com/open-webui/mcpo">MCPO</a> to leverage all kinds of MCP servers: local via sdio, or remote via SSE (Server-Sent Events), or Streamable HTTP, please refer to <a href="/openwebui-mcpo-for-mpc-sdio-sse-http/">this article</a>.</p>



<h3 class="wp-block-heading">What is MCP?</h3>



<p><strong>MCP</strong> is an open standard that functions as a universal communication bridge, connecting LLMs to external tools and data sources. This protocol enables AI assistants to access real-time information and perform tasks on a variety of different areas.</p>



<p>MCP servers communicate with clients (the LLMs) using three primary channels: <code><strong>stdio</strong></code> (standard input/output), <strong>SSE</strong> (Server-Sent Events), or <strong>Streamable HTTP</strong>.</p>



<h3 class="wp-block-heading">Connect to MCP via HTTP Streaming</h3>



<p>In <a href="https://github.com/open-webui/open-webui/releases/tag/v0.6.31">v0.6.31</a> Open WebUI added MCP (streamable HTTP) server support, alongside existing OpenAPI server integration. This allows to connect directly to an MCP server that exposes its functionality over a streaming HTTP endpoint. It supports Bearer token, session and OAuth for authentication, if necessary (<em><a href="https://docs.openwebui.com/features/mcp/">doc page</a>, but very basic so far</em>).</p>



<p>To find MCP servers, the <a href="https://mcpservers.org/remote-mcp-servers">&#8220;Remote MCP Servers&#8221; page of Awesome MCP Servers</a> is a good starting point. Looking at all the servers with <code>http</code> support, let&#8217;s user the one from <a href="https://mcp.api.coingecko.com/">CoinGecko</a>.</p>



<p>Once logged in Open WebUI:</p>



<ol class="wp-block-list">
<li>Navigate to <strong>Admin Panel</strong> -&gt; <strong>Settings</strong> -&gt; <strong>External Tools</strong>.</li>



<li>Click &#8220;<strong>+</strong>&#8220;<em> (Add Connection)</em>.</li>



<li>Set the <strong>Type</strong> to <strong>MCP Streamable HTTP</strong>.</li>



<li>Set the <strong>URL</strong> to <code>https://mcp.api.coingecko.com/mcp</code></li>



<li>Set <strong>Auth</strong> to <strong>None</strong>.</li>



<li>Set <strong>ID</strong> to <code>coingecko_mcp_http</code>.
<ul class="wp-block-list">
<li>This is the string used in the logs to identity the MCP tool call.</li>
</ul>
</li>



<li>Set <strong>Name</strong> to <code>CoinGecko MCP via http</code>.
<ul class="wp-block-list">
<li>This is the string used in the UI to configure the available tools and MCP servers for the model (see below).</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading">Create an agent which uses MCP</h3>



<p>To be sure the MCP call is considered, and then executed, by the LLM, ensure the model <a href="https://ollama.com/search?c=tools">has tools support</a>, and that <strong>Function Calling</strong> parameter set to <strong>Native</strong> in the Advanced Params section of the model configuration.</p>



<p>Here an example to create a specialized agent to return values of crypto assets:</p>



<ol class="wp-block-list">
<li>Navigate to <strong>Workspace</strong> -&gt; <strong>Models</strong> -&gt; <strong>New Model</strong>.</li>



<li>Set <strong>Model Name</strong> to <code>Crypto expert</code>.</li>



<li>Set <strong>Base Model</strong> to <code>qwen3:8b</code>.
<ul class="wp-block-list">
<li>Or any other model supporting tools calling</li>
</ul>
</li>



<li>Set <strong>Description</strong> to <code>Return value of crypto assets</code>.</li>



<li>Set <strong>System Prompt</strong> to <code>You are a cryptocurrency price lookup agent. When the user specifies one or more cryptocurrency names (e.g., "bitcoin", "ethereum", "BTC", "CRO"), output ONLY the current market price in USD for each, formatted as: [Name]: $[price]. Do not add explanations, context, errors, or any text beyond this. If a crypto is unrecognized, output: [Name]: Not found.</code></li>



<li><strong>Advanced Params</strong> -&gt; <strong>Show</strong>.
<ul class="wp-block-list">
<li>Set <strong>Function Calling</strong> to <strong>Native</strong>.</li>
</ul>
</li>



<li>In the <strong>Tools</strong>, check <strong>CoinGecko MCP via http</strong>.</li>



<li>In the <strong>Capabilities</strong>, uncheck everything except <strong>Status Updates</strong>. </li>
</ol>



<p>Save and start chatting with the agent, for example asking <code>BNB price</code>. Here what the result could be, where the result of the CoinGecko MCP is expanded for additional clarity:</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="798" src="https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/10/image-1-1024x798.png" alt="Open WebUI chat window" class="wp-image-11099" srcset="https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/10/image-1-1024x798.png 1024w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/10/image-1-300x234.png 300w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/10/image-1-200x156.png 200w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/10/image-1-768x598.png 768w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/10/image-1-1100x857.png 1100w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2025/10/image-1.png 1468w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Example of an Open WebUI agent using MCP server calls</figcaption></figure>



<p>If the MCP server doesn&#8217;t support streamable HTTP, it&#8217;s possible to <a href="/openwebui-mcpo-for-mpc-sdio-sse-http/">use mcpo to access them</a>.</p>
<p>The post <a href="https://rainbowbreeze.it/openwebui-mcp-http/">Open WebUI and native MCP integration</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rainbowbreeze.it/openwebui-mcp-http/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">11095</post-id>	</item>
		<item>
		<title>“Servant leader&#8221; &#8211; Interview with Alfredo Morresi</title>
		<link>https://rainbowbreeze.it/servant-leader-ensouinterview-with-alfredo-morresi/</link>
					<comments>https://rainbowbreeze.it/servant-leader-ensouinterview-with-alfredo-morresi/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo]]></dc:creator>
		<pubDate>Thu, 12 Dec 2024 09:00:00 +0000</pubDate>
				<category><![CDATA[Talk]]></category>
		<category><![CDATA[Team]]></category>
		<category><![CDATA[Leadership]]></category>
		<guid isPermaLink="false">https://rainbowbreeze.it/?p=11093</guid>

					<description><![CDATA[<p>[&#8230;] It was during that period that I met Alfredo Morresi, who even then was the community manager for developers. Ensoul was developing a prototype of a webVR viewer, and Alfredo immediately stood out for his kindness and attentiveness. Among other things, we were fortunate to receive an early physical prototype of the Google Pixel &#8230; <a href="https://rainbowbreeze.it/servant-leader-ensouinterview-with-alfredo-morresi/" class="more-link">Continue reading <span class="screen-reader-text">“Servant leader&#8221; &#8211; Interview with Alfredo Morresi</span> <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://rainbowbreeze.it/servant-leader-ensouinterview-with-alfredo-morresi/">“Servant leader&#8221; &#8211; Interview with Alfredo Morresi</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>[&#8230;] It was during that period that I met Alfredo Morresi, who even then was the community manager for developers. Ensoul was developing a prototype of a webVR viewer, and Alfredo immediately stood out for his kindness and attentiveness. Among other things, we were fortunate to receive an early physical prototype of the Google Pixel and an invitation to the Google VR Workshop in London. [&#8230;]</p>


<p><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted" title="&quot;Servant Leader&quot; - Ensoul Interviews Alfredo Morresi from Google - Ensoul Diary - Shopify, Technology, Digital culture" src="https://widget.spreaker.com/player?episode_id=63335137&#038;theme=light&#038;playlist=false&#038;cover_image_url=https%3A%2F%2Fd3wo5wojvuv7l.cloudfront.net%2Fimages.spreaker.com%2Foriginal%2F99cc41d20258b3e4bc313111c6c39b7b.jpg#?secret=R6LjmflTwI" data-secret="R6LjmflTwI" width="1100" height="500" frameborder="0"></iframe></p>



<p>Link to the <a href="https://diary.ensoul.it/servant-leader-interview-with-alfredo-morresi-from-google/">original post</a>, and thanks <a href="https://www.linkedin.com/in/fulvioromanin/">Fulvio</a> for the interview!</p>
<p>The post <a href="https://rainbowbreeze.it/servant-leader-ensouinterview-with-alfredo-morresi/">“Servant leader&#8221; &#8211; Interview with Alfredo Morresi</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rainbowbreeze.it/servant-leader-ensouinterview-with-alfredo-morresi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">11093</post-id>	</item>
		<item>
		<title>Home Assistant for privacy, choice and sustainability</title>
		<link>https://rainbowbreeze.it/home-assistant-for-privacy-choice-and-sustainability/</link>
					<comments>https://rainbowbreeze.it/home-assistant-for-privacy-choice-and-sustainability/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo]]></dc:creator>
		<pubDate>Sat, 19 Oct 2024 20:26:30 +0000</pubDate>
				<category><![CDATA[Talk]]></category>
		<category><![CDATA[Home Assistant]]></category>
		<category><![CDATA[Home Automation]]></category>
		<guid isPermaLink="false">https://www.rainbowbreeze.it/?p=11027</guid>

					<description><![CDATA[<p>In the following talk (in Italian), I explained the basics concepts behind Home Assistant, the number one choice to manage home automation with 3 core principles in mind: privacy, choice and sustainability. (MOCA 2024, Pescara)</p>
<p>The post <a href="https://rainbowbreeze.it/home-assistant-for-privacy-choice-and-sustainability/">Home Assistant for privacy, choice and sustainability</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>In the following talk (<em>in Italian</em>), I explained the basics concepts behind Home Assistant, the number one choice to manage home automation with 3 core principles in mind: privacy, choice and sustainability.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="1100" height="619" src="https://www.youtube.com/embed/TjX6UnAodug?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<p>(<a href="https://moca.camp/">MOCA 2024</a>, Pescara)</p>
<p>The post <a href="https://rainbowbreeze.it/home-assistant-for-privacy-choice-and-sustainability/">Home Assistant for privacy, choice and sustainability</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rainbowbreeze.it/home-assistant-for-privacy-choice-and-sustainability/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">11027</post-id>	</item>
		<item>
		<title>The Sonic-AI project: the brain</title>
		<link>https://rainbowbreeze.it/the-sonic-ai-project-the-brain/</link>
					<comments>https://rainbowbreeze.it/the-sonic-ai-project-the-brain/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo]]></dc:creator>
		<pubDate>Mon, 26 Aug 2024 14:48:53 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[GenAI]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[SonicAI]]></category>
		<guid isPermaLink="false">https://www.rainbowbreeze.it/?p=10998</guid>

					<description><![CDATA[<p>Sonic-AI project: an effort to learn how to use LLM, GenAI and ML tools, while building a Sonic-like virtual buddy for my kid, with privacy in mind (full details here). This post explains how to build a local stack to create the basic chatbot, using a LLM and a web UI to chat with it. &#8230; <a href="https://rainbowbreeze.it/the-sonic-ai-project-the-brain/" class="more-link">Continue reading <span class="screen-reader-text">The Sonic-AI project: the brain</span> <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://rainbowbreeze.it/the-sonic-ai-project-the-brain/">The Sonic-AI project: the brain</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><strong>Sonic-AI project</strong>: an effort to learn how to use LLM, GenAI and ML tools, while building a Sonic-like virtual buddy for my kid, with privacy in mind (<a href="/the-sonic-ai-project-intro/">full details here</a>). This post explains how to build a local stack to create the basic chatbot, using a LLM and a web UI to chat with it. And how to run the stack on a cloud computer, in case you don&#8217;t have enough resources locally (mainly a GPU).</p>



<p>I could have used the many online services to create a customized chatbot in minutes. Instead, I wanted to create a stack I can run locally, for two reasons: use open source models to guarantee maximum privacy, and avoid exposing my data to third parties. Privacy is always a compromise with complexity. So, time to get hands dirty.</p>



<p> Searching around, <a href="https://www.youtube.com/watch?v=Wjrdr0NU4Sk">host ALL your AI locally</a> video provided a good idea to start with.</p>



<h3 class="wp-block-heading">Choose an LLM</h3>



<p>Nowadays (Aug 2024) LLMs are perfect for creating chatbots. They embed NLP capabilities, can speak different languages, the already know a lot about the world and can be customized to learn specific knowledge domains.</p>


<div class="wp-block-image">
<figure class="alignleft size-full"><img loading="lazy" decoding="async" width="200" height="202" src="https://www.rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_gemma.png" alt="" class="wp-image-11004" srcset="https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_gemma.png 200w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_gemma-198x200.png 198w" sizes="auto, (max-width: 200px) 100vw, 200px" /></figure>
</div>


<p>Speaking about models, the landscape of open source models to use is very wide: Mistral, Gemma, Llama, Phi-3, etc. In their respective versions, small, medium and large sizes, and potential customization. Each one of them has strenghts and limits, so I took one close to my work: <a href="https://blog.google/technology/developers/google-gemma-2/">Gemma2 with 9B parameters</a>, a good compromise between complexity of the model, resources required to decently run it on a &#8220;normal pc&#8221; with a normal GPU, and support of Italian language.</p>


<div class="wp-block-image">
<figure class="alignright size-full"><img loading="lazy" decoding="async" width="90" height="127" src="https://www.rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_ollama-e1724612247466.png" alt="Ollama icon" class="wp-image-11003"/></figure>
</div>


<p><a href="https://ollama.com/">Ollama</a> was the no-brain choice to interact with the LLM, considering how easy the setup and usage is, the large array of options it offers, support for nVidia and AMD GPUs, and how widely integrated Ollama is with other tools.</p>



<p>The only downside was the usage of the command line to interact with Ollama &#8211; I love it, but my kid doesn&#8217;t. So I needed a better UI to create my chatbot.</p>



<h3 class="wp-block-heading">Choose a user-friendly UI</h3>


<div class="wp-block-image">
<figure class="alignleft size-thumbnail"><img loading="lazy" decoding="async" width="200" height="148" src="https://www.rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_openwebui-200x148.png" alt="" class="wp-image-11006" srcset="https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_openwebui-200x148.png 200w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_openwebui-300x222.png 300w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_openwebui.png 308w" sizes="auto, (max-width: 200px) 100vw, 200px" /></figure>
</div>


<p>In the open source landscape there are two main players: <a href="https://openwebui.com/">Open WebUI</a> and the <a href="https://github.com/oobabooga/text-generation-webui">oobabooga&#8217;s Text generation web UI</a>. I selected the former, Open WebUI, because it has an easier-to-use and more polished interface, offers a chatbox experience out-of-the-box, has the ability to create agents, plus other handy capabilities useful for the other parts of my project (like TTS, STT, etc).</p>



<p>Ice on the cake, the project offers a ready-to-use docker image (<code>https://ghcr.io/open-webui/open-webui:ollama</code>) containing Ollama + Open WebUI, CUDA drivers, and a lot of pre-made configurations to wire everything together. It means no installation and configuration headaches.</p>



<p>At this point, it&#8217;s time to assemble everything togher.</p>



<h3 class="wp-block-heading">Host the chatbot stack</h3>



<p>I confess, I don&#8217;t own a machine with a good enough GPU to run mid-size models <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f62d.png" alt="😭" class="wp-smiley" style="height: 1em; max-height: 1em;" />. I&#8217;ll solve for this soon, but in the meantime I had the idea to provision a self-managed virtual machine with an appropriate CPU + GPU config, connect a disk, install an OS image, and use it as it was my &#8220;local&#8221; computer. This VM-based setup allowed to quickly iterate at the beginning of the project, try different hardware configs and find the one most appropriate for what I needed, spending few $ per day to keep using a VM instance.</p>



<p>Well, I tried hard to create such VM on <a href="https://cloud.google.com/products/compute">Google Compute Engine</a>, but with no success, all the time with the same error of no available resources. I even used this <a href="https://github.com/doitintl/gpu-finder">nice gpu-finder tool</a>, to automate the creation of different configs (<em>N1 machines with 2 vCores with <i>both nVidia Tesla T4 or Tesla P4 single GPU</i></em>) on different days in all the zones offering these GPUs, but I wasn&#8217;t able to create a VM a single time. </p>



<p>So, I had to look elsewhere. And I ended-up chosing <a href="https://runpod.io?ref=9ph6k4oh">RunPod</a>.</p>


<div class="wp-block-image">
<figure class="alignleft size-full"><img loading="lazy" decoding="async" width="121" height="129" src="https://www.rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-e1724617266317.png" alt="" class="wp-image-11005"/></figure>
</div>


<p>It allows to create a VM (<a href="https://docs.runpod.io/pods/overview">called Pod</a>) selecting among different types of really available GPUs, the billing is quite cheap, and in addition to a webui, it offers CLI and SDKs to orchestrate everything, for example from a Colab. The downside, at least for me, was they didn&#8217;t offer a real VM which I could freely administrate: the only way to install software and configs was via a docker image. I was lucky enough becase the image with everything I needed existed and was <code>https://ghcr.io/open-webui/open-webui:ollama</code>. Otherwise, I had to create one with my custom config, deploy somewhere, and then install on RunPod. Feasible, but why make life more complex?</p>



<p>So, while waiting to buy a machine with a GPU to be fully local, the <a href="https://runpod.io?ref=9ph6k4oh">RunPod</a> solution was a really good option.</p>



<p>Because my plan was to create different pods to experiment, instead of having a single, always-running instance, I created a <a href="https://docs.runpod.io/pods/storage/create-network-volumes">network volume</a> to store all my configs across instances, with these configs:</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="716" src="https://www.rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-networkvolume-1024x716.jpg" alt="" class="wp-image-11007" srcset="https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-networkvolume-1024x716.jpg 1024w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-networkvolume-300x210.jpg 300w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-networkvolume-200x140.jpg 200w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-networkvolume-768x537.jpg 768w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-networkvolume-1536x1074.jpg 1536w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-networkvolume-1100x769.jpg 1100w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-networkvolume.jpg 1848w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>I chose a location with available A40 GPUs &#8211; from my tests, a single one manages without problems the latest mid-size models (<em>alternatively, also a RTX3090 worked great too</em>), and 50GB were enought to store different models + configs.</p>



<p>Then, I created a <a href="https://docs.runpod.io/category/templates">template</a> (<em>Docker containers images paired with a configuration</em>) to host my &#8220;LLM brain&#8221;:</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="557" src="https://www.rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-template-1024x557.jpg" alt="" class="wp-image-11008" srcset="https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-template-1024x557.jpg 1024w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-template-300x163.jpg 300w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-template-200x109.jpg 200w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-template-768x417.jpg 768w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-template-1536x835.jpg 1536w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-template-2048x1113.jpg 2048w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-template-1100x598.jpg 1100w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>Relevant configurations:</p>



<ul class="wp-block-list">
<li>Container Image: <code>https://ghcr.io/open-webui/open-webui:ollama</code></li>



<li>Volume disk: 0Gb &#8211; no need to have a volume disk, as it will be replaced by the network volume later</li>



<li>Volume Mount Path: <code>/app/backend/data</code> &#8211; this is the folder where the docker image saves models, configs, etc.
<ul class="wp-block-list">
<li>Adding the folder with all configs to a volume disks in the template, and then connect a network volume during pod creation, automatically saves all the configs on the network volume</li>
</ul>
</li>



<li>Environment Variables
<ul class="wp-block-list">
<li>OLLAMA_MODELS: <code>/app/backend/data/ollama/models</code> &#8211; this will move downloaded models to the network volume, so there is no need to redownload models every time a new instance is created </li>
</ul>
</li>
</ul>



<p>Finally, I deployed a <a href="https://docs.runpod.io/pods/overview">pod</a> to &#8220;run the brain&#8221;, using the template just created, with 2 vCPUs and 8Gb or RAM, connected the network disk. I also selected &#8220;<a href="https://docs.runpod.io/references/faq/#secure-cloud-vs-community-cloud">Secure Cloud</a>&#8221; to have leave everything in the RunPod server farm, and a &#8220;<a href="https://docs.runpod.io/references/faq#what-are-pods">Spot instance</a>&#8220;, as I didn&#8217;t need absolute reliability for the tests. Waited for all the docker layers to be downloaded, opened the running Pod settings and connected to the HTTP port.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="407" src="https://www.rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-pod-1024x407.jpg" alt="" class="wp-image-11009" style="width:770px;height:auto" srcset="https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-pod-1024x407.jpg 1024w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-pod-300x119.jpg 300w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-pod-200x79.jpg 200w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-pod-768x305.jpg 768w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-pod-1536x610.jpg 1536w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-pod-2048x814.jpg 2048w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-pod-1100x437.jpg 1100w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>Welcome to a brand-new instace of Open WebUI.</p>



<h3 class="wp-block-heading">Customize the bot to impersonate Sonic</h3>



<p>There are different tutorial on how to configure Open WebUI. This is what I did to create a chatbot with a &#8220;Sonic flavor&#8221;.</p>



<p>First, I created the admin user, and the user for my kid, called &#8220;Leo&#8221;, and with a user role.</p>



<p>Then, from the Admin user:</p>



<ul class="wp-block-list">
<li>Settings -> Admin Panel -> Settings -> Models
<ul class="wp-block-list">
<li>Pull a Model from Ollama.com
<ul class="wp-block-list">
<li>gemma2:9b (list available <a href="https://ollama.com/library">here</a>)</li>
</ul>
</li>
</ul>
</li>



<li>Workspace -> Models -> Create a model
<ul class="wp-block-list">
<li>Image: upload an image</li>



<li>Name: Sonic</li>



<li>Model ID: sonic_v1</li>



<li>Base Model: gemma2:9b</li>



<li>Description: <code>Ciao, sono Sonic the Hedgehog</code>
<ul class="wp-block-list">
<li>Equivalment in English: <code>Hi, I'm Sonic the Hedgehog</code></li>
</ul>
</li>



<li>System prompt:
<ul class="wp-block-list">
<li><code>Interpreti Sonic the Hedgehog, della serie Sonic Adventure. Farai domande e risponderai come Sonic the Hedgehog, usando il tono, i modi e il vocabolario che Sonic the Hedgehog userebbe. Usa un linguaggio adatto ai bambini, non scivere spiegazioni. Rispondi in italiano. Hai la conoscenza di Sonic the Hedgehog. Vivi a Green Hills, nel Montana. Sei amichevole e sempre disponibile a dare una mano.</code>
<ul class="wp-block-list">
<li>The prompt is in Italian, so the model will speak in Italian.</li>
</ul>
</li>



<li><em>Equivalent in English</em>: <code>You play as Sonic the Hedgehog, from the Sonic Adventure series. You will ask and answer questions like Sonic the Hedgehog, using the tone, manner, and vocabulary Sonic the Hedgehog would use. Use child-friendly language, do not write any explanations. Answer in Italian. You have knowledge of Sonic the Hedgehog. You live in Green Hills, Montana. You are friendly and always willing to lend a hand.</code></li>
</ul>
</li>



<li>Capabilities: uncheck Vision, as this model is text-only for now</li>
</ul>
</li>
</ul>



<p>Then, I logged with my kid&#8217;s user and:</p>



<ul class="wp-block-list">
<li>Settings -> Settings
<ul class="wp-block-list">
<li>General -> Language -> Italian</li>



<li>Interface -> Default Model: Sonic
<ul class="wp-block-list">
<li>Unfortunately, whitelisting of specific models to specific users is <a href="https://github.com/open-webui/open-webui/discussions/2733">still in development</a></li>
</ul>
</li>
</ul>
</li>
</ul>



<p>Finally, my kid can interact with his preferred hero, in Italian.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="687" src="https://www.rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-chatwithsonic-1024x687.jpg" alt="" class="wp-image-11010" srcset="https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-chatwithsonic-1024x687.jpg 1024w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-chatwithsonic-300x201.jpg 300w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-chatwithsonic-200x134.jpg 200w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-chatwithsonic-768x515.jpg 768w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-chatwithsonic-1536x1031.jpg 1536w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-chatwithsonic-2048x1374.jpg 2048w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_runpod-chatwithsonic-1100x738.jpg 1100w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>Step one of the project&#8230; Achieved! <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p>To &#8220;pause&#8221; the pod from running, and save some money, the pod can be simply <a href="https://docs.runpod.io/pods/manage-pods#terminate-a-pod">terminated</a> in the RunPod management UI. All the configs will persist because they&#8217;re are stored in the network volume. To restart everything again, re-create the pod using the template, deploy and connect to it once ready.</p>
<p>The post <a href="https://rainbowbreeze.it/the-sonic-ai-project-the-brain/">The Sonic-AI project: the brain</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rainbowbreeze.it/the-sonic-ai-project-the-brain/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10998</post-id>	</item>
		<item>
		<title>The Sonic-AI project &#8211; intro</title>
		<link>https://rainbowbreeze.it/the-sonic-ai-project-intro/</link>
					<comments>https://rainbowbreeze.it/the-sonic-ai-project-intro/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo]]></dc:creator>
		<pubDate>Sun, 25 Aug 2024 16:19:37 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[GenAI]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[SonicAI]]></category>
		<guid isPermaLink="false">https://www.rainbowbreeze.it/?p=10997</guid>

					<description><![CDATA[<p>I always considered a &#8220;real world&#8221; project the best way to learn a new tech: get the hands dirty, be guided by (sort-of) realistic user requirements, and the excitement of building something step after step, one solved failure at time. This is why I decided to &#8220;be inspired&#8221; by the passion one of my kids &#8230; <a href="https://rainbowbreeze.it/the-sonic-ai-project-intro/" class="more-link">Continue reading <span class="screen-reader-text">The Sonic-AI project &#8211; intro</span> <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://rainbowbreeze.it/the-sonic-ai-project-intro/">The Sonic-AI project &#8211; intro</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="alignleft size-medium"><img loading="lazy" decoding="async" width="200" height="300" src="https://www.rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_logo-200x300.png" alt="" class="wp-image-11001" srcset="https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_logo-200x300.png 200w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_logo-683x1024.png 683w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_logo-133x200.png 133w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_logo-768x1152.png 768w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/08/20240800-SonicAI_logo.png 800w" sizes="auto, (max-width: 200px) 100vw, 200px" /></figure>
</div>


<p>I always considered a &#8220;real world&#8221; project the best way to learn a new tech: get the hands dirty, be guided by (<em>sort-of</em>) realistic user requirements, and the excitement of building something step after step, one solved failure at time.</p>



<p>This is why I decided to &#8220;be inspired&#8221; by the passion one of my kids has for <a href="https://en.wikipedia.org/wiki/Sonic_the_Hedgehog_(character)">Sonic the Hedgehog</a>, and use the latest tools available in the ML and GenAI space to create for him a &#8220;Sonic-AI buddy&#8221;. A virtual chatbot, looking and acting like Sonic, my kid can interact and conversate with, safely and having fun.</p>



<p>To break-down complexity of such project, so I don&#8217;t need to learn everything-about-LLM before creating something, I want to start with a very basic working prototype providing simple chatbot features (<a href="https://en.wikipedia.org/wiki/Minimum_viable_product">the so-called MVP</a>), and then develop different &#8220;skills&#8221;, with each one of them requiring learning and using different ML or GenAI techs to be be achieved. Incremental learning and improvements.</p>



<ul class="wp-block-list">
<li>The &#8220;<strong>Brain</strong>&#8221; (<em><a href="/the-sonic-ai-project-the-brain/">done</a></em>): the core part of the project, a text chatbot agent able to impersonate Sonic, to provide my kid the feeling he can ask basic questions to him, and gets replies coherent with the style of his preferred heroes.
<ul class="wp-block-list">
<li>Technologies: an LLM used as a chatbot, a UI to interact with it, a system prompt to give the basic characterization.</li>
</ul>
</li>



<li>The &#8220;<strong>Memories</strong>&#8221; (<em>in progress</em>): enrich the chatbot with domain-specific knowledge of the world of Sonic and his friends, so conversations won&#8217;t only be &#8220;in the tone&#8221; of Sonic, but also relavant to Sonic-verse.
<ul class="wp-block-list">
<li>Technologies: a mix of better prompting, fine tuning, RAG or something else to give the LLM the right knowledge about the character to impersonate</li>
</ul>
</li>



<li>The &#8220;<strong>Voice</strong>&#8221; (<em>in progress</em>): what if the bot can speak with <a href="https://en.wikipedia.org/wiki/Sonic_the_Hedgehog_(film)">the voice</a> my kid associates with Sonic?
<ul class="wp-block-list">
<li>Technologies: a customized Text-to-Speech model trained on the voice to reproduce, and a speaker</li>
</ul>
</li>



<li>The &#8220;<strong>Hearing</strong>&#8221; (<em>in progress</em>): to completely get rid of text interaction, questions should be asked via voice
<ul class="wp-block-list">
<li>Technologies: connect the chatbot with a Speech-To-Text engine, and a mic</li>
</ul>
</li>



<li>The &#8220;<strong>Eyes</strong>&#8221; (<em>in progress</em>): Sonic should be able to see the world around him
<ul class="wp-block-list">
<li>Technologies: something to capture a video stream, and a multimodal LLM to process images and text.</li>
</ul>
</li>



<li>The &#8220;<strong>Body</strong>&#8221; (<em>in progress</em>): This is something that will connect the different input/output sensors. I&#8217;m still unsure how to create the body.about this In addition to a voice, the bot should have some sort of tangible body
<ul class="wp-block-list">
<li>Technologies: it could be a 3D printed figure of Sonic, an animated characted or something else</li>
</ul>
</li>
</ul>



<p>There is another preprequisite I want to fullfil: <strong>everything can run locally</strong> and <strong>based on OSS software</strong>. I&#8217;m <s>a little bit paranoic</s> mindful about privacy, and for no reasons the interaction of my kid should end-up in training dataset, or for internal model analysis, or somewhere else. So, privacy first.</p>



<p>Let&#8217;s start with &#8220;<a href="/the-sonic-ai-project-the-brain/">the brain</a>&#8220;, the main element to which all the rest can then be attached.</p>
<p>The post <a href="https://rainbowbreeze.it/the-sonic-ai-project-intro/">The Sonic-AI project &#8211; intro</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rainbowbreeze.it/the-sonic-ai-project-intro/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10997</post-id>	</item>
		<item>
		<title>Serving Gemma 2B for free using Google Colab</title>
		<link>https://rainbowbreeze.it/serving-gemma-2b-for-free-using-google-colab/</link>
					<comments>https://rainbowbreeze.it/serving-gemma-2b-for-free-using-google-colab/#comments</comments>
		
		<dc:creator><![CDATA[Alfredo]]></dc:creator>
		<pubDate>Thu, 15 Aug 2024 23:57:00 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[GenAI]]></category>
		<category><![CDATA[LLM]]></category>
		<guid isPermaLink="false">https://www.rainbowbreeze.it/?p=10993</guid>

					<description><![CDATA[<p>The free tier of Google Colab runtime, powered only by a CPU, is enough to successfully run Google&#8217;s Gemma 2B parameters model and prompt it using the Colab UI.In addition, it&#8217;s possible to set up the Colab to serve the model, so it can be consumed from anywhere via a normal REST call. Colab with &#8230; <a href="https://rainbowbreeze.it/serving-gemma-2b-for-free-using-google-colab/" class="more-link">Continue reading <span class="screen-reader-text">Serving Gemma 2B for free using Google Colab</span> <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://rainbowbreeze.it/serving-gemma-2b-for-free-using-google-colab/">Serving Gemma 2B for free using Google Colab</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>The free tier of Google Colab runtime, powered only by a CPU, is enough to successfully run <a href="https://huggingface.co/google/gemma-2b">Google&#8217;s Gemma 2B parameters model</a> and prompt it using the Colab UI.<br>In addition, it&#8217;s possible to set up the Colab to serve the model, so it can be consumed from anywhere via a normal REST call.</p>



<p>Colab with all the instructions is <a href="https://colab.research.google.com/drive/1PYibBP3TjxAWuUdY0kQU6xWfh-k6RArb#scrollTo=YuulwOQkzKF1">here</a>.</p>



<h3 class="wp-block-heading">Install Ollama in Colab notebook</h3>



<pre class="wp-block-code"><code>!curl -fsSL https://ollama.com/install.sh | sh</code></pre>



<p>This command installs <a href="https://ollama.com/">Ollama</a> on the notebook.</p>



<h3 class="wp-block-heading">Expose Ollama via a Cloudflare tunnel</h3>



<p>In order to &#8220;expose&#8221; the Ollama instance installed in the Colab notebook to the external world, a  Cloudflare Tunnel is created, using the <a href="https://github.com/cloudflare/cloudflared">official client</a>. The following lines install the required packages:</p>



<pre class="wp-block-code"><code>!wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
!dpkg -i cloudflared-linux-amd64.deb</code></pre>



<h3 class="wp-block-heading">Create the tunnel and capture the TryCloudflare subdomain</h3>



<p>Instead of adding a subdomain to a registered Cloudflare&#8217;s account, a random subdomain is generated by <a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/do-more-with-tunnels/trycloudflare/">TryCloudflare</a>. No registration required.</p>



<p>The following code exists for two purposes: start the Cloudflare tunnel as soon as Ollama is ready to serve, and return the random subdomain created by TryCloudflare.</p>



<pre class="wp-block-code"><code>import os
# Set OLLAMA_HOST to specify bind address
# https://github.com/ollama/ollama/blob/main/docs/faq.md#setting-environment-variables-on-linux
os.environ.update({'OLLAMA_HOST': '0.0.0.0'})

import subprocess
import threading
import time
import socket

def iframe_thread(port):
    while True:
        time.sleep(0.5)
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        result = sock.connect_ex(('127.0.0.1', port))
        if result == 0:
            break
        sock.close()

    p = subprocess.Popen(&#91;"cloudflared", "tunnel", "--url", f"http://127.0.0.1:{port}"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    for line in p.stderr:
        l = line.decode()
        if "trycloudflare.com " in l:
            print("\n\n\n\n\n")
            print("running ollama server\n\n", l&#91;l.find("http"):], end='')
            print("\n\n\n\n\n")

threading.Thread(target=iframe_thread, daemon=True, args=(11434,)).start()</code></pre>



<p>After setting some enviromental variables, a <code>iframe_thread</code> function is defined. In the function, a <code>while True</code> loop waits till the Ollama server is up and running. Once this happen, the <code>subprocess.Popen</code> creates the Cloudflare tunnel pointing to the local Ollama installation, using the command <code>cloudflared</code>, and prints the <em>xxxx.trycloudflare.com</em> randomly generated subdomain.</p>



<p>The last line of code lauches the <code>iframe_thread</code>  as a background <code>Thread</code>. The wait for being connected with the Ollama server starts.</p>



<h3 class="wp-block-heading">Launch the Ollama server</h3>



<p>At this point, everything is ready to launch the Ollama server</p>



<pre class="wp-block-code"><code>!ollama serve</code></pre>



<p>Colab will start the Ollama server, and the previously created thread, which was waiting for this to happen, quits from the <code>while</code> loop, creates the tunnel and print the subdomain. Looking at the output of this Colab block something similar will appear:</p>



<pre class="wp-block-code"><code>Couldn't find '/root/.ollama/id_ed25519'. Generating new private key.
Your new public key is: 

ssh-ed25519 blablablabla

2024/08/15 21:29:34 routes.go:1125: INFO server config env="map&#91;CUDA_VISIBLE_DEVICES: GPU_DEVICE_ORDINAL: HIP_VISIBLE_DEVICES: HSA_OVERRIDE_GFX_VERSION: OLLAMA_DEBUG:false OLLAMA_FLASH_ATTENTION:false OLLAMA_HOST:http://0.0.0.0:11434 OLLAMA_INTEL_GPU:false OLLAMA_KEEP_ALIVE:5m0s OLLAMA_LLM_LIBRARY: OLLAMA_MAX_LOADED_MODELS:0 OLLAMA_MAX_QUEUE:512 OLLAMA_MODELS:/root/.ollama/models OLLAMA_NOHISTORY:false OLLAMA_NOPRUNE:false OLLAMA_NUM_PARALLEL:0 OLLAMA_ORIGINS:&#91;http://localhost https://localhost http://localhost:* https://localhost:* http://127.0.0.1 https://127.0.0.1 http://127.0.0.1:* https://127.0.0.1:* http://0.0.0.0 https://0.0.0.0 http://0.0.0.0:* https://0.0.0.0:* app://* file://* tauri://*] OLLAMA_RUNNERS_DIR: OLLAMA_SCHED_SPREAD:false OLLAMA_TMPDIR: ROCR_VISIBLE_DEVICES:]"
&#91;...]


running ollama server

 <strong>https://sand-commerce-fields-danger.trycloudflare.com</strong>                                     </code></pre>



<p>Bingo! The address <strong>https://sand-commerce-fields-danger.trycloudflare.com</strong> is the url to use to reach our Ollama-on-Colab instance, the <em>&lt;your_cloudflare_subdomain></em> in the following snippets.</p>



<h3 class="wp-block-heading">Set up Ollama using API calls</h3>



<p>Last, but not the least, Ollama need to download the Gemma 2B model. From this point ongoing, while the Colab notebook is busy keeps running the Ollama server, the rest of the interaction happen via <a href="https://github.com/ollama/ollama/blob/main/docs/api.md">Ollama API</a>, available via the newly created Cloudflare tunnel. <br>From any command line shell available (<em>a local computer, a mobile device, etc</em>) these two commands need to be launched (<em>only the first one is really mandatory, the second one is useful to improve performances</em>):</p>



<pre class="wp-block-code"><code>curl &lt;your_cloudflare_subdomain>/api/pull -d '{ "name": "gemma:2b" }'</code></pre>



<p>This call instructs Ollama to download the <a href="https://ollama.com/library/gemma:2b">Gemma 2B model</a> via the <code>pull</code> API endpoint.</p>



<pre class="wp-block-code"><code>curl &lt;your_cloudflare_subdomain>/api/generate -d '{"model": "gemma:2b", "keep_alive": -1}'</code></pre>



<p>This call instructs Ollama to keep the gemma:2b model loaded in memory, instead of discarding it after 5 minutes of non usage (<em>the default behaviour</em>).</p>



<h3 class="wp-block-heading">Ask question to Gemma 2B</h3>



<p>It&#8217;s time to ask the first question to Gemma:</p>



<pre class="wp-block-code"><code>curl &lt;your_cloudflare_subdomain>/api/generate -d '{"model": "gemma:2b", "stream":false, "prompt": "Create a 10 line poem about love, with rhyming couplets"}'</code></pre>



<p><code>generate</code> API endpoint generates a response for a given prompt with a provided model.<br><code>"stream":false</code> waits for the model to elaborate the answer and returns it all at once, instead of a stream of tokens.</p>



<p>To generate the reply, Gemma took approx 60 to 90 seconds. Not the quickest in the world, but all CPU powered! ;)</p>



<p>The model&#8217;s reply is in the json message payload. To focus on it, and filter all the rest out, pipe the previous command to <code><a href="https://jqlang.github.io/jq/">jq</a></code>:</p>



<pre class="wp-block-code"><code>curl &lt;your_cloudflare_subdomain>/api/generate -d '{"model": "gemma:2b", "stream":false, "prompt": "Create a 10 line poem about love, with rhyming couplets"}'<em> | jq ".response"</em></code></pre>



<h3 class="wp-block-heading">Does it works forever?</h3>



<p>Well, no. <a href="https://colab.research.google.com/signup">Google Colab FAQ </a>says the free notebook can run for at most 12 hours.<br>But no fear, once the notebook has been shut down, it&#8217;s just a matter to launch another &#8220;<em>Run all</em>&#8220;, wait to the new Cloudflare random subdomain, and restart the fun.</p>
<p>The post <a href="https://rainbowbreeze.it/serving-gemma-2b-for-free-using-google-colab/">Serving Gemma 2B for free using Google Colab</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rainbowbreeze.it/serving-gemma-2b-for-free-using-google-colab/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10993</post-id>	</item>
		<item>
		<title>Using AI Tools for Effortless Event Planning</title>
		<link>https://rainbowbreeze.it/using-ai-tools-for-effortless-event-planning/</link>
					<comments>https://rainbowbreeze.it/using-ai-tools-for-effortless-event-planning/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo]]></dc:creator>
		<pubDate>Fri, 19 Jul 2024 16:17:50 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Talk]]></category>
		<category><![CDATA[Community Builder]]></category>
		<category><![CDATA[Community management]]></category>
		<category><![CDATA[Gemini]]></category>
		<category><![CDATA[GenAI]]></category>
		<guid isPermaLink="false">https://www.rainbowbreeze.it/?p=10990</guid>

					<description><![CDATA[<p>Tired of juggling event details and missing out on creative inspiration? This session dives deep into the world of AI-powered tools for community managers, sharing practical strategies for optimizing the entire event planning process. We&#8217;ll delve into specific tools that can assist with argument selection, creative asset and marketing material creation, survey analysis, and attendee data &#8230; <a href="https://rainbowbreeze.it/using-ai-tools-for-effortless-event-planning/" class="more-link">Continue reading <span class="screen-reader-text">Using AI Tools for Effortless Event Planning</span> <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://rainbowbreeze.it/using-ai-tools-for-effortless-event-planning/">Using AI Tools for Effortless Event Planning</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Tired of juggling event details and missing out on creative inspiration? This session dives deep into the world of AI-powered tools for community managers, sharing practical strategies for optimizing the entire event planning process. We&#8217;ll delve into specific tools that can assist with argument selection, creative asset and marketing material creation, survey analysis, and attendee data insights, and much more.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="1100" height="619" src="https://www.youtube.com/embed/8p_sQjLi7EY?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<p>(Google North America Community Summit 2024 &#8211; <a href="https://rainbowbreeze.github.io/ai_for_community_events/">Repo with all the prompts</a>)</p>
<p>The post <a href="https://rainbowbreeze.it/using-ai-tools-for-effortless-event-planning/">Using AI Tools for Effortless Event Planning</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rainbowbreeze.it/using-ai-tools-for-effortless-event-planning/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10990</post-id>	</item>
		<item>
		<title>A template to show Zigbee devices with flat battery</title>
		<link>https://rainbowbreeze.it/template-to-show-zigbee-devices-with-flat-battery/</link>
					<comments>https://rainbowbreeze.it/template-to-show-zigbee-devices-with-flat-battery/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo]]></dc:creator>
		<pubDate>Wed, 03 Jan 2024 09:00:00 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Home Assistant]]></category>
		<category><![CDATA[Home Automation]]></category>
		<guid isPermaLink="false">https://www.rainbowbreeze.it/?p=10980</guid>

					<description><![CDATA[<p>With a lot of battery-powered ZigBee devices on my home network (thermostats, contact sensors, remote controls, etc) it&#8217;s useful to have an Home Assistant dashboard with the status of all the batteries, to change the ones before the device goes off. Simple task, with an Entities Card: With the following result: But this approach has &#8230; <a href="https://rainbowbreeze.it/template-to-show-zigbee-devices-with-flat-battery/" class="more-link">Continue reading <span class="screen-reader-text">A template to show Zigbee devices with flat battery</span> <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://rainbowbreeze.it/template-to-show-zigbee-devices-with-flat-battery/">A template to show Zigbee devices with flat battery</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>With a lot of battery-powered ZigBee devices on my home network (thermostats, contact sensors, remote controls, etc) it&#8217;s useful to have an <a href="/tag/home-assistant/">Home Assistant</a> dashboard with the status of all the batteries, to change the ones before the device goes off.</p>



<p>Simple task, with an <a href="https://www.home-assistant.io/dashboards/entities/">Entities Card</a>:</p>



<pre class="wp-block-code"><code>type: entities
title: Battery level
state_color: true
entities:
  - type: section
    label: Remote controls
  - entity: sensor.switch_01_ikea_e1743_battery
  - type: section
    label: Thermostats
  - entity: sensor.thermo_001_battery
    name: Living room
  - entity: sensor.thermo_002_battery
    name: Parents room</code></pre>



<p>With the following result:</p>



<figure class="wp-block-image size-medium"><img loading="lazy" decoding="async" width="300" height="214" src="https://www.rainbowbreeze.it/wordpress/wp-content/uploads/2024/01/20240102-HA_battery_dash-300x214.png" alt="Home Assistant Battery dashboard" class="wp-image-10981" srcset="https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/01/20240102-HA_battery_dash-300x214.png 300w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/01/20240102-HA_battery_dash-200x143.png 200w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/01/20240102-HA_battery_dash-768x549.png 768w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/01/20240102-HA_battery_dash.png 926w" sizes="auto, (max-width: 300px) 100vw, 300px" /></figure>



<p>But this approach has three main drawbacks: </p>



<ul class="wp-block-list">
<li>Every time a new devices is added to the network, the card needs to be updated</li>



<li>Even if the colors help to identify at a glance the batteries that need to be replaced, the search is still a manual process</li>



<li>It cannot be automated, for example sending a message every time a battery goes under a certain level</li>
</ul>



<h3 class="wp-block-heading">Templates to the rescue</h3>



<p>Here a <a href="https://www.home-assistant.io/dashboards/markdown/">Markdown card</a> with a template that identify all the entities in the system tracking battery level, find the ones with a value below a certain number, and list them:</p>



<pre class="wp-block-code"><code>type: markdown
content: |
  {#- Find all the battery sensors -#}
  {%- set sensors = expand(states.sensor)
    | rejectattr('state', 'in', &#91;'unavailable', 'undefined', 'unknown'])
    | selectattr('attributes.device_class', 'defined') 
    | selectattr('attributes.device_class', '==', 'battery') 
    | rejectattr('entity_id', "search", "keepout_8p")
    | selectattr('attributes.unit_of_measurement', 'defined') 
    | selectattr('attributes.unit_of_measurement', '==', '%') 
    | list %}
  {#- Show only the entities with a battery level below a certain threshold -#}
  {%- for s in sensors -%}
  {%- if s.state | int(0) &lt; 30 -%}
    {{ s.attributes.friendly_name + ": " + s.state }}
    {#- s.entity_id can be used too #}
  {% endif -%}
  {% endfor -%}
title: Devices with low battery level</code></pre>



<p>With this final result:</p>



<figure class="wp-block-image size-medium"><img loading="lazy" decoding="async" width="300" height="109" src="https://www.rainbowbreeze.it/wordpress/wp-content/uploads/2024/01/20240102-HA_battery_markdown-300x109.png" alt="Home Assistant Markdown card" class="wp-image-10982" srcset="https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/01/20240102-HA_battery_markdown-300x109.png 300w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/01/20240102-HA_battery_markdown-200x72.png 200w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/01/20240102-HA_battery_markdown-768x278.png 768w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2024/01/20240102-HA_battery_markdown.png 784w" sizes="auto, (max-width: 300px) 100vw, 300px" /></figure>



<p>Let&#8217;s look at the code block by block.</p>



<h4 class="wp-block-heading">Find all the entities measuring a battery level</h4>



<pre class="wp-block-code"><code>  {#- Find all the battery sensors -#}
  {%- set sensors = expand(states.sensor)
    | rejectattr('state', 'in', &#91;'unavailable', 'undefined', 'unknown'])
    | selectattr('attributes.device_class', 'defined') 
    | selectattr('attributes.device_class', '==', 'battery') 
    | rejectattr('entity_id', "search", "keepout_8p")
    | selectattr('attributes.unit_of_measurement', 'defined') 
    | selectattr('attributes.unit_of_measurement', '==', '%') 
    | list %}</code></pre>



<p>First, the expand() command returns all the sensors in the system, then a series of <a href="https://jinja.palletsprojects.com/en/3.0.x/templates/#list-of-builtin-filters">Jinja 2 filters</a> are applied to remove unavailable, undefined and unknown entities, find all the entities with a battery device class, remove entity_id of my phone (<em>keepout_8p</em>) and find all the remainig entities with the % as unit of measurement of the battery.</p>



<h4 class="wp-block-heading">Find all the battery level below a certain threshold </h4>



<pre class="wp-block-code"><code>  {#- Show only the entities with a battery level below a certain threshold -#}
  {%- for s in sensors -%}
  {%- if s.state | int(0) &lt; 30 -%}
    {{ s.attributes.friendly_name + ": " + s.state }}
    {#- s.entity_id can be used too #}
  {% endif -%}
  {% endfor -%}</code></pre>



<p>A simple check for all the sensors found previously, to identify if there are battery levels below a certain threshold. To be sure a comparison between numbers is done, the state value is parsed as integer, and then compared with the threshold level. Once the entity is identified, the message to show is assembled, chaining different property of the sensor.</p>



<h3 class="wp-block-heading">A template sensor with the devices</h3>



<p>To get the information, but inside an sensor, it could be useful to create a <a href="https://www.home-assistant.io/integrations/template/">template sensor</a>. The logic is the same:</p>



<pre class="wp-block-code"><code> template:
  - sensor:
      - name: ZigBee devices battery to change
        unique_id: zigbee_devices_battery_to_change
        state: >
          {#- Find all the battery sensors -#}
          {%- set sensors = expand(states.sensor)
            | rejectattr('state', 'in', &#91;'unavailable', 'undefined', 'unknown'])
            | selectattr('attributes.device_class', 'defined') 
            | selectattr('attributes.device_class', '==', 'battery') 
            | rejectattr('entity_id', "search", "keepout_8p")
            | selectattr('attributes.unit_of_measurement', 'defined') 
            | selectattr('attributes.unit_of_measurement', '==', '%') 
            | list %}
          {#- Show only the devices with a battery level below a certain threshold -#}
          {%- for s in sensors -%}
          {% if s.state | int(0) &lt; 30 %}
          {{ s.attributes.friendly_name + ": " + s.state }}
          {#- s.entity_id can be used too -#}
          {% endif -%}
          {%- endfor -%}</code></pre>
<p>The post <a href="https://rainbowbreeze.it/template-to-show-zigbee-devices-with-flat-battery/">A template to show Zigbee devices with flat battery</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rainbowbreeze.it/template-to-show-zigbee-devices-with-flat-battery/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10980</post-id>	</item>
		<item>
		<title>The Community Commitment Curve to architect community engagement</title>
		<link>https://rainbowbreeze.it/the-community-commitment-curve-to-architect-community-engagement/</link>
					<comments>https://rainbowbreeze.it/the-community-commitment-curve-to-architect-community-engagement/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo]]></dc:creator>
		<pubDate>Thu, 12 Oct 2023 08:05:00 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Talk]]></category>
		<category><![CDATA[Community Builder]]></category>
		<category><![CDATA[Community Commitment Curve]]></category>
		<category><![CDATA[Community management]]></category>
		<guid isPermaLink="false">https://www.rainbowbreeze.it/?p=10979</guid>

					<description><![CDATA[<p>&#8220;How to use the Community Commitment Curve to architect community engagement&#8221; is a comprehensive session aimed at helping individuals and organizations create and sustain vibrant developer marketing communities. The session will provide insights into the concept of the Community Commitment Curve, a strategic framework designed to map and optimize community engagement. (Developer Marketing Alliance webinar, &#8230; <a href="https://rainbowbreeze.it/the-community-commitment-curve-to-architect-community-engagement/" class="more-link">Continue reading <span class="screen-reader-text">The Community Commitment Curve to architect community engagement</span> <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://rainbowbreeze.it/the-community-commitment-curve-to-architect-community-engagement/">The Community Commitment Curve to architect community engagement</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>&#8220;How to use the Community Commitment Curve to architect community engagement&#8221; is a comprehensive session aimed at helping individuals and organizations create and sustain vibrant developer marketing communities.</p>



<p>The session will provide insights into the concept of the Community Commitment Curve, a strategic framework designed to map and optimize community engagement.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="1100" height="619" src="https://www.youtube.com/embed/gMdTbQXpZik?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<p>(<a href="https://www.developermarketing.io/">Developer Marketing Alliance</a> webinar, 11 Oct 2023)</p>
<p>The post <a href="https://rainbowbreeze.it/the-community-commitment-curve-to-architect-community-engagement/">The Community Commitment Curve to architect community engagement</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rainbowbreeze.it/the-community-commitment-curve-to-architect-community-engagement/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10979</post-id>	</item>
		<item>
		<title>A playbook for a successful developer community operations team</title>
		<link>https://rainbowbreeze.it/a-playbook-for-a-successful-developer-community-operations-team/</link>
					<comments>https://rainbowbreeze.it/a-playbook-for-a-successful-developer-community-operations-team/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo]]></dc:creator>
		<pubDate>Fri, 08 Sep 2023 13:00:00 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Talk]]></category>
		<category><![CDATA[Community Builder]]></category>
		<category><![CDATA[Community management]]></category>
		<category><![CDATA[Community Operations]]></category>
		<guid isPermaLink="false">https://www.rainbowbreeze.it/?p=10988</guid>

					<description><![CDATA[<p>Shared lessons learned from years of hands-on experience in community building, including: (DevRelCon London 2023 &#8211; Slides)</p>
<p>The post <a href="https://rainbowbreeze.it/a-playbook-for-a-successful-developer-community-operations-team/">A playbook for a successful developer community operations team</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Shared lessons learned from years of hands-on experience in community building, including:</p>



<ul class="wp-block-list">
<li>Defining &#8220;Community Operations&#8221;: Demystifying the role and establishing its significance within an organization.The core building blocks of a Community Operations team.</li>



<li>The power of data-informed decision-making for community strategy.</li>



<li>The Metrics That Matter: Identifying KPIs that go beyond vanity metrics to justify the existence, and impact, of a community program.</li>



<li>Actionable steps to build a high-performing Community Operations team</li>
</ul>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="1100" height="619" src="https://www.youtube.com/embed/2GDcIvvQfQ4?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<p>(<a href="https://developerrelations.com/">DevRelCon London 2023</a> &#8211; <a href="https://docs.google.com/presentation/d/1b42X6RgABe37RwS4RGyyIokkmYjYp7zLp41F-Cn45zs/edit?usp=drive_link">Slides</a>)</p>
<p>The post <a href="https://rainbowbreeze.it/a-playbook-for-a-successful-developer-community-operations-team/">A playbook for a successful developer community operations team</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rainbowbreeze.it/a-playbook-for-a-successful-developer-community-operations-team/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10988</post-id>	</item>
		<item>
		<title>Leadership Lessons From A Team of Community Builders</title>
		<link>https://rainbowbreeze.it/leadership-lessons-from-a-team-of-community-builders-2/</link>
					<comments>https://rainbowbreeze.it/leadership-lessons-from-a-team-of-community-builders-2/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo]]></dc:creator>
		<pubDate>Fri, 28 Jul 2023 08:00:00 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Talk]]></category>
		<category><![CDATA[Community Builder]]></category>
		<category><![CDATA[Community management]]></category>
		<category><![CDATA[Leadership]]></category>
		<guid isPermaLink="false">https://www.rainbowbreeze.it/?p=10969</guid>

					<description><![CDATA[<p>Good managers are made, not born. It makes no difference for a team of community builders, with added complexities such as remote working, high burnout risk, unclear career path, etc. I’ll share my stories covering topics like hiring, setting a vision, building and tracking metrics, managing a remote team, keeping work-life in harmony, scaling, etc &#8230; <a href="https://rainbowbreeze.it/leadership-lessons-from-a-team-of-community-builders-2/" class="more-link">Continue reading <span class="screen-reader-text">Leadership Lessons From A Team of Community Builders</span> <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://rainbowbreeze.it/leadership-lessons-from-a-team-of-community-builders-2/">Leadership Lessons From A Team of Community Builders</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Good managers are made, not born. It makes no difference for a team of community builders, with added complexities such as remote working, high burnout risk, unclear career path, etc. I’ll share my stories covering topics like hiring, setting a vision, building and tracking metrics, managing a remote team, keeping work-life in harmony, scaling, etc &#8211; while working in the context of a community team.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="1100" height="619" src="https://www.youtube.com/embed/6QJixmUkK5k?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<p>(<a href="https://www.communityrebellionconference.com/">Community Rebellion Conference</a>, June 2023)</p>



<p><a href="https://docs.google.com/presentation/d/1TgMRM4RAL_gr8fnHq3tuj4lT8vtT7bKnf1BEfxxPXhw/edit?usp=sharing">Slides</a>, with a lot of speaker&#8217;s notes</p>
<p>The post <a href="https://rainbowbreeze.it/leadership-lessons-from-a-team-of-community-builders-2/">Leadership Lessons From A Team of Community Builders</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rainbowbreeze.it/leadership-lessons-from-a-team-of-community-builders-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10969</post-id>	</item>
		<item>
		<title>Scaling communities through chapters</title>
		<link>https://rainbowbreeze.it/scaling-communities-through-chapters/</link>
					<comments>https://rainbowbreeze.it/scaling-communities-through-chapters/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo]]></dc:creator>
		<pubDate>Mon, 30 Jan 2023 22:33:11 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Talk]]></category>
		<category><![CDATA[Community management]]></category>
		<category><![CDATA[GDG]]></category>
		<guid isPermaLink="false">https://www.rainbowbreeze.it/?p=10959</guid>

					<description><![CDATA[<p>Alfredo Morresi and Van Riper have over a decade of experience at Google in developer relationship and community management. They will talk about their experiences in the context of the Google Developer Groups, a meta community program born in 2009 that has grown to 1,000+ chapters across 140 countries. They discuss how to build a &#8230; <a href="https://rainbowbreeze.it/scaling-communities-through-chapters/" class="more-link">Continue reading <span class="screen-reader-text">Scaling communities through chapters</span> <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://rainbowbreeze.it/scaling-communities-through-chapters/">Scaling communities through chapters</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Alfredo Morresi and Van Riper have over a decade of experience at Google in developer relationship and community management. They will talk about their experiences in the context of the Google Developer Groups, a meta community program born in 2009 that has grown to 1,000+ chapters across 140 countries.</p>



<p>They discuss how to build a program at that scale with benefits for the company, benefits for the developer community, and benefits for the world.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="600" height="314" src="https://www.rainbowbreeze.it/wordpress/wp-content/uploads/2023/01/20230126-Gradual_community_online_event.png" alt="" class="wp-image-10960" srcset="https://rainbowbreeze.it/wordpress/wp-content/uploads/2023/01/20230126-Gradual_community_online_event.png 600w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2023/01/20230126-Gradual_community_online_event-300x157.png 300w, https://rainbowbreeze.it/wordpress/wp-content/uploads/2023/01/20230126-Gradual_community_online_event-200x105.png 200w" sizes="auto, (max-width: 600px) 100vw, 600px" /></figure>



<p>(<a href="https://community.gradual.com/public/videos/scaling-communities-through-chapters-a-case-study-of-google-developer-groups-with-alfredo-morresi-and-van-riper-2023-01-27">link to the video and transcript</a>)</p>
<p>The post <a href="https://rainbowbreeze.it/scaling-communities-through-chapters/">Scaling communities through chapters</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rainbowbreeze.it/scaling-communities-through-chapters/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10959</post-id>	</item>
		<item>
		<title>A Playbook for a Successful Community Operations Team</title>
		<link>https://rainbowbreeze.it/a-playbook-for-a-successful-community-operations-team/</link>
					<comments>https://rainbowbreeze.it/a-playbook-for-a-successful-community-operations-team/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo]]></dc:creator>
		<pubDate>Sat, 24 Sep 2022 16:51:21 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Talk]]></category>
		<category><![CDATA[Community Builder]]></category>
		<category><![CDATA[Community management]]></category>
		<category><![CDATA[Community Operations]]></category>
		<category><![CDATA[Leadership]]></category>
		<guid isPermaLink="false">https://www.rainbowbreeze.it/?p=10956</guid>

					<description><![CDATA[<p>When a community program grows, it moves from a one-person band role, to a team of people, to a team of teams. And Community Operations is often one of the first teams formed. When to start one, and how to scale it? What are its key responsibilities? It’s just about data, dashboards and automations, or &#8230; <a href="https://rainbowbreeze.it/a-playbook-for-a-successful-community-operations-team/" class="more-link">Continue reading <span class="screen-reader-text">A Playbook for a Successful Community Operations Team</span> <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://rainbowbreeze.it/a-playbook-for-a-successful-community-operations-team/">A Playbook for a Successful Community Operations Team</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>When a community program grows, it moves from a one-person band role, to a team of people, to a team of teams. And Community Operations is often one of the first teams formed. When to start one, and how to scale it? What are its key responsibilities? It’s just about data, dashboards and automations, or is there something more? In this session, I shared my best learnings in leading a dev community operations team in Google, the most embarrassing failures and &#8220;the road head&#8221;.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="1100" height="619" src="https://www.youtube.com/embed/UbRz6283IEU?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<p><em>(<a href="https://events.cmxhub.com/events/details/cmx-cmx-hq-presents-cmx-summit-2022-thrive/">CMX Summit</a>, Sept 2022)</em></p>



<p><a href="https://docs.google.com/presentation/d/1fsUTGsxTzXVw__a6B0S1hR4VJDIdmG2ocRsQbhPZG8U/edit">Here are the slides,</a> with lot of info in the speaker&#8217;s notes too.</p>
<p>The post <a href="https://rainbowbreeze.it/a-playbook-for-a-successful-community-operations-team/">A Playbook for a Successful Community Operations Team</a> appeared first on <a href="https://rainbowbreeze.it">Rainbowbreeze</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rainbowbreeze.it/a-playbook-for-a-successful-community-operations-team/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10956</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin


Served from: rainbowbreeze.it @ 2026-04-17 09:08:23 by W3 Total Cache
-->