<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://exepert.com/blog</id>
    <title>EXEPERT Blog</title>
    <updated>2026-06-19T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://exepert.com/blog"/>
    <subtitle>EXEPERT Blog</subtitle>
    <icon>https://exepert.com/img/favicon.png</icon>
    <entry>
        <title type="html"><![CDATA[Changelog calendar tracker and prompt list polish]]></title>
        <id>https://exepert.com/blog/changelog-calendar-tracker</id>
        <link href="https://exepert.com/blog/changelog-calendar-tracker"/>
        <updated>2026-06-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The changelog page now has an interactive calendar tracker for developer]]></summary>
        <content type="html"><![CDATA[<p>The changelog page now has an interactive calendar tracker for developer
activity. It maps changelog posts and committed code activity onto a monthly
grid so devs can inspect what changed by date.</p>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="what-changed">What changed<a href="https://exepert.com/blog/changelog-calendar-tracker#what-changed" class="hash-link" aria-label="Direct link to What changed" title="Direct link to What changed" translate="no">​</a></h2>
<ul>
<li class=""><code>docs-site/scripts/generate-activity-calendar.mjs</code> generates static activity
data from changelog markdown and committed Git stats.</li>
<li class=""><code>docs-site/src/components/ActivityCalendar</code> renders the calendar, activity
markers, day details, month navigation, and click-to-filter behavior.</li>
<li class=""><code>docs-site/src/theme/BlogListPage</code> adds the tracker above <code>/blog</code> entries and
filters visible changelog posts when a day is selected.</li>
<li class=""><code>docs-site/package.json</code> runs activity generation before docs start and build
commands, while <code>docs-site/docusaurus.config.ts</code> shows all posts on the blog
index so filtering works across the full changelog.</li>
<li class="">The calendar detail panel now uses container-aware layout rules to prevent
hover flicker and to stack cleanly on narrower blog columns.</li>
<li class=""><code>css/app.css</code> gives the Prompt list a thin neutral scrollbar, stable gutter,
and removes the older duplicate prompt-list style block.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="user-impact">User impact<a href="https://exepert.com/blog/changelog-calendar-tracker#user-impact" class="hash-link" aria-label="Direct link to User impact" title="Direct link to User impact" translate="no">​</a></h2>
<ul>
<li class="">Developers can scan changelog and code activity by date from <code>/blog</code>.</li>
<li class="">Hovering a day previews the related changelogs, commits, file count, and line
activity.</li>
<li class="">Clicking a day filters the changelog list to that date, and clearing the
filter restores the full list.</li>
<li class="">The Prompt list scrollbar feels quieter and no longer shows chunky browser
scrollbar buttons.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="verification">Verification<a href="https://exepert.com/blog/changelog-calendar-tracker#verification" class="hash-link" aria-label="Direct link to Verification" title="Direct link to Verification" translate="no">​</a></h2>
<p>Checked locally with:</p>
<div class="language-bash codeBlockContainer_DNoR theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_V6CO"><pre tabindex="0" class="prism-code language-bash codeBlock_oNt_ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines__z_2"><div class="token-line" style="color:#F8F8F2"><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> docs-site</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> activity:generate</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> typecheck</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> build</span><br></div></code></pre></div></div>
<p>Browser checks confirmed the calendar renders on <code>/blog</code>, June 17 and June 18
filter to the expected changelog posts, hover previews no longer flicker, and
desktop, tablet, and mobile widths have no horizontal overflow.</p>]]></content>
        <author>
            <name>EXEPERT Team</name>
            <uri>https://github.com/exepert/exepert</uri>
        </author>
        <category label="UI" term="UI"/>
        <category label="Docs" term="Docs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Brain stage telemetry cleanup]]></title>
        <id>https://exepert.com/blog/brain-stage-telemetry-cleanup</id>
        <link href="https://exepert.com/blog/brain-stage-telemetry-cleanup"/>
        <updated>2026-06-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The brain stage now keeps telemetry in one place. The floating canvas badge has]]></summary>
        <content type="html"><![CDATA[<p>The brain stage now keeps telemetry in one place. The floating canvas badge has
been removed, and the existing bottom status bar now carries the neuron and
axon counts beside the live signal count.</p>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="what-changed">What changed<a href="https://exepert.com/blog/brain-stage-telemetry-cleanup#what-changed" class="hash-link" aria-label="Direct link to What changed" title="Direct link to What changed" translate="no">​</a></h2>
<ul>
<li class=""><code>index.html</code> removes the <code>.brain-badge</code> overlay from the brain stage and
updates the initial status text with <code>N 0</code>, <code>A 0</code>, and <code>SIG 0</code>.</li>
<li class=""><code>css/app.css</code> removes the desktop and mobile badge styles plus the live-dot
styling that only existed for that overlay.</li>
<li class=""><code>src/brain-ui.ts</code> no longer caches or updates <code>#brainTelemetry</code>, and the
removed <code>buildTelemetryLine()</code> helper is gone.</li>
<li class=""><code>src/scene.ts</code> adds neuron and axon totals to the status bar. The full status
uses <code>NEURONS</code> and <code>AXONS</code>; the compact status uses <code>N</code> and <code>A</code> to keep the
line readable on narrow canvases.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="user-impact">User impact<a href="https://exepert.com/blog/brain-stage-telemetry-cleanup#user-impact" class="hash-link" aria-label="Direct link to User impact" title="Direct link to User impact" translate="no">​</a></h2>
<ul>
<li class="">The brain canvas is visually cleaner and focuses on the 3D brain plus the
existing affect label.</li>
<li class="">Duplicate telemetry is gone. Neuron and axon counts now live with the rest of
the stage readout in the bottom status bar.</li>
<li class="">The right-panel telemetry tiles are unchanged, so dashboard metrics remain in
the same place.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="verification">Verification<a href="https://exepert.com/blog/brain-stage-telemetry-cleanup#verification" class="hash-link" aria-label="Direct link to Verification" title="Direct link to Verification" translate="no">​</a></h2>
<p>Checked locally with:</p>
<div class="language-bash codeBlockContainer_DNoR theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_V6CO"><pre tabindex="0" class="prism-code language-bash codeBlock_oNt_ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines__z_2"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> typecheck</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">test</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> vite build</span><br></div></code></pre></div></div>
<p>The built app was served locally and checked at desktop and mobile widths. The
checks confirmed the badge DOM is gone, <code>#brainTelemetry</code> no longer exists, the
affect overlay remains, the status bar includes neuron, axon, and signal counts,
the right-panel metrics remain populated, and the WebGL canvas renders with
visible pixel variation.</p>]]></content>
        <author>
            <name>EXEPERT Team</name>
            <uri>https://github.com/exepert/exepert</uri>
        </author>
        <category label="UI" term="UI"/>
        <category label="Bugfix" term="Bugfix"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Docs homepage and search polish]]></title>
        <id>https://exepert.com/blog/docs-homepage-search-polish</id>
        <link href="https://exepert.com/blog/docs-homepage-search-polish"/>
        <updated>2026-06-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The docs site homepage now uses a flatter, calmer presentation, and local docs]]></summary>
        <content type="html"><![CDATA[<p>The docs site homepage now uses a flatter, calmer presentation, and local docs
search has a clearer validation workflow. This change also removes long dash
punctuation from visible docs copy so the writing reads cleaner and less
template-like.</p>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="what-changed">What changed<a href="https://exepert.com/blog/docs-homepage-search-polish#what-changed" class="hash-link" aria-label="Direct link to What changed" title="Direct link to What changed" translate="no">​</a></h2>
<ul>
<li class=""><code>docs-site/src/css/custom.css</code> removes hero gradients, normalizes hero title
spacing, and simplifies the eyebrow badge.</li>
<li class=""><code>docs-site/src/pages/index.module.css</code> tightens homepage feature cards with
an 8px radius, quieter hover states, and more compact spacing.</li>
<li class=""><code>docs-site/docusaurus.config.ts</code> keeps local Docusaurus search, adds page
indexing, expands result limits and context, and excludes navbar, footer,
breadcrumbs, pagination, table of contents, and doc footer chrome from the
index.</li>
<li class=""><code>docs-site/package.json</code> adds <code>preview:search</code> for the production-search
workflow: build the docs site, then serve the generated static output.</li>
<li class="">Current docs, versioned docs, and blog posts replace long dash separators
with cleaner punctuation or explicit wording.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="user-impact">User impact<a href="https://exepert.com/blog/docs-homepage-search-polish#user-impact" class="hash-link" aria-label="Direct link to User impact" title="Direct link to User impact" translate="no">​</a></h2>
<ul>
<li class="">The docs homepage has a flat visual style with no gradient coloring.</li>
<li class="">Search validation is less confusing: <code>pnpm start</code> remains for live editing,
while <code>pnpm serve</code> or <code>pnpm preview:search</code> validates the generated search
index.</li>
<li class="">Searching for terms such as <code>tele</code> in the built site returns real local
results instead of the build-index warning.</li>
<li class="">The visible docs copy no longer uses em dash or en dash separators.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="verification">Verification<a href="https://exepert.com/blog/docs-homepage-search-polish#verification" class="hash-link" aria-label="Direct link to Verification" title="Direct link to Verification" translate="no">​</a></h2>
<p>Checked locally with:</p>
<div class="language-bash codeBlockContainer_DNoR theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_V6CO"><pre tabindex="0" class="prism-code language-bash codeBlock_oNt_ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines__z_2"><div class="token-line" style="color:#F8F8F2"><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> docs-site</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> typecheck</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> build</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">rg </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'\x{2014}|\x{2013}'</span><span class="token plain"> docs-site/docs docs-site/versioned_docs docs-site/blog docs-site/src/pages docs-site/docusaurus.config.ts</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">rg </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-n</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'linear-gradient|radial-gradient'</span><span class="token plain"> docs-site/src</span><br></div></code></pre></div></div>
<p>The built site was served at <code>http://127.0.0.1:3001/</code>. Browser checks confirmed
the homepage hero has no background image, the mobile layout fits at 390px, and
searching for <code>tele</code> returns Telemetry results without the build-index warning.</p>]]></content>
        <author>
            <name>EXEPERT Team</name>
            <uri>https://github.com/exepert/exepert</uri>
        </author>
        <category label="UI" term="UI"/>
        <category label="Bugfix" term="Bugfix"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Emotion-reactive brain canvas for EXEPERT Chat]]></title>
        <id>https://exepert.com/blog/emotion-reactive-brain-canvas</id>
        <link href="https://exepert.com/blog/emotion-reactive-brain-canvas"/>
        <updated>2026-06-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[EXEPERT Chat now drives a synthetic affect layer that colors and pulses the]]></summary>
        <content type="html"><![CDATA[<p>EXEPERT Chat now drives a synthetic affect layer that colors and pulses the
brain canvas while a user chats with an AI model. The feature is designed for AI
emotion research UX: it visualizes conversational affect signals, not clinical
or literal emotion detection.</p>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="what-changed">What changed<a href="https://exepert.com/blog/emotion-reactive-brain-canvas#what-changed" class="hash-link" aria-label="Direct link to What changed" title="Direct link to What changed" translate="no">​</a></h2>
<ul>
<li class=""><code>src/affect/*</code> adds the affect engine: shared types, the emotion palette, the
deterministic local classifier, text hashing, affect-to-region mapping, and
the browser client for saving affect annotations.</li>
<li class=""><code>src/brain-ui.ts</code> classifies user input immediately, classifies assistant
output after streaming, renders message affect chips, updates the new
<strong>Affective Field</strong>, and triggers emotion-colored neural pulses. Chat error
states can also become <code>assistant_error</code> affect events when the failed span is
available.</li>
<li class=""><code>index.html</code> adds the <strong>Affective Field</strong> readout inside the Chat tile and the
canvas-stage affect overlay.</li>
<li class=""><code>css/app.css</code> styles the Affective Field, message chips, stage overlay, and
responsive narrow-panel behavior.</li>
<li class=""><code>rust/brain_sim/src/lib.rs</code> extends the WASM signal pool with per-signal RGB
color buffers. Stimuli can now pass a hex color, and signals propagate that
color through neuron firing.</li>
<li class=""><code>src/brain.ts</code> binds the WASM particle color buffer to a Three.js <code>color</code>
geometry attribute so simultaneous signals can render different emotion
colors in the same canvas.</li>
<li class=""><code>supabase/functions/chat-affect/index.ts</code> adds an authenticated Edge Function
that writes <code>affective_state</code> span annotations. It always stores the local
<code>CODE</code> classifier output and can also store an LLM-refined annotation through
9Router.</li>
<li class=""><code>supabase/functions/run-chat/index.ts</code> now includes <code>trace_id</code>, <code>span_id</code>,
<code>otel_trace_id</code>, and <code>otel_span_id</code> on streaming error payloads when the error
span was persisted successfully.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="affect-model">Affect model<a href="https://exepert.com/blog/emotion-reactive-brain-canvas#affect-model" class="hash-link" aria-label="Direct link to Affect model" title="Direct link to Affect model" translate="no">​</a></h2>
<p>The local classifier scores:</p>
<ul>
<li class="">anger</li>
<li class="">fear</li>
<li class="">sadness</li>
<li class="">joy</li>
<li class="">disgust</li>
<li class="">surprise</li>
<li class="">curiosity</li>
<li class="">calm</li>
<li class="">distress</li>
<li class="">neutral</li>
</ul>
<p>Profanity is context-aware. For example, "fuck yeah" routes toward high-arousal
joy, while directed hostile profanity routes toward anger, distress, and higher
toxicity. The UI can look dramatic, but docs and metadata call the output
synthetic affect telemetry.</p>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="persistence">Persistence<a href="https://exepert.com/blog/emotion-reactive-brain-canvas#persistence" class="hash-link" aria-label="Direct link to Persistence" title="Direct link to Persistence" translate="no">​</a></h2>
<p><code>chat-affect</code> writes to existing <code>span_annotations</code> rather than adding a new
table:</p>
<ul>
<li class=""><code>name = "affective_state"</code></li>
<li class=""><code>annotator_kind = "CODE"</code> for local analysis</li>
<li class=""><code>annotator_kind = "LLM"</code> for optional refinement</li>
<li class=""><code>identifier = chat-turn:&lt;turn_id&gt;:phase:&lt;phase&gt;:source:&lt;source&gt;</code></li>
</ul>
<p>Metadata stores score vectors, region mix, color palette, classifier version,
selected chat model, affect model, phase, and text hash. Raw message text is not
duplicated in affect metadata.</p>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="verification">Verification<a href="https://exepert.com/blog/emotion-reactive-brain-canvas#verification" class="hash-link" aria-label="Direct link to Verification" title="Direct link to Verification" translate="no">​</a></h2>
<p>Checked locally with:</p>
<div class="language-bash codeBlockContainer_DNoR theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_V6CO"><pre tabindex="0" class="prism-code language-bash codeBlock_oNt_ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines__z_2"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> run typecheck</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">test</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> build</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--dir</span><span class="token plain"> docs-site build</span><br></div></code></pre></div></div>
<p>A browser smoke check opened Chat at <code>http://127.0.0.1:9001/</code>, verified the
Affective Field on desktop and narrow viewports, confirmed no Chat overflow,
and confirmed the WebGL brain canvas screenshot was nonblank.</p>]]></content>
        <author>
            <name>EXEPERT Team</name>
            <uri>https://github.com/exepert/exepert</uri>
        </author>
        <category label="UI" term="UI"/>
        <category label="Research" term="Research"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Settings shortcuts documented and empty clip timer fixed]]></title>
        <id>https://exepert.com/blog/settings-shortcuts-clip-timer</id>
        <link href="https://exepert.com/blog/settings-shortcuts-clip-timer"/>
        <updated>2026-06-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[EXEPERT now treats visualizer keyboard controls as documented commands instead]]></summary>
        <content type="html"><![CDATA[<p>EXEPERT now treats visualizer keyboard controls as documented commands instead
of hidden global behavior, and the right-panel clip preview no longer pretends a
video is loaded when the stimulus slot is empty.</p>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="what-changed">What changed<a href="https://exepert.com/blog/settings-shortcuts-clip-timer#what-changed" class="hash-link" aria-label="Direct link to What changed" title="Direct link to What changed" translate="no">​</a></h2>
<ul>
<li class=""><code>src/ui/keyboard-shortcuts.ts</code> adds a shared registry for visible keyboard
commands and a guard that decides whether global scene shortcuts should run.</li>
<li class=""><code>src/events.ts</code> now scopes the visualizer shortcuts so <code>Space</code>, <code>A</code>, and <code>S</code>
only affect the 3D scene when focus is outside inputs, buttons, chat, search,
Settings, diagnostics, prompt playground, and <code>lil-gui</code> controls.</li>
<li class=""><code>index.html</code> adds a <strong>Keyboard Shortcuts &amp; Commands</strong> card to Settings and
changes the initial clip preview from a fake <code>0:06</code> duration to an explicit
empty state.</li>
<li class=""><code>src/ui/workbench.ts</code> renders the Settings command list from the shortcut
registry so the visible docs match the active runtime behavior.</li>
<li class=""><code>src/ui/media-duration.ts</code> centralizes duration labels: no stimulus shows
<code>:</code>, images show <code>Still</code>, videos show their metadata duration, and unknown
loaded media shows <code>Loaded</code>.</li>
<li class=""><code>src/brain-ui.ts</code> now resets cleared media to an empty state, waits for video
metadata before showing a duration badge, and removes the clip-thumb badge
when no stimulus is loaded.</li>
<li class=""><code>css/app.css</code> adds the empty clip thumbnail style and responsive Settings
shortcut rows with compact <code>kbd</code> chips, scope labels, and wrapped
descriptions.</li>
<li class=""><code>src/__tests__/keyboard-shortcuts.test.ts</code> and
<code>src/__tests__/media-duration.test.ts</code> cover the shortcut guard and duration
label behavior.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="user-impact">User impact<a href="https://exepert.com/blog/settings-shortcuts-clip-timer#user-impact" class="hash-link" aria-label="Direct link to User impact" title="Direct link to User impact" translate="no">​</a></h2>
<ul>
<li class="">Pressing <code>A</code>, <code>S</code>, or <code>Space</code> while typing in Chat or interacting with
Settings no longer toggles visualizer helpers by accident.</li>
<li class="">Settings now lists the app's current global and contextual commands,
including Search, Diagnostics, Chat send, model picker navigation, and the
Floor Platform visualizer command.</li>
<li class="">Fresh app load and cleared clips show <strong>Duration :</strong> and a muted <strong>No clip</strong>
thumbnail instead of <code>0:06</code>.</li>
<li class="">Uploaded images show <strong>Still</strong> instead of a fake video duration; uploaded
videos show their real metadata duration once available.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="verification">Verification<a href="https://exepert.com/blog/settings-shortcuts-clip-timer#verification" class="hash-link" aria-label="Direct link to Verification" title="Direct link to Verification" translate="no">​</a></h2>
<p>Checked locally with:</p>
<div class="language-bash codeBlockContainer_DNoR theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_V6CO"><pre tabindex="0" class="prism-code language-bash codeBlock_oNt_ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines__z_2"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> typecheck</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> vitest run src/__tests__/keyboard-shortcuts.test.ts src/__tests__/media-duration.test.ts</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> build</span><br></div></code></pre></div></div>
<p>The browser smoke test opened <code>http://localhost:9001/</code>, confirmed the empty clip
state, confirmed the Settings list rendered nine command rows, and verified
<code>A</code>, <code>S</code>, and <code>Space</code> type normally inside the Chat input.</p>]]></content>
        <author>
            <name>EXEPERT Team</name>
            <uri>https://github.com/exepert/exepert</uri>
        </author>
        <category label="UI" term="UI"/>
        <category label="Bugfix" term="Bugfix"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Chat model menu polished and Trace Ingestion moved to Observability]]></title>
        <id>https://exepert.com/blog/chat-model-menu-observability-tab</id>
        <link href="https://exepert.com/blog/chat-model-menu-observability-tab"/>
        <updated>2026-06-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The Chat header now uses a dark, searchable model menu for all 9Router models,]]></summary>
        <content type="html"><![CDATA[<p>The Chat header now uses a dark, searchable model menu for all 9Router models,
and Trace Ingestion has moved out of the Chat area into the existing
Observability activity-bar page.</p>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="what-changed">What changed<a href="https://exepert.com/blog/chat-model-menu-observability-tab#what-changed" class="hash-link" aria-label="Direct link to What changed" title="Direct link to What changed" translate="no">​</a></h2>
<ul>
<li class=""><code>index.html</code> replaced the native <code>#brainModelSelect</code> with an app-owned model
picker: <code>#brainModelTrigger</code>, <code>#brainModelMenu</code>, <code>#brainModelSearch</code>, and
<code>#brainModelList</code>. It also added the <code>data-view="observability"</code> right-panel
view and the new <code>#observabilitySlot</code> mount target.</li>
<li class=""><code>src/brain-ui.ts</code> now renders the model list as a custom listbox while keeping
the existing <code>chatModels</code>, <code>selectedChatModel</code>, and
<code>exepert.brainChat.model.v1</code> persistence flow. The menu supports provider
grouping, search, variant badges, Escape, ArrowUp/ArrowDown, Enter,
outside-click dismissal, and disabled state while streaming.</li>
<li class=""><code>src/ui/observability.ts</code> now prefers <code>#observabilitySlot</code>, falls back to the
old <code>#obsSlot</code> only for older shells, and uses <code>exepert.obsCollapsed.v2</code> so the
activity-page panel defaults to expanded.</li>
<li class=""><code>css/app.css</code> adds the dark model popover, selected/active row states,
responsive badge behavior, Observability workbench view rules, and the wider
Trace Ingestion page layout.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="user-impact">User impact<a href="https://exepert.com/blog/chat-model-menu-observability-tab#user-impact" class="hash-link" aria-label="Direct link to User impact" title="Direct link to User impact" translate="no">​</a></h2>
<ul>
<li class="">Opening the Chat model picker no longer shows a white operating-system
dropdown in the dark UI.</li>
<li class="">Codex and Claude models from 9Router are searchable and grouped by provider.</li>
<li class="">Chat keeps its full vertical space because Trace Ingestion is no longer
mounted under the chat tile.</li>
<li class="">The Observability activity icon now opens a focused Trace Ingestion page with
the existing import, sample, trace viewer, live, project, Supabase status, and
summary controls.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="verification">Verification<a href="https://exepert.com/blog/chat-model-menu-observability-tab#verification" class="hash-link" aria-label="Direct link to Verification" title="Direct link to Verification" translate="no">​</a></h2>
<p>Checked locally with:</p>
<div class="language-bash codeBlockContainer_DNoR theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_V6CO"><pre tabindex="0" class="prism-code language-bash codeBlock_oNt_ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines__z_2"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> typecheck</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">pnpm</span><span class="token plain"> build</span><br></div></code></pre></div></div>
<p>The browser smoke test confirmed that the menu listed 25 models, filtering
worked for Claude models, keyboard selection worked, a chat request used the
selected <code>cx/gpt-5.4</code> model, and <code>#obs-panel</code> mounted inside
<code>#observabilitySlot</code> rather than the Chat area.</p>]]></content>
        <author>
            <name>EXEPERT Team</name>
            <uri>https://github.com/exepert/exepert</uri>
        </author>
        <category label="UI" term="UI"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Vercel build now bundles docs and the EXEPERT favicon]]></title>
        <id>https://exepert.com/blog/vercel-docs-favicon-bundle</id>
        <link href="https://exepert.com/blog/vercel-docs-favicon-bundle"/>
        <updated>2026-06-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The Vercel deployment path now builds the Rust/WASM app and the Docusaurus docs]]></summary>
        <content type="html"><![CDATA[<p>The Vercel deployment path now builds the Rust/WASM app and the Docusaurus docs
site together, then publishes the docs from the same origin as the app.</p>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="what-changed">What changed<a href="https://exepert.com/blog/vercel-docs-favicon-bundle#what-changed" class="hash-link" aria-label="Direct link to What changed" title="Direct link to What changed" translate="no">​</a></h2>
<ul>
<li class="">Added <code>scripts/vercel-build.sh</code> as the Vercel build command. It prepares Rust,
installs the <code>wasm32-unknown-unknown</code> target and <code>wasm-pack</code>, runs the Vite
production build, builds <code>docs-site/</code>, and merges the rendered docs into
<code>dist/</code>.</li>
<li class="">Added <code>scripts/copy-docs-build.mjs</code> to copy <code>docs-site/build</code> into <code>dist/</code>
while skipping the docs site's root <code>index.html</code>. The app stays mounted at
<code>/</code>, and Docusaurus pages are available under routes like
<code>/docs/getting-started/introduction/</code>.</li>
<li class="">Replaced hardcoded <code>localhost:3000</code> documentation links with environment-aware
links. Local app origins use <code>http://localhost:3000</code>; production uses the app's
deployed origin unless <code>VITE_DOCS_URL</code> is explicitly set.</li>
<li class="">Added EXEPERT favicon assets for the app and docs site:
<code>public/favicon.png</code>, <code>public/favicon-32.png</code>, <code>public/favicon-192.png</code>,
<code>public/apple-touch-icon.png</code>, and <code>docs-site/static/img/favicon.png</code>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="deployment-note">Deployment note<a href="https://exepert.com/blog/vercel-docs-favicon-bundle#deployment-note" class="hash-link" aria-label="Direct link to Deployment note" title="Direct link to Deployment note" translate="no">​</a></h2>
<p>Set Vercel's Build Command to:</p>
<div class="language-bash codeBlockContainer_DNoR theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_V6CO"><pre tabindex="0" class="prism-code language-bash codeBlock_oNt_ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines__z_2"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">bash</span><span class="token plain"> scripts/vercel-build.sh</span><br></div></code></pre></div></div>
<p>Leave the Output Directory as <code>dist</code>. Do not set <code>VITE_DOCS_URL</code> for the normal
Vercel deployment unless the docs are intentionally hosted somewhere else.</p>]]></content>
        <author>
            <name>EXEPERT Team</name>
            <uri>https://github.com/exepert/exepert</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="Bugfix" term="Bugfix"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Chat header decluttered + collapsible Trace Ingestion]]></title>
        <id>https://exepert.com/blog/declutter-chat-and-collapsible-obs</id>
        <link href="https://exepert.com/blog/declutter-chat-and-collapsible-obs"/>
        <updated>2026-06-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Two small left-region tweaks give the Neural Brain chat more breathing room:]]></summary>
        <content type="html"><![CDATA[<p>Two small left-region tweaks give the <strong>Neural Brain</strong> chat more breathing room:
a stripped-down chat header and a collapsible Trace Ingestion tile.</p>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="decluttered-chat-header">Decluttered chat header<a href="https://exepert.com/blog/declutter-chat-and-collapsible-obs#decluttered-chat-header" class="hash-link" aria-label="Direct link to Decluttered chat header" title="Direct link to Decluttered chat header" translate="no">​</a></h2>
<p>The chat tile header (<code>.brain-chat-header</code>) previously showed a "Neural Brain"
title plus a live-telemetry status pill (pulse dot + "Live telemetry" /
"Waiting for signal"). Both were removed; the header now holds only the close
(×) button, right-aligned.</p>
<ul>
<li class=""><code>index.html</code>: dropped <code>.brain-chat-title</code> and <code>.brain-chat-status-inline</code>
(which contained <code>#brainChatStatus</code>). The dialog now names itself with
<code>aria-label="Neural Brain chat"</code> instead of the dangling
<code>aria-labelledby="brainChatTitle"</code> (no such element ever existed).</li>
<li class=""><code>src/brain-ui.ts</code>: removed <code>brainChatStatus</code> from the cached-element list and
the per-tick <code>els.brainChatStatus.textContent = …</code> write, so nothing
references the deleted node.</li>
<li class=""><code>css/app.css</code>: <code>.brain-chat-header</code> is now <code>justify-content: flex-end</code>;
removed the unused <code>.brain-chat-title</code>, <code>.brain-chat-status-inline</code>,
<code>.pulse-dot</code>, and <code>@keyframes pulseDot</code> rules.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="collapsible-trace-ingestion-tile">Collapsible Trace Ingestion tile<a href="https://exepert.com/blog/declutter-chat-and-collapsible-obs#collapsible-trace-ingestion-tile" class="hash-link" aria-label="Direct link to Collapsible Trace Ingestion tile" title="Direct link to Collapsible Trace Ingestion tile" translate="no">​</a></h2>
<p>The observability panel (<code>#obs-panel</code>) gained a chevron toggle in its header
(<code>#obsCollapse</code>) that collapses the tile to just its header, hiding <code>.obs-body</code>.
Because the slot is <code>flex: 0 0 auto</code> and <code>#leftChat</code> is <code>flex: 1</code>, collapsing
the panel hands that vertical space straight to the chat.</p>
<ul>
<li class="">Defaults to <strong>collapsed</strong> so the chat gets maximum real estate out of the box.</li>
<li class="">The choice is persisted across reloads in <code>localStorage</code> under
<code>exepert.obsCollapsed</code>, wrapped in try/catch for private-mode / SSR safety.</li>
<li class=""><code>aria-expanded</code> + <code>aria-controls="obsBody"</code> keep the toggle accessible; the
chevron rotates 180° when expanded.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="help-link-now-opens-the-rendered-guide">Help link now opens the rendered guide<a href="https://exepert.com/blog/declutter-chat-and-collapsible-obs#help-link-now-opens-the-rendered-guide" class="hash-link" aria-label="Direct link to Help link now opens the rendered guide" title="Direct link to Help link now opens the rendered guide" translate="no">​</a></h2>
<p>The panel's <code>?</code> help link pointed at <code>Plans/guide-trace-ingestion.md</code>, which
Vite resolved to a raw, unrendered <code>.md</code> file on the app origin (a blank page).
It now opens the rendered Docusaurus guide page at
<code>/docs/guides/trace-ingestion</code>.</p>
<p>On local app origins, docs links default to <code>http://localhost:3000</code>, which
matches the separate Docusaurus dev server. In production, leave <code>VITE_DOCS_URL</code>
unset: the Vercel build bundles the rendered docs into the app's <code>dist/</code> folder,
so the link resolves on the deployed app origin under <code>/docs</code>.</p>
<p>See the <a class="" href="https://exepert.com/docs/ui-guide/overview#tile-structure">UI guide</a> for the chat tile
contract and the trace-ingestion tile notes.</p>]]></content>
        <author>
            <name>EXEPERT Team</name>
            <uri>https://github.com/exepert/exepert</uri>
        </author>
        <category label="UI" term="UI"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fix: Neural Brain chat tile rendered collapsed]]></title>
        <id>https://exepert.com/blog/fix-left-chat-nesting</id>
        <link href="https://exepert.com/blog/fix-left-chat-nesting"/>
        <updated>2026-06-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The inline Neural Brain chat tile (#leftChat) rendered with its messages]]></summary>
        <content type="html"><![CDATA[<p>The inline <strong>Neural Brain</strong> chat tile (<code>#leftChat</code>) rendered with its messages
squeezed into a ~30px-wide column and the input box overflowing the left panel.
The cause was malformed markup, not CSS.</p>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="symptom">Symptom<a href="https://exepert.com/blog/fix-left-chat-nesting#symptom" class="hash-link" aria-label="Direct link to Symptom" title="Direct link to Symptom" translate="no">​</a></h2>
<p>With the Chat tab active, the DOM collapsed into the chat header:</p>
<ul>
<li class=""><code>div.brain-chat-header &gt; div#brainMessages</code>: message column ~30px wide
instead of full width.</li>
<li class=""><code>div.brain-chat-header &gt; div.brain-chat-input</code>: input overflowing the panel
(333px wide inside a 329px panel).</li>
</ul>
<p><code>#leftChat</code> is a <code>flex-direction: column</code> tile and its five regions are meant to
be <strong>direct siblings</strong>. Because they were nested inside the header row instead,
they inherited <code>display: flex; align-items: center</code> and collapsed.</p>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="root-cause">Root cause<a href="https://exepert.com/blog/fix-left-chat-nesting#root-cause" class="hash-link" aria-label="Direct link to Root cause" title="Direct link to Root cause" translate="no">​</a></h2>
<p><code>index.html</code> had a duplicated opening <code>&lt;div class="brain-chat-header"&gt;</code> tag with
only one matching <code>&lt;/div&gt;</code>:</p>
<div class="language-html codeBlockContainer_DNoR theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_KpbH">index.html: before</div><div class="codeBlockContent_V6CO"><pre tabindex="0" class="prism-code language-html codeBlock_oNt_ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines__z_2"><div class="token-line" style="color:#F8F8F2"><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">brain-chat-header</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">brain-chat-header</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">strong</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">brain-chat-title</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">Neural Brain</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">strong</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  …status · close…</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">&lt;!-- chat-context, brainMessages, quick-prompts, brain-chat-input</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">     were now all trapped INSIDE the header --&gt;</span><br></div></code></pre></div></div>
<p>The unbalanced tag pushed <code>.chat-context</code>, <code>#brainMessages</code>, <code>.quick-prompts</code>,
and <code>.brain-chat-input</code> inside the header, so the column layout never applied.</p>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="fix">Fix<a href="https://exepert.com/blog/fix-left-chat-nesting#fix" class="hash-link" aria-label="Direct link to Fix" title="Direct link to Fix" translate="no">​</a></h2>
<p>Removed the duplicate opening tag so the header self-closes and the five regions
are siblings again:</p>
<div class="language-html codeBlockContainer_DNoR theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_KpbH">index.html: after</div><div class="codeBlockContent_V6CO"><pre tabindex="0" class="prism-code language-html codeBlock_oNt_ thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines__z_2"><div class="token-line" style="color:#F8F8F2"><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">brain-chat-header</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">strong</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">brain-chat-title</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">Neural Brain</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">strong</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">span</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">brain-chat-status-inline</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">…</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">span</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">button</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">brain-chat-close</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">closeBrainChat</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token entity named-entity">&amp;times;</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">button</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">chat-context</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">…</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">brain-chat-messages</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">id</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">brainMessages</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">…</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">quick-prompts</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">…</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag" style="color:rgb(255, 121, 198)"> </span><span class="token tag attr-name" style="color:rgb(241, 250, 140)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(248, 248, 242)">=</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag attr-value" style="color:rgb(255, 121, 198)">brain-chat-input</span><span class="token tag attr-value punctuation" style="color:rgb(248, 248, 242)">"</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain">…</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&lt;/</span><span class="token tag" style="color:rgb(255, 121, 198)">div</span><span class="token tag punctuation" style="color:rgb(248, 248, 242)">&gt;</span><br></div></code></pre></div></div>
<p>No CSS changed: the stylesheet (<code>.brain-chat-messages { flex: 1 }</code>, the column
container, the input row) was already correct. See the
<a class="" href="https://exepert.com/docs/ui-guide/overview#tile-structure">UI guide</a> for the sibling contract that
this tile depends on.</p>]]></content>
        <author>
            <name>EXEPERT Team</name>
            <uri>https://github.com/exepert/exepert</uri>
        </author>
        <category label="Bugfix" term="Bugfix"/>
        <category label="UI" term="UI"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[EXEPERT v0.2: docs are live]]></title>
        <id>https://exepert.com/blog/welcome</id>
        <link href="https://exepert.com/blog/welcome"/>
        <updated>2026-06-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The EXEPERT documentation site is live. EXEPERT is a brain research]]></summary>
        <content type="html"><![CDATA[<p>The EXEPERT documentation site is live. EXEPERT is a brain research
visualizer: a live neural-network simulation rendered over a brain mesh, with
research-style telemetry layered on top.</p>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="whats-documented">What's documented<a href="https://exepert.com/blog/welcome#whats-documented" class="hash-link" aria-label="Direct link to What's documented" title="Direct link to What's documented" translate="no">​</a></h2>
<p>This first pass covers the project as it actually runs today:</p>
<ul>
<li class=""><strong>Getting started</strong>: prerequisites (Node, pnpm, Rust + <code>wasm-pack</code>),
installation, the dev loop on port 9001, and production builds.</li>
<li class=""><strong>Architecture</strong>: the two-layer design where a Rust <code>World</code> compiled to
WebAssembly owns the state and the Three.js front end reads it through
zero-copy buffers.</li>
<li class=""><strong>Simulation core</strong>: neuron/axon generation, the struct-of-arrays signal
pool, the four cortical regions, stimulus injection, and the telemetry
contract.</li>
<li class=""><strong>Frontend modules</strong>, the <strong>diagnostics logger</strong>, a <strong>UI guide</strong>, and
<strong>development</strong> notes (testing, CI, the legacy reference pages).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_r1aM" id="a-note-on-the-rendering-path">A note on the rendering path<a href="https://exepert.com/blog/welcome#a-note-on-the-rendering-path" class="hash-link" aria-label="Direct link to A note on the rendering path" title="Direct link to A note on the rendering path" translate="no">​</a></h2>
<p>EXEPERT currently renders with a classic WebGL2 <code>WebGLRenderer</code> and GLSL
<code>ShaderMaterial</code> shaders, driven by a CPU simulation step (<code>step_cpu</code>). Earlier
design docs in the <code>Plans/</code> folder describe a WebGPU + TSL compute path that was
built and then reverted. The documentation describes the shipped code; treat
those plans as history.</p>
<p>Browse the <a class="" href="https://exepert.com/docs/getting-started/introduction">Introduction</a> to get started.</p>]]></content>
        <author>
            <name>EXEPERT Team</name>
            <uri>https://github.com/exepert/exepert</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="Architecture" term="Architecture"/>
    </entry>
</feed>