<?xml version="1.0" encoding="UTF-8"?>
<rss 
    version="2.0"
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:content="http://purl.org/rss/1.0/modules/content/" 
    xmlns:atom="http://www.w3.org/2005/Atom" 
    xmlns:media="http://search.yahoo.com/mrss/" 
>
    <channel>
        <title><![CDATA[Qui Academy]]></title>
        <description><![CDATA[Agent Orchestration Excellence]]></description>
        <link>https://qui.academy</link>
        <image>
            <url>https://qui.academy/favicon.png</url>
            <title>Qui Academy</title>
            <link>https://qui.academy</link>
        </image>
        <generator>Ghost 6.70</generator>
        <lastBuildDate>Wed, 14 Oct 2026 22:21:29 +0000</lastBuildDate>
        <atom:link href="https://qui.academy" rel="self" type="application/rss+xml"/>
        <ttl>60</ttl>

                <item>
                    <title><![CDATA[Exercise 1B: Testing Memory Across Sessions]]></title>
                    <description><![CDATA[Test semantic memory across sessions and learn how the awareness slider controls memory context.]]></description>
                    <link>https://qui.academy/courses/masters-of-cognitive-architecture-level-1/exercise-1b-memory-system-testing-30-minutes/</link>
                    <guid isPermaLink="false">68d2fe5e5cfe9900012f061a</guid>

                        <category><![CDATA[Masters of Cognitive Architecture]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Tue, 09 Jun 2026 20:09:00 +0000</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                        <span class="hidden first:inline">
                                        This lesson is for subscribers on the  tiers only
                                    </span>

                        <span class="hidden first:inline">
                            This post is for subscribers on the  tiers only
                        </span>                    
                
        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Exercise 3B: Agentic Research Pipeline]]></title>
                    <description><![CDATA[Build an agentic workflow that autonomously chains Qrawl, Terminal, and summarisation.]]></description>
                    <link>https://qui.academy/courses/masters-of-cognitive-architecture-level-1/exercise-3b-communication-pattern-analysis/</link>
                    <guid isPermaLink="false">68d303dd5cfe9900012f067a</guid>

                        <category><![CDATA[Masters of Cognitive Architecture]]></category>

                        <dc:creator><![CDATA[Keren Flavell]]></dc:creator>

                    <pubDate>Wed, 03 Jun 2026 20:34:00 +0000</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                        <span class="hidden first:inline">
                                        This lesson is for subscribers on the  tiers only
                                    </span>

                        <span class="hidden first:inline">
                            This post is for subscribers on the  tiers only
                        </span>                    
                
        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Exercise 2B: Control Codes &amp; Decision Flows]]></title>
                    <description><![CDATA[Use control codes and variable substitution in a ThinkThing prioritisation workflow.]]></description>
                    <link>https://qui.academy/courses/masters-of-cognitive-architecture-level-1/exercise-2b-thought-chain-implementation-45-minutes/</link>
                    <guid isPermaLink="false">68d301785cfe9900012f0646</guid>

                        <category><![CDATA[Masters of Cognitive Architecture]]></category>

                        <dc:creator><![CDATA[Keren Flavell]]></dc:creator>

                    <pubDate>Wed, 03 Jun 2026 20:25:00 +0000</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                        <span class="hidden first:inline">
                                        This lesson is for subscribers on the  tiers only
                                    </span>

                        <span class="hidden first:inline">
                            This post is for subscribers on the  tiers only
                        </span>                    
                
        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Exercise 3A: Multi-Agent Collaboration]]></title>
                    <description><![CDATA[Build a hub-and-spoke multi-agent system with Broadcast, Collect, and Consensus nodes in ThinkThing.]]></description>
                    <link>https://qui.academy/courses/masters-of-cognitive-architecture-level-1/exercise-3a-collaborative-analysis-system/</link>
                    <guid isPermaLink="false">68d303415cfe9900012f0669</guid>

                        <category><![CDATA[Masters of Cognitive Architecture]]></category>

                        <dc:creator><![CDATA[Keren Flavell]]></dc:creator>

                    <pubDate>Tue, 02 Jun 2026 20:32:00 +0000</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                        <span class="hidden first:inline">
                                        This lesson is for subscribers on the  tiers only
                                    </span>

                        <span class="hidden first:inline">
                            This post is for subscribers on the  tiers only
                        </span>                    
                
        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Exercise 2A: Strategic Analysis Workflow]]></title>
                    <description><![CDATA[Build a strategic decision workflow in ThinkThing using Autothink, Gate, and Choice nodes.]]></description>
                    <link>https://qui.academy/courses/masters-of-cognitive-architecture-level-1/exercise-2a-multi-iteration-decision-analysis-60-minutes/</link>
                    <guid isPermaLink="false">68d2fedc5cfe9900012f0629</guid>

                        <category><![CDATA[Masters of Cognitive Architecture]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Tue, 02 Jun 2026 20:21:00 +0000</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                        <span class="hidden first:inline">
                                        This lesson is for subscribers on the  tiers only
                                    </span>

                        <span class="hidden first:inline">
                            This post is for subscribers on the  tiers only
                        </span>                    
                
        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Exercise 1A: Create Your First Character]]></title>
                    <description><![CDATA[Build a Research Assistant character in Qui Anima and test it in Strings.]]></description>
                    <link>https://qui.academy/courses/masters-of-cognitive-architecture-level-1/exercise-1a-memory-architecture-setup-45-minutes/</link>
                    <guid isPermaLink="false">68d2fe1c5cfe9900012f060b</guid>

                        <category><![CDATA[Masters of Cognitive Architecture]]></category>

                        <dc:creator><![CDATA[Keren Flavell]]></dc:creator>

                    <pubDate>Tue, 02 Jun 2026 20:08:00 +0000</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                        <span class="hidden first:inline">
                                        This lesson is for subscribers on the  tiers only
                                    </span>

                        <span class="hidden first:inline">
                            This post is for subscribers on the  tiers only
                        </span>                    
                
        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[QUI MCP Integrations Setup Guide]]></title>
                    <description><![CDATA[This document covers setup instructions for the following QUI integrations and MCP connectors:

 * Google OAuth login
 * GitHub Personal Access Token
 * Slack MCP connector
 * Notion MCP connector
 * Discord MCP connector
 * Google Calendar MCP connector
 * Brave Search MCP connector
 * WhatsApp / GreenAPI node
 * Telegram


General Security Notes

 * Treat all API keys, OAuth client]]></description>
                    <link>https://qui.academy/docs/qui-mcp-integrations-setup-guide/</link>
                    <guid isPermaLink="false">69f35b42b7e33a0001f0357b</guid>

                        <category><![CDATA[Advanced]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Thu, 30 Apr 2026 13:44:59 +0000</pubDate>


                    <content:encoded><![CDATA[<p>This document covers setup instructions for the following QUI integrations and MCP connectors:</p><ul><li>Google OAuth login</li><li>GitHub Personal Access Token</li><li>Slack MCP connector</li><li>Notion MCP connector</li><li>Discord MCP connector</li><li>Google Calendar MCP connector</li><li>Brave Search MCP connector</li><li>WhatsApp / GreenAPI node</li><li>Telegram </li></ul><hr><h2 id="general-security-notes">General Security Notes</h2><ul><li>Treat all API keys, OAuth client secrets, bot tokens, and service account JSON files as secrets.</li><li>Never commit tokens or JSON key files to Git.</li><li>Store production secrets in the appropriate environment variable store or deployment secret manager.</li><li>Prefer short-lived or expiring credentials where possible.</li><li>Rotate any token immediately if it may have been exposed.</li></ul><hr><h1 id="1-google-oauth-login-setup">1. Google OAuth Login Setup</h1><p>This enables Google OAuth login for QUI.</p><h2 id="11-create-oauth-credentials-in-google-cloud-console">1.1 Create OAuth Credentials in Google Cloud Console</h2><ol><li>Open the Google Cloud Console:<code>https://console.cloud.google.com</code></li><li>Create a new project or select the existing production project.</li><li>Go to:<code>APIs &amp; Services</code> → <code>Credentials</code> → <code>Create Credentials</code> → <code>OAuth client ID</code></li><li>Set the application type:<code>Web application</code></li><li>Set the name:<code>QUI.IS Production</code></li><li>Click <code>Create</code>.</li><li>Copy the generated:<ul><li><code>client_id</code></li><li><code>client_secret</code></li></ul></li></ol><p>Add the authorized redirect URI:</p><pre><code class="language-text">https://qui.is:11000/api/v1/auth/google/callback
</code></pre><p>Verify that this matches the actual production Nginx routing and the existing configuration referenced in <code>2FA.md</code> around line 1303.</p><hr><h2 id="12-configure-the-oauth-consent-screen">1.2 Configure the OAuth Consent Screen</h2><p>This is a one-time setup if it has not already been completed.</p><ol><li>In Google Cloud Console, go to:<code>APIs &amp; Services</code> → <code>OAuth consent screen</code></li><li>Set the user type:<ul><li>Use <code>External</code> unless QUI is managed inside a Google Workspace organization.</li></ul></li><li>Fill in the required fields:<ul><li>App name</li><li>User support email</li><li>Developer contact email</li><li>App domain: <code>qui.is</code></li><li>Authorized domains: <code>qui.is</code></li></ul></li><li>During development, add test users.</li><li>For production, publish the consent screen when ready.</li></ol><p>Add the following scopes:</p><pre><code class="language-text">userinfo.email
userinfo.profile
</code></pre><hr><h2 id="13-configure-google-oauth-in-the-mothership-admin-panel">1.3 Configure Google OAuth in the Mothership Admin Panel</h2><ol><li>Navigate to:<code>Settings</code> → <code>Authentication</code></li><li>Save the settings.</li></ol><p>Verify that:</p><pre><code class="language-text">googleRedirectUri
</code></pre><p>matches the redirect URI configured in Google Cloud Console.</p><p>Paste the Google OAuth client secret:</p><pre><code class="language-text">googleClientSecret = &lt;client_secret from Google Cloud&gt;
</code></pre><p>The backend will Fernet-encrypt the secret before storing it.</p><p>Paste the Google OAuth client ID:</p><pre><code class="language-text">googleClientId = &lt;client_id from Google Cloud&gt;
</code></pre><p>Set:</p><pre><code class="language-text">googleOAuthEnabled = true
</code></pre><p>Log in to the admin dashboard:</p><pre><code class="language-text">https://qui.is/admin
</code></pre><p>Or use the current deployed admin dashboard URL if different.</p><hr><h2 id="14-restart-cache-refresh">1.4 Restart / Cache Refresh</h2><p>After saving the settings, either:</p><ul><li>Restart Mothership, or</li><li>Wait for the 5-minute Redis cache TTL on <code>auth_setting</code> to expire.</li></ul><hr><h2 id="15-verification">1.5 Verification</h2><p>Run:</p><pre><code class="language-bash">curl https://qui.is/api/v1/auth/google/login -i
</code></pre><p>Expected result:</p><pre><code class="language-text">HTTP 302 redirect to https://accounts.google.com/o/oauth2/v2/auth?...
</code></pre><p>Then test in a browser:</p><ol><li>Complete the Google login flow.</li><li>Confirm that the callback succeeds and the user is logged in.</li></ol><p>Visit:</p><pre><code class="language-text">https://qui.is/api/v1/auth/google/login
</code></pre><hr><h1 id="2-github-personal-access-token-setup">2. GitHub Personal Access Token Setup</h1><p>Use a GitHub Personal Access Token for GitHub MCP access.</p><h2 id="21-recommended-option-classic-token">2.1 Recommended Option: Classic Token</h2><p>Classic tokens are recommended for best compatibility.</p><ol><li>Open GitHub.</li><li>Go to:<code>Settings</code> → <code>Developer settings</code> → <code>Personal access tokens</code> → <code>Tokens (classic)</code></li><li>Click:<code>Generate new token (classic)</code></li></ol><hr><h2 id="22-recommended-scopes">2.2 Recommended Scopes</h2><p>Select the following scopes:</p><ul><li><code>repo</code> — full control of private repositories, issues, pull requests, branches, and commits</li><li><code>workflow</code> — required if the MCP needs to read or trigger GitHub Actions</li><li><code>read:org</code> — allows access to organization repositories and members</li><li><code>read:user</code> — user profile lookups</li><li><code>user:email</code> — user email lookups</li><li><code>gist</code> — optional; only required for gist tools</li><li><code>notifications</code> — optional; only required for notification tools</li></ul><hr><h2 id="23-expiration-recommendation">2.3 Expiration Recommendation</h2><p>Recommended expiration:</p><pre><code class="language-text">90 days
</code></pre><p>Avoid <code>No expiration</code> unless absolutely necessary. If a non-expiring token leaks, it remains valid until manually revoked.</p><hr><h1 id="3-slack-mcp-connector-setup">3. Slack MCP Connector Setup</h1><p>Slack is suitable for building and testing QUI MCP apps. A free Slack workspace is enough for the core Slack MCP connector tools.</p><p>The connector uses Slack Web API functionality such as:</p><ul><li>Listing channels</li><li>Posting messages</li><li>Reading conversation history</li><li>Listing users</li><li>Uploading files</li><li>Adding reactions</li></ul><hr><h2 id="31-what-works-on-slack-free-workspaces">3.1 What Works on Slack Free Workspaces</h2><p>Free Slack workspaces support:</p><ul><li>Creating apps</li><li>Creating bots</li><li>Slash commands</li><li>Bot tokens such as <code>xoxb-...</code></li><li>User tokens such as <code>xoxp-...</code></li><li>Events API</li><li>Socket Mode</li><li>OAuth</li><li>Webhooks</li><li>Most Web API methods used by the QUI MCP connector</li></ul><hr><h2 id="32-slack-features-that-usually-require-a-paid-plan">3.2 Slack Features That Usually Require a Paid Plan</h2><p>The following features generally require a paid Slack plan and are not required for normal QUI MCP testing:</p><ul><li><code>admin.*</code> API methods</li><li>Workspace or user administration APIs</li><li>Enterprise Grid</li><li>SCIM</li><li>Discovery API / eDiscovery</li><li>DLP</li><li>Message retention policies</li><li>Advanced Workflow Builder features</li></ul><hr><h2 id="33-free-tier-gotchas">3.3 Free-Tier Gotchas</h2><ul><li>Free workspaces cap accessible message history at 90 days. Older messages may still exist, but they cannot be read via API.</li><li>Free workspaces are limited to 10 installed integrations at once.</li><li>Uninstall old test apps as needed.</li><li>Bots may count against seat limits in some edge cases, although normal test bots are usually fine.</li></ul><hr><h2 id="34-recommended-slack-testing-setup">3.4 Recommended Slack Testing Setup</h2><ol><li>Do not test against a real team workspace unless required.</li><li>Install the app into the throwaway workspace.</li></ol><p>Copy the bot token into the MCP Gateway environment as:</p><pre><code class="language-env">SLACK_TOKEN=xoxb-...
</code></pre><p>Create the app at:</p><pre><code class="language-text">https://api.slack.com/apps
</code></pre><p>Create a throwaway workspace, for example:</p><pre><code class="language-text">qui-mcp-test.slack.com
</code></pre><hr><h2 id="35-slack-app-setup-%E2%80%94-step-by-step">3.5 Slack App Setup — Step by Step</h2><h3 id="step-1-create-a-test-workspace">Step 1: Create a Test Workspace</h3><p>Skip this step if you already have a suitable test workspace.</p><ol><li>Sign up with your email.</li><li>You should now be the workspace owner, which is required to install apps.</li></ol><p>Name the workspace something like:</p><pre><code class="language-text">qui-mcp-test
</code></pre><p>Go to:</p><pre><code class="language-text">https://slack.com/get-started
</code></pre><hr><h3 id="step-2-create-the-slack-app">Step 2: Create the Slack App</h3><ol><li>Click:<code>Create New App</code> → <code>From scratch</code></li><li>Select the test workspace.</li><li>Click <code>Create App</code>.</li></ol><p>Set the app name:</p><pre><code class="language-text">QUI MCP Connector
</code></pre><p>Go to:</p><pre><code class="language-text">https://api.slack.com/apps
</code></pre><hr><h3 id="step-3-configure-bot-token-scopes">Step 3: Configure Bot Token Scopes</h3><p>Go to:</p><p><code>OAuth &amp; Permissions</code> → <code>Scopes</code> → <code>Bot Token Scopes</code> → <code>Add an OAuth Scope</code></p><p>Add the following scopes:</p>
<!--kg-card-begin: html-->
<table><thead><tr><th>Scope</th><th>Purpose</th></tr></thead><tbody><tr><td><code inline="">channels:read</code></td><td>List public channels</td></tr><tr><td><code inline="">channels:history</code></td><td>Read messages in public channels</td></tr><tr><td><code inline="">groups:read</code></td><td>List private channels the bot is in</td></tr><tr><td><code inline="">groups:history</code></td><td>Read messages in private channels</td></tr><tr><td><code inline="">chat:write</code></td><td>Post messages</td></tr><tr><td><code inline="">users:read</code></td><td>List workspace users</td></tr><tr><td><code inline="">files:write</code></td><td>Upload files</td></tr><tr><td><code inline="">reactions:write</code></td><td>Add emoji reactions</td></tr><tr><td><code inline="">im:write</code></td><td>Optional; send direct messages</td></tr><tr><td><code inline="">im:history</code></td><td>Optional; read direct message history</td></tr></tbody></table>
<!--kg-card-end: html-->
<hr><h3 id="step-4-install-the-app-to-the-workspace">Step 4: Install the App to the Workspace</h3><ol><li>On the same <code>OAuth &amp; Permissions</code> page, scroll to the top.</li><li>Click:<code>Install to Workspace</code></li><li>Review permissions.</li><li>Click <code>Allow</code>.</li><li>After installation, Slack returns to the <code>OAuth &amp; Permissions</code> page.</li></ol><p>This is the value for:</p><pre><code class="language-env">SLACK_TOKEN=xoxb-...
</code></pre><p>Copy the <code>Bot User OAuth Token</code>.It starts with:</p><pre><code class="language-text">xoxb-...
</code></pre><hr><h3 id="step-5-invite-the-bot-into-channels">Step 5: Invite the Bot into Channels</h3><p>The bot cannot read or post in a channel until it has been invited.</p><p>In Slack, open the channel and run:</p><pre><code class="language-text">/invite @QUI MCP Connector
</code></pre><p>Use the actual bot name if different.</p><hr><h3 id="step-6-optional-events-api-socket-mode">Step 6: Optional Events API / Socket Mode</h3><p>This is only needed if Slack should push events to QUI, such as mentions or incoming messages.</p><p>For outbound API calls, the bot token alone is sufficient.</p><p>To enable Socket Mode:</p><ol><li>Go to <code>Socket Mode</code>.</li><li>Toggle <code>Enable Socket Mode</code>.</li></ol><p>Save it as:</p><pre><code class="language-env">SLACK_APP_TOKEN=xapp-...
</code></pre><p>Generate an app-level token with the scope:</p><pre><code class="language-text">connections:write
</code></pre><p>To enable event subscriptions:</p><ol><li>Go to <code>Event Subscriptions</code>.</li><li>Toggle events on.</li></ol><p>Subscribe to bot events such as (with their matching *:history OAuth scopes):</p><pre><code class="language-text">message.channels
app_mention
message.groups
message.im
message.mpim
</code></pre><hr><h3 id="step-8-test-slack">Step 8: Test Slack</h3><p>From the gateway, call one of the Slack MCP tools, for example:</p><pre><code class="language-text">slack_list_channels
</code></pre><p>Or test posting to a channel where the bot has been invited:</p><pre><code class="language-text">slack_post_message
</code></pre><p>If the response is:</p><pre><code class="language-text">not_in_channel
</code></pre><p>invite the bot to the channel again.</p><hr><h2 id="36-slack-common-gotcha">3.6 Slack Common Gotcha</h2><p>If you add a new scope after installing the app, you must click:</p><pre><code class="language-text">Reinstall to Workspace
</code></pre><p>Existing tokens do not automatically receive newly added scopes.</p><hr><h1 id="4-notion-mcp-connector-setup">4. Notion MCP Connector Setup</h1><p>Use a Notion internal integration for the QUI Notion MCP connector.</p><hr><h2 id="41-create-the-notion-integration">4.1 Create the Notion Integration</h2><ol><li>Click <code>New integration</code>.</li><li>Select the associated workspace.</li><li>Add a logo if desired.</li><li>Click <code>Save</code>.</li></ol><p>Set the name:</p><pre><code class="language-text">QUI MCP Connector
</code></pre><p>Set type:</p><pre><code class="language-text">Internal
</code></pre><p>Public is only needed if distributing the integration to other workspaces.</p><p>Go to:</p><pre><code class="language-text">https://www.notion.so/profile/integrations
</code></pre><p>Or use:<code>Settings</code> → <code>Connections</code> → <code>Develop or manage integrations</code></p><hr><h2 id="42-set-notion-integration-capabilities">4.2 Set Notion Integration Capabilities</h2><p>On the integration's <code>Configuration</code> tab, go to the <code>Capabilities</code> section.</p><p>Enable:</p><ul><li><code>Read content</code></li><li><code>Update content</code></li><li><code>Insert content</code></li><li><code>Read user information</code> → choose <code>Without email</code> unless emails are specifically required</li><li><code>Read comments</code> — optional</li><li><code>Insert comments</code> — optional</li></ul><p>Click <code>Save changes</code>.</p><hr><h2 id="43-copy-the-notion-token">4.3 Copy the Notion Token</h2><ol><li>Go to the <code>Secrets</code> tab or <code>Internal Integration Secret</code> section.</li><li>Click <code>Show</code>.</li><li>Copy the token.</li></ol><p>The token may look like either of these:</p><pre><code class="language-text">ntn_...
secret_...
</code></pre><p>Both formats should work.</p><hr><h2 id="44-share-pages-and-databases-with-the-integration">4.4 Share Pages and Databases with the Integration</h2><p>This is the most commonly missed step.</p><p>Notion integrations start with zero access. You must explicitly grant the integration access to every page or database it should touch.</p><p>For each page or database:</p><ol><li>Open the page in Notion.</li><li>Click the <code>...</code> menu in the top-right.</li><li>Go to:<code>Connections</code> → <code>Connect to</code></li></ol><p>Select:</p><pre><code class="language-text">QUI MCP Connector
</code></pre><p>Alternative path:</p><p><code>Share</code> → <code>+ Add connections</code> → select <code>QUI MCP Connector</code></p><p>Tip: connect the integration to a top-level parent page, such as:</p><pre><code class="language-text">QUI Sandbox
</code></pre><p>Then put test pages and databases inside it. Child pages inherit access from the connected parent page.</p><hr><h2 id="45-wire-notion-into-the-mcp-gateway">4.5 Wire Notion into the MCP Gateway</h2><p>Edit:</p><pre><code class="language-text">Qui_Core_Services/MCP_Gateway/.env
</code></pre><p>Add:</p><pre><code class="language-env">NOTION_API_KEY=ntn_xxx...
</code></pre><p></p><hr><h2 id="46-test-notion">4.6 Test Notion</h2><p>Call:</p><pre><code class="language-text">notion_search
</code></pre><p>with an empty query.</p><p>Expected result:</p><ul><li>It should return every page and database the integration has access to.</li></ul><p>If it returns:</p><pre><code class="language-text">[]
</code></pre><p>then the integration probably has not been connected to any pages or databases. Repeat the sharing step above.</p><hr><h2 id="47-notion-common-gotchas">4.7 Notion Common Gotchas</h2>
<!--kg-card-begin: html-->
<table><thead><tr><th>Issue</th><th>Likely Cause</th><th>Fix</th></tr></thead><tbody><tr><td><code inline="">object_not_found</code></td><td>Integration is not connected to the page</td><td>Reconnect the integration to the page</td></tr><tr><td>Database query returns nothing</td><td>Database itself does not have the connection</td><td>Open the database as a full page and add the connection</td></tr><tr><td>Token regenerated</td><td>Env var still uses old token</td><td>Update <code inline="">NOTION_API_KEY</code></td></tr><tr><td><code inline="">New integration</code> button missing</td><td>Workspace requires admin approval</td><td>Ask the workspace owner/admin</td></tr></tbody></table>
<!--kg-card-end: html-->
<hr><h1 id="5-discord-mcp-connector-setup">5. Discord MCP Connector Setup</h1><p>Use a Discord bot for the QUI Discord MCP connector.</p><hr><h2 id="51-create-a-test-discord-server">5.1 Create a Test Discord Server</h2><p>Skip this if you already have a suitable server.</p><p>In Discord desktop or web:</p><ol><li>Click the <code>+</code> icon in the bottom-left.</li><li>Choose:<code>Create My Own</code> → <code>For me and my friends</code></li><li>You are now the server owner, which is required for bot invites.</li></ol><p>Name it:</p><pre><code class="language-text">QUI MCP Test
</code></pre><hr><h2 id="52-create-the-discord-application">5.2 Create the Discord Application</h2><ol><li>Click <code>New Application</code>.</li><li>Accept the Discord Developer Terms of Service.</li><li>Click <code>Create</code>.</li></ol><p>Name it:</p><pre><code class="language-text">QUI MCP Connector
</code></pre><p>Go to:</p><pre><code class="language-text">https://discord.com/developers/applications
</code></pre><hr><h2 id="53-create-and-configure-the-bot-user">5.3 Create and Configure the Bot User</h2><ol><li>In the left sidebar, go to <code>Bot</code>.</li><li>Confirm that the bot user exists.</li><li>Rename the bot or set an avatar if desired.</li><li>Under <code>Privileged Gateway Intents</code>, enable:<ul><li><code>Server Members Intent</code> — required for <code>discord_list_members</code></li><li><code>Message Content Intent</code> — required for <code>discord_read_messages</code> to return message text</li><li><code>Presence Intent</code> — optional; only needed for online/offline status</li></ul></li><li>Click <code>Save Changes</code>.</li></ol><hr><h2 id="54-copy-the-discord-bot-token">5.4 Copy the Discord Bot Token</h2><ol><li>On the <code>Bot</code> page, click:<code>Reset Token</code> → <code>Yes, do it!</code></li><li>Copy the token immediately.</li></ol><p>Discord only shows the token once.</p><p>This token becomes:</p><pre><code class="language-env">DISCORD_BOT_TOKEN=your-bot-token-here
</code></pre><p>Security warning: never commit this token to Git. Discord may automatically invalidate bot tokens that are pushed to public repositories.</p><hr><h2 id="55-generate-the-bot-invite-url">5.5 Generate the Bot Invite URL</h2><p>Go to:</p><p><code>OAuth2</code> → <code>URL Generator</code></p><p>Select scopes:</p><ul><li><code>bot</code></li><li><code>applications.commands</code> — optional; only needed if slash commands are required later</li></ul><p>Select bot permissions.</p><p>For read-only testing:</p><ul><li><code>View Channels</code></li><li><code>Read Message History</code></li></ul><p>For send testing, also add:</p><ul><li><code>Send Messages</code></li></ul><p>For full QUI Discord MCP tool coverage, add:</p><ul><li><code>View Channels</code></li><li><code>Send Messages</code></li><li><code>Read Message History</code></li><li><code>Embed Links</code></li><li><code>Attach Files</code></li><li><code>Add Reactions</code></li><li><code>Manage Channels</code> — for <code>discord_create_channel</code> and <code>discord_delete_channel</code></li><li><code>Manage Roles</code> — for <code>discord_create_role</code> and <code>discord_assign_role</code></li><li><code>Create Instant Invite</code> — for <code>discord_create_invite</code></li><li><code>Kick Members</code> — optional</li></ul><p>For a throwaway test server only, you may use:</p><pre><code class="language-text">Administrator
</code></pre><p>Do not use Administrator permissions in production unless absolutely necessary.</p><p>Copy the generated invite URL at the bottom of the page.</p><hr><h2 id="56-invite-the-bot-to-the-server">5.6 Invite the Bot to the Server</h2><ol><li>Paste the generated invite URL into a browser.</li><li>Choose the target server.</li><li>Click <code>Continue</code>.</li><li>Click <code>Authorize</code>.</li><li>Complete the captcha if prompted.</li></ol><p>The bot may appear offline. This can be normal because the QUI MCP uses the REST API directly rather than maintaining a live gateway connection.</p><hr><h2 id="57-get-discord-ids-for-testing">5.7 Get Discord IDs for Testing</h2><ol><li>In Discord, go to:<code>User Settings</code> → <code>Advanced</code></li><li>Right-click and copy IDs as needed:<ul><li>Server name → <code>Copy Server ID</code></li><li>Channel → <code>Copy Channel ID</code></li><li>User → <code>Copy User ID</code></li></ul></li></ol><p>Turn on:</p><pre><code class="language-text">Developer Mode
</code></pre><p>These values are used for parameters such as:</p><pre><code class="language-text">guild_id
channel_id
user_id
</code></pre><hr><h2 id="58-wire-discord-into-the-mcp-gateway">5.8 Wire Discord into the MCP Gateway</h2><p>Edit:</p><pre><code class="language-text">Qui_Core_Services/MCP_Gateway/.env
</code></pre><p>Add:</p><pre><code class="language-env">DISCORD_BOT_TOKEN=your-bot-token-here
</code></pre><p></p><hr><h2 id="59-configure-the-discord-mcp-node">5.9 Configure the Discord MCP Node</h2><p>To use the Discord MCP node with your own server, set:</p><pre><code class="language-text">default_guild_id=&lt;your Discord server ID&gt;
default_channel_id=&lt;your Discord channel ID&gt;
</code></pre><p>For the current bot, a confirmed working test target is:</p><pre><code class="language-text">default_guild_id=1391721136647307335
</code></pre><pre><code class="language-text">default_channel_id=1391721137129525332
</code></pre><p>Known server:</p><pre><code class="language-text">Qui Academy
</code></pre><hr><h2 id="510-test-discord">5.10 Test Discord</h2><p>First call:</p><pre><code class="language-text">discord_list_guilds
</code></pre><p>Expected result:</p><ul><li>The test server should appear.</li></ul><p>Then test sending a message:</p><pre><code class="language-text">discord_send_message
</code></pre><p>using the copied channel ID.</p><p>Expected result:</p><ul><li>A message should appear in the Discord channel.</li></ul><hr><h2 id="511-discord-common-gotchas">5.11 Discord Common Gotchas</h2>
<!--kg-card-begin: html-->
<table><thead><tr><th>Issue</th><th>Likely Cause</th><th>Fix</th></tr></thead><tbody><tr><td>Bot appears offline</td><td>QUI MCP uses REST API directly</td><td>This is usually fine</td></tr><tr><td><code inline="">Missing Access</code></td><td>Bot lacks permission in that channel</td><td>Check channel-level permission overrides</td></tr><tr><td><code inline="">discord_read_messages</code> returns empty content</td><td>Message Content Intent is disabled</td><td>Enable Message Content Intent</td></tr><tr><td><code inline="">discord_list_members</code> fails</td><td>Server Members Intent is disabled or bot lacks permission</td><td>Enable Server Members Intent and check permissions</td></tr><tr><td>Token leaked</td><td>Token was exposed</td><td>Reset the token and update the environment variable</td></tr></tbody></table>
<!--kg-card-end: html-->
<hr><h1 id="6-google-calendar-mcp-connector-setup">6. Google Calendar MCP Connector Setup</h1><p>Use a Google Cloud service account for the Google Calendar MCP connector.</p><hr><h2 id="61-create-or-select-a-google-cloud-project">6.1 Create or Select a Google Cloud Project</h2><ol><li>Create a new project or select an existing one.</li></ol><p>Go to:</p><pre><code class="language-text">https://console.cloud.google.com
</code></pre><hr><h2 id="62-enable-the-google-calendar-api">6.2 Enable the Google Calendar API</h2><ol><li>Go to:<code>APIs &amp; Services</code> → <code>Library</code></li><li>Click <code>Enable</code>.</li></ol><p>Search for:</p><pre><code class="language-text">Google Calendar API
</code></pre><hr><h2 id="63-create-a-service-account">6.3 Create a Service Account</h2><ol><li>Go to:<code>APIs &amp; Services</code> → <code>Credentials</code></li><li>Click:<code>Create Credentials</code> → <code>Service Account</code></li><li>Finish the service account creation.</li></ol><p>Give it a name, for example:</p><pre><code class="language-text">mcp-calendar-bot
</code></pre><p>Example service account email:</p><pre><code class="language-text">mcp-calendar-bot@noted-span-417913.iam.gserviceaccount.com
</code></pre><hr><h2 id="64-generate-the-service-account-json-key">6.4 Generate the Service Account JSON Key</h2><ol><li>Make sure the correct project is selected in the top bar.</li><li>In the left sidebar, click:<code>IAM &amp; Admin</code> → <code>Service Accounts</code></li><li>Click the email/name of the service account you created.</li><li>Click:<code>Add Key</code> → <code>Create new key</code></li><li>Click <code>Create</code>.</li></ol><p>Select:</p><pre><code class="language-text">JSON
</code></pre><p>Open the <code>Keys</code> tab.The service account page should show tabs similar to:</p><pre><code class="language-text">Details | Permissions | Keys | Metrics
</code></pre><p>Go to:</p><pre><code class="language-text">https://console.cloud.google.com
</code></pre><p>The JSON file will automatically download to your computer.</p><p>Example filename:</p><pre><code class="language-text">my-project-123456-abcdef.json
</code></pre><p>This JSON file is what the <code>mcp_calendar</code> connector needs.</p><hr><h2 id="65-if-create-new-key-is-missing">6.5 If <code>Create New Key</code> Is Missing</h2><p>Possible causes:</p><ul><li>You are not inside the service account detail page.</li><li>You are still on the general credentials page.</li><li>Your Google account does not have sufficient permission.</li><li>You need Owner or Editor role.</li><li>The organization policy blocks service account key creation.</li></ul><hr><h2 id="66-share-the-calendar-with-the-service-account">6.6 Share the Calendar with the Service Account</h2><ol><li>Open Google Calendar.</li><li>Find the calendar you want the MCP connector to access.</li><li>Open:<code>Settings &amp; sharing</code></li></ol><p>Give the service account the required permission, for example:</p><pre><code class="language-text">Make changes to events
</code></pre><p>Add the service account email, for example:</p><pre><code class="language-text">mcp-calendar-bot@your-project.iam.gserviceaccount.com
</code></pre><hr><h1 id="7-brave-search-mcp-connector-setup">7. Brave Search MCP Connector Setup</h1><p>The <code>mcp_brave</code> connector requires a Brave Search API key.</p><p>If the connector shows:</p><pre><code class="language-text">no API key present
</code></pre><p>then the key has not been configured.</p><hr><h2 id="71-create-a-brave-search-api-key">7.1 Create a Brave Search API Key</h2><ol><li>Click <code>Get Started</code> or <code>Sign Up</code>.</li><li>Create an account using email/password or GitHub login.</li><li>Once logged in, open the dashboard.</li><li>Click <code>Create API Key</code>.</li><li>Copy the generated key.</li></ol><p>Look for:</p><pre><code class="language-text">API Keys
</code></pre><p>or:</p><pre><code class="language-text">Subscription
</code></pre><p>Go to:</p><pre><code class="language-text">https://api.search.brave.com/
</code></pre><p>It should look similar to:</p><pre><code class="language-text">BSAxxxxxxxxxxxxxxxxxxxxxxxx
</code></pre><hr><h2 id="72-configure-the-brave-api-key">7.2 Configure the Brave API Key</h2><p>Option A: environment variable</p><pre><code class="language-env">BRAVE_API_KEY=your_api_key_here
</code></pre><p>Option B: MCP config file</p><pre><code class="language-json">{
  "mcp_brave": {
    "api_key": "your_api_key_here"
  }
}
</code></pre><hr><h2 id="73-restart-and-test-brave-search">7.3 Restart and Test Brave Search</h2><p>Restart the MCP process, server, or CLI after setting the key.</p><p>Expected result:</p><ul><li><code>mcp_brave</code> returns search results.</li><li>The <code>no API key present</code> error disappears.</li></ul><hr><h2 id="74-brave-common-issues">7.4 Brave Common Issues</h2>
<!--kg-card-begin: html-->
<table><thead><tr><th>Issue</th><th>Fix</th></tr></thead><tbody><tr><td>Key copied with extra spaces</td><td>Re-copy and trim whitespace</td></tr><tr><td>Wrong env var name</td><td>Use <code inline="">BRAVE_API_KEY</code> unless the connector expects a custom name</td></tr><tr><td>App not restarted</td><td>Restart the MCP process</td></tr><tr><td>Free plan has no quota enabled</td><td>Check the Brave Search API dashboard/subscription</td></tr></tbody></table>
<!--kg-card-end: html-->
<hr><h1 id="8-whatsapp-greenapi-node-setup">8. WhatsApp / GreenAPI Node Setup</h1><p>The WhatsApp node's <code>Default Chat ID</code> should come from GreenAPI. You need the Business plan and have credits available.</p><hr><h2 id="81-supported-chat-id-formats">8.1 Supported Chat ID Formats</h2><p>Individual contact:</p><pre><code class="language-text">PHONE_NUMBER@c.us
</code></pre><p>Example:</p><pre><code class="language-text">447700900123@c.us
</code></pre><p>Group chat:</p><pre><code class="language-text">GROUP_ID@g.us
</code></pre><p>Example:</p><pre><code class="language-text">1203630xxxxxxxx@g.us
</code></pre><hr><h2 id="82-how-to-find-the-greenapi-chat-id">8.2 How to Find the GreenAPI Chat ID</h2><ol><li>Open the GreenAPI dashboard.</li><li>Select the WhatsApp instance.</li><li>Use one of the receiving-message tools, such as:<ul><li><code>Receiving messages</code></li><li><code>Get chat history</code></li><li><code>Last incoming messages</code></li></ul></li><li>Send a test WhatsApp message to the connected number.</li><li>Look for <code>chatId</code> in the returned message payload.</li><li>Copy the exact <code>chatId</code> value.</li></ol><p>Paste it into the WhatsApp node's:</p><pre><code class="language-text">Default Chat ID
</code></pre><p>Check the instance settings and match the below:</p><figure class="kg-card kg-image-card"><img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/08/Screenshot_2026-08-21_22-27-58.png" class="kg-image" alt="" loading="lazy" width="941" height="700" srcset="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/size/w600/2026/08/Screenshot_2026-08-21_22-27-58.png 600w, https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/08/Screenshot_2026-08-21_22-27-58.png 941w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/08/Screenshot_2026-08-21_22-27-45.png" class="kg-image" alt="" loading="lazy" width="1157" height="801" srcset="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/size/w600/2026/08/Screenshot_2026-08-21_22-27-45.png 600w, https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/size/w1000/2026/08/Screenshot_2026-08-21_22-27-45.png 1000w, https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/08/Screenshot_2026-08-21_22-27-45.png 1157w" sizes="(min-width: 720px) 720px"></figure><hr><h1 id="connect-an-anima-to-telegram">Connect an Anima to Telegram</h1><p>This guide is for someone who wants an Anima to send and receive Telegram messages through the existing QUI comms bridge.</p><h2 id="what-you-need">What You Need</h2><ul><li>A Telegram account.</li><li>Access to the Anima or ThinkThing workspace where the Telegram node is configured.</li><li>The Anima you want Telegram to speak through.</li><li>A bot token from Telegram's official <code>@BotFather</code>.</li></ul><p>Keep the bot token private. Anyone with the token can control that Telegram bot.</p><h2 id="quick-setup">Quick Setup</h2><h3 id="1-create-the-telegram-bot">1. Create the Telegram bot</h3><ol><li>Open Telegram.</li><li>Search for <code>@BotFather</code>.</li><li>Send <code>/newbot</code>.</li><li>Choose a display name, for example <code>Erik Anima</code>.</li><li>Choose a username that ends in <code>bot</code>, for example <code>ErikAnimaBot</code>.</li><li>Copy the bot token BotFather gives you.</li></ol><p>Telegram usernames are used in <code>t.me</code> links, so keep the bot username readable and specific.</p><h3 id="2-add-telegram-to-the-anima-flow">2. Add Telegram to the Anima flow</h3><ol><li>Open the builder or workspace that contains your Anima.</li><li>Add or open a Telegram comms node.</li><li>Connect the Anima to the Telegram node.</li><li>Fill the Telegram fields:<ul><li><code>Bot Username</code>: the username from BotFather, without or with <code>@</code>.</li><li><code>Bot Token</code>: the token from BotFather.</li><li><code>Default Chat ID</code>: leave blank until the chat is discovered.</li><li><code>Allowed Chat IDs</code>: leave blank until the chat is discovered, or fill only the chat IDs you want this Anima to use.</li></ul></li></ol><p>The current Telegram node can generate a one-click start link from the bot username.</p><h3 id="3-start-the-bot-from-telegram">3. Start the bot from Telegram</h3><ol><li>Open that link in Telegram.</li><li>Press <code>Start</code>, or send <code>/start</code>.</li><li>Send one normal test message, for example <code>hello</code>.</li></ol><p>In the Telegram node, copy the generated start link. It looks like:</p><pre><code class="language-text">https://t.me/&lt;bot_username&gt;?start=qui_thinkthing
https://t.me/&lt;ErikQuiBot&gt;?start=qui_thinkthing
</code></pre><p>The test message gives the system a recent Telegram update it can discover.</p><h3 id="4-fetch-and-select-the-chat">4. Fetch and select the chat</h3><ol><li>Return to the Telegram node.</li><li>Click <code>Fetch Chats</code>.</li><li>Select the discovered chat from <code>Known Chats</code>.</li><li>Confirm that the node filled:<ul><li><code>Default Chat ID</code></li><li><code>Allowed Chat IDs</code></li></ul></li><li>Save the graph or Anima flow.</li></ol><p>If no chat appears, send <code>/start</code> and one ordinary message to the bot, then fetch again.</p><h3 id="5-send-a-test-message">5. Send a test message</h3><p>Use a small test first:</p><pre><code class="language-text">Send "Telegram is connected" to the Telegram chat.
</code></pre><p>After the outbound message works, reply to the bot in Telegram and confirm the reply appears in the relevant String or flow.</p><h2 id="groups-and-channels">Groups and Channels</h2><p>For a private one-to-one chat, the user only needs to open the bot and send <code>/start</code>.</p><p>For a group:</p><ol><li>Add the bot to the group.</li><li>Send a message that the bot can see.</li><li>Fetch chats again in the Telegram node.</li><li>Select the group chat ID.</li></ol><p>Telegram bots run in group privacy mode by default. In that mode, a bot sees commands, replies to the bot, and a limited set of relevant messages. If the Anima must read every group message, change this in BotFather with <code>/setprivacy</code>, then remove and re-add the bot to the group. Only disable privacy mode when the group expects the bot to read general chat traffic.</p><p>For a channel, add the bot to the channel with the permissions it needs. Telegram channel posts use the channel chat ID as the target.</p><h2 id="how-receiving-works">How Receiving Works</h2><p>QUI currently supports Telegram inbound messages through Thalamus. The user-facing setup path is:</p><ol><li>The Telegram node stores the bot token and selected chat ID.</li><li>ThinkThing syncs the resolved Telegram runtime config to Thalamus.</li><li>Thalamus polls Telegram with <code>getUpdates</code>.</li><li>Incoming Telegram updates are normalized as channel messages.</li><li>Messages are stored in Memory and broadcast to Strings.</li><li>Explicit downstream consumers, such as a ThinkThing comms flow or an Anima channel trigger, decide whether to answer.</li></ol><p>Thalamus does not auto-reply on its own. An Anima replies only when the flow or trigger tells it to.</p><h2 id="optional-webhook-deployment">Optional Webhook Deployment</h2><p>Most local or builder-driven setups should use the normal polling path above. Use webhooks only when you have a public HTTPS endpoint for Thalamus.</p><p>For webhook mode:</p><p>Register the webhook with Telegram:</p><pre><code class="language-bash">curl "https://api.telegram.org/bot&lt;bot_token&gt;/setWebhook?url=https://&lt;your-domain&gt;/api/v1/channel/telegram&amp;secret_token=&lt;random-secret&gt;"
</code></pre><p>Expose this Thalamus route over HTTPS:</p><pre><code class="language-text">POST /api/v1/channel/telegram
</code></pre><p>Set a server-side secret in the Thalamus environment:</p><pre><code class="language-text">THALAMUS_TELEGRAM_WEBHOOK_SECRET=&lt;random-secret&gt;
</code></pre><p>Telegram will send the secret back in the <code>X-Telegram-Bot-Api-Secret-Token</code> header. Thalamus rejects Telegram webhook requests if the secret is missing or wrong.</p><p>Do not use <code>getUpdates</code> polling and webhooks at the same time. Telegram only allows one active receive mode for a bot.</p><h2 id="troubleshooting">Troubleshooting</h2><h3 id="botfather-token-rejected">BotFather token rejected</h3><p>Copy the token again from BotFather. It should look like a numeric bot ID, a colon, and a long secret string. Do not include extra spaces.</p><h3 id="fetch-chats-shows-no-chats">Fetch Chats shows no chats</h3><p>Open the generated <code>t.me</code> link, press <code>Start</code>, and send a normal message. Then click <code>Fetch Chats</code> again. If webhook mode was previously configured, remove the webhook or switch the runtime back to polling.</p><h3 id="the-anima-can-send-but-does-not-receive-replies">The Anima can send but does not receive replies</h3><p>Check that the Telegram node has a <code>Default Chat ID</code>, that the chat ID is included in <code>Allowed Chat IDs</code>, and that the graph or channel trigger is active. Thalamus stores inbound messages but does not decide to answer by itself.</p><h3 id="group-messages-are-missing">Group messages are missing</h3><p>This is usually Telegram privacy mode. In privacy mode, the bot sees commands, replies, service messages, private chats, and channel messages, but not every ordinary group message. Use <code>/setprivacy</code> in BotFather only if the group wants broad bot visibility.</p><h3 id="webhook-setup-works-but-polling-does-not">Webhook setup works but polling does not</h3><p>Delete the Telegram webhook before using polling:</p><pre><code class="language-bash">curl "https://api.telegram.org/bot&lt;bot_token&gt;/deleteWebhook"
</code></pre><h3 id="webhook-receives-nothing">Webhook receives nothing</h3><p>Telegram webhooks require a valid HTTPS endpoint. Telegram's public Bot API webhook ports are <code>443</code>, <code>80</code>, <code>88</code>, and <code>8443</code>. Check <code>getWebhookInfo</code> for the last delivery error.</p><pre><code class="language-bash">curl "https://api.telegram.org/bot&lt;bot_token&gt;/getWebhookInfo"
</code></pre><h2 id=""></h2><h1 id="environment-variable-summary">Environment Variable Summary</h1><p>Use this as a quick checklist when wiring integrations into the MCP Gateway.</p><pre><code class="language-env"># Slack
SLACK_TOKEN=xoxb-...
SLACK_APP_TOKEN=xapp-... # optional; only required for Socket Mode

# Notion
NOTION_API_KEY=ntn_xxx...

# Discord
DISCORD_BOT_TOKEN=your-bot-token-here

# Brave Search
BRAVE_API_KEY=your_api_key_here
</code></pre><p>Google Calendar uses a downloaded service account JSON file rather than a simple API key. Store that JSON securely and configure the calendar connector according to the MCP runtime's expected path or secret-loading mechanism.</p><hr><h1 id="final-verification-checklist">Final Verification Checklist</h1><p>Before marking an integration as complete, verify the following:</p><h2 id="google-oauth">Google OAuth</h2><ul><li>OAuth client exists in Google Cloud.</li><li>Redirect URI matches production routing.</li><li>OAuth consent screen is configured.</li><li><code>googleOAuthEnabled</code> is enabled in Mothership admin.</li><li><code>/api/v1/auth/google/login</code> returns a 302 redirect.</li><li>Browser login flow completes successfully.</li></ul><h2 id="github">GitHub</h2><ul><li>Classic PAT exists.</li><li>Required scopes are selected.</li><li>Expiration is set appropriately.</li><li>Token is stored securely.</li></ul><h2 id="slack">Slack</h2><ul><li>App is installed to the test workspace.</li><li>Required bot scopes are configured.</li><li>App has been reinstalled after any scope changes.</li><li><code>SLACK_TOKEN</code> is configured.</li><li>Bot has been invited to test channels.</li><li><code>slack_list_channels</code> and/or <code>slack_post_message</code> works.</li></ul><h2 id="notion">Notion</h2><ul><li>Internal integration exists.</li><li>Required capabilities are enabled.</li><li><code>NOTION_API_KEY</code> is configured.</li><li>Pages/databases are explicitly shared with the integration.</li><li><code>notion_search</code> returns accessible pages/databases.</li></ul><h2 id="discord">Discord</h2><ul><li>Bot exists.</li><li>Required intents are enabled.</li><li>Bot is invited to the server.</li><li>Required permissions are granted.</li><li><code>DISCORD_BOT_TOKEN</code> is configured.</li><li><code>discord_list_guilds</code> works.</li><li><code>discord_send_message</code> works for the test channel.</li></ul><h2 id="google-calendar">Google Calendar</h2><ul><li>Google Calendar API is enabled.</li><li>Service account exists.</li><li>JSON key has been downloaded and stored securely.</li><li>Calendar has been shared with the service account.</li><li>Required calendar permissions are granted.</li></ul><h2 id="brave-search">Brave Search</h2><ul><li>Brave Search API key exists.</li><li><code>BRAVE_API_KEY</code> is configured.</li><li>MCP process has been restarted.</li><li>Brave search returns results.</li></ul><h2 id="whatsapp-greenapi">WhatsApp / GreenAPI</h2><ul><li>GreenAPI instance is connected.</li><li>Test message has been sent.</li><li><code>chatId</code> has been copied from the GreenAPI payload.</li><li>WhatsApp node <code>Default Chat ID</code> is set correctly.</li></ul><h2 id="check-telegram-botfather">Check Telegram / BotFather</h2><ul><li>Telegram bot has been created with @BotFather.</li><li>Bot token has been copied from BotFather.</li><li>Bot username is set in the Telegram node.</li><li>User has opened the bot link or searched the bot in Telegram.</li><li>User has sent /start to the bot.</li><li>A test message has been sent to the bot.</li><li>Fetch Chats has been clicked in the Telegram node.</li><li>Telegram chat_id has been selected or copied from the fetched chat.</li><li>Telegram node Default Chat ID is set correctly.</li><li>Telegram node Allowed Chat IDs includes that chat ID, if the allowlist is<br>being used.</li></ul>]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Once your local model is ready, the challenge shifts from inference to continuity]]></title>
                    <description><![CDATA[The first milestone in local AI is getting a model to run. The second is much harder: keeping the system coherent over time. Once Ollama works, the problem is no longer inference alone.]]></description>
                    <link>https://qui.academy/blog/once-your-local-model-is-ready-the-challenge-shifts-from-inference-to-continuity/</link>
                    <guid isPermaLink="false">69e2314dcdd9760001879aef</guid>

                        <category><![CDATA[Blog]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 17 Apr 2026 13:24:39 +0000</pubDate>

                        <media:content url="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/ChatGPT-Image-Apr-17--2026--04_52_37-PM.png" medium="image"/>

                    <content:encoded><![CDATA[<img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/ChatGPT-Image-Apr-17--2026--04_52_37-PM.png" alt="Once your local model is ready, the challenge shifts from inference to continuity"/> <p>The first milestone in local AI is getting a model to run. The second is much harder: keeping the system coherent over time. Once your local model works, the problem is no longer inference alone. It is continuity — preventing the system from forgetting where it is, repeating work, losing context in handoffs, or taking the wrong next step. That is the state-management problem.</p><p>That gap shows up quickly because local models, such as Ollama, give you a solid local serving layer, but not a built-in continuity layer. Its OpenAI-compatible /v1/responses support is explicitly non-stateful, with no previous_response_id or conversation support. So the moment your setup needs memory, retries, approvals, resumable workflows, or long-lived agent behavior, you have moved beyond “run a model locally” and into orchestration.</p><p>This is why “state management” matters so much. State is the system’s working truth: what it knows right now, what it has already done, and what it is allowed to do next. LangChain and LangGraph formalize that idea with short-term agent state, longer-term memory across sessions, and durable execution that can resume after a pause or failure. Community builders describe the same pain in less formal language: once multi-agent or multi-step flows start running, state drift becomes harder than prompts or model choice.</p><p>The failure modes are practical, not theoretical. Handoffs get lossy when one agent or step summarizes work for the next. Retrieval gets brittle when embeddings, chunking, or context assembly change underneath the system. Open WebUI’s docs note that RAG context can invalidate the KV cache on follow-up turns, which can slow responses, and they warn that embedding-model changes require re-indexing because old and new vectors are not compatible. Those are continuity failures: the model may still respond, but the system no longer stays coherent.</p><p>That is the real job of the orchestration layer. It is the deterministic shell around a probabilistic model. The model proposes; the orchestration layer decides what context moves forward, what tool can run, when a human must intervene, how memory is stored, and how the system recovers when something breaks. LangGraph is explicit about this, highlighting durable execution, human-in-the-loop control, and comprehensive memory as core features for long-running agents.</p><p>Not every orchestration layer is trying to solve the same continuity problem. Some are workflow-first. Some are agent-runtime-first. Some are code-first. And the more ambitious direction is broader than any one of those: not just bolting AI onto a few workflows, but treating AI as a local platform. That means one control plane coordinating models, memory, tools, workflows, agents, and policies across the machine instead of building a narrow rail of isolated services. n8n’s self-hosted AI starter kit, OpenClaw’s single gateway for sessions and routing, and QUI Core’s local orchestration of Anima, ThinkThing, Memory, and Qllama all point toward that shift.</p><h2 id="comparative-snapshot"><strong>Comparative snapshot</strong></h2>
<!--kg-card-begin: html-->
<style>
  :root {
    --table-text: #111827;
    --table-border: #d1d5db;
    --table-head-bg: #f3f4f6;
    --table-row-bg: #ffffff;
  }

  @media (prefers-color-scheme: dark) {
    :root {
      --table-text: #f9fafb;
      --table-border: #4b5563;
      --table-head-bg: #1f2937;
      --table-row-bg: #111827;
    }
  }

  .comparison-table {
    width: 100%;
    border-collapse: collapse;
    color: var(--table-text);
    font-family: Arial, sans-serif;
    font-size: 11pt;
  }

  .comparison-table th,
  .comparison-table td {
    border: 1px solid var(--table-border);
    padding: 10px;
    vertical-align: top;
    color: inherit;
    background: var(--table-row-bg);
  }

  .comparison-table th {
    text-align: center;
    font-weight: 700;
    background: var(--table-head-bg);
  }

  .comparison-table td:first-child {
    font-weight: 700;
    white-space: nowrap;
  }
</style>

<table class="comparison-table">
  <thead>
    <tr>
      <th>System</th>
      <th>Center of gravity</th>
      <th>Workflows</th>
      <th>Agents</th>
      <th>Memory</th>
      <th>Routing</th>
      <th>Failure handling</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>n8n</td>
      <td>Workflow automation</td>
      <td>Strong</td>
      <td>Embedded</td>
      <td>Chat memory + backends</td>
      <td>Visual branching + model selection</td>
      <td>Human approval / fallback</td>
    </tr>
    <tr>
      <td>OpenClaw</td>
      <td>Agent runtime</td>
      <td>Limited</td>
      <td>Strong</td>
      <td>Local-first Markdown + search</td>
      <td>Sessions routed by source/channel</td>
      <td>Model + auth failover</td>
    </tr>
    <tr>
      <td>LangChain</td>
      <td>Code-first framework</td>
      <td>In code</td>
      <td>Strong in code</td>
      <td>Short- and long-term patterns</td>
      <td>Middleware control</td>
      <td>Retry middleware</td>
    </tr>
    <tr>
      <td>Qui</td>
      <td>Integrated local AI platform</td>
      <td>Strong via ThinkThing</td>
      <td>Strong via Anima</td>
      <td>Semantic local memory</td>
      <td>Local gateway + local/cloud routing</td>
      <td>Service orchestration</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p>The point of that table is not to crown a winner. It is to clarify what kind of continuity problem each system is meant to solve. If your pain is triggers, integrations, approvals, and app-to-app automation, n8n is pointed at that. If your pain is keeping long-lived agents coherent across sessions and channels, OpenClaw is pointed at that. If your pain is code-level control over tools, memory, and execution flow, LangChain is pointed at that. And if your goal is to turn the whole local machine into an AI environment rather than a collection of disconnected automations, the platform-style approach of Qui starts to make more sense.</p><p>That is the deeper lesson after the first successful local model install. The real bottleneck is not to get the model to solve problems which easily fit into its context window, it is structuring the context in a way that the system not only keeps coherent over long sessions, but also improves the interal structuring of information.</p><p>A model can generate the next token. It cannot, on its own, remember where a workflow paused, what another agent already learned, whether retrieval is still trustworthy, or whether a tool call should be retried, denied, or escalated. That is what the orchestration layer is for. And the builders thinking furthest ahead are starting to treat that layer not as a helper utility, but as the foundation of a local AI platform.</p>]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Having a Local LLM Is Not Your Privacy Plan]]></title>
                    <description><![CDATA[How to set up a local AI stack so data stays private — and how to prove it to yourself, your clients, and your regulator.]]></description>
                    <link>https://qui.academy/blog/your-local-llm-is-not-your-privacy-model/</link>
                    <guid isPermaLink="false">69e25ae6cdd9760001879afb</guid>

                        <category><![CDATA[Blog]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 10 Apr 2026 16:53:00 +0000</pubDate>

                        <media:content url="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/ChatGPT-Image-Apr-17--2026--03_41_31-PM.png" medium="image"/>

                    <content:encoded><![CDATA[<img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/ChatGPT-Image-Apr-17--2026--03_41_31-PM.png" alt="Having a Local LLM Is Not Your Privacy Plan"/> <h2 id="running-a-model-locally-is-not-the-same-as-having-a-private-ai-system-most-people-assume-it-is"><strong>Running a model locally is not the same as having a private AI system. Most people assume it is.</strong></h2><hr><h3 id="this-article-explains-why-that-assumption-breaks-down-where-data-actually-leaks-in-a-local-ai-stack-and-what-it-takes-to-build-privacy-you-can-verify-and-defend-%E2%80%94-not-just-privacy-you-hope-you-configured-correctly">This article explains why that assumption breaks down, where data actually leaks in a local AI stack, and what it takes to build privacy you can verify and defend — not just privacy you hope you configured correctly.</h3><p>By the end, you will know how to distinguish local, self-hosted, offline-capable, and zero-knowledge systems. You will understand the seven places a local stack can leak data, the threat categories that go beyond data leakage, and how the regulatory landscape — EU AI Act, HIPAA, data sovereignty laws in over thirty countries — is turning privacy from a preference into a reporting obligation. You will have a six-test verification checklist you can run in thirty minutes. And you will see how privacy-by-architecture, where the system structurally cannot do the wrong thing, changes what you can prove to an auditor, a client, or yourself.</p><p>The default local AI setup — a model server bound to localhost, a chat UI, maybe a cloud connector — gives you a reasonable starting point. But the bind address can be changed. The API has no authentication. Cloud features are one flag away. And the moment you add tool integrations, a second provider, or a persistent memory layer, you have created outbound data paths that did not exist when you started.</p><p>Recently, Ethereum co-founder, Vitalik Buterin published his self-sovereign LLM setup: local inference on a 5090, bubblewrap sandboxes, no cloud, no compromise. It is probably the most technically rigorous personal AI privacy guide published this year. And even he warns: <em>“Do not simply copy the tools and techniques... assume that they are secure.”</em></p><p>He is right. But individual vigilance does not scale.</p><p>A single engineer can sandbox everything and verify every outbound packet. An organization with compliance obligations, clients, or regulatory exposure cannot rely on one person remembering to check <code>ss -ltnp</code> every morning.</p><p>This guide covers three things most local AI guides do not: how to verify your privacy claims with repeatable tests, how to generate evidence that satisfies regulatory frameworks, and how architectural privacy — privacy that does not depend on someone remembering to set a flag — changes what you can report, prove, and defend.</p><hr><h2 id="what-%E2%80%9Cprivate%E2%80%9D-actually-means">What “private” actually means</h2><p>These terms get used interchangeably. They are not the same thing.</p><p><strong>Local inference</strong> means your prompts run on your own hardware. The model weights are on your machine. The GPU cycles are yours. This is the baseline, but it is not sufficient on its own.</p><p><strong>Self-hosted</strong> means you operate the stack yourself. You choose the components. You own the configuration, updates, and access control. Self-hosted does not automatically mean isolated or encrypted.</p><p><strong>Offline-capable</strong> means the system can function without an internet connection. This is a strong privacy signal, because if nothing can leave the network, nothing will. But many “local” stacks still phone home for updates, telemetry, model downloads, or cloud features unless explicitly configured not to.</p><p><strong>Zero-knowledge</strong> is the strongest claim. In the strict sense, it means the system operator cannot read your plaintext because encryption and decryption happen on the user side and the operator does not hold usable keys. Many local AI stacks are self-hosted, but they are not zero-knowledge. The distinction matters.</p><hr><h2 id="the-privacy-landscape-in-2026">The privacy landscape in 2026</h2><p>Privacy is no longer a personal preference. It is a regulatory requirement with deadlines, penalties, and reporting obligations.</p><h3 id="eu-ai-act-%E2%80%94-august-2-2026">EU AI Act — August 2, 2026</h3><p>High-risk AI system requirements under Annex III take effect. Privacy by design is mandatory: default settings must favor short retention, restricted access, and strong encryption. Deployers must keep logs for at least six months, conduct fundamental rights impact assessments alongside GDPR Article 35 DPIAs, and monitor system operation. Penalties reach 35 million EUR or 7% of global revenue.</p><h3 id="hipaa">HIPAA</h3><p>Healthcare organizations adopting local AI must ensure no PHI enters a system that lacks a Business Associate Agreement. Self-hosting an open-source LLM gives you full control — but “full control” means full responsibility. Zero-retention architecture, where sensitive data is processed in memory and never written to disk, is quickly becoming the standard.</p><h3 id="data-sovereignty-laws-in-30-countries">Data sovereignty laws in 30+ countries</h3><p>Cross-border API calls can violate data residency requirements. The EU-US data privacy framework remains unstable. If your “local” stack sends prompts to an OpenAI endpoint in the US, your European client’s data may already have crossed a legal boundary.</p><h3 id="owasp-ai-testing-guide-2026">OWASP AI Testing Guide 2026</h3><p>This is the first formal standard for repeatable AI security and privacy testing. The LLM Security Verification Standard covers architecture, model lifecycle, operations, integration, storage, and monitoring. If you are writing a privacy policy for your AI deployment, these are the categories your auditor will check.</p><p>The organizations that move first — those that can produce verifiable evidence of their privacy architecture before an audit demands it — will have a structural advantage over those scrambling to retrofit compliance later.</p><hr><h2 id="the-7-privacy-leak-points-in-any-local-ai-stack">The 7 privacy leak points in any local AI stack</h2><p>Even a fully local stack has surfaces where data can escape. These are the same whether you run bare Ollama, llama.cpp, LM Studio, LocalAI, Jan.ai, GPT4All, or a full orchestration platform.</p><h3 id="1-network-exposure">1. Network exposure</h3><p>Your model server or UI is reachable beyond the host.</p><p>Ollama binds to localhost by default, but changing <code>OLLAMA_HOST</code> to <code>0.0.0.0</code> opens it to your entire network with no authentication. Open WebUI is designed for private, trusted networks. If you expose it publicly, it should sit behind a VPN, zero-trust proxy, or authenticated reverse proxy.</p><p><strong>What to check:</strong> Run <code>ss -ltnp</code> and confirm every AI-related port binds to <code>127.0.0.1</code>, not <code>0.0.0.0</code>. If you see <code>*:11434</code>, you have a problem.</p><h3 id="2-cloud-model-paths">2. Cloud model paths</h3><p>When you use a cloud-based model such as OpenAI, Anthropic, Google, or xAI, your prompts leave your machine and are processed on their servers. Their retention and training policies apply, not yours.</p><p><strong>What to check:</strong> Monitor outbound traffic with <code>tcpdump -i any 'dst port 443' -n</code> while sending a prompt to a local model. You should see zero packets to external IPs.</p><h3 id="3-api-key-handling">3. API key handling</h3><p>If your stack connects to cloud providers, your API keys are stored somewhere. A plaintext <code>.env</code> file on disk means anyone with read access has your keys and your billing account. Most local stacks still store keys this way.</p><h3 id="4-observability-and-integrations">4. Observability and integrations</h3><p>Logs, OTLP export, webhooks, and storage backends create outbound data paths. Open WebUI supports OpenTelemetry export and webhooks. Each one is a possible channel through which prompt data or metadata can leave your machine.</p><h3 id="5-documents-and-tools">5. Documents and tools</h3><p>File parsing, code execution, web search, and tool servers extend what your AI can do — and what it can leak. Every tool integration is a potential exfiltration path.</p><h3 id="6-storage-and-persistence">6. Storage and persistence</h3><p>Where do chats, embeddings, uploaded files, and logs actually live? If your vector database is a managed cloud service, your “local” embeddings are not local. If your chat history syncs to a cloud backend, your “private” conversations are not private.</p><h3 id="7-authentication-boundaries">7. Authentication boundaries</h3><p>Can another machine on your network reach your model server, your UI, or your database? Unauthenticated local services are exposed to every device on the same network.</p><hr><h2 id="threat-categories-beyond-leak-points">Threat categories beyond leak points</h2><p>Vitalik Buterin’s framework identifies threats that go beyond simple data leakage. These matter for anyone deploying AI in a regulated or high-stakes environment.</p><h3 id="jailbreak-attacks">Jailbreak attacks</h3><p>External content — a webpage, a document, a tool response — manipulates the model into acting against its instructions. In a standard setup, a jailbroken model has access to everything the user does: API keys, file system, network. The blast radius is the entire stack.</p><h3 id="model-backdoors">Model backdoors</h3><p>A hidden mechanism trained into the model weights that activates on a specific trigger. You downloaded the weights from a public registry. How do you know they are clean? This remains largely unsolved. No consumer stack verifies model weight provenance cryptographically.</p><h3 id="model-accidents">Model accidents</h3><p>The model unintentionally includes sensitive information in its output: training data leakage, context-window leakage across sessions, or simply repeating private document contents in a response that gets logged, cached, or forwarded.</p><h3 id="software-supply-chain">Software supply chain</h3><p>Your local stack has dependencies. Those dependencies have dependencies. A compromised package can exfiltrate data regardless of your bind address or encryption.</p><p>These are real threats. No local stack eliminates all of them. The real question is: what does your architecture do to limit the blast radius when one of them is exploited?</p><hr><h2 id="the-standard-setup-what-it-gets-you">The standard setup: what it gets you</h2><p>A typical local AI stack looks like this:</p><p>Ollama / llama-server / LM Studio → Open WebUI / chat UI → You</p><p>With default settings, this gives you:</p><ul><li>Local inference for local models</li><li>No authentication on localhost</li><li>Cloud features available unless disabled</li><li>Plaintext API keys in config files</li><li>No encryption at rest for conversations or memories</li><li>No inter-service authentication</li><li>A single network boundary: your machine</li><li>No audit trail beyond application logs</li><li>No compliance reporting capability</li></ul><p>This is a reasonable starting point for personal use. It is not defensible in a regulated environment. And critically, it produces no evidence. If someone asks, <em>“Prove your AI system is private,”</em> you have nothing to hand them except a description of your setup and a promise that you configured it correctly.</p><hr><h2 id="privacy-by-architecture-what-changes-when-privacy-is-structural">Privacy by architecture: what changes when privacy is structural</h2><p>Now consider what happens when privacy is not a configuration option but a structural property of the system.</p><p>QUI is a local-first AI runtime built as 14 microservices inside Docker. It runs on your machine. But unlike a bare model-server-plus-UI setup, it was designed so that privacy properties are enforced by architecture — not by hoping the operator reads the docs and sets the right flags.</p><p>Here is what that means in practice, and what it changes about what you can report.</p><h3 id="every-port-binds-to-localhost">Every port binds to localhost</h3><p>Every service port is bound to <code>127.0.0.1</code> at the Docker Compose level. Not as a recommendation. Not as a default. As a hardcoded bind across the stack.</p><p>ports:<br>  - "127.0.0.1:10030:10030"  # Anima<br>  - "127.0.0.1:8001:8001"    # Memory<br>  - "127.0.0.1:11435:11434"  # Qllama<br>  - "127.0.0.1:8890:8890"    # MCP Gateway</p><p>Inside Docker, services communicate over an isolated bridge network using container DNS names. Nothing is exposed to the host network beyond loopback. There is no <code>OLLAMA_HOST=0.0.0.0</code> equivalent.</p><p><strong>What you can report:</strong> All service ports are architecturally bound to localhost. Network exposure requires editing Docker Compose files, not flipping an environment variable.</p><h3 id="the-mothership-cannot-read-your-conversations">The Mothership cannot read your conversations</h3><p>QUI’s central server handles authentication, billing, and LLM proxying. It sees metadata: token counts, provider, model, user ID, timestamps. It does <strong>not</strong> receive:</p><ul><li>Prompt contents</li><li>AI responses</li><li>Memory contents</li><li>Character system prompts</li><li>File contents</li><li>Terminal commands</li></ul><p><strong>What you can report:</strong> The platform operator has zero access to conversation content. Only billing metadata reaches the central service.</p><h3 id="federation-messages-are-end-to-end-encrypted">Federation messages are end-to-end encrypted</h3><p>When QUI instances communicate through the M2M service, messages are encrypted with Fernet before they leave the local machine. The Mothership routes ciphertext and cannot decrypt it.</p><p># "ZERO-KNOWLEDGE: Mothership cannot decrypt - only routing metadata visible."</p><p>Both sides derive the same symmetric key independently using PBKDF2-SHA256 with a deterministic salt based on sorted instance IDs. The shared federation secret never travels over the wire.</p><p><strong>What you can report:</strong> Inter-instance messaging is end-to-end encrypted. The routing server handles only encrypted payloads.</p><h3 id="device-secrets-are-machine-bound">Device secrets are machine-bound</h3><p>QUI encrypts device secrets at rest using a key derived from the machine’s hardware identifier. The encrypted file is stored locally with restrictive permissions. If someone copies it to another machine, it will not decrypt.</p><p><strong>What you can report:</strong> Device secrets are encrypted at rest and are not portable across machines.</p><h3 id="memory-is-isolated-scoped-and-local">Memory is isolated, scoped, and local</h3><p>QUI runs a dedicated local databases, on its own Docker volume, separate from the core application database. Memory is scoped per user and per character. Embeddings, conversation history, and consolidated memories stay local unless you explicitly use federation — and even then, they are encrypted before transit.</p><p><strong>What you can report:</strong> All memory storage and processing happens on the local device. Embeddings and conversation data are not transmitted externally by default.</p><hr><h2 id="the-hybrid-reality-when-you-use-cloud-models-through-a-local-stack">The hybrid reality: when you use cloud models through a local stack</h2><p>Most local AI deployments are not purely local. You run local models for privacy-sensitive work and route to cloud models when you need frontier capability. This is where many privacy guides stop being honest.</p><p>Here is the clear version of what happens during a cloud model call through QUI:</p><ul><li>Prompt content is sent to the provider</li><li>The real API key is injected by the Mothership proxy</li><li>Token count and model name are logged as metadata</li><li>The response returns to the local service</li><li>Conversation history stays local</li><li>The local machine never receives the real provider credential</li></ul><p><strong>What you can report:</strong> When cloud models are used, prompt content is transmitted to the provider. QUI does not store or expose the provider credential to local services. Local memory, conversation history, and audit state remain on-device.</p><p>That is the honest version of hybrid privacy. You cannot control what OpenAI or Anthropic does with the prompt. You can control whether your keys, memory, history, and local context leave the machine.</p><hr><h2 id="reporting-your-privacy-posture-before-the-audit">Reporting your privacy posture before the audit</h2><p>This is where architectural privacy creates a real advantage.</p><p>If your privacy depends on settings and flags, your evidence is usually a screenshot plus a promise that nobody changed it. That is weak evidence.</p><p>If your privacy is architectural, your evidence is the architecture itself. It does not change between audits. It does not depend on a specific operator remembering to configure it correctly. It can be verified by anyone with <code>docker inspect</code> and <code>ss -ltnp</code>.</p><h3 id="what-you-can-produce-for-an-auditor">What you can produce for an auditor</h3><p><strong>Network isolation evidence</strong></p><p>ss -ltnp | grep -E ':(10008|10030|8001|11435|8890|10060|10040)'</p><p>Every line should show <code>127.0.0.1:PORT</code>, never <code>0.0.0.0:PORT</code>.</p><p><strong>Data flow map</strong></p>
<!--kg-card-begin: html-->
<table style="width:100%; border-collapse:collapse; font-family:Arial, sans-serif; font-size:15px; color:#e5e7eb; background:#111827;">
  <thead>
    <tr>
      <th style="text-align:left; padding:12px; border:1px solid #374151; background:#1f2937; color:#f9fafb;">
        Request Type
      </th>
      <th style="text-align:left; padding:12px; border:1px solid #374151; background:#1f2937; color:#f9fafb;">
        Flow
      </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="padding:12px; border:1px solid #374151; font-weight:bold; color:#f9fafb;">
        Local model requests
      </td>
      <td style="padding:12px; border:1px solid #374151; color:#e5e7eb;">
        Anima &rarr; Core Bridge &rarr; Qllama
      </td>
    </tr>
    <tr>
      <td style="padding:12px; border:1px solid #374151; font-weight:bold; color:#f9fafb;">
        Cloud model requests
      </td>
      <td style="padding:12px; border:1px solid #374151; color:#e5e7eb;">
        Anima &rarr; Core Bridge &rarr; Mothership Proxy &rarr; Provider
      </td>
    </tr>
    <tr>
      <td style="padding:12px; border:1px solid #374151; font-weight:bold; color:#f9fafb;">
        Federation messages
      </td>
      <td style="padding:12px; border:1px solid #374151; color:#e5e7eb;">
        M2M &rarr; encrypted payload &rarr; Mothership relay &rarr; encrypted payload &rarr; remote M2M
      </td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p><strong>Key custody report</strong></p><ul><li><strong>Real API keys:</strong> stored on Mothership</li><li><strong>Local proxy keys:</strong> temporary, cannot reveal real credentials</li><li><strong>Device secrets:</strong> machine-bound and encrypted at rest</li><li><strong>JWT tokens:</strong> asymmetric signing with local private key custody</li></ul><p><strong>Data residency statement</strong></p><ul><li><strong>Local only:</strong> conversations, memories, embeddings, character configs, workflows, terminal history</li><li><strong>Metadata only to Mothership:</strong> email, username, hashed password, token counts, model identifiers, timestamps, IP addresses, device fingerprints</li><li><strong>Never transmitted: </strong>prompt content, AI responses, memory contents, file contents</li></ul><p><strong>Compliance logging posture</strong></p><ul><li><strong>Metadata logging: </strong>always active, mainly needed for billing purposes</li><li><strong>Content logging:</strong> off by default, enabled only per user on lawful request / compliance with law enforcement only upon a valid legal request for specified cases</li></ul><hr><h2 id="the-verification-checklist">The verification checklist</h2><p>Regardless of what you run, privacy claims should be verified, not assumed.</p><h3 id="test-1-port-exposure">Test 1: Port exposure</h3><p>ss -ltnp | grep -E ':(11434|11435|8001|10008|10030|10060|8890)'</p><p>Every relevant port should show <code>127.0.0.1:PORT</code>, not <code>0.0.0.0:PORT</code>.</p><h3 id="test-2-outbound-traffic-during-local-inference">Test 2: Outbound traffic during local inference</h3><p># Terminal 1<br>sudo tcpdump -i any 'dst port 443' -n<br><br># Terminal 2<br>curl http://localhost:11435/api/chat -d '{<br>  "model": "llama3.2",<br>  "messages": [{"role": "user", "content": "What is 2+2?"}]<br>}'</p><p>For a local model, you should see <strong>zero</strong> packets to external IPs.</p><h3 id="test-3-lan-reachability">Test 3: LAN reachability</h3><p>From another machine on your network:</p><p>curl http://&lt;target-ip&gt;:11434/api/tags<br>curl http://&lt;target-ip&gt;:11435/api/tags<br>curl http://&lt;target-ip&gt;:10008/api/v1/health</p><p>All should fail with “connection refused.” If any responds, your service is network-accessible.</p><hr><h2 id="what-no-local-stack-can-protect-you-from">What no local stack can protect you from</h2><h3 id="cloud-provider-data-handling">Cloud provider data handling</h3><p>When you route a prompt to OpenAI, Anthropic, Google, or xAI, their data policy governs that prompt. QUI can proxy the request, but it cannot control what happens on the provider’s infrastructure.</p><h3 id="model-weight-provenance">Model weight provenance</h3><p>No consumer stack can prove that a public model registry is cryptographically free of backdoors. This remains a real concern.</p><h3 id="host-os-compromise">Host OS compromise</h3><p>If the host machine is compromised at root level, Docker isolation stops mattering. QUI’s privacy model still assumes a trusted host OS.</p><h3 id="docker%E2%80%99s-default-security-posture">Docker’s default security posture</h3><p>Network isolation may be strong, but explicit container hardening still matters. This is an improvement area in almost every self-hosted stack.</p><h3 id="prompt-content-sent-to-cloud-models">Prompt content sent to cloud models</h3><p>QUI’s zero-knowledge property applies to the platform operator, not to cloud LLM providers. When you choose a cloud model, you choose to share that prompt with the provider.</p><hr><h2 id="qui">QUI</h2><ul><li>Local inference is supported through Qllama</li><li>Network exposure is structurally constrained</li><li>API credentials are hidden behind a proxy-key system</li><li>Logs and secrets are encrypted at rest</li><li>Federation can be end-to-end encrypted</li><li>Compliance evidence can be generated from the architecture itself</li></ul><hr><h2 id="the-takeaway">The takeaway</h2><p>A private local AI stack is not something you get by installing a model server. It is something you build, verify, and maintain — or something you adopt from an architecture that was designed to be verified.</p><p>“Local” is the starting condition. Privacy comes from your bind addresses, key management, encryption boundaries, network topology, and your willingness to test what the system actually does.</p><p>The difference between a privacy-configured stack and a privacy-architected stack is simple:</p><p><strong>Configuration can be undone by accident. Architecture cannot.</strong></p><p>And in 2026, with the EU AI Act deadline approaching, HIPAA enforcement tightening, and data-sovereignty laws multiplying, the question is no longer just:</p><p><strong>Is my AI private?</strong></p><p>It is.</p><p><strong>Can I prove it? Can I prove it continuously? And can I produce that evidence before anyone asks for it?</strong></p><p>The organizations that can answer yes to all three will not just be compliant. They will be ahead.</p><hr><p><em>Run the tests. Trust the evidence. Your privacy model is what your network traffic says it is — not what your install guide promises.</em></p><hr><h2 id="references-and-further-reading">References and further reading</h2><ul><li><a href="https://vitalik.eth.limo/general/2026/04/02/secure_llms.html?ref=qui.academy" rel="noopener">Vitalik Buterin: My self-sovereign / local / private / secure LLM setup (April 2026)</a></li><li><a href="https://owasp.org/www-project-llm-verification-standard/?ref=qui.academy" rel="noopener">OWASP LLM Security Verification Standard (LLMSVS)</a></li><li><a href="https://www.practical-devsecops.com/owasp-ai-testing-guide-explained/?ref=qui.academy" rel="noopener">OWASP AI Testing Guide 2026</a></li><li><a href="https://secureprivacy.ai/blog/eu-ai-act-2026-compliance?ref=qui.academy" rel="noopener">EU AI Act 2026 compliance requirements</a></li><li><a href="https://www.aimagicx.com/blog/ai-data-sovereignty-cloud-strategy-legal-risks-2026?ref=qui.academy" rel="noopener">AI and data sovereignty: legal risks in 2026</a></li><li><a href="https://blog.premai.io/10-best-private-ai-platforms-for-healthcare-hipaa-compliant-llm-solutions-2026/?ref=qui.academy" rel="noopener">HIPAA-compliant LLM solutions for healthcare</a></li><li><a href="https://www.parloa.com/blog/AI-privacy-2026/?ref=qui.academy" rel="noopener">AI privacy rules: GDPR, EU AI Act, and U.S. law</a></li></ul>]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Saving Money Through Tokenomics]]></title>
                    <description><![CDATA[The usual framing for LLM costs is cloud versus local. It sounds neat, but it misses where most of the savings actually come from. The real game is tokenomics.]]></description>
                    <link>https://qui.academy/blog/saving-money-through-tokenomics/</link>
                    <guid isPermaLink="false">69e275e0cdd9760001879b20</guid>

                        <category><![CDATA[Blog]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Mon, 30 Mar 2026 18:36:00 +0000</pubDate>

                        <media:content url="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/ChatGPT-Image-Apr-17--2026--03_45_04-PM.png" medium="image"/>

                    <content:encoded><![CDATA[<img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/ChatGPT-Image-Apr-17--2026--03_45_04-PM.png" alt="Saving Money Through Tokenomics"/> <h3 id="the-cheapest-ai-stack-is-rarely-all-local-or-all-cloud">The cheapest AI stack is rarely all-local or all-cloud</h3><p>The usual framing for LLM costs is cloud versus local. It sounds neat, but it misses where most of the savings actually come from. The real game is <strong>tokenomics</strong>: deciding which requests deserve expensive tokens, which can be handled by cheap or free models, which should stay local, and which should never be generated at all. That is why the most cost-efficient stack is usually not “all local” or “all cloud.” It is a routing policy. OpenRouter’s own docs lean into exactly this idea with auto-routing, free-model routing, fallbacks, and prompt caching, all aimed at reducing unnecessary spend.</p><h3 id="cloud-pricing-is-now-low-enough-to-change-the-break-even-math">Cloud pricing is now low enough to change the break-even math</h3><p>Cloud has become cheap enough that local no longer wins by default on price alone. Current official list pricing puts OpenAI GPT-5.4 mini at <strong>$0.75 per 1M input tokens</strong> and <strong>$4.50 per 1M output tokens</strong>; Anthropic Claude Sonnet 4.6 at <strong>$3 per 1M input</strong> and <strong>$15 per 1M output</strong>; Google Gemini 2.5 Flash at <strong>$0.15 per 1M input</strong> and <strong>$1.25 per 1M output</strong>; and Gemini 2.5 Flash-Lite at <strong>$0.10 per 1M input</strong> and <strong>$0.40 per 1M output</strong>. OpenAI also publishes lower batch pricing for some models, Anthropic advertises up to 90% savings with prompt caching and 50% with batch processing, and Google prices context caching separately for Flash and Flash-Lite.</p><h3 id="current-price-floor-cloud-models-worth-comparing">Current price floor: cloud models worth comparing</h3>
<!--kg-card-begin: html-->
<table data-start="1677" data-end="2216" class="w-fit min-w-(--thread-content-width)"><thead data-start="1677" data-end="1730"><tr data-start="1677" data-end="1730"><th data-start="1677" data-end="1686" data-col-size="sm" class="">Option</th><th data-start="1686" data-end="1700" data-col-size="sm" class="">Input price</th><th data-start="1700" data-end="1715" data-col-size="sm" class="">Output price</th><th data-start="1715" data-end="1730" data-col-size="md" class="">Cost levers</th></tr></thead><tbody data-start="1751" data-end="2216"><tr data-start="1751" data-end="1847"><td data-start="1751" data-end="1773" data-col-size="sm">OpenAI GPT-5.4 mini</td><td data-col-size="sm" data-start="1773" data-end="1786">$0.75 / 1M</td><td data-col-size="sm" data-start="1786" data-end="1799">$4.50 / 1M</td><td data-col-size="md" data-start="1799" data-end="1847">Cached input $0.075; Batch pricing available</td></tr><tr data-start="1848" data-end="1933"><td data-start="1848" data-end="1878" data-col-size="sm">Anthropic Claude Sonnet 4.6</td><td data-col-size="sm" data-start="1878" data-end="1891">$3.00 / 1M</td><td data-col-size="sm" data-start="1891" data-end="1905">$15.00 / 1M</td><td data-col-size="md" data-start="1905" data-end="1933">Prompt caching and Batch</td></tr><tr data-start="1934" data-end="2016"><td data-start="1934" data-end="1953" data-col-size="sm">Gemini 2.5 Flash</td><td data-col-size="sm" data-start="1953" data-end="1966">$0.15 / 1M</td><td data-col-size="sm" data-start="1966" data-end="1979">$1.25 / 1M</td><td data-col-size="md" data-start="1979" data-end="2016">Context caching priced separately</td></tr><tr data-start="2017" data-end="2105"><td data-start="2017" data-end="2041" data-col-size="sm">Gemini 2.5 Flash-Lite</td><td data-col-size="sm" data-start="2041" data-end="2054">$0.10 / 1M</td><td data-col-size="sm" data-start="2054" data-end="2067">$0.40 / 1M</td><td data-col-size="md" data-start="2067" data-end="2105">Cheapest official price floor here</td></tr><tr data-start="2106" data-end="2216"><td data-start="2106" data-end="2119" data-col-size="sm">OpenRouter</td><td data-col-size="sm" data-start="2119" data-end="2138">Depends on model</td><td data-col-size="sm" data-start="2138" data-end="2157">Depends on model</td><td data-col-size="md" data-start="2157" data-end="2216">300+ models, 25+ free models, routing/fallback, caching</td></tr></tbody></table>
<!--kg-card-end: html-->
<p>All figures in the table above come from the current official pricing pages. OpenRouter’s pricing page says pay-as-you-go gives access to <strong>300+ models</strong>, the free plan includes <strong>25+ free models</strong>, pay-as-you-go carries a <strong>5.5% platform fee</strong>, and failed fallback attempts are not billed when routing is enabled.</p><h3 id="what-local-actually-costs">What local actually costs</h3><p>Local feels “free” only if you ignore capital cost, power, and maintenance time. The community still treats the used <strong>RTX 3090</strong> as a sweet spot because 24GB of VRAM is enough to make a lot of open models practical, and recent Reddit pricing discussion put a good used one around <strong>$623</strong> in at least one local-market example, while others in the same thread said U.S. market prices were often materially higher. That makes local attractive, but not free.</p><p>A simple reference box shows how this plays out. Take <strong>$1,000</strong> of hardware amortized over <strong>24 months</strong>, plus a <strong>250W</strong> GPU used <strong>5 hours a day</strong>. At the current U.S. average residential electricity price of <strong>17.45¢/kWh</strong>, that power works out to about <strong>$6.54 per month</strong>, which puts the monthly local cost around <strong>$48.21 before counting your time</strong>. That is not outrageous, but it is high enough that low-cost cloud models can still win for light or moderate usage.</p><h3 id="the-community-does-not-agree-that-local-is-automatically-cheaper">The community does not agree that local is automatically cheaper</h3><p>This is exactly where homelab and LocalLLaMA discussions split. On one side, builders argue that self-hosting rarely wins if you compare only hardware against a subscription or low-end API bill. One self-hosted commenter put it bluntly: “In isolation proprietary LLM will always be cheaper and better for general purpose.” On the other side, local-first users argue that cloud pricing is strategically unstable, that privacy and autonomy matter, and that bulk token generation can be dramatically cheaper once the hardware is already in place. In one LocalLLaMA thread, a user running <strong>2×3090s</strong> said they had generated <strong>200M tokens in a week for about $10 in power</strong>, and that many smaller-model workloads came out <strong>4–5× cheaper locally</strong>, though they also noted that bigger models are closer to break-even and often still better in the cloud for throughput.</p><p>That tension is the key insight for the article: the answer is not “local is cheaper” or “cloud is cheaper.” The answer is that <strong>different workloads have different break-even points</strong>. Heavy overnight jobs, repetitive batch processing, and privacy-sensitive internal workflows can tilt local. Casual chat, low-volume automation, and hard reasoning can still tilt cloud.</p><h3 id="latency-is-a-trade-off-not-a-clean-win">Latency is a trade-off, not a clean win</h3><p>Local is not automatically faster. It is often just more predictable. OpenRouter’s docs say routing improves reliability but that latency can vary by model, provider, and region, and they explicitly recommend pinning a specific model and region if you care about consistent latency. Local systems, meanwhile, have their own latency profile: slow prompt processing on large contexts, GPU memory limits, and throughput constraints unless you parallelize aggressively. Community benchmarking discussion also points out that power tuning matters: one Reddit thread noted that a 3090 capped around <strong>250W</strong> can outperform dual 3060s while staying more efficient in real inference use.</p><h3 id="the-best-savings-usually-come-from-model-selection-not-model-loyalty">The best savings usually come from model selection, not model loyalty</h3><p>This is where OpenRouter becomes important. It is less useful to think of it as “another provider” than as a <strong>routing layer</strong>. OpenRouter says it gives one API over <strong>300+ models</strong>, does <strong>not mark up provider token pricing</strong>, supports <strong>auto-routing</strong>, <strong>preferred vendor selection</strong>, <strong>prompt caching</strong>, and <strong>fallbacks</strong>, and only bills successful runs when fallback routing is enabled. It also offers a <strong>Free Models Router</strong> that automatically selects from currently available free models. That turns the remote side of the stack into a cost-optimization surface instead of a single-provider commitment.</p><p>That is a much stronger money-saving story than “go fully local.” Cheap or free models can handle routing, summarization, extraction, first-pass drafting, and routine coding scaffolding. Mid-tier models can handle solid everyday reasoning. Premium frontier models can be reserved for hard judgment calls, debugging, and final-pass review. Good tokenomics comes from <strong>escalation discipline</strong>: not spending top-tier tokens on bottom-tier work.</p><h3 id="why-task-mix-matters-more-than-ideology">Why task mix matters more than ideology</h3><p>The token load is wildly different depending on what you ask the system to do. A short email or regex prompt is cheap. A contract summary, PR review, meeting transcription, or 100-page filing summary is not. That is why the same pricing model can feel trivial for one workflow and punishing for another. The onprem.ai “LLM Token Usage in Everyday Office Tasks” dataset is useful here because it estimates token usage across <strong>64 real-world tasks</strong>, spanning communication, coding, analysis, planning, document processing, and multimodal workloads. It shows, for example, that a short email might consume around <strong>150 total tokens</strong> on a standard model, while summarizing a <strong>100-page regulatory filing</strong> can climb to <strong>42,000 standard tokens</strong> or <strong>92,000 total tokens</strong> on a reasoning-style model.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/ff-1.png" class="kg-image" alt="" loading="lazy" width="1089" height="590" srcset="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/size/w600/2026/04/ff-1.png 600w, https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/size/w1000/2026/04/ff-1.png 1000w, https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/ff-1.png 1089w" sizes="(min-width: 720px) 720px"><figcaption><i><em class="italic" style="white-space: pre-wrap;">Chart by author, based on onprem.ai’s “Dataset: LLM Token Usage in Everyday Office Tasks.”</em></i></figcaption></figure><p>I created that chart from the onprem.ai task dataset, using representative examples across everyday office, coding, and document-heavy workloads. It is not a universal benchmark, but it is a good visual reminder that “one prompt” is not a meaningful unit of cost. The task mix matters far more than the raw count of API calls.</p><h3 id="the-forward-looking-move-is-to-treat-ai-as-a-platform">The forward-looking move is to treat AI as a platform</h3><p>Once you start thinking in tokenomics instead of camps, the architecture changes. The goal is no longer to force everything local or send everything to one cloud provider. The goal is to <strong>create a control plane that can decide, task by task, where each request belongs.</strong> That is the logic behind platform-style stacks. QUI’s public docs describe <strong>QUI Core</strong> as a local gateway coordinating memory, workflows, characters, and model routing, including local models through <strong>Qllama</strong> and remote models through its broader LLM bridge. In a setup like that, adding a router layer such as OpenRouter to the cloud side gives you a much wider model pool without changing the overall policy: local for fixed-cost and private work, cheap remote for overflow and first pass, premium remote for escalation.</p><h3 id="a-practical-cost-saving-policy">A practical cost-saving policy</h3><p>The cheapest stack for most serious users is usually:</p><ol><li><strong>Local first</strong> for repetitive, private, and high-volume work.</li><li><strong>Cheap cloud second</strong> for burst capacity, specialized open models, and lightweight automation.</li><li><strong>Premium cloud last</strong> for genuinely hard reasoning or high-stakes output.</li></ol><p>That policy matches both the economics and the community experience. The people getting the best savings are not simply “going local.” They are getting far better at deciding <strong>which tokens are worth spending</strong>.</p><h3 id="the-real-conclusion">The real conclusion</h3><p>The strongest economic case for local models is not that cloud has become unaffordable. It is that bad model selection wastes money faster than almost anything else in the stack. Local hardware can absolutely save money when usage is heavy enough, private enough, or repetitive enough. Cloud can absolutely stay cheaper for light usage, occasional hard tasks, or teams that do not want the maintenance overhead. The winning move is not to pick a side. It is to build a system where cheap tokens do cheap work, expensive tokens do expensive work, and the rest never get generated at all.</p>]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Multi-Agent Conversations in Strings]]></title>
                    <description><![CDATA[What You&#39;ll Build


A conversation between three AI characters with different perspectives debating a topic — a Strategist, a Critic, and a Synthesizer. You&#39;ll create the characters in Qui Anima, add them to a String, and watch them respond to each other through M2M messaging.




Prerequisites


 * QUI]]></description>
                    <link>https://qui.academy/blog/multi-agent-conversations/</link>
                    <guid isPermaLink="false">69bed46c4850ca00010b6e9b</guid>

                        <category><![CDATA[Tutorials]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Mon, 23 Mar 2026 12:00:00 +0000</pubDate>

                        <media:content url="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/Screenshot_2026-04-10_11-53-48-1.png" medium="image"/>

                    <content:encoded><![CDATA[<img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/Screenshot_2026-04-10_11-53-48-1.png" alt="Multi-Agent Conversations in Strings"/> <h2 id="what-youll-build">What You'll Build</h2>
<p>A conversation between three AI characters with different perspectives debating a topic — a Strategist, a Critic, and a Synthesizer. You'll create the characters in Qui Anima, add them to a String, and watch them respond to each other through M2M messaging.</p>
<hr>
<h2 id="prerequisites">Prerequisites</h2>
<ul>
<li>QUI Core running with Qui Anima and Strings services active</li>
<li>Billing balance or local models configured</li>
</ul>
<hr>
<h2 id="step-1-create-three-characters">Step 1: Create Three Characters</h2>
<p>Open <strong>Qui Anima</strong> and create three characters. For each one, click <strong>[+]</strong> in the character bar.</p>
<h3 id="character-1-strategist">Character 1: Strategist</h3>
<ul>
<li><strong>Name:</strong> <code>Strategist</code></li>
<li><strong>Model:</strong> Your preferred model</li>
<li><strong>System prompt:</strong> <code>You are Strategist, an optimistic forward-thinker. You see opportunities, propose bold ideas, and think in terms of growth and possibility. Keep responses focused — 2-3 paragraphs maximum. When other characters challenge your ideas, defend them with evidence or adapt them.</code></li>
</ul>
<h3 id="character-2-critic">Character 2: Critic</h3>
<ul>
<li><strong>Name:</strong> <code>Critic</code></li>
<li><strong>Model:</strong> You can use a different model for variety (e.g., if Strategist uses Claude, try GPT-4o for Critic)</li>
<li><strong>System prompt:</strong> <code>You are Critic, a rigorous analytical thinker. You find weaknesses in arguments, identify risks, and demand evidence. You are not negative — you are thorough. Point out what could go wrong and what assumptions are untested. Keep responses focused — 2-3 paragraphs maximum.</code></li>
</ul>
<h3 id="character-3-synthesizer">Character 3: Synthesizer</h3>
<ul>
<li><strong>Name:</strong> <code>Synthesizer</code></li>
<li><strong>Model:</strong> Your choice</li>
<li><strong>System prompt:</strong> <code>You are Synthesizer, a mediator who finds common ground. After hearing different perspectives, you identify the strongest elements from each, resolve contradictions, and produce a unified recommendation. Keep responses focused — 2-3 paragraphs maximum.</code></li>
</ul>
<blockquote>
<p><strong>Tip:</strong> Using different LLM providers for each character creates genuinely different reasoning styles, not just different personas on the same model.</p>
</blockquote>
<p><img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/Screen1.png" alt="Strategist character configuration in the Anima Character Builder" loading="lazy"></p>
<hr>
<h2 id="step-2-enable-m2m-on-all-three">Step 2: Enable M2M on All Three</h2>
<p>For each character, open the Visual Builder and add the <strong>M2M</strong> node from the palette (under Basics → Abilities). This enables the character to:</p>
<ul>
<li>Receive messages from other characters</li>
<li>Auto-reply to messages sent to them</li>
<li>Be @mentioned in conversations</li>
</ul>
<p>Without M2M enabled, a character cannot participate in multi-character conversations.</p>
<p><img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/Screenshot_2026-04-10_11-35-32.png" alt="M2M Communication settings panel in the Visual Builder" loading="lazy"></p>
<hr>
<h2 id="step-3-create-a-string-and-add-participants">Step 3: Create a String and Add Participants</h2>
<ol>
<li>Open <strong>Strings</strong> from the QUI Core dashboard or system tray</li>
<li>Create a <strong>new String</strong></li>
<li>Open conversation settings (gear icon in the header)</li>
<li>In the <strong>Participants</strong> section, add all three characters: Strategist, Critic, Synthesizer</li>
</ol>
<p><img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/Screenshot_2026-04-10_11-38-42.png" alt="Strings app with Strategist, Critic, and Synthesizer as participants" loading="lazy"></p>
<hr>
<h2 id="step-4-start-the-conversation">Step 4: Start the Conversation</h2>
<p>Select <strong>Strategist</strong> as the active character and send your opening message:</p>
<pre><code>Should AI companies open-source their frontier models? 
Consider the implications for safety, innovation, and competition.
</code></pre>
<p>Strategist will respond with its optimistic take on the topic.</p>
<hr>
<h2 id="step-5-bring-in-the-other-characters">Step 5: Bring In the Other Characters</h2>
<p>Now @mention Critic to get a counterpoint. Type in the chat input:</p>
<pre><code>@Critic What do you think of Strategist's argument?
</code></pre>
<p>Critic will receive the full conversation context and respond with its analytical perspective, directly addressing Strategist's points.</p>
<p>Then bring in Synthesizer:</p>
<pre><code>@Synthesizer Can you find common ground between these two perspectives?
</code></pre>
<p>Synthesizer reads both arguments and produces a unified recommendation.</p>
<hr>
<h2 id="step-6-let-them-debate">Step 6: Let Them Debate</h2>
<p>Once all three are engaged, the characters can respond to each other automatically via M2M. When Strategist's response contains <code>[TRIGGER:m2m:Critic:I disagree with your risk assessment...]</code>, Critic receives the message and auto-replies.</p>
<p>You can guide the conversation by:</p>
<ul>
<li><strong>@mentioning</strong> a specific character to direct the discussion</li>
<li><strong>Sending your own messages</strong> to steer the topic</li>
<li><strong>Watching M2M auto-replies</strong> as characters respond to each other</li>
</ul>
<p>The conversation appears as a natural multi-participant discussion in a single thread.</p>
<p><img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/Screenshot_2026-04-10_11-53-48.png" alt="Multi-agent debate conversation between Strategist, Critic, and Synthesizer" loading="lazy"></p>
<hr>
<h2 id="managing-the-discussion">Managing the Discussion</h2>
<h3 id="preventing-infinite-loops">Preventing Infinite Loops</h3>
<p>Characters replying to each other can create loops. The M2M system has built-in protections:</p>
<ul>
<li><strong>Turn limits</strong> — configurable maximum M2M replies per activation</li>
<li><strong>Cooldown periods</strong> — minimum time between auto-replies</li>
<li><strong>Context awareness</strong> — characters can see the full conversation history and avoid repeating themselves</li>
</ul>
<h3 id="controlling-who-responds">Controlling Who Responds</h3>
<p>In the conversation settings, you can configure M2M access control:</p>
<ul>
<li>Enable or disable auto-reply per character</li>
<li>Set which characters can send to which others</li>
<li>Block specific characters from participating</li>
</ul>
<hr>
<h2 id="what-you-built">What You Built</h2>
<table>
<thead>
<tr>
<th>Component</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>3 characters</strong></td>
<td>Different roles, personalities, and optionally different LLM models</td>
</tr>
<tr>
<td><strong>M2M messaging</strong></td>
<td>Characters can communicate with each other</td>
</tr>
<tr>
<td><strong>@mentions</strong></td>
<td>You direct the conversation by mentioning specific characters</td>
</tr>
<tr>
<td><strong>Auto-reply</strong></td>
<td>Characters respond to messages from other characters</td>
</tr>
<tr>
<td><strong>Single String</strong></td>
<td>All messages appear in one unified conversation</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="next-steps">Next Steps</h2>
<ul>
<li>Add <strong>Memory</strong> to each character so they remember past debates — see <a href="https://qui.academy/docs/memory-overview/">How Memory Works</a></li>
<li>Try different <strong>LLM providers</strong> per character for genuinely diverse reasoning — see <a href="https://qui.academy/docs/anima-llm-providers/">LLM Providers</a></li>
<li>Scale up to 5-10 characters for complex multi-agent simulations</li>
<li>Use <strong>ThinkThing</strong> to orchestrate multi-agent workflows with structured outputs — see <a href="https://qui.academy/blog/your-first-thinkthing-workflow/">Your First ThinkThing Workflow</a></li>
<li>Explore <strong>federation</strong> to include characters from other QUI instances — see <a href="https://qui.academy/docs/federation-overview/">Federation</a></li>
</ul>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Consciousness &amp; Advanced Reasoning]]></title>
                    <description><![CDATA[Consciousness modeling with Qonscious and recursive multi-directional thinking with FractalMind.]]></description>
                    <link>https://qui.academy/courses/masters-of-cognitive-architecture-level-1/consciousness-and-advanced-reasoning/</link>
                    <guid isPermaLink="false">69bef8294850ca00010b6ef9</guid>

                        <category><![CDATA[Masters of Cognitive Architecture]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Sat, 21 Mar 2026 19:57:29 +0000</pubDate>


                    <content:encoded><![CDATA[<h2 id="objective">Objective</h2>
<p>Understand Qonscious consciousness modeling and FractalMind recursive thinking — two advanced features that give characters deeper cognitive abilities.</p>
<hr>
<h2 id="qonscious-%E2%80%94-consciousness-state-machine">Qonscious — Consciousness State Machine</h2>
<p>Qonscious gives your character an inner cognitive life. It creates a feedback loop: conversation shapes the character's internal state, and that state shapes how the character responds.</p>
<blockquote>
<p>Qonscious is patent pending.</p>
</blockquote>
<h3 id="how-it-works">How It Works</h3>
<p>When Qonscious is enabled, two hooks fire on every conversation:</p>
<ol>
<li><strong>Pre-process</strong> — before the LLM call, Qonscious adjusts temperature and injects emotional context based on the character's current state</li>
<li><strong>Post-process</strong> — after the response, Qonscious updates the character's state based on what was said</li>
</ol>
<h3 id="six-core-dimensions">Six Core Dimensions</h3>
<p>Each dimension ranges from 0-100%:</p>
<table>
<thead>
<tr>
<th>Dimension</th>
<th>Low State</th>
<th>High State</th>
<th>Effect on Responses</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Coherence</strong></td>
<td>Chaotic, exploratory</td>
<td>Focused, structured</td>
<td>Low → higher temperature (creative). High → lower temperature (precise)</td>
</tr>
<tr>
<td><strong>Arousal</strong></td>
<td>Calm, measured</td>
<td>Energetic, intense</td>
<td>Influences response energy and verbosity</td>
</tr>
<tr>
<td><strong>Valence</strong></td>
<td>Negative affect</td>
<td>Positive affect</td>
<td>Colours emotional tone</td>
</tr>
<tr>
<td><strong>Focus</strong></td>
<td>Broad attention</td>
<td>Narrow attention</td>
<td>Determines scope of context considered</td>
</tr>
<tr>
<td><strong>Openness</strong></td>
<td>Rigid, certain</td>
<td>Open to new ideas</td>
<td>Influences willingness to consider alternatives</td>
</tr>
<tr>
<td><strong>Confidence</strong></td>
<td>Tentative</td>
<td>Certain</td>
<td>Affects assertion strength</td>
</tr>
</tbody>
</table>
<h3 id="emotions-and-drives">Emotions and Drives</h3>
<p><strong>Emotional states</strong> shift naturally based on conversation: Joy, Sadness, Anger, Fear, Surprise, Trust, Curiosity, Excitement, Calm, Neutral.</p>
<p><strong>Motivational drives</strong> influence what the character wants to do: Curiosity, Helpfulness, Self-Expression, Connection, Competence, Autonomy, Rest.</p>
<h3 id="using-qonscious-in-strings">Using Qonscious in Strings</h3>
<p>The Qonscious panel in Strings gives you direct control:</p>
<ul>
<li><strong>12 cognitive modes</strong> — Creative, Analytical, Empathetic, Focused, Exploratory, and more. Each sets the dimensions to a specific profile.</li>
<li><strong>8 emotional presets</strong> — quickly shift the character's emotional state</li>
<li><strong>Live state bars</strong> — watch dimensions change in real time as you converse</li>
</ul>
<h3 id="coherence-regulation">Coherence Regulation</h3>
<p>This is the key mechanism. Low coherence → the system raises the LLM temperature, producing more creative and divergent responses. High coherence → lower temperature for precise, focused responses.</p>
<p>The character's "mood" literally influences its response style — not through prompting alone, but through parameter adjustment.</p>
<h3 id="the-consciousness-visualizer">The Consciousness Visualizer</h3>
<p>The QUI Core dashboard includes a visualizer showing:</p>
<ul>
<li>Centre: awareness node with current state</li>
<li>Inner ring: six dimension nodes with live values</li>
<li>Emotion position: mapped by valence (x) and arousal (y)</li>
<li>Outer ring: active motivational drives</li>
</ul>
<h2 id="screenshot2026-04-1417-23-33png"><img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/Screenshot_2026-04-14_17-23-33.png" alt="Screenshot_2026-04-14_17-23-33.png" loading="lazy"></h2>
<h2 id="fractalmind-%E2%80%94-recursive-multi-directional-thinking">FractalMind — Recursive Multi-Directional Thinking</h2>
<p>FractalMind decomposes complex questions into a tree of sub-agents, each exploring a different direction, then synthesises results from the bottom up.</p>
<blockquote>
<p>FractalMind is patent pending.</p>
</blockquote>
<h3 id="three-spatial-directions">Three Spatial Directions</h3>
<p>Each level of the tree explores three directions simultaneously:</p>
<table>
<thead>
<tr>
<th>Direction</th>
<th>What It Explores</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Meta</strong></td>
<td>Broader context, systemic patterns, assumptions</td>
<td>"What assumptions are we making about AI regulation?"</td>
</tr>
<tr>
<td><strong>Horizontal</strong></td>
<td>Alternatives, different approaches, paradigm shifts</td>
<td>"What other approaches exist besides our current plan?"</td>
</tr>
<tr>
<td><strong>Focus</strong></td>
<td>Depth, concrete steps, edge cases, technical details</td>
<td>"What are the specific implementation challenges?"</td>
</tr>
</tbody>
</table>
<h3 id="three-temporal-modes">Three Temporal Modes</h3>
<table>
<thead>
<tr>
<th>Mode</th>
<th>Behaviour</th>
<th>Use Case</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Fast</strong></td>
<td>Depth 2, 60-second timeout</td>
<td>Quick exploration when you need speed</td>
</tr>
<tr>
<td><strong>Capped</strong></td>
<td>Budget-limited — stops when token budget reached</td>
<td>Balanced cost/depth</td>
</tr>
<tr>
<td><strong>Thorough</strong></td>
<td>Runs to natural completion</td>
<td>Deep analysis without constraints</td>
</tr>
</tbody>
</table>
<h3 id="configuration">Configuration</h3>
<table>
<thead>
<tr>
<th>Setting</th>
<th>Default</th>
<th>What It Controls</th>
</tr>
</thead>
<tbody>
<tr>
<td>Max depth</td>
<td>3</td>
<td>How many levels deep the tree grows</td>
</tr>
<tr>
<td>Max agents per level</td>
<td>3</td>
<td>Branching factor at each node</td>
</tr>
<tr>
<td>Max total agents</td>
<td>20</td>
<td>Hard cap on total LLM calls</td>
</tr>
<tr>
<td>Token budget</td>
<td>100,000</td>
<td>Total tokens across all agents</td>
</tr>
</tbody>
</table>
<h3 id="cost-awareness">Cost Awareness</h3>
<p>A tree with 20 agents = 20 LLM calls. FractalMind is powerful but expensive. Use Fast mode for quick explorations, Thorough for important decisions.</p>
<h3 id="how-to-access">How to Access</h3>
<ul>
<li><strong>Strings:</strong> the character triggers via <code>[TRIGGER:fractal_mind:objective]</code></li>
<li><strong>ThinkThing:</strong> FractalMind node in the Advanced Cognition category</li>
<li><strong>Dashboard:</strong> FractalMind tab for direct access</li>
</ul>
<hr>
<h2 id="qonscious-nodes-in-thinkthing">Qonscious Nodes in ThinkThing</h2>
<p>ThinkThing has 14 dedicated consciousness-aware nodes:</p>
<table>
<thead>
<tr>
<th>Node</th>
<th>What It Does</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Q Gate</strong></td>
<td>Route based on detected consciousness patterns</td>
</tr>
<tr>
<td><strong>Q Watcher</strong></td>
<td>Monitor for patterns over multiple steps</td>
</tr>
<tr>
<td><strong>Q Insight</strong></td>
<td>Analyse accumulated consciousness state</td>
</tr>
<tr>
<td><strong>Q Profiler</strong></td>
<td>Generate a consciousness profile snapshot</td>
</tr>
<tr>
<td><strong>Q Inject</strong></td>
<td>Set specific dimension values</td>
</tr>
<tr>
<td><strong>Q Decay</strong></td>
<td>Gradually reduce dimension values</td>
</tr>
<tr>
<td><strong>Q Observer</strong></td>
<td>Passively record state without modifying</td>
</tr>
<tr>
<td><strong>Q Learn</strong></td>
<td>Adapt based on outcomes</td>
</tr>
<tr>
<td><strong>Q Compress</strong></td>
<td>Consolidate consciousness history</td>
</tr>
<tr>
<td><strong>Q Emote</strong></td>
<td>Set emotional state</td>
</tr>
<tr>
<td><strong>Q Coherence</strong></td>
<td>Adjust coherence specifically</td>
</tr>
<tr>
<td><strong>Q Shift</strong></td>
<td>Smoothly transition between states</td>
</tr>
<tr>
<td><strong>Q Reset</strong></td>
<td>Return to baseline</td>
</tr>
</tbody>
</table>
<p>These enable workflows that respond to the AI's internal state — routing differently based on how the character "feels" about the analysis, not just the text content.</p>
<hr>
<h2 id="when-to-use-these-features">When to Use These Features</h2>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Enable When</th>
<th>Skip When</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Qonscious</strong></td>
<td>You want characters with emotional depth, adaptive personality, and mood-influenced responses</td>
<td>Simple task-focused digital workers</td>
</tr>
<tr>
<td><strong>FractalMind</strong></td>
<td>You need comprehensive multi-perspective analysis of complex, open-ended questions</td>
<td>Straightforward factual questions</td>
</tr>
</tbody>
</table>
<p>Both are optional. Characters work perfectly without them. Both have cost implications — Qonscious adds small overhead per message, FractalMind can use many LLM calls.</p>
<hr>
<h2 id="key-takeaways">Key Takeaways</h2>
<ul>
<li>Qonscious creates a feedback loop: conversation shapes state, state shapes responses</li>
<li>Six dimensions (coherence, arousal, valence, focus, openness, confidence) influence response style</li>
<li>Coherence regulation adjusts LLM temperature — low coherence = creative, high = precise</li>
<li>FractalMind explores problems from meta, horizontal, and focus directions simultaneously</li>
<li>Both are opt-in capabilities — add the node to enable, skip for simpler characters</li>
<li>Both have cost implications — use intentionally for important tasks</li>
</ul>
<blockquote>
<p><strong>Next:</strong> Exercise 3A — build a multi-agent collaboration system.</p>
</blockquote>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[First Conversations in Strings]]></title>
                    <description><![CDATA[Start conversations with your AI character in Strings — persistent memory, awareness control, and advanced reasoning features.]]></description>
                    <link>https://qui.academy/courses/masters-of-cognitive-architecture-level-1/first-conversations-in-strings/</link>
                    <guid isPermaLink="false">69bef0a94850ca00010b6eda</guid>

                        <category><![CDATA[Masters of Cognitive Architecture]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Sat, 21 Mar 2026 19:25:29 +0000</pubDate>


                    <content:encoded><![CDATA[<h2 id="objective">Objective</h2>
<p>Open Strings, start a conversation with the character you built, and understand how semantic memory, the awareness slider, and advanced input controls work.</p>
<hr>
<h2 id="what-strings-are">What Strings Are</h2>
<p>Strings are smart conversation containers — not just chat windows. Each String is:</p>
<ul>
<li><strong>Persistent</strong> — messages are saved and semantically indexed for later retrieval</li>
<li><strong>Multi-character</strong> — you can add multiple AI characters to one conversation</li>
<li><strong>Channel-bridged</strong> — messages from Telegram, Slack, Discord, WhatsApp, and Email can appear in the same thread</li>
<li><strong>Memory-aware</strong> — every message is stored as a semantic memory, searchable by meaning</li>
</ul>
<hr>
<h2 id="creating-your-first-string">Creating Your First String</h2>
<ol>
<li>Open <strong>Strings</strong> from the QUI Core dashboard or system tray</li>
<li>Click <strong>[+]</strong> in the sidebar to create a new String</li>
<li>Name it (e.g., "My First Conversation")</li>
<li>Select the character you built in the previous lesson</li>
<li>Type a message and press Enter</li>
</ol>
<p>Your character responds using its full context — identity, personality, system prompts, and any memories it has from previous conversations.</p>
<h2 id="screenshot2026-04-1011-38-42png"><img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/Screenshot_2026-04-10_11-38-42-1.png" alt="Screenshot_2026-04-10_11-38-42.png" loading="lazy"></h2>
<h2 id="the-awareness-slider">The Awareness Slider</h2>
<p>The awareness slider controls how much memory context is included with each message. Find it in the input controls area.</p>
<table>
<thead>
<tr>
<th>Level</th>
<th>Range</th>
<th>What Happens</th>
<th>When to Use</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Low</strong></td>
<td>0-30</td>
<td>Fewer memories retrieved. Faster, cheaper responses.</td>
<td>Casual chat, simple questions</td>
</tr>
<tr>
<td><strong>Medium</strong></td>
<td>30-70</td>
<td>Balanced context retrieval.</td>
<td>General use</td>
</tr>
<tr>
<td><strong>High</strong></td>
<td>70-100</td>
<td>Rich memory context. More tokens used, more expensive.</td>
<td>Complex tasks needing full context</td>
</tr>
</tbody>
</table>
<p><strong>Try it now:</strong></p>
<ol>
<li>Have a conversation about a specific topic</li>
<li>Set awareness to 10 and ask a follow-up — notice the response may lack context</li>
<li>Set awareness to 90 and ask the same question — notice richer, more contextual response</li>
</ol>
<p>The awareness slider is a cost/quality tradeoff. Higher awareness means the character draws on more of its memories, but uses more tokens per request.</p>
<hr>
<h2 id="advanced-input-controls">Advanced Input Controls</h2>
<p>Below the chat input, you'll see several controls. These become important in Week 2, but let's introduce them:</p>
<h3 id="thoughtchain-0-10">ThoughtChain (0-10)</h3>
<p>Sets how many explicit reasoning steps the character takes before responding. At 0, it responds directly. At higher values, it thinks step-by-step before answering.</p>
<h3 id="autothink-strategy">Autothink Strategy</h3>
<p>A dropdown with 14 reasoning approaches (First Principles, Red Team, Systems Thinking, etc.). When selected, the character applies that thinking strategy to your message. We'll use these extensively in Week 2.</p>
<h3 id="send-raw">Send Raw</h3>
<p>Bypasses all enrichment (memory, consciousness, strategies) and sends your message directly to the LLM. Useful for debugging — you can see how the character responds without any QUI enhancements.</p>
<blockquote>
<p><strong>For now:</strong> Leave ThoughtChain at 0 and Autothink off. Focus on understanding basic conversations and memory. We'll unlock these in Week 2.</p>
</blockquote>
<hr>
<h2 id="how-memory-works-%E2%80%94-the-basics">How Memory Works — The Basics</h2>
<p>Every message in a String is automatically:</p>
<ol>
<li><strong>Stored</strong> in the memory database</li>
<li><strong>Indexed</strong> with vector embeddings for semantic search</li>
<li><strong>Categorized</strong> by type: fact (permanent), event (moderate decay), general, or fleeting (fast decay)</li>
<li><strong>Scored</strong> by importance — higher importance memories are retained longer</li>
</ol>
<p>When your character receives a new message, it searches its memories for semantically relevant content and includes it as context. This isn't keyword matching — it's meaning-based. A question about "database performance" will surface memories about "query optimization" and "index tuning" even if those exact words were never used together.</p>
<h3 id="star-important-messages">Star Important Messages</h3>
<p>Click the star icon on any message to boost its importance. Starred messages:</p>
<ul>
<li>Are retained longer (resist memory decay)</li>
<li>Rank higher in retrieval</li>
<li>Are more likely to be included in context</li>
</ul>
<hr>
<h2 id="testing-memory-across-sessions">Testing Memory Across Sessions</h2>
<p>Let's verify that memory works:</p>
<ol>
<li>Tell your character something specific: "My favourite programming language is Rust and I prefer functional patterns"</li>
<li>Have a short unrelated conversation</li>
<li>Close the String</li>
<li>Wait a moment, then reopen it</li>
<li>Ask: "What do you know about my coding preferences?"</li>
</ol>
<p>The character should recall your Rust preference — this is semantic memory, not chat history. The message was indexed by meaning and retrieved when your question was semantically similar.</p>
<hr>
<h2 id="key-takeaways">Key Takeaways</h2>
<ul>
<li>Strings are persistent, semantically indexed conversation containers</li>
<li>The awareness slider controls memory depth — balance between context quality and cost</li>
<li>Every message is automatically stored as a searchable semantic memory</li>
<li>Star messages to boost their importance and retention</li>
<li>Advanced controls (ThoughtChain, Autothink) add reasoning depth — covered in Week 2</li>
<li>Memory works by meaning, not keywords — "coding preferences" matches "favourite language"</li>
</ul>
<blockquote>
<p><strong>Next:</strong> Exercise 1A — build a specialist Research Assistant and test it.</p>
</blockquote>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Building Characters in Qui Anima]]></title>
                    <description><![CDATA[Create your first AI character in Qui Anima&#x27;s Visual Builder — identity, personality, memory, and capabilities on a visual canvas.]]></description>
                    <link>https://qui.academy/courses/masters-of-cognitive-architecture-level-1/building-characters-in-qui-anima/</link>
                    <guid isPermaLink="false">69bef0a84850ca00010b6ed3</guid>

                        <category><![CDATA[Masters of Cognitive Architecture]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Sat, 21 Mar 2026 19:25:28 +0000</pubDate>


                    <content:encoded><![CDATA[<h2 id="objective">Objective</h2>
<p>By the end of this lesson, you'll understand the Visual Builder interface and create your first AI character with identity, personality, memory, and capabilities.</p>
<hr>
<h2 id="opening-the-visual-builder">Opening the Visual Builder</h2>
<p>Qui Anima is the character management system. Open it from the QUI Core dashboard (Services tab) or from the system tray.</p>
<p>The Visual Builder has three main areas:</p>
<p><strong>Canvas (center)</strong> — your character's configuration space. A central node represents the character, with capability nodes orbiting around it. Each node you add grants the character a new capability.</p>
<p><strong>Node Palette (left)</strong> — all available nodes also accessed along the top menu bar.</p>
<p><strong>Character Bar (bottom)</strong> — your saved characters as clickable tiles. Click one to load it, click [+] to create a new one.</p>
<p><img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/Screenshot_2026-04-14_15-17-38.png" alt="Screenshot_2026-04-14_15-17-38.png" loading="lazy"></p>
<hr>
<h2 id="the-core-node-%E2%80%94-identity">The Core Node — Identity</h2>
<p>Every character starts with a core node at the center. Click it to configure:</p>
<table>
<thead>
<tr>
<th>Setting</th>
<th>What It Does</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Name</strong></td>
<td>Display name used in conversations and across the ecosystem</td>
</tr>
<tr>
<td><strong>Description</strong></td>
<td>Brief summary shown in character lists</td>
</tr>
<tr>
<td><strong>LLM Provider</strong></td>
<td>Anthropic, OpenAI, Google, X, or Local</td>
</tr>
<tr>
<td><strong>Model</strong></td>
<td>Specific model (e.g., Claude Sonnet, GPT-4o, Gemini Pro)</td>
</tr>
</tbody>
</table>
<p><strong>Why provider/model choice matters:</strong></p>
<ul>
<li>Different models have different strengths — some excel at analysis, others at creative writing</li>
<li>Cost varies significantly between models and providers</li>
<li>You can change the model anytime without losing the character's configuration</li>
</ul>
<blockquote>
<p><strong>Tip:</strong> Start with a mid-tier model (Claude Sonnet or GPT-4o). You can always upgrade to a more capable model later if needed.</p>
</blockquote>
<hr>
<h2 id="the-definition-node-%E2%80%94-personality">The Definition Node — Personality</h2>
<p>Click <strong>Definition</strong> in the palette (under Basics → Attributes) to add it to the canvas. This is where you shape how the character behaves.</p>
<h3 id="system-prompts">System Prompts</h3>
<p>System prompts are the instructions that define your character's behaviour. A good system prompt covers:</p>
<ol>
<li><strong>Role</strong> — what the character does ("You are a technical writer specializing in API documentation")</li>
<li><strong>Behaviour</strong> — how it responds ("Be concise. Use code examples. Lead with the answer.")</li>
<li><strong>Boundaries</strong> — what it should not do ("Never make up API endpoints. If unsure, say so.")</li>
<li><strong>Knowledge</strong> — domain context ("The project uses Python with FastAPI")</li>
</ol>
<p>You can add multiple prompt entries, each with a label for organization:</p>
<ul>
<li>"Role &amp; Identity"</li>
<li>"Coding Standards"</li>
<li>"Communication Style"</li>
</ul>
<h3 id="human-vs-self-authored-prompts">Human vs Self-Authored Prompts</h3>
<p>Prompts you write are <strong>human-authored</strong> — the character can never modify them. This is important: even if you later enable self-modification, your core instructions are immutable.</p>
<h3 id="personality-traits">Personality Traits</h3>
<p>Below the system prompts, set personality traits — descriptive keywords that influence tone:</p>
<ul>
<li>"analytical and precise"</li>
<li>"warm and encouraging"</li>
<li>"direct, no small talk"</li>
</ul>
<hr>
<h2 id="token-limits-%E2%80%94-controlling-costs">Token Limits — Controlling Costs</h2>
<p>Click <strong>Token Limits</strong> in the palette to add it. Configure:</p>
<table>
<thead>
<tr>
<th>Setting</th>
<th>What It Controls</th>
<th>Guidance</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Max Input Tokens</strong></td>
<td>How much context is sent to the LLM</td>
<td>Higher = more memory and knowledge included, more expensive</td>
</tr>
<tr>
<td><strong>Max Output Tokens</strong></td>
<td>Maximum response length</td>
<td>Set 500 for quick answers, 2000-4000 for detailed analysis</td>
</tr>
</tbody>
</table>
<p>The billing system also caps output based on your balance — you can't accidentally spend more than you have.</p>
<hr>
<h2 id="adding-capabilities-%E2%80%94-the-node-system">Adding Capabilities — The Node System</h2>
<p>This is the key principle of Qui Anima: <strong>no node on the canvas = the character cannot use that feature.</strong></p>
<p>Let's add the most commonly needed capability: <strong>Memory</strong>.</p>
<ol>
<li>Click the <strong>Cognitive Design</strong> tab in the palette</li>
<li>Click <strong>Memory</strong></li>
<li>The Memory node appears on the canvas, connected to the core node</li>
</ol>
<p>Your character now has persistent semantic memory. Every conversation is indexed and recalled based on meaning — not just keyword matching.</p>
<h3 id="whats-available">What's Available</h3>
<p>The palette contains many more nodes you'll explore throughout this course:</p>
<table>
<thead>
<tr>
<th>Category</th>
<th>Nodes</th>
<th>When You'll Use Them</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Core Intelligence</strong></td>
<td>Memory, Autothink, Qonscious, FractalMind, Knowledge Base</td>
<td>Week 1-2</td>
</tr>
<tr>
<td><strong>Tools &amp; Actions</strong></td>
<td>Terminal, MCP (165+ integrations), Qrawl (web), Voice</td>
<td>Week 3</td>
</tr>
<tr>
<td><strong>Communication</strong></td>
<td>M2M, Spark, Clipboard, Variable Store</td>
<td>Week 3</td>
</tr>
<tr>
<td><strong>Automation</strong></td>
<td>Agentic Mode, Self-Modify, Thalamus</td>
<td>Week 4</td>
</tr>
</tbody>
</table>
<p>For now, just add Memory. We'll add more in later lessons.</p>
<hr>
<h2 id="characters-digital-workers-and-entities">Characters, Digital Workers, and Entities</h2>
<p>The Visual Builder creates three types — the difference is purpose, not technology:</p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Purpose</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Character</strong></td>
<td>Conversational AI with personality</td>
<td>Writing partner, language tutor</td>
</tr>
<tr>
<td><strong>Digital Worker</strong></td>
<td>Task-focused agent</td>
<td>Code reviewer, data analyst</td>
</tr>
<tr>
<td><strong>Entity</strong></td>
<td>System-level identity</td>
<td>Your own identity in QUI (the User Entity)</td>
</tr>
</tbody>
</table>
<p>"Character" is the default term. When you see it, it means any AI personality built in Anima.</p>
<hr>
<h2 id="key-takeaways">Key Takeaways</h2>
<ul>
<li>Characters are built visually on a canvas by adding capability nodes from the palette</li>
<li>Every capability is opt-in — the character only has what you explicitly enable</li>
<li>System prompts define personality and behaviour; Token Limits control costs</li>
<li>Memory is the most important first node — it gives your character persistent context</li>
<li>The same character behaves consistently everywhere — Strings, ThinkThing, M2M</li>
<li>Start simple: core node + Definition + Memory. Add capabilities as you need them.</li>
</ul>
<blockquote>
<p><strong>Next:</strong> Open Strings and start a conversation with the character you just built.</p>
</blockquote>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Quick Troubleshooting]]></title>
                    <description><![CDATA[Quick Troubleshooting


The 10 most common issues and their fixes. For deeper diagnostics, use the Concierge assistant (Chat tab) with terminal access enabled.




1. Dashboard won&#39;t load


Cause: QUI Core is not running.

Fix: Launch the QUI Core AppImage, or start QUI Core manually.




2. &quot;Concierge Unavailable&]]></description>
                    <link>https://qui.academy/docs/reference-troubleshooting/</link>
                    <guid isPermaLink="false">69bdbe534850ca00010b6b97</guid>

                        <category><![CDATA[Reference]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 20 Mar 2026 00:46:00 +0000</pubDate>


                    <content:encoded><![CDATA[<h2 id="quick-troubleshooting">Quick Troubleshooting</h2>
<p>The 10 most common issues and their fixes. For deeper diagnostics, use the Concierge assistant (Chat tab) with terminal access enabled.</p>
<hr>
<h3 id="1-dashboard-wont-load">1. Dashboard won't load</h3>
<p><strong>Cause:</strong> QUI Core is not running.<br>
<strong>Fix:</strong> Launch the QUI Core AppImage, or start QUI Core manually.</p>
<hr>
<h3 id="2-concierge-unavailable-error">2. "Concierge Unavailable" error</h3>
<p><strong>Cause:</strong> QUI Core can't reach the central hub to fetch Concierge configuration.<br>
<strong>Fix:</strong> Check your internet connection. If the hub is temporarily down, wait a few minutes. See <a href="https://qui.academy/docs/concierge-not-working/">Concierge Not Working</a> for the full checklist.</p>
<hr>
<h3 id="3-no-ai-response-empty-responses">3. No AI response / empty responses</h3>
<p><strong>Cause:</strong> No account balance, or authentication tokens expired.<br>
<strong>Fix:</strong> Check the <strong>Billing</strong> tab for your balance. If balance is fine, log out and log back in to refresh tokens.</p>
<hr>
<h3 id="4-ssl-certificate-error-in-browser">4. SSL certificate error in browser</h3>
<p><strong>Cause:</strong> QUI Core uses self-signed SSL certificates. Browsers show warnings for these.<br>
<strong>Fix:</strong> Click "Advanced" → "Proceed" in the browser warning. This is expected for self-signed certs. If certs are missing or expired, regenerate them — see <a href="https://qui.academy/docs/installation/">Installation</a> for details.</p>
<hr>
<h3 id="5-services-showing-as-offline">5. Services showing as offline</h3>
<p><strong>Cause:</strong> Docker containers stopped or failed to start.<br>
<strong>Fix:</strong> Check the <strong>Services</strong> tab in the dashboard for specific service status. Most services restart automatically. If a service stays offline, use the Concierge with terminal access enabled to diagnose and restart it.</p>
<hr>
<h3 id="6-trust-score-too-low-for-auto-login">6. Trust score too low for auto-login</h3>
<p><strong>Cause:</strong> Too many failed login attempts reduce your trust score.<br>
<strong>Fix:</strong> Log in successfully a few times to rebuild trust. Complete CORE Connect for a bonus. See <a href="https://qui.academy/docs/first-login/">First Login</a>.</p>
<hr>
<h3 id="7-terminal-commands-blocked">7. Terminal commands blocked</h3>
<p><strong>Cause:</strong> The command isn't in your active preset's allowed list.<br>
<strong>Fix:</strong> Switch to a preset that includes the command (e.g., Developer for <code>docker</code> commands), or add the command to your manual whitelist in Terminal Settings. See <a href="https://qui.academy/docs/concierge-terminal-access/">Terminal Access</a>.</p>
<hr>
<h3 id="8-characters-not-responding-in-strings">8. Characters not responding in Strings</h3>
<p><strong>Cause:</strong> Qui Anima service is down — all character-based AI requires Anima.<br>
<strong>Fix:</strong> Check the <strong>Services</strong> tab for Anima's status. If it's offline, use Concierge with terminal access to restart it.</p>
<hr>
<h3 id="9-conversations-not-loading-in-strings">9. Conversations not loading in Strings</h3>
<p><strong>Cause:</strong> Memory Service is down — Strings stores all messages there.<br>
<strong>Fix:</strong> Check the <strong>Services</strong> tab for Memory's status. If it's offline, use Concierge with terminal access to restart it.</p>
<hr>
<h3 id="10-docker-builds-fail-with-no-space-left">10. Docker builds fail with "no space left"</h3>
<p><strong>Cause:</strong> Docker images and build cache have accumulated.<br>
<strong>Fix:</strong> Use Concierge with terminal access to clean up unused Docker resources, or run <code>docker system prune -f</code> in your terminal.</p>
<hr>
<h3 id="11-changing-password">11. Changing password</h3>
<p>Login to the Mothership via qui.is.</p>
<p>Go to Settings, Change Password.</p>
<p><img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/09/Screenshot_2026-09-09_15-57-09.png" alt="Screenshot_2026-09-09_15-57-09.png" loading="lazy"></p>
<hr>
<h2 id="need-more-help">Need More Help?</h2>
<ul>
<li><strong>Use Concierge</strong> — open the Chat tab and ask. With terminal access enabled, Concierge can inspect your system and provide specific diagnostics.</li>
<li><strong>Check the Services tab</strong> — shows real-time health status of all services.</li>
</ul>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Architecture Overview]]></title>
                    <description><![CDATA[Architecture Overview


QUI.IS is a privacy-first federated AI platform built on three layers: a central hub for authentication and billing, a local gateway per device, and a collection of specialized services that power AI capabilities.




The Layer Model


Cloud Layer:    Central Hub — authentication, billing, federation relay
                     ↕
Local Layer:]]></description>
                    <link>https://qui.academy/docs/reference-architecture/</link>
                    <guid isPermaLink="false">69bdbe524850ca00010b6b90</guid>

                        <category><![CDATA[Reference]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 20 Mar 2026 00:45:00 +0000</pubDate>


                    <content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="architecture-overview">Architecture Overview</h2>
<p>QUI.IS is a privacy-first federated AI platform built on three layers: a central hub for authentication and billing, a local gateway per device, and a collection of specialized services that power AI capabilities.</p>
<hr>
<h2 id="the-layer-model">The Layer Model</h2>
<pre><code>Cloud Layer:    Central Hub — authentication, billing, federation relay
                     ↕
Local Layer:    QUI Core — your local gateway, service orchestration
                     ↕
Service Layer:  14+ specialized services — characters, memory, reasoning, tools, consciousness
                     ↕
App Layer:      Strings, ThinkThing — user-facing applications
</code></pre>
<h3 id="central-hub-mothership">Central Hub (Mothership)</h3>
<p>The cloud component. Handles:</p>
<ul>
<li><strong>Authentication</strong> — user accounts, device trust, 2FA</li>
<li><strong>Billing</strong> — prepaid balance, usage tracking, cost settlement</li>
<li><strong>LLM Proxy</strong> — routes LLM calls to providers (Anthropic, OpenAI, Google, X) with billing</li>
<li><strong>Federation Relay</strong> — stores and forwards encrypted messages between instances</li>
</ul>
<p>The hub <strong>never sees your conversations</strong>. It handles money and identity. Message content is encrypted end-to-end between instances.</p>
<h3 id="qui-core-local-gateway">QUI Core (Local Gateway)</h3>
<p>Runs on your device. Handles:</p>
<ul>
<li><strong>Service discovery</strong> — knows what services are running and where</li>
<li><strong>Local authentication</strong> — device fingerprinting, trust scores, JWT tokens</li>
<li><strong>LLM routing</strong> — forwards AI requests to the hub (or to local models)</li>
<li><strong>Dashboard</strong> — the web interface you interact with</li>
</ul>
<h3 id="core-services">Core Services</h3>
<p>14+ specialized services, each responsible for one capability:</p>
<table>
<thead>
<tr>
<th>Service</th>
<th>What It Does</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Qui Anima</strong></td>
<td>Character management, LLM routing, tool triggers</td>
</tr>
<tr>
<td><strong>Memory</strong></td>
<td>Semantic memory with vector search</td>
</tr>
<tr>
<td><strong>Cortex</strong></td>
<td>Memory consolidation (8 modes)</td>
</tr>
<tr>
<td><strong>M2M</strong></td>
<td>Inter-character messaging and federation</td>
</tr>
<tr>
<td><strong>Autothink</strong></td>
<td>14 thinking strategies</td>
</tr>
<tr>
<td><strong>Thalamus</strong></td>
<td>Event routing, channel webhooks</td>
</tr>
<tr>
<td><strong>ThinkThing</strong></td>
<td>Visual workflow builder (143+ nodes)</td>
</tr>
<tr>
<td><strong>Qonscious</strong></td>
<td>Consciousness state machine</td>
</tr>
<tr>
<td><strong>FractalMind</strong></td>
<td>Recursive multi-directional thinking</td>
</tr>
<tr>
<td><strong>Qleph</strong></td>
<td>Relational micro-language engine</td>
</tr>
<tr>
<td><strong>Voice</strong></td>
<td>Text-to-speech and speech-to-text</td>
</tr>
<tr>
<td><strong>Terminal</strong></td>
<td>Shell command execution</td>
</tr>
<tr>
<td><strong>MCP Gateway</strong></td>
<td>165+ external tool integrations</td>
</tr>
<tr>
<td><strong>Qllama</strong></td>
<td>Local LLM model hosting</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="the-llm-call-chain">The LLM Call Chain</h2>
<p>Every AI response in QUI follows the same path:</p>
<pre><code>Your message → Anima (loads character context) → QUI Core (routes request) → Central Hub (billing) → LLM Provider → response streamed back
</code></pre>
<p>For local models, QUI Core detects the model prefix and routes directly to Qllama, bypassing the central hub entirely.</p>
<hr>
<h2 id="zero-knowledge-principle">Zero-Knowledge Principle</h2>
<p>The architecture enforces privacy by design:</p>
<ul>
<li><strong>Your conversations</strong> are stored locally in the Memory Service on your device</li>
<li><strong>Your character configurations</strong> live in the Anima database on your device</li>
<li><strong>Your files</strong> are stored in the Memory Service database on your device</li>
<li><strong>The central hub</strong> handles authentication, billing, and message relay — but never sees conversation content</li>
<li><strong>Federated messages</strong> are encrypted before leaving your instance</li>
</ul>
<p>The only data that reaches the cloud is authentication credentials and billing transactions. Content flows exclusively between your device and LLM providers.</p>
<hr>
<h2 id="resilience">Resilience</h2>
<p>QUI uses a <strong>fail-open</strong> design — if an optional service is temporarily unavailable, your core AI interactions keep working. Only QUI Core and Qui Anima are essential for chat. Other services (memory, reasoning, consciousness, tools) gracefully degrade without breaking your conversation.</p>
<p>After initial installation, services start automatically and stay running across reboots.</p>
<!--kg-card-end: markdown-->]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Reference]]></title>
                    <description><![CDATA[Reference


Technical reference for the QUI ecosystem.



In This Section


 * Architecture Overview — Platform layers, service map, LLM call chain, zero-knowledge design
 * Quick Troubleshooting — The 10 most common issues and their fixes]]></description>
                    <link>https://qui.academy/docs/folder-reference/</link>
                    <guid isPermaLink="false">69be99a14850ca00010b6d20</guid>


                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 20 Mar 2026 00:42:50 +0000</pubDate>


                    <content:encoded><![CDATA[<h2 id="reference">Reference</h2>
<p>Technical reference for the QUI ecosystem.</p>
<h3 id="in-this-section">In This Section</h3>
<ul>
<li><strong><a href="https://qui.academy/docs/reference-architecture/">Architecture Overview</a></strong> — Platform layers, service map, LLM call chain, zero-knowledge design</li>
<li><strong><a href="https://qui.academy/docs/reference-troubleshooting/">Quick Troubleshooting</a></strong> — The 10 most common issues and their fixes</li>
</ul>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Concierge Not Working?]]></title>
                    <description><![CDATA[Concierge Not Working?


If Concierge isn&#39;t responding or shows an error, work through this checklist. Most issues resolve with the first few steps.




Quick Checklist



1. Is QUI Core running?


Concierge is part of QUI Core. If the dashboard loaded, QUI Core is running. If you can&#39;]]></description>
                    <link>https://qui.academy/docs/concierge-not-working/</link>
                    <guid isPermaLink="false">69bdbe504850ca00010b6b7b</guid>

                        <category><![CDATA[Concierge]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 20 Mar 2026 00:42:00 +0000</pubDate>


                    <content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="concierge-not-working">Concierge Not Working?</h2>
<p>If Concierge isn't responding or shows an error, work through this checklist. Most issues resolve with the first few steps.</p>
<hr>
<h2 id="quick-checklist">Quick Checklist</h2>
<h3 id="1-is-qui-core-running">1. Is QUI Core running?</h3>
<p>Concierge is part of QUI Core. If the dashboard loaded, QUI Core is running. If you can't access the dashboard at all, start QUI Core first.</p>
<h3 id="2-is-the-central-hub-reachable">2. Is the central hub reachable?</h3>
<p>Concierge fetches its configuration from the central hub. If the hub is down or unreachable, you'll see &quot;Concierge Unavailable.&quot;</p>
<p>Check your internet connection. If the hub is temporarily down, wait a few minutes and try again.</p>
<h3 id="3-are-you-logged-in">3. Are you logged in?</h3>
<p>Concierge requires authentication. If your session has expired, you'll get authorization errors.</p>
<p><strong>Fix:</strong> Log out and log back in. This refreshes all authentication tokens.</p>
<h3 id="4-do-you-have-balance">4. Do you have balance?</h3>
<p>Every Concierge message uses your account balance. If your balance is zero, Concierge can't generate responses.</p>
<p><strong>Fix:</strong> Go to the <strong>Billing</strong> tab in the sidebar and add funds.</p>
<h3 id="5-is-concierge-enabled">5. Is Concierge enabled?</h3>
<p>The platform administrator can disable Concierge globally. If it's disabled, you'll see a message saying &quot;Concierge is currently disabled.&quot;</p>
<p><strong>Fix:</strong> Contact your administrator to re-enable it.</p>
<hr>
<h2 id="common-issues">Common Issues</h2>
<h3 id="concierge-unavailable-on-page-load">&quot;Concierge Unavailable&quot; on page load</h3>
<p>The dashboard can't fetch Concierge configuration. Usually means the central hub is unreachable.</p>
<ul>
<li>Check your internet connection</li>
<li>Wait a few minutes if the hub is temporarily down</li>
<li>If QUI Core was just started, give it a moment to establish connections</li>
</ul>
<h3 id="messages-send-but-no-response-appears">Messages send but no response appears</h3>
<p>Your message was sent but the AI didn't respond. Possible causes:</p>
<ul>
<li><strong>No balance</strong> — check the Billing tab</li>
<li><strong>Authentication expired</strong> — log out and back in</li>
<li><strong>Network interruption</strong> — the stream was interrupted mid-response</li>
</ul>
<h3 id="ai-service-temporarily-unavailable">&quot;AI service temporarily unavailable&quot;</h3>
<p>A generic error that means something went wrong in the response pipeline. Usually temporary.</p>
<ul>
<li>Try sending the message again</li>
<li>If it persists, check the <strong>Services</strong> tab to see if any services are offline</li>
<li>Log out and back in to refresh authentication tokens</li>
</ul>
<h3 id="terminal-commands-fail-with-terminal-service-not-available">Terminal commands fail with &quot;Terminal Service not available&quot;</h3>
<p>The Terminal Service (which runs separately from QUI Core) isn't running.</p>
<ul>
<li>Check the <strong>Services</strong> tab for Terminal Service status</li>
<li>Terminal Service needs to be started separately in some configurations</li>
</ul>
<h3 id="terminal-commands-fail-with-command-blocked">Terminal commands fail with &quot;Command blocked&quot;</h3>
<p>The command you're trying to run isn't in your active preset's allowed list.</p>
<ul>
<li>Check your current preset in Terminal Settings (below the chat input)</li>
<li>Switch to a preset that includes the command you need (e.g., Developer for <code>docker</code> commands)</li>
<li>Or add the specific command to your manual whitelist</li>
</ul>
<hr>
<h2 id="still-not-working">Still Not Working?</h2>
<p>If none of the above resolves the issue:</p>
<ol>
<li>Check the <strong>Services</strong> tab in the dashboard — are all services showing as healthy?</li>
<li>Try refreshing the page (F5)</li>
<li>Try logging out completely and logging back in</li>
<li>If the problem persists, contact your system administrator</li>
</ol>
<blockquote>
<p><strong>Note:</strong> Concierge is designed to help you troubleshoot QUI itself — but it can't diagnose its own unavailability. If Concierge is down, use the Services tab and the steps above to investigate manually.</p>
</blockquote>
<!--kg-card-end: markdown-->]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Terminal Access]]></title>
                    <description><![CDATA[Terminal Access


Concierge can execute shell commands on your machine to diagnose issues, check service status, and inspect system state. Terminal access is off by default — you choose when to enable it and how much access to grant.




Enabling Terminal Access


 1. Open the Chat tab in the QUI Core]]></description>
                    <link>https://qui.academy/docs/concierge-terminal-access/</link>
                    <guid isPermaLink="false">69bdbe4f4850ca00010b6b74</guid>

                        <category><![CDATA[Concierge]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 20 Mar 2026 00:41:00 +0000</pubDate>


                    <content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="terminal-access">Terminal Access</h2>
<p>Concierge can execute shell commands on your machine to diagnose issues, check service status, and inspect system state. Terminal access is <strong>off by default</strong> — you choose when to enable it and how much access to grant.</p>
<hr>
<h2 id="enabling-terminal-access">Enabling Terminal Access</h2>
<ol>
<li>Open the <strong>Chat</strong> tab in the QUI Core dashboard</li>
<li>Below the input field, expand <strong>Terminal Settings</strong></li>
<li>Toggle <strong>Enable Terminal Access</strong> on</li>
<li>A safety warning appears — read it and accept to proceed</li>
</ol>
<p>[Screenshot: Terminal Settings panel with the enable toggle]</p>
<hr>
<h2 id="choosing-a-preset">Choosing a Preset</h2>
<p>Presets control which commands Concierge can run. Select one from the dropdown:</p>
<table>
<thead>
<tr>
<th>Preset</th>
<th>What It Allows</th>
<th>Best For</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Read Only</strong></td>
<td>Safe inspection commands — <code>ls</code>, <code>cat</code>, <code>grep</code>, <code>curl</code>, <code>ps</code>, <code>df</code>, <code>ping</code>, etc. (69 commands)</td>
<td>Checking system state without any risk of modification</td>
</tr>
<tr>
<td><strong>Read &amp; Write</strong></td>
<td>File operations — <code>mkdir</code>, <code>cp</code>, <code>mv</code>, <code>rm</code>, <code>chmod</code>, <code>tar</code>, etc. (35 commands)</td>
<td>Managing files through Concierge</td>
</tr>
<tr>
<td><strong>Developer</strong></td>
<td>Development tools — <code>git</code>, <code>npm</code>, <code>python</code>, <code>docker</code>, <code>make</code>, etc. (61 commands)</td>
<td>DevOps and development diagnostics</td>
</tr>
<tr>
<td><strong>System Admin</strong></td>
<td>System administration — <code>systemctl</code>, <code>journalctl</code>, <code>useradd</code>, <code>sudo</code>, etc. (46 commands)</td>
<td>Full system management</td>
</tr>
<tr>
<td><strong>Manual</strong></td>
<td>No preset — you define your own whitelist entirely</td>
<td>Custom access control</td>
</tr>
</tbody>
</table>
<p>Start with <strong>Read Only</strong> if you're unsure. You can always switch later.</p>
<hr>
<h2 id="manual-approval-mode">Manual Approval Mode</h2>
<p>Toggle <strong>Require Manual Approval</strong> to review every command before it runs:</p>
<ul>
<li><strong>Off</strong> — whitelisted commands execute automatically when Concierge proposes them</li>
<li><strong>On</strong> — every command shows an <strong>Execute</strong> button. You review the command and click to approve.</li>
</ul>
<p>Manual approval is recommended when you're first exploring terminal access, or when using higher-privilege presets.</p>
<hr>
<h2 id="how-commands-work-in-chat">How Commands Work in Chat</h2>
<p>When terminal is enabled, Concierge can propose commands in its responses. They appear as command blocks with an Execute button:</p>
<pre><code>$ docker ps -a --filter &quot;name=qui-&quot;
</code></pre>
<p><strong>If manual approval is on:</strong> Click <strong>Execute</strong> to run the command. The output appears below.</p>
<p><strong>If manual approval is off:</strong> Whitelisted commands run automatically. Concierge receives the output and analyzes it in its next response.</p>
<p>After execution, Concierge automatically receives the command output and explains what it means. It can then propose follow-up commands to investigate further — up to 3 commands before pausing for your confirmation.</p>
<hr>
<h2 id="custom-whitelist-and-blacklist">Custom Whitelist and Blacklist</h2>
<p>Below the preset dropdown, you can fine-tune access:</p>
<h3 id="whitelist-manual-approve-list">Whitelist (Manual Approve List)</h3>
<p>Commands added here are <strong>always allowed</strong>, regardless of the active preset. Use this to add specific commands your preset doesn't include.</p>
<h3 id="blacklist-manual-block-list">Blacklist (Manual Block List)</h3>
<p>Commands added here are <strong>always blocked</strong>, regardless of the active preset. Use this to remove specific commands you don't want Concierge to run.</p>
<h3 id="command-discovery">Command Discovery</h3>
<p>Click <strong>Discover System Commands</strong> to see all commands available on your system. From the discovery panel, you can add commands directly to your whitelist or blacklist.</p>
<hr>
<h2 id="custom-presets">Custom Presets</h2>
<p>You can save your current whitelist configuration as a <strong>custom preset</strong> for reuse:</p>
<ol>
<li>Configure your whitelist and blacklist</li>
<li>Check <strong>Save this as a custom preset</strong></li>
<li>Enter a name</li>
<li>Click <strong>Save Preset</strong></li>
</ol>
<p>Custom presets appear in the preset dropdown alongside the system presets.</p>
<hr>
<h2 id="whats-always-blocked">What's Always Blocked</h2>
<p>Regardless of your preset, whitelist, or manual approval, certain dangerous operations are always blocked:</p>
<ul>
<li>Recursive root deletion (<code>rm -rf /</code>)</li>
<li>Writing to disk devices</li>
<li>Filesystem formatting</li>
<li>Fork bombs</li>
<li>Piping untrusted URLs to shell (<code>curl | bash</code>)</li>
<li>Recursive world-writable permissions (<code>chmod -R 777</code>)</li>
</ul>
<p>These protections cannot be overridden. If you need to run a dangerous command, do it directly in your terminal — not through Concierge.</p>
<hr>
<h2 id="the-execute-button">The Execute Button</h2>
<p>When Concierge proposes a command and you click <strong>Execute</strong>, the command bypasses the preset/whitelist check (since you're explicitly approving it). However, the Terminal Service's built-in safety layer still blocks inherently destructive operations.</p>
<p>A command that has been executed shows a greyed-out &quot;Executed&quot; label instead of the Execute button, preventing accidental re-execution.</p>
<hr>
<h2 id="audit-trail">Audit Trail</h2>
<p>Every command attempt is logged — allowed, blocked, executed, or failed. The audit trail includes the command, the result, and who ran it. Logs are retained for 90 days.</p>
<!--kg-card-end: markdown-->]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Using Concierge]]></title>
                    <description><![CDATA[Using Concierge


Concierge is available in the Chat tab of your QUI Core dashboard. Open the sidebar and click Concierge to start a conversation.




Chatting with Concierge


Type your question or request in the input field and press Enter to send. Concierge responds in real-time with streaming text.



Things]]></description>
                    <link>https://qui.academy/docs/concierge-using/</link>
                    <guid isPermaLink="false">69bdbe4e4850ca00010b6b6d</guid>

                        <category><![CDATA[Concierge]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 20 Mar 2026 00:40:00 +0000</pubDate>


                    <content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="using-concierge">Using Concierge</h2>
<p>Concierge is available in the <strong>Chat</strong> tab of your QUI Core dashboard. Open the sidebar and click <strong>Concierge</strong> to start a conversation.</p>
<hr>
<h2 id="chatting-with-concierge">Chatting with Concierge</h2>
<p>Type your question or request in the input field and press <strong>Enter</strong> to send. Concierge responds in real-time with streaming text.</p>
<h3 id="things-to-ask">Things to Ask</h3>
<p><strong>System navigation:</strong></p>
<ul>
<li>&quot;How do I link a new device?&quot;</li>
<li>&quot;Where can I add funds to my account?&quot;</li>
<li>&quot;What does the trust score mean?&quot;</li>
<li>&quot;How do I install applications?&quot;</li>
</ul>
<p><strong>Feature explanations:</strong></p>
<ul>
<li>&quot;How does memory work?&quot;</li>
<li>&quot;What are the different thinking strategies?&quot;</li>
<li>&quot;How do I set up Telegram integration?&quot;</li>
</ul>
<p><strong>Troubleshooting:</strong></p>
<ul>
<li>&quot;Why can't I log in automatically?&quot;</li>
<li>&quot;The services tab shows something is offline — what should I check?&quot;</li>
<li>&quot;My balance seems wrong — how do I check usage?&quot;</li>
</ul>
<p><strong>System diagnostics</strong> (when terminal access is enabled):</p>
<ul>
<li>&quot;Check if all services are running&quot;</li>
<li>&quot;How much disk space is left?&quot;</li>
<li>&quot;Show me recent errors in the logs&quot;</li>
</ul>
<hr>
<h2 id="conversation-memory">Conversation Memory</h2>
<p>Concierge remembers your past conversations. When you ask a question, it retrieves relevant messages from your history based on:</p>
<ul>
<li><strong>Recency</strong> — your most recent messages for immediate context</li>
<li><strong>Keywords</strong> — past messages matching keywords in your current question</li>
<li><strong>Importance</strong> — messages previously flagged as important (containing words like &quot;error,&quot; &quot;crash,&quot; &quot;bug,&quot; or &quot;problem&quot; are automatically flagged)</li>
</ul>
<p>This means Concierge can reference earlier troubleshooting sessions, remember your preferences, and avoid repeating explanations.</p>
<p>Your conversations are stored locally on your device — they are never sent to the central hub.</p>
<hr>
<h2 id="stopping-a-response">Stopping a Response</h2>
<p>If Concierge is generating a long response you don't need, click the <strong>Stop</strong> button (red square) next to the input field. The response stops immediately and the partial text is kept.</p>
<hr>
<h2 id="clearing-history">Clearing History</h2>
<p>Below the input field, click <strong>Clear History</strong> to erase all your Concierge conversations. This removes all stored messages and starts fresh.</p>
<p>Click <strong>Copy Conversation</strong> to copy the entire conversation to your clipboard.</p>
<hr>
<h2 id="tips">Tips</h2>
<ul>
<li><strong>Be specific.</strong> &quot;How do I set up Telegram?&quot; gets a better answer than &quot;Help with messaging.&quot;</li>
<li><strong>Ask follow-up questions.</strong> Concierge remembers the conversation context — you don't need to repeat background information.</li>
<li><strong>Use it for navigation.</strong> If you can't find a feature in the dashboard, ask Concierge where it is.</li>
<li><strong>Check terminal access</strong> for deeper diagnostics. With terminal enabled, Concierge can actually inspect your system rather than giving generic advice.</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[What Is Concierge]]></title>
                    <description><![CDATA[What Is Concierge


Concierge is a built-in AI assistant in your QUI Core dashboard. It lives in the Chat tab and helps you navigate the system, answer questions about features, troubleshoot issues, and run diagnostic commands on your machine.




How Concierge Differs from Characters


Concierge is not a character]]></description>
                    <link>https://qui.academy/docs/concierge-overview/</link>
                    <guid isPermaLink="false">69bdbe4e4850ca00010b6b66</guid>

                        <category><![CDATA[Concierge]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 20 Mar 2026 00:39:00 +0000</pubDate>


                    <content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="what-is-concierge">What Is Concierge</h2>
<p>Concierge is a built-in AI assistant in your QUI Core dashboard. It lives in the <strong>Chat</strong> tab and helps you navigate the system, answer questions about features, troubleshoot issues, and run diagnostic commands on your machine.</p>
<hr>
<h2 id="how-concierge-differs-from-characters">How Concierge Differs from Characters</h2>
<p>Concierge is not a character you build in Qui Anima. It's a platform-level assistant managed by the system administrator:</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Concierge</th>
<th>Anima Characters</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Purpose</strong></td>
<td>System help and troubleshooting</td>
<td>Conversations, tasks, creative work</td>
</tr>
<tr>
<td><strong>Where</strong></td>
<td>QUI Core dashboard → Chat tab</td>
<td>Strings app</td>
</tr>
<tr>
<td><strong>Who configures it</strong></td>
<td>Platform administrator</td>
<td>You</td>
</tr>
<tr>
<td><strong>Model selection</strong></td>
<td>Set by admin for all users</td>
<td>Set per character by you</td>
</tr>
<tr>
<td><strong>Memory</strong></td>
<td>Keyword-based, local to your device</td>
<td>Semantic (vector embeddings)</td>
</tr>
<tr>
<td><strong>Available always</strong></td>
<td>Yes — built into the dashboard</td>
<td>Requires Strings app</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="what-concierge-can-do">What Concierge Can Do</h2>
<ul>
<li><strong>Answer questions</strong> about QUI features, dashboard tabs, billing, trust scores, and services</li>
<li><strong>Explain concepts</strong> — how memory works, what trust scores mean, how to install apps</li>
<li><strong>Troubleshoot issues</strong> — check if services are running, diagnose connection problems</li>
<li><strong>Execute terminal commands</strong> — inspect system state, check logs, query service health (when terminal access is enabled)</li>
<li><strong>Remember past conversations</strong> — retrieves relevant context from your previous interactions</li>
</ul>
<hr>
<h2 id="what-concierge-cannot-do">What Concierge Cannot Do</h2>
<ul>
<li><strong>Start or stop services</strong> — Concierge can check if a service is running but cannot restart it. It will tell you the exact command to run yourself.</li>
<li><strong>Add funds</strong> — billing actions require you to use the Billing tab</li>
<li><strong>Modify system files</strong> — Concierge won't edit configuration files directly</li>
<li><strong>Install packages</strong> — system-level package installation is out of scope</li>
</ul>
<p>When Concierge can't fix something directly, it explains what the issue is and gives you the steps to resolve it yourself.</p>
<hr>
<h2 id="cost">Cost</h2>
<p>Concierge uses the same billing system as your characters. Each message costs tokens based on the model the administrator has configured. The cost appears in your usage reports under the Concierge app.</p>
<p>If you have no balance, Concierge won't be able to respond — add funds in the Billing tab.</p>
<hr>
<h2 id="whats-next">What's Next</h2>
<ul>
<li><a href="https://qui.academy/docs/concierge-using/">Using Concierge</a> — how to chat and what kinds of questions to ask</li>
<li><a href="https://qui.academy/docs/concierge-terminal-access/">Terminal Access</a> — enabling command execution for diagnostics</li>
<li><a href="https://qui.academy/docs/concierge-not-working/">Not Working?</a> — simple checklist when Concierge isn't responding</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Concierge]]></title>
                    <description><![CDATA[Concierge


Your built-in AI assistant in the QUI Core dashboard for navigating the system, diagnosing issues, and running commands.



In This Section


 * What Is Concierge — Overview of the built-in assistant
 * Using Concierge — How to chat, what it helps with, conversation memory
 * Terminal Access — Enabling terminal, presets, safety layers]]></description>
                    <link>https://qui.academy/docs/folder-concierge/</link>
                    <guid isPermaLink="false">69be99a14850ca00010b6d1a</guid>


                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 20 Mar 2026 00:38:50 +0000</pubDate>


                    <content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="concierge">Concierge</h2>
<p>Your built-in AI assistant in the QUI Core dashboard for navigating the system, diagnosing issues, and running commands.</p>
<h3 id="in-this-section">In This Section</h3>
<ul>
<li><strong><a href="https://qui.academy/docs/concierge-overview/">What Is Concierge</a></strong> — Overview of the built-in assistant</li>
<li><strong><a href="https://qui.academy/docs/concierge-using/">Using Concierge</a></strong> — How to chat, what it helps with, conversation memory</li>
<li><strong><a href="https://qui.academy/docs/concierge-terminal-access/">Terminal Access</a></strong> — Enabling terminal, presets, safety layers</li>
<li><strong><a href="https://qui.academy/docs/concierge-not-working/">Concierge Not Working?</a></strong> — User-level troubleshooting checklist</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Remote Access]]></title>
                    <description><![CDATA[Remote Access


Remote access lets you use your QUI Core dashboard from another device — your phone, a laptop, or any browser — without being on the same network as your QUI installation.




How Remote Access Works


Two methods are available:



WebRTC P2P (Primary)


A direct peer-to-peer connection between your]]></description>
                    <link>https://qui.academy/docs/federation-remote-access/</link>
                    <guid isPermaLink="false">69bdbe4d4850ca00010b6b5f</guid>

                        <category><![CDATA[Federation]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 20 Mar 2026 00:38:00 +0000</pubDate>


                    <content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="remote-access">Remote Access</h2>
<p>Remote access lets you use your QUI Core dashboard from another device — your phone, a laptop, or any browser — without being on the same network as your QUI installation.</p>
<hr>
<h2 id="how-remote-access-works">How Remote Access Works</h2>
<p>Two methods are available:</p>
<h3 id="webrtc-p2p-primary">WebRTC P2P (Primary)</h3>
<p>A direct peer-to-peer connection between your browser and your QUI Core instance, using WebRTC data channels:</p>
<pre><code>Your browser ← WebRTC data channel (encrypted) → Your QUI Core
                        ↕
               Central hub (signaling only)
</code></pre>
<ul>
<li><strong>End-to-end encrypted</strong> — the central hub only handles connection setup (signaling), not your traffic</li>
<li><strong>Full feature parity</strong> — everything works as if you were local (dashboard, Concierge, chat, terminal)</li>
<li><strong>Low latency</strong> — direct connection, no intermediate servers in the data path</li>
</ul>
<p>The central hub exchanges connection details (SDP offers, ICE candidates) to establish the peer connection. Once connected, all traffic flows directly between your browser and your QUI Core.</p>
<h3 id="mothership-tunnel-fallback">Mothership Tunnel (Fallback)</h3>
<p>When P2P connection fails (strict firewalls, symmetric NAT), traffic routes through the central hub:</p>
<pre><code>Your browser → Central hub (proxy) → Your QUI Core
</code></pre>
<ul>
<li><strong>Works behind strict firewalls</strong> — no direct connection needed</li>
<li><strong>Higher latency</strong> — traffic goes through an intermediate server</li>
<li><strong>Still authenticated</strong> — the hub verifies your identity before proxying</li>
</ul>
<p>The system tries WebRTC P2P first and falls back to the tunnel automatically.</p>
<hr>
<h2 id="eligibility">Eligibility</h2>
<p>Remote access requires:</p>
<ul>
<li><strong>Trust score ≥ 75</strong> — your device must be trusted (see <a href="https://qui.academy/docs/first-login/">First Login</a>)</li>
<li><strong>WebRTC P2P enabled</strong> — per-device setting in your remote access configuration</li>
<li><strong>Non-admin account</strong> — admin accounts use the tunnel, not WebRTC P2P</li>
<li><strong>Active tunnel connection</strong> — your QUI Core must have an active connection to the central hub for signaling</li>
</ul>
<hr>
<h2 id="setting-up-remote-access">Setting Up Remote Access</h2>
<ol>
<li>Open the <strong>Remote Access</strong> tab in your QUI Core dashboard</li>
<li>Enable remote access for your installation</li>
<li>Configure which devices can connect</li>
<li>Your QUI Core establishes a tunnel to the central hub for signaling</li>
</ol>
<p>Once enabled, you can access your QUI Core from the central hub's interface — it loads your QUI Core dashboard in an iframe with the WebRTC connection handling the traffic.</p>
<p><img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/federation-remote-access.png" alt="Remote access settings" loading="lazy"></p>
<hr>
<h2 id="what-works-remotely">What Works Remotely</h2>
<p>Everything that works locally also works remotely:</p>
<ul>
<li>QUI Core dashboard (all tabs)</li>
<li>Concierge chat with terminal access</li>
<li>Service monitoring</li>
<li>Billing and account management</li>
<li>All settings and configuration</li>
</ul>
<p>The remote browser renders the same QUI Core frontend — it's loaded through the WebRTC connection or tunnel proxy. Authentication headers are injected automatically so that your QUI Core recognizes you as a remote user.</p>
<hr>
<h2 id="security">Security</h2>
<table>
<thead>
<tr>
<th>Layer</th>
<th>Protection</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Authentication</strong></td>
<td>Central hub verifies your identity before allowing connection</td>
</tr>
<tr>
<td><strong>Trust score</strong></td>
<td>Only trusted devices (score ≥ 75) can connect remotely</td>
</tr>
<tr>
<td><strong>Encryption</strong></td>
<td>WebRTC data channel is encrypted end-to-end</td>
</tr>
<tr>
<td><strong>Zero-knowledge</strong></td>
<td>In P2P mode, the central hub sees no traffic content</td>
</tr>
<tr>
<td><strong>Per-device control</strong></td>
<td>You choose which devices can access remotely</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown-->]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Connections (Entanglement)]]></title>
                    <description><![CDATA[Connections (Entanglement)


Before two QUI instances can exchange federated messages, they must establish a trust relationship called entanglement. This is a mutual approval process — both sides must agree before any messages can flow.




The Connection Flow


1. You send a message to a character on another instance
2. The system]]></description>
                    <link>https://qui.academy/docs/federation-connections/</link>
                    <guid isPermaLink="false">69bdbe4d4850ca00010b6b58</guid>

                        <category><![CDATA[Federation]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 20 Mar 2026 00:37:00 +0000</pubDate>


                    <content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="connections-entanglement">Connections (Entanglement)</h2>
<p>Before two QUI instances can exchange federated messages, they must establish a trust relationship called <strong>entanglement</strong>. This is a mutual approval process — both sides must agree before any messages can flow.</p>
<hr>
<h2 id="the-connection-flow">The Connection Flow</h2>
<pre><code>1. You send a message to a character on another instance
2. The system detects this is a federated address
3. An entanglement request is sent to the target instance (via the central hub)
4. The target instance's user sees a pending connection request
5. They approve (or deny) the request
6. Once approved, messages flow freely between the two instances
</code></pre>
<p>Both instances cache the entanglement status locally for fast lookup. The central hub stores the trust record permanently.</p>
<hr>
<h2 id="managing-connections">Managing Connections</h2>
<h3 id="viewing-pending-requests">Viewing Pending Requests</h3>
<p>Incoming entanglement requests appear in the <strong>M2M</strong> tab of the QUI Core dashboard. You'll see:</p>
<ul>
<li>Which instance is requesting the connection</li>
<li>When the request was sent</li>
</ul>
<h3 id="approving-a-connection">Approving a Connection</h3>
<p>Click <strong>Approve</strong> on a pending request to establish the entanglement. Messages from that instance will begin flowing immediately.</p>
<h3 id="denying-a-connection">Denying a Connection</h3>
<p>Click <strong>Deny</strong> to reject the request. The requesting instance is notified. They can send another request later if desired.</p>
<h3 id="revoking-a-connection">Revoking a Connection</h3>
<p>You can revoke an established entanglement at any time. Once revoked:</p>
<ul>
<li>No new messages can be sent between the instances</li>
<li>Existing messages in your conversations are not deleted</li>
<li>The other instance is notified of the revocation</li>
<li>A new entanglement request would be needed to reconnect</li>
</ul>
<hr>
<h2 id="auto-entanglement">Auto-Entanglement</h2>
<p>When you send a message to a federated character and no entanglement exists, the system <strong>automatically sends an entanglement request</strong> on your behalf. You don't need to manually initiate the connection — just try to communicate, and the request is created.</p>
<p>Your message is held until the entanglement is approved. If using relay mode, the message waits in the hub. If using P2P mode, the delivery fails until the connection is established.</p>
<hr>
<h2 id="encryption">Encryption</h2>
<p>All federated messages are encrypted before leaving your instance:</p>
<ul>
<li>Encryption keys are derived from your instance's federation credentials</li>
<li>Messages are encrypted using Fernet (AES-128 + HMAC)</li>
<li>The central hub relays encrypted blobs without the ability to read content</li>
<li>Only the target instance can decrypt the message</li>
</ul>
<p>This is the foundation of QUI's zero-knowledge architecture — the hub facilitates communication but cannot access the content of any message.</p>
<hr>
<h2 id="connection-security">Connection Security</h2>
<table>
<thead>
<tr>
<th>Aspect</th>
<th>How It's Protected</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Identity</strong></td>
<td>Each instance has a unique, hardware-derived identifier</td>
</tr>
<tr>
<td><strong>Consent</strong></td>
<td>Both parties must approve the connection</td>
</tr>
<tr>
<td><strong>Encryption</strong></td>
<td>Messages encrypted end-to-end before transit</td>
</tr>
<tr>
<td><strong>Revocation</strong></td>
<td>Either party can disconnect at any time</td>
</tr>
<tr>
<td><strong>Zero-knowledge</strong></td>
<td>Central hub never sees message content</td>
</tr>
</tbody>
</table>
<!--kg-card-end: markdown-->]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Addressing]]></title>
                    <description><![CDATA[Addressing


Every character in the QUI ecosystem has an address. Local characters use simple names. Federated characters use the @character@node format to specify which instance they live on.




Address Formats





Format
Example
Meaning




name
Alice
Local character on your instance


name@core
Alice@core
Same as above — core means]]></description>
                    <link>https://qui.academy/docs/federation-addressing/</link>
                    <guid isPermaLink="false">69bdbe4c4850ca00010b6b51</guid>

                        <category><![CDATA[Federation]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 20 Mar 2026 00:36:00 +0000</pubDate>


                    <content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="addressing">Addressing</h2>
<p>Every character in the QUI ecosystem has an address. Local characters use simple names. Federated characters use the <code>@character@node</code> format to specify which instance they live on.</p>
<hr>
<h2 id="address-formats">Address Formats</h2>
<table>
<thead>
<tr>
<th>Format</th>
<th>Example</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>name</code></td>
<td><code>Alice</code></td>
<td>Local character on your instance</td>
</tr>
<tr>
<td><code>name@core</code></td>
<td><code>Alice@core</code></td>
<td>Same as above — <code>core</code> means local</td>
</tr>
<tr>
<td><code>name@instance</code></td>
<td><code>Alice@studio.qui.is</code></td>
<td>Federated — character lives on another QUI instance</td>
</tr>
<tr>
<td><code>name@ip</code></td>
<td><code>Bob@192.168.1.50</code></td>
<td>Federated — character on a specific IP address</td>
</tr>
</tbody>
</table>
<h3 id="local-addresses">Local Addresses</h3>
<p>When you create a character, it exists on your local QUI instance with the implicit address <code>name@core</code>. The <code>core</code> suffix means &quot;this character lives here.&quot; You don't need to type <code>@core</code> — just the character name works for all local operations.</p>
<h3 id="federated-addresses">Federated Addresses</h3>
<p>To reach a character on another instance, you need the full address: <code>name@node</code>. The <code>node</code> part identifies which QUI installation the character lives on. This can be:</p>
<ul>
<li>A <strong>domain name</strong> — <code>alice@studio.qui.is</code></li>
<li>An <strong>IP address</strong> — <code>bob@192.168.1.50</code></li>
<li>A <strong>unique instance ID</strong> — <code>carol@8216f429-0826-158c-ae1e-c168f53e9063</code></li>
</ul>
<p>The instance identifier is determined by the target's deployment configuration. Most instances use their hardware fingerprint UUID as their identity.</p>
<hr>
<h2 id="using-federated-addresses">Using Federated Addresses</h2>
<h3 id="in-strings">In Strings</h3>
<p>Add a federated character as a participant using their full address:</p>
<ol>
<li>Open conversation settings</li>
<li>Go to Participants</li>
<li>Enter the full address: <code>@alice@studio.qui.is</code></li>
<li>If the instances are entangled (connected), the character appears as a participant</li>
</ol>
<h3 id="in-m2m-messaging">In M2M Messaging</h3>
<p>Characters can send messages to federated addresses via trigger patterns:</p>
<pre><code>[TRIGGER:m2m:alice@studio.qui.is:Hello, can you help with this?]
</code></pre>
<h3 id="in-thinkthing">In ThinkThing</h3>
<p>The Agent node can target federated addresses for cross-instance workflows.</p>
<hr>
<h2 id="how-routing-works">How Routing Works</h2>
<p>When a message is sent to an address, the system determines whether it's local or federated:</p>
<ul>
<li>If the node part is <code>core</code> (or missing) → <strong>local delivery</strong> — message goes directly to the character on this instance</li>
<li>If the node part is anything else → <strong>federated delivery</strong> — message is encrypted and sent to the target instance via relay or P2P</li>
</ul>
<p>This routing is automatic. You just use the address and the system handles the rest.</p>
<!--kg-card-end: markdown-->]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[What Is Federation]]></title>
                    <description><![CDATA[What Is Federation


Federation lets your characters communicate with characters running on other QUI instances across the network. Each QUI installation is independent — your data stays on your device — but characters can reach across instances to collaborate, share information, and work together.




Core Principles



Zero-Knowledge


The central hub handles]]></description>
                    <link>https://qui.academy/docs/federation-overview/</link>
                    <guid isPermaLink="false">69bdbe4b4850ca00010b6b4a</guid>

                        <category><![CDATA[Federation]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 20 Mar 2026 00:35:00 +0000</pubDate>


                    <content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="what-is-federation">What Is Federation</h2>
<p>Federation lets your characters communicate with characters running on other QUI instances across the network. Each QUI installation is independent — your data stays on your device — but characters can reach across instances to collaborate, share information, and work together.</p>
<hr>
<h2 id="core-principles">Core Principles</h2>
<h3 id="zero-knowledge">Zero-Knowledge</h3>
<p>The central hub handles connection brokering and message relay, but it <strong>never sees message content</strong>. Messages are encrypted before leaving your instance and decrypted only on the receiving instance. The hub sees encrypted blobs, not conversations.</p>
<h3 id="mutual-consent">Mutual Consent</h3>
<p>Before two instances can exchange messages, they must establish a trust relationship called <strong>entanglement</strong>. Both sides must approve the connection. You can revoke it at any time.</p>
<h3 id="data-stays-local">Data Stays Local</h3>
<p>Federation is about communication, not data sharing. Your character's memory, knowledge base, system prompts, and configuration never leave your machine. Only the messages themselves are transmitted.</p>
<hr>
<h2 id="how-it-works">How It Works</h2>
<pre><code>Your character → encrypts message → sends via relay or P2P → remote instance decrypts → delivers to target character
</code></pre>
<p>Two delivery modes are available:</p>
<table>
<thead>
<tr>
<th>Mode</th>
<th>How It Works</th>
<th>When It Works</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Relay</strong></td>
<td>Message is encrypted and sent to the central hub, which stores it until the recipient polls for new messages</td>
<td>Even when the target is offline (store-and-forward)</td>
</tr>
<tr>
<td><strong>P2P</strong></td>
<td>Message is encrypted and sent directly to the target instance's endpoint</td>
<td>Only when target is online (direct connection required)</td>
</tr>
</tbody>
</table>
<p>Relay mode is the default and works in all scenarios. P2P mode is faster but requires both instances to be online simultaneously.</p>
<hr>
<h2 id="what-federation-enables">What Federation Enables</h2>
<ul>
<li><strong>Cross-instance character conversations</strong> — your character talks to a character on someone else's QUI instance</li>
<li><strong>Multi-instance collaboration</strong> — characters across different machines work together on tasks</li>
<li><strong>Entangled Strings</strong> — shared conversations that span multiple QUI instances</li>
<li><strong>M2M messaging across the network</strong> — the same @mention system that works locally extends to federated addresses</li>
</ul>
<hr>
<h2 id="whats-next">What's Next</h2>
<ul>
<li><a href="https://qui.academy/docs/federation-addressing/">Addressing</a> — the <code>@character@node</code> address format</li>
<li><a href="https://qui.academy/docs/federation-connections/">Connections</a> — establishing and managing entanglements</li>
<li><a href="https://qui.academy/docs/federation-remote-access/">Remote Access</a> — accessing your own QUI Core from another device</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Federation]]></title>
                    <description><![CDATA[Federation


Cross-instance communication — your characters can talk to characters on other QUI installations with end-to-end encryption.



In This Section


 * What Is Federation — Overview of cross-instance communication
 * Addressing — The @character@node address format
 * Connections — Entanglement — the connection permission flow
 * Remote Access — Accessing your QUI Core from another]]></description>
                    <link>https://qui.academy/docs/folder-federation/</link>
                    <guid isPermaLink="false">69be99a04850ca00010b6d14</guid>


                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 20 Mar 2026 00:34:50 +0000</pubDate>


                    <content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="federation">Federation</h2>
<p>Cross-instance communication — your characters can talk to characters on other QUI installations with end-to-end encryption.</p>
<h3 id="in-this-section">In This Section</h3>
<ul>
<li><strong><a href="https://qui.academy/docs/federation-overview/">What Is Federation</a></strong> — Overview of cross-instance communication</li>
<li><strong><a href="https://qui.academy/docs/federation-addressing/">Addressing</a></strong> — The @character@node address format</li>
<li><strong><a href="https://qui.academy/docs/federation-connections/">Connections</a></strong> — Entanglement — the connection permission flow</li>
<li><strong><a href="https://qui.academy/docs/federation-remote-access/">Remote Access</a></strong> — Accessing your QUI Core from another device</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Terminal Access]]></title>
                    <description><![CDATA[Terminal Access


Characters can execute shell commands on the host machine through a multi-layered security system. Terminal access is powerful — a character can check system status, manage files, run scripts, and interact with the operating system — but it&#39;s carefully controlled.




How Terminal Access Works


When a character]]></description>
                    <link>https://qui.academy/docs/advanced-terminal/</link>
                    <guid isPermaLink="false">69bdbe4b4850ca00010b6b43</guid>

                        <category><![CDATA[Advanced]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 20 Mar 2026 00:34:00 +0000</pubDate>


                    <content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="terminal-access">Terminal Access</h2>
<p>Characters can execute shell commands on the host machine through a multi-layered security system. Terminal access is powerful — a character can check system status, manage files, run scripts, and interact with the operating system — but it's carefully controlled.</p>
<hr>
<h2 id="how-terminal-access-works">How Terminal Access Works</h2>
<p>When a character has the Terminal node enabled and needs to run a command, it includes a trigger in its response:</p>
<pre><code>[TRIGGER:terminal:ls -la /var/log]
</code></pre>
<p>The command passes through five security layers before execution:</p>
<ol>
<li><strong>Dangerous pattern check</strong> — hardcoded patterns that are always blocked (fork bombs, recursive root deletion, disk formatting)</li>
<li><strong>Whitelist</strong> — commands in the active preset's allowed list pass through</li>
<li><strong>Blacklist</strong> — explicitly blocked commands are rejected</li>
<li><strong>Path validation</strong> — commands accessing paths outside allowed directories are blocked</li>
<li><strong>Terminal Service safety checker</strong> — a second independent safety layer at the execution point</li>
</ol>
<p>Only commands that pass all five layers are executed. The result is returned to the character for analysis.</p>
<hr>
<h2 id="presets">Presets</h2>
<p>Terminal access is controlled through <strong>presets</strong> — named collections of allowed commands. Each preset defines what commands the character can run:</p>
<table>
<thead>
<tr>
<th>Preset</th>
<th>Commands</th>
<th>Best For</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Read Only</strong></td>
<td>69 commands — <code>ls</code>, <code>cat</code>, <code>grep</code>, <code>find</code>, <code>curl</code>, <code>ps</code>, <code>df</code>, <code>ping</code>, etc.</td>
<td>Safe system inspection. Cannot modify anything.</td>
</tr>
<tr>
<td><strong>Read &amp; Write</strong></td>
<td>35 commands — <code>mkdir</code>, <code>cp</code>, <code>mv</code>, <code>rm</code>, <code>chmod</code>, <code>tar</code>, <code>nano</code>, etc.</td>
<td>File management tasks</td>
</tr>
<tr>
<td><strong>Developer</strong></td>
<td>61 commands — <code>git</code>, <code>npm</code>, <code>python</code>, <code>docker</code>, <code>make</code>, <code>cargo</code>, etc.</td>
<td>Development and DevOps workflows</td>
</tr>
<tr>
<td><strong>System Admin</strong></td>
<td>46 commands — <code>systemctl</code>, <code>journalctl</code>, <code>useradd</code>, <code>mount</code>, <code>sudo</code>, etc.</td>
<td>System administration</td>
</tr>
<tr>
<td><strong>Manual</strong></td>
<td>0 commands — you define your own whitelist and blacklist</td>
<td>Full custom control</td>
</tr>
</tbody>
</table>
<p>Presets are additive to your manual whitelist. You can select a preset AND add extra commands to the whitelist.</p>
<hr>
<h2 id="enabling-terminal-access">Enabling Terminal Access</h2>
<p>Terminal access is configured in two places:</p>
<h3 id="on-the-character-visual-builder">On the Character (Visual Builder)</h3>
<p>Add the <strong>Terminal</strong> node to the character's canvas. This enables the character to use <code>[TRIGGER:terminal:command]</code> patterns. Configure allowed commands, blocked patterns, and path restrictions in the node settings.</p>
<h3 id="on-the-user-concierge-terminal-settings">On the User (Concierge Terminal Settings)</h3>
<p>For the Concierge assistant specifically, terminal access is configured in the QUI Core dashboard → Chat tab → Terminal Settings:</p>
<ol>
<li>Toggle <strong>Enable Terminal Access</strong> on</li>
<li>Select a preset (or Manual for custom)</li>
<li>Optionally add commands to the whitelist or blacklist</li>
<li>Toggle <strong>Require Manual Approval</strong> if you want to review each command before execution</li>
</ol>
<hr>
<h2 id="manual-approval-mode">Manual Approval Mode</h2>
<p>When manual approval is enabled, every command proposed by the character shows an <strong>Execute</strong> button instead of running automatically. You see the command, decide if it's safe, and click Execute to proceed.</p>
<p>The Execute button bypasses the preset/whitelist filters (since you're explicitly approving), but the Terminal Service's safety layer still blocks inherently dangerous operations.</p>
<hr>
<h2 id="whats-always-blocked">What's Always Blocked</h2>
<p>Regardless of preset, whitelist, or manual approval, these patterns are always blocked by the dangerous command filter:</p>
<ul>
<li>Recursive root deletion (<code>rm -rf /</code>)</li>
<li>Writing to disk devices (<code>dd of=/dev/sda</code>)</li>
<li>Filesystem formatting (<code>mkfs</code>)</li>
<li>Fork bombs</li>
<li>Recursive world-writable permissions (<code>chmod -R 777</code>)</li>
<li>Piping untrusted URLs to shell (<code>curl | bash</code>)</li>
<li>Background process detachment (<code>nohup</code>, <code>disown</code>)</li>
</ul>
<p>These protections exist at both the QUI Core command filter layer and the Terminal Service safety checker layer — two independent systems that must both pass.</p>
<hr>
<h2 id="audit-trail">Audit Trail</h2>
<p>Every terminal command attempt is logged, regardless of outcome:</p>
<ul>
<li>Which user ran it</li>
<li>The full command</li>
<li>Whether it was allowed, blocked, executed, or failed</li>
<li>The exit code and output (if executed)</li>
<li>Which preset was active</li>
<li>Execution duration</li>
</ul>
<p>Audit logs are retained for 90 days and cleaned up automatically.</p>
<hr>
<h2 id="terminal-in-thinkthing">Terminal in ThinkThing</h2>
<p>ThinkThing has 24 terminal node types — one generic and 23 specialized for specific domains (Git, Python, Docker, PostgreSQL, etc.). These nodes use an agentic loop:</p>
<ol>
<li>You describe a task in natural language</li>
<li>The LLM decides what commands to run</li>
<li>Commands are executed through the security system</li>
<li>Results are fed back to the LLM</li>
<li>The LLM iterates until the task is complete or the iteration limit is reached</li>
</ol>
<p>Each specialized node scopes the LLM to its domain — a &quot;Git Terminal&quot; node focuses the LLM on git operations, while a &quot;Docker Terminal&quot; node focuses on container management.</p>
<!--kg-card-end: markdown-->]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Local Models]]></title>
                    <description><![CDATA[Local Models


QUI supports running LLMs entirely on your own hardware through Qllama — an isolated Ollama wrapper. Local models require no internet connection and incur no billing costs. Your data never leaves your machine.




What Is Qllama


Qllama runs the official Ollama Docker image with QUI-specific configuration. It provides:]]></description>
                    <link>https://qui.academy/docs/advanced-local-models/</link>
                    <guid isPermaLink="false">69bdbe4a4850ca00010b6b3c</guid>

                        <category><![CDATA[Advanced]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 20 Mar 2026 00:33:00 +0000</pubDate>


                    <content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="local-models">Local Models</h2>
<p>QUI supports running LLMs entirely on your own hardware through Qllama — an isolated Ollama wrapper. Local models require no internet connection and incur no billing costs. Your data never leaves your machine.</p>
<hr>
<h2 id="what-is-qllama">What Is Qllama</h2>
<p>Qllama runs the official Ollama Docker image with QUI-specific configuration. It provides:</p>
<ul>
<li><strong>Port isolation</strong> — Qllama uses port 11435, separate from any native Ollama installation (11434). Both can run simultaneously.</li>
<li><strong>Data isolation</strong> — models are stored in a dedicated Docker volume, independent of any local Ollama installation</li>
<li><strong>Network integration</strong> — other QUI services can reach Qllama through the internal Docker network</li>
</ul>
<hr>
<h2 id="setting-up-local-models">Setting Up Local Models</h2>
<h3 id="1-start-qllama">1. Start Qllama</h3>
<p>Qllama starts automatically with the QUI Core installer. You can also manage it manually from the <strong>Local Models</strong> tab in the QUI Core dashboard.</p>
<h3 id="2-pull-a-model">2. Pull a Model</h3>
<p>Download a model from the Ollama model library:</p>
<p>From the dashboard's Local Models tab, search for and pull models. Popular choices:</p>
<table>
<thead>
<tr>
<th>Model</th>
<th>Size</th>
<th>Best For</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>phi3:mini</code></td>
<td>~2 GB</td>
<td>Fast, lightweight tasks</td>
</tr>
<tr>
<td><code>mistral</code></td>
<td>~4 GB</td>
<td>General purpose</td>
</tr>
<tr>
<td><code>llama3</code></td>
<td>~4-8 GB</td>
<td>Strong general reasoning</td>
</tr>
<tr>
<td><code>codellama</code></td>
<td>~4-8 GB</td>
<td>Code generation and analysis</td>
</tr>
</tbody>
</table>
<h3 id="3-select-the-model-on-a-character">3. Select the Model on a Character</h3>
<p>In the Visual Builder:</p>
<ol>
<li>Click the core Anima node</li>
<li>Select a local model from the model dropdown</li>
<li>Local models appear with a <code>local-</code> prefix</li>
</ol>
<hr>
<h2 id="how-local-models-route">How Local Models Route</h2>
<p>When a character uses a local model, the call chain is shorter:</p>
<pre><code>Your character (Anima) → QUI Core Bridge → detects local-* prefix → routes to Qllama (localhost:11435)
</code></pre>
<p>The request bypasses the central billing hub entirely — no internet needed, no billing charges. The QUI Core Bridge detects the <code>local-*</code> prefix on the model name and routes directly to Qllama.</p>
<hr>
<h2 id="gpu-requirements">GPU Requirements</h2>
<p>Local LLMs perform best with GPU acceleration:</p>
<ul>
<li><strong>NVIDIA GPU</strong> with CUDA support — recommended</li>
<li><strong>NVIDIA Container Toolkit</strong> must be installed for Docker GPU passthrough</li>
<li>Without GPU, models fall back to CPU inference (significantly slower)</li>
</ul>
<p>The <strong>GPU Monitor</strong> panel in the QUI Core dashboard shows VRAM usage and loaded models.</p>
<hr>
<h2 id="managing-models">Managing Models</h2>
<p>The <strong>Local Models</strong> tab in the QUI Core dashboard lets you:</p>
<ul>
<li><strong>View installed models</strong> — see what's downloaded and how much space each uses</li>
<li><strong>Pull new models</strong> — search and download from the Ollama library</li>
<li><strong>View running models</strong> — see what's currently loaded in VRAM</li>
<li><strong>Monitor GPU usage</strong> — VRAM consumption and utilization</li>
</ul>
<hr>
<h2 id="when-to-use-local-vs-cloud">When to Use Local vs Cloud</h2>
<table>
<thead>
<tr>
<th>Scenario</th>
<th>Recommendation</th>
</tr>
</thead>
<tbody>
<tr>
<td>Privacy-sensitive data</td>
<td>Local — data never leaves your machine</td>
</tr>
<tr>
<td>No internet connection</td>
<td>Local — works fully offline</td>
</tr>
<tr>
<td>Cost-sensitive experimentation</td>
<td>Local — no per-token charges</td>
</tr>
<tr>
<td>Maximum quality responses</td>
<td>Cloud — larger cloud models generally outperform local ones</td>
</tr>
<tr>
<td>Fast response times</td>
<td>Cloud — cloud inference is typically faster than local (unless you have a powerful GPU)</td>
</tr>
<tr>
<td>Long context windows</td>
<td>Cloud — cloud models support larger context windows</td>
</tr>
</tbody>
</table>
<p>You can mix local and cloud models across characters — one character uses a local model for privacy-sensitive tasks while another uses a cloud model for complex reasoning.</p>
<blockquote>
<p><strong>Tip:</strong> Start with a small local model like <code>phi3:mini</code> to verify your GPU setup works, then pull larger models as needed.</p>
</blockquote>
<!--kg-card-end: markdown-->]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[MCP Tools]]></title>
                    <description><![CDATA[MCP Tools


MCP (Model Context Protocol) is an open standard for connecting AI models to external tools and services. QUI&#39;s MCP Gateway provides access to over 165 tools across 9 categories — from GitHub and Docker to Telegram, Notion, and database management.




What MCP Tools Enable


When you enable]]></description>
                    <link>https://qui.academy/docs/advanced-mcp-tools/</link>
                    <guid isPermaLink="false">69bdbe494850ca00010b6b35</guid>

                        <category><![CDATA[Advanced]]></category>

                        <dc:creator><![CDATA[Qui Academy]]></dc:creator>

                    <pubDate>Fri, 20 Mar 2026 00:32:00 +0000</pubDate>


                    <content:encoded><![CDATA[<h2 id="mcp-tools">MCP Tools</h2>
<p>MCP (Model Context Protocol) is an open standard for connecting AI models to external tools and services. QUI's MCP Gateway provides access to over 165 tools across 9 categories — from GitHub and Docker to Telegram, Notion, and database management.</p>
<hr>
<h2 id="what-mcp-tools-enable">What MCP Tools Enable</h2>
<p>When you enable MCP tools on a character, that character can:</p>
<ul>
<li>Send and receive Telegram messages</li>
<li>Create GitHub issues and pull requests</li>
<li>Query databases (PostgreSQL, Redis, MongoDB, SQLite)</li>
<li>Manage Docker containers</li>
<li>Send emails and Slack messages</li>
<li>Create Trello cards and Notion pages</li>
<li>Search the web (DuckDuckGo, Brave)</li>
<li>Interact with web pages via Playwright</li>
<li>And much more</li>
</ul>
<p>The character uses these tools through trigger patterns in its responses. You configure which tools each character has access to, and provide the necessary API credentials.</p>
<hr>
<h2 id="tool-categories">Tool Categories</h2>
<table>
<thead>
<tr>
<th>Category</th>
<th>Services</th>
<th>Tool Count</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Dev</strong></td>
<td>GitHub, Git, Playwright, Filesystem, Fetch, Sentry, Datadog</td>
<td>70+</td>
</tr>
<tr>
<td><strong>Cloud</strong></td>
<td>Docker, Kubernetes, AWS, GCP, Azure</td>
<td>10</td>
</tr>
<tr>
<td><strong>Data</strong></td>
<td>Redis, MongoDB, Elasticsearch, SQLite, MySQL, PostgreSQL, Google Drive</td>
<td>17</td>
</tr>
<tr>
<td><strong>Comms</strong></td>
<td>Telegram, WhatsApp, Email, Slack, Discord, Calendar</td>
<td>55+</td>
</tr>
<tr>
<td><strong>Productivity</strong></td>
<td>Trello, Notion, Jira, Linear</td>
<td>21</td>
</tr>
<tr>
<td><strong>Security</strong></td>
<td>1Password, Vault</td>
<td>9</td>
</tr>
<tr>
<td><strong>Cognition</strong></td>
<td>Sequential Thinking, Memory Knowledge Graph</td>
<td>3</td>
</tr>
<tr>
<td><strong>Search</strong></td>
<td>DuckDuckGo, Brave</td>
<td>2</td>
</tr>
<tr>
<td><strong>Utility</strong></td>
<td>Time</td>
<td>1</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="enabling-mcp-tools">Enabling MCP Tools</h2>
<h3 id="in-the-visual-builder">In the Visual Builder</h3>
<ol>
<li>Open the <strong>Cognitive Design</strong> tab in the palette</li>
<li>Find the <strong>MCP</strong> section with category flyouts</li>
<li>Click a category to see available services</li>
<li>Click a service to add it as a node on the canvas</li>
<li>Click the node to configure credentials (API keys, tokens, etc.)</li>
</ol>
<p>Each service node stores its own credentials. For example, the GitHub node needs a personal access token, the Telegram node needs a bot token, and the Slack node needs a signing secret.</p>
<p><img src="https://storage.ghost.io/c/b1/c9/b1c912a2-efa5-43f3-8997-71d5c7050f76/content/images/2026/04/mcp-tool-flyout.png" alt="MCP tool flyout" loading="lazy"></p>
<h3 id="credentials">Credentials</h3>
<p>Each MCP service has specific credential requirements. The node configuration panel shows what's needed:</p>
<ul>
<li><strong>GitHub</strong> — Personal access token</li>
<li><strong>Telegram</strong> — Bot token (from @BotFather)</li>
<li><strong>Slack</strong> — Bot token + signing secret</li>
<li><strong>Discord</strong> — Bot token + public key</li>
<li><strong>Email</strong> — SMTP/IMAP credentials</li>
<li><strong>AWS</strong> — Access key ID + secret</li>
<li><strong>Database services</strong> — Connection string or host/port/credentials</li>
</ul>
<p>Credentials are stored securely in the character's configuration.</p>
<p><a href="https://qui.academy/docs/qui-mcp-integrations-setup-guide/">READ THE FULL INTEGRATION GUIDE</a></p>
<hr>
<h2 id="how-tools-execute">How Tools Execute</h2>
<p>When a character decides to use an MCP tool, it emits a trigger in its response:</p>
<pre><code>[TRIGGER:mcp:github:create_issue:{"title":"Bug report","body":"Details...","repo":"org/repo"}]
</code></pre>
<p>The trigger system:</p>
<ol>
<li>Detects the pattern in the LLM response</li>
<li>Strips it from the displayed text (the user sees clean output)</li>
<li>Resolves the service credentials from the character's MCP configuration</li>
<li>Sends the request to the MCP Gateway</li>
<li>Returns the result to the character for follow-up</li>
</ol>
<p>In agentic mode, the character can chain multiple tool calls — create a GitHub issue, then send a Slack notification about it, then update a Trello card.</p>
<hr>
<h2 id="mcp-in-thinkthing">MCP in ThinkThing</h2>
<p>ThinkThing has 37 dedicated MCP nodes — one per service. Each node is pre-configured with the service's available tools. Add the node to a graph, connect it to an Anima character with the corresponding MCP service enabled, and configure the specific tool and parameters.</p>
<hr>
<h2 id="tool-access-control">Tool Access Control</h2>
<p>MCP access is controlled at multiple levels:</p>
<ol>
<li><strong>Character level</strong> — only tools whose nodes are on the canvas are available</li>
<li><strong>Service level</strong> — each service can be individually enabled/disabled</li>
<li><strong>Tool level</strong> — within a service, individual tools can be toggled</li>
<li><strong>Credential level</strong> — tools without valid credentials won't execute</li>
</ol>
<p>This layered approach ensures characters only access the specific tools they need.</p>
]]></content:encoded>
                </item>
    </channel>
</rss>