<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Wireless Bobulator</title><link>https://bobulator.net/</link><description>Recent content on Wireless Bobulator</description><generator>Hugo</generator><language>en</language><lastBuildDate>Mon, 20 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://bobulator.net/index.xml" rel="self" type="application/rss+xml"/><item><title>Riverside Athletic Center</title><link>https://bobulator.net/case-studies/riverside-athletic-center/</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><guid>https://bobulator.net/case-studies/riverside-athletic-center/</guid><description>&lt;p&gt;Riverside runs leagues, school tournaments, and weekend events across fourteen
courts built in three construction phases. Score controllers spoke two BLE
profiles, legacy horns used dry contacts, and the newest light bars expected
Wi-Fi multicast. The old integration treated each protocol as a separate
project.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Before the Bobulator, every tournament started with someone walking the
courts and chasing clocks. Now one reviewed rule leaves every court
together.”&lt;/p&gt;
&lt;p&gt;— &lt;strong&gt;Maya Chen&lt;/strong&gt;, Director of Operations, Riverside Athletic Center&lt;/p&gt;</description></item><item><title>15-minute quickstart</title><link>https://bobulator.net/docs/quickstart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bobulator.net/docs/quickstart/</guid><description>&lt;p&gt;This path starts with a factory-reset WB-1 and ends with a reviewed rule firing
across two zones. It does not require the cloud, an app store, or an account on
our infrastructure.&lt;/p&gt;
&lt;h2 id="0-what-you-need"&gt;0. What you need&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;one WB-1, its USB-C supply, and a laptop on the same network;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;jq&lt;/code&gt;, and &lt;a href="https://github.com/vi/websocat"&gt;&lt;code&gt;websocat&lt;/code&gt;&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;15 minutes and one input you can change safely.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use the fictional host below exactly until your unit announces a different
&lt;code&gt;.local&lt;/code&gt; name.&lt;/p&gt;</description></item><item><title>Sports Facilities</title><link>https://bobulator.net/use-cases/sports-facilities/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bobulator.net/use-cases/sports-facilities/</guid><description>&lt;p&gt;A competitive court is a real-time system that happens to have people in
it. The buzzer, the shot clock, the scoreboard, the floodlights, and the
PA all have to agree on the same instant — and right now they&amp;rsquo;re five
separate boxes from five vendors, wired by whoever had the ladder that
week. The Wireless Bobulator collapses them into one orchestration layer.&lt;/p&gt;
&lt;figure class="r9-figure" data-r9-figure="uc-court"&gt;
 &lt;svg viewBox="0 0 640 220" role="img" aria-labelledby="fig-uc-court-title" xmlns="http://www.w3.org/2000/svg"&gt;
 &lt;title id="fig-uc-court-title"&gt;Eight-court complex: court three's horn, scoreboard and lighting fire together; neighbouring courts unaffected&lt;/title&gt;
 &lt;style&gt;
 .fq-lbl { font: 600 10px 'JetBrains Mono', monospace; fill: #fbfaf6; letter-spacing: 0.06em; }
 .fq-sub { font: 500 9px 'JetBrains Mono', monospace; fill: rgba(251,250,246,0.55); }
 .fq-court { fill: rgba(251,250,246,0.04); stroke: rgba(251,250,246,0.25); }
 .fq-hot { fill: rgba(61,245,180,0.14); stroke: #3df5b4; stroke-width: 1.4; }
 .fq-num { font: 700 11px 'JetBrains Mono', monospace; fill: #3df5b4; }
 .fq-line { stroke: rgba(251,250,246,0.2); }
 &lt;/style&gt;
 &lt;rect class="fq-court" x="14" y="20" width="140" height="74" rx="3"/&gt;
 &lt;line class="fq-line" x1="84" y1="20" x2="84" y2="94"/&gt;
 &lt;circle cx="84" cy="57" r="12" fill="none" stroke="rgba(251,250,246,0.25)"/&gt;
 &lt;text class="fq-lbl" x="22" y="110"&gt;COURT 1&lt;/text&gt;
 &lt;rect class="fq-court" x="170" y="20" width="140" height="74" rx="3"/&gt;
 &lt;line class="fq-line" x1="240" y1="20" x2="240" y2="94"/&gt;
 &lt;circle cx="240" cy="57" r="12" fill="none" stroke="rgba(251,250,246,0.25)"/&gt;
 &lt;text class="fq-lbl" x="178" y="110"&gt;COURT 2&lt;/text&gt;
 &lt;rect class="fq-hot" x="326" y="20" width="140" height="74" rx="3"/&gt;
 &lt;line class="fq-line" x1="396" y1="20" x2="396" y2="94"/&gt;
 &lt;circle cx="396" cy="57" r="12" fill="none" stroke="rgba(251,250,246,0.25)"/&gt;
 &lt;text class="fq-lbl" x="334" y="110"&gt;COURT 3&lt;/text&gt;
 &lt;rect class="fq-court" x="482" y="20" width="140" height="74" rx="3"/&gt;
 &lt;line class="fq-line" x1="552" y1="20" x2="552" y2="94"/&gt;
 &lt;circle cx="552" cy="57" r="12" fill="none" stroke="rgba(251,250,246,0.25)"/&gt;
 &lt;text class="fq-lbl" x="490" y="110"&gt;COURT 4&lt;/text&gt;
 &lt;rect class="fq-court" x="14" y="126" width="140" height="60" rx="3"/&gt;
 &lt;text class="fq-lbl" x="22" y="200"&gt;COURT 5&lt;/text&gt;
 &lt;rect class="fq-court" x="170" y="126" width="140" height="60" rx="3"/&gt;
 &lt;text class="fq-lbl" x="178" y="200"&gt;COURT 6&lt;/text&gt;
 &lt;rect class="fq-court" x="326" y="126" width="140" height="60" rx="3"/&gt;
 &lt;text class="fq-lbl" x="334" y="200"&gt;COURT 7&lt;/text&gt;
 &lt;rect class="fq-court" x="482" y="126" width="140" height="60" rx="3"/&gt;
 &lt;text class="fq-lbl" x="490" y="200"&gt;COURT 8&lt;/text&gt;
 &lt;text class="fq-sub" x="14" y="12"&gt;court 3 · shot_clock == 0&lt;/text&gt;
 &lt;text class="fq-num" x="326" y="12"&gt;horn + board + lights: one chain, &amp;lt;8 ms&lt;/text&gt;
 &lt;text class="fq-sub" x="14" y="213"&gt;# neighbours unaffected — four games stay live&lt;/text&gt;
 &lt;/svg&gt;
 &lt;figcaption&gt;FIG. U4 · game night: court 3 ends its period; seven courts never notice&lt;/figcaption&gt;
 &lt;span class="r9-figure__fallback"&gt;Eight basketball courts under one WB-1: when court three's shot clock
 hits zero the horn, scoreboard and zoned LED lighting fire as one chain in under 8 milliseconds, while
 the four live games on neighbouring courts are untouched.&lt;/span&gt;
&lt;/figure&gt;

&lt;h2 id="the-scenario-a-multi-court-complex-on-game-night"&gt;The scenario: a multi-court complex on game night&lt;/h2&gt;
&lt;p&gt;Eight basketball courts, each with its own shot clock, scoreboard, and
zoned LED lighting, plus a shared PA. A game ends on Court 3 while four
other games are live. Here&amp;rsquo;s the chain the Bobulator runs in &lt;strong&gt;under 8 ms&lt;/strong&gt;
from buzzer to lights:&lt;/p&gt;</description></item><item><title>How we build</title><link>https://bobulator.net/company/how-we-build/</link><pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate><guid>https://bobulator.net/company/how-we-build/</guid><description>&lt;p&gt;This is not a values mural. These are choices that cost schedule, board area,
or convenience and survived anyway. Each principle points to the surface where
a visitor can check it.&lt;/p&gt;
&lt;h2 id="principle-1--decisions-happen-at-the-edge"&gt;Principle 1 — Decisions happen at the edge&lt;/h2&gt;
&lt;p&gt;A building should not lose its reflexes because an uplink is slow or a vendor&amp;rsquo;s
status page is red. The Cortex-M7 owns the deterministic path; cloud services
may analyze history, never hold the critical loop. The split is visible in the
&lt;a href="https://bobulator.net/architecture/"&gt;architecture&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Hartwell Controls — Cell 4</title><link>https://bobulator.net/case-studies/hartwell-controls/</link><pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate><guid>https://bobulator.net/case-studies/hartwell-controls/</guid><description>&lt;p&gt;Hartwell&amp;rsquo;s six-cell assembly line is a hostile place for radios and a worse
place for ambiguous faults. Four variable-frequency drives sit within twenty
metres of Cell 4. The previous gateway forwarded edge transitions to the cloud,
where retries and VFD noise produced an average of seventeen false stops a
week.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“The useful change was not another dashboard. It was proving why the line
stopped, in order, while the evidence was still warm.”&lt;/p&gt;</description></item><item><title>Rule DSL reference</title><link>https://bobulator.net/docs/rule-dsl/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bobulator.net/docs/rule-dsl/</guid><description>&lt;p&gt;Rules are versioned data evaluated once per 1 kHz engine cycle. A candidate
revision is parsed and validated before activation; an unknown key fails the
revision and leaves the active set untouched.&lt;/p&gt;
&lt;h2 id="grammar"&gt;Grammar&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rule := &amp;#34;rule:&amp;#34; id newline priority when then
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;priority := &amp;#34;priority:&amp;#34; integer[1..100]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;when := &amp;#34;when:&amp;#34; (&amp;#34;all:&amp;#34; condition+ | &amp;#34;any:&amp;#34; condition+)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;condition := input comparator value | builtin comparator value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;then := &amp;#34;then:&amp;#34; action+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;action := output set value | emit event | hold_until condition
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Canonical YAML shape:&lt;/p&gt;</description></item><item><title>Smart Buildings</title><link>https://bobulator.net/use-cases/smart-buildings/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bobulator.net/use-cases/smart-buildings/</guid><description>&lt;p&gt;The average commercial floor runs lighting, HVAC, access control, and
occupancy sensing as four independent systems that barely speak. Each has
its own gateway, its own app, its own idea of what &amp;ldquo;the third floor&amp;rdquo; means.
The Bobulator makes them one system with one rule set — and replaces a
closet full of single-protocol gateways with a single device per floor.&lt;/p&gt;
&lt;figure class="r9-figure" data-r9-figure="uc-floor"&gt;
 &lt;svg viewBox="0 0 640 220" role="img" aria-labelledby="fig-uc-floor-title" xmlns="http://www.w3.org/2000/svg"&gt;
 &lt;title id="fig-uc-floor-title"&gt;Office floor plan: four zones coordinated by one device instead of four gateways&lt;/title&gt;
 &lt;style&gt;
 .ff-lbl { font: 600 10px 'JetBrains Mono', monospace; fill: #fbfaf6; letter-spacing: 0.06em; }
 .ff-sub { font: 500 9px 'JetBrains Mono', monospace; fill: rgba(251,250,246,0.55); }
 .ff-zone { fill: rgba(251,250,246,0.04); stroke: rgba(251,250,246,0.25); }
 .ff-on { fill: rgba(61,245,180,0.12); stroke: #3df5b4; }
 .ff-hub { fill: #3df5b4; }
 .ff-link { stroke: #3df5b4; stroke-width: 1.1; fill: none; stroke-dasharray: 2 3; }
 &lt;/style&gt;
 &lt;rect class="ff-on" x="14" y="20" width="190" height="86" rx="3"/&gt;
 &lt;text class="ff-lbl" x="24" y="40"&gt;ZONE A · LOBBY&lt;/text&gt;
 &lt;text class="ff-sub" x="24" y="55"&gt;lights 100% · HVAC pre-cool&lt;/text&gt;
 &lt;text class="ff-sub" x="24" y="69"&gt;06:40 — awake ahead of badge-ins&lt;/text&gt;
 &lt;rect class="ff-zone" x="14" y="116" width="190" height="86" rx="3"/&gt;
 &lt;text class="ff-lbl" x="24" y="136"&gt;ZONE B · OPEN DESKS&lt;/text&gt;
 &lt;text class="ff-sub" x="24" y="151"&gt;waking with occupancy trend&lt;/text&gt;
 &lt;rect class="ff-zone" x="436" y="20" width="190" height="86" rx="3"/&gt;
 &lt;text class="ff-lbl" x="446" y="40"&gt;ZONE C · MEETING&lt;/text&gt;
 &lt;text class="ff-sub" x="446" y="55"&gt;dark until booked&lt;/text&gt;
 &lt;rect class="ff-zone" x="436" y="116" width="190" height="86" rx="3"/&gt;
 &lt;text class="ff-lbl" x="446" y="136"&gt;ZONE D · CORNER&lt;/text&gt;
 &lt;text class="ff-sub" x="446" y="151"&gt;empty — burning nothing&lt;/text&gt;
 &lt;circle class="ff-hub" cx="320" cy="111" r="9"/&gt;
 &lt;text class="ff-lbl" x="296" y="92"&gt;WB-1&lt;/text&gt;
 &lt;text class="ff-sub" x="258" y="136"&gt;one per floor — not a closet of gateways&lt;/text&gt;
 &lt;path class="ff-link" d="M311 105 L204 63"/&gt;
 &lt;path class="ff-link" d="M311 117 L204 159"/&gt;
 &lt;path class="ff-link" d="M329 105 L436 63"/&gt;
 &lt;path class="ff-link" d="M329 117 L436 159"/&gt;
 &lt;/svg&gt;
 &lt;figcaption&gt;FIG. U3 · a floor waking zone by zone — never all at once, never an empty corner&lt;/figcaption&gt;
 &lt;span class="r9-figure__fallback"&gt;An office floor split into four zones around one WB-1: the lobby is lit
 and pre-cooled ahead of the first badge-ins, open desks wake with the occupancy trend, meeting rooms stay
 dark until booked, and the empty corner burns nothing — lighting, HVAC, access and occupancy coordinated
 by a single device per floor instead of four separate gateways.&lt;/span&gt;
&lt;/figure&gt;

&lt;h2 id="the-scenario-an-office-floor-waking-up"&gt;The scenario: an office floor waking up&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s 06:40. The first badge taps the lobby reader. Across the next twenty
minutes the floor comes to life, zone by zone, ahead of the people — never
the whole floor at once, never an empty corner burning power:&lt;/p&gt;</description></item><item><title>Meridian Event Hall</title><link>https://bobulator.net/case-studies/meridian-event-hall/</link><pubDate>Wed, 15 Jul 2026 00:00:00 +0000</pubDate><guid>https://bobulator.net/case-studies/meridian-event-hall/</guid><description>&lt;p&gt;Meridian&amp;rsquo;s movable walls create three halls, one ballroom, or seven breakout
rooms. That flexibility used to produce brittle automation: the lighting scene
knew yesterday&amp;rsquo;s wall plan, the room scheduler knew today&amp;rsquo;s, and accessibility
strobes lived on a third controller.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“We stopped treating every room flip like a new integration. The state
follows the wall plan, and the show keeps its cues when the uplink does not.”&lt;/p&gt;
&lt;p&gt;— &lt;strong&gt;Nia Brooks&lt;/strong&gt;, Technical Operations Manager, Meridian Event Hall&lt;/p&gt;</description></item><item><title>Industrial Automation</title><link>https://bobulator.net/use-cases/industrial-automation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bobulator.net/use-cases/industrial-automation/</guid><description>&lt;p&gt;On a factory floor, &amp;ldquo;latency&amp;rdquo; stops being a UX metric and becomes a safety
property. A light curtain that halts a conveyor in 8 ms protects a hand; one
that takes 80 ms doesn&amp;rsquo;t. The Wireless Bobulator was built for exactly this
seam — fusing dozens of sensors, making the call deterministically, and
proving in the audit log that it made the right one.&lt;/p&gt;
&lt;figure class="r9-figure" data-r9-figure="uc-cell"&gt;
 &lt;svg viewBox="0 0 640 220" role="img" aria-labelledby="fig-uc-cell-title" xmlns="http://www.w3.org/2000/svg"&gt;
 &lt;title id="fig-uc-cell-title"&gt;Packaging cell plan: light curtain to conveyor halt in eight milliseconds&lt;/title&gt;
 &lt;style&gt;
 .fc-lbl { font: 600 10px 'JetBrains Mono', monospace; fill: #fbfaf6; letter-spacing: 0.06em; }
 .fc-sub { font: 500 9px 'JetBrains Mono', monospace; fill: rgba(251,250,246,0.55); }
 .fc-box { fill: rgba(251,250,246,0.05); stroke: rgba(251,250,246,0.25); }
 .fc-belt { fill: none; stroke: rgba(251,250,246,0.4); stroke-width: 2; }
 .fc-curtain { stroke: #f56b3d; stroke-width: 1.6; stroke-dasharray: 5 4; }
 .fc-halt { stroke: #3df5b4; stroke-width: 1.4; fill: none; }
 .fc-num { font: 700 11px 'JetBrains Mono', monospace; fill: #3df5b4; }
 .fc-warn { font: 700 11px 'JetBrains Mono', monospace; fill: #f56b3d; }
 &lt;/style&gt;
 &lt;path class="fc-belt" d="M20 120 H420"/&gt;
 &lt;circle cx="34" cy="128" r="6" fill="none" stroke="rgba(251,250,246,0.3)"/&gt;
 &lt;circle cx="76" cy="128" r="6" fill="none" stroke="rgba(251,250,246,0.3)"/&gt;
 &lt;circle cx="118" cy="128" r="6" fill="none" stroke="rgba(251,250,246,0.3)"/&gt;
 &lt;circle cx="160" cy="128" r="6" fill="none" stroke="rgba(251,250,246,0.3)"/&gt;
 &lt;circle cx="202" cy="128" r="6" fill="none" stroke="rgba(251,250,246,0.3)"/&gt;
 &lt;circle cx="244" cy="128" r="6" fill="none" stroke="rgba(251,250,246,0.3)"/&gt;
 &lt;circle cx="286" cy="128" r="6" fill="none" stroke="rgba(251,250,246,0.3)"/&gt;
 &lt;circle cx="328" cy="128" r="6" fill="none" stroke="rgba(251,250,246,0.3)"/&gt;
 &lt;circle cx="370" cy="128" r="6" fill="none" stroke="rgba(251,250,246,0.3)"/&gt;
 &lt;circle cx="412" cy="128" r="6" fill="none" stroke="rgba(251,250,246,0.3)"/&gt;
 &lt;text class="fc-lbl" x="20" y="108"&gt;CONVEYOR&lt;/text&gt;
 &lt;rect class="fc-box" x="150" y="30" width="110" height="46" rx="3"/&gt;
 &lt;text class="fc-lbl" x="160" y="49"&gt;ROBOT ARM&lt;/text&gt;
 &lt;text class="fc-sub" x="160" y="63"&gt;halt on breach&lt;/text&gt;
 &lt;rect class="fc-box" x="290" y="30" width="120" height="46" rx="3"/&gt;
 &lt;text class="fc-lbl" x="300" y="49"&gt;VIBRATION ×2&lt;/text&gt;
 &lt;text class="fc-sub" x="300" y="63"&gt;bearing trend&lt;/text&gt;
 &lt;line class="fc-curtain" x1="440" y1="86" x2="440" y2="160"/&gt;
 &lt;text class="fc-lbl" x="428" y="76"&gt;LIGHT CURTAIN · load point&lt;/text&gt;
 &lt;rect class="fc-box" x="480" y="96" width="140" height="52" rx="3"/&gt;
 &lt;text class="fc-lbl" x="490" y="115"&gt;WB-1&lt;/text&gt;
 &lt;text class="fc-sub" x="490" y="129"&gt;priority: 100 interlock&lt;/text&gt;
 &lt;path class="fc-halt" d="M480 122 C450 122 452 120 444 120"/&gt;
 &lt;text class="fc-num" x="470" y="176"&gt;breach → halt in 8 ms&lt;/text&gt;
 &lt;text class="fc-warn" x="20" y="196"&gt;at 80 ms the belt travels 10× farther before stopping&lt;/text&gt;
 &lt;text class="fc-sub" x="20" y="210"&gt;latency here is a safety property, not a UX metric&lt;/text&gt;
 &lt;/svg&gt;
 &lt;figcaption&gt;FIG. U2 · the cell that protects itself: curtain breach → conveyor halt, 8 ms&lt;/figcaption&gt;
 &lt;span class="r9-figure__fallback"&gt;A packaging cell: conveyor, robot arm, two vibration sensors, and a
 light curtain at the load point all report to one WB-1 running a priority-100 interlock rule. A curtain
 breach halts the conveyor in 8 milliseconds — at 80 milliseconds the belt would travel ten times farther
 before stopping.&lt;/span&gt;
&lt;/figure&gt;

&lt;h2 id="the-scenario-a-packaging-cell-that-protects-itself"&gt;The scenario: a packaging cell that protects itself&lt;/h2&gt;
&lt;p&gt;A single cell has a conveyor, a robotic arm, vibration sensors on two motor
bearings, a light curtain at the load point, and an operator HMI. Three
jobs run at once — predictive maintenance, a safety interlock, and the live
operator view — all from one Bobulator:&lt;/p&gt;</description></item><item><title>Events &amp; Venues</title><link>https://bobulator.net/use-cases/events-and-venues/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bobulator.net/use-cases/events-and-venues/</guid><description>&lt;p&gt;A festival is a fully-featured facility that has to exist for three days and
then vanish — with no conduit in the ground, no structured cabling, and a
load-in window measured in hours. That&amp;rsquo;s the worst possible environment for
wired control and the best possible case for a device that orchestrates
&lt;strong&gt;over the air&lt;/strong&gt;. The Wireless Bobulator drops in as the nervous system for
a pop-up venue, then packs back into a road case.&lt;/p&gt;</description></item><item><title>The Team</title><link>https://bobulator.net/company/team/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://bobulator.net/company/team/</guid><description>&lt;p&gt;Six people. One product. We are small on purpose, and every person below owns
a hard problem from the whiteboard to the customer who unboxes the puck.&lt;/p&gt;
&lt;div class="team-grid"&gt;
&lt;article class="team-card"&gt;
&lt;div class="team-card__portrait"&gt;&lt;svg viewBox="0 0 320 320" role="img" aria-label="Portrait of Priya" xmlns="http://www.w3.org/2000/svg" class="portrait-svg"&gt;&lt;rect width="320" height="320" rx="16" fill="#06120f"/&gt;&lt;line x1="80" y1="16" x2="80" y2="304" stroke="#3df5b4" stroke-opacity="0.06" stroke-width="1"/&gt;&lt;line x1="160" y1="16" x2="160" y2="304" stroke="#3df5b4" stroke-opacity="0.06" stroke-width="1"/&gt;&lt;line x1="240" y1="16" x2="240" y2="304" stroke="#3df5b4" stroke-opacity="0.06" stroke-width="1"/&gt;&lt;line x1="16" y1="160" x2="304" y2="160" stroke="#3df5b4" stroke-opacity="0.06" stroke-width="1"/&gt;&lt;path d="M60 300 Q160 210 260 300" fill="none" stroke="#3df5b4" stroke-width="3" stroke-opacity="0.85"/&gt;&lt;circle cx="160" cy="140" r="52" fill="#16c489" fill-opacity="0.12" stroke="#3df5b4" stroke-width="3"/&gt;&lt;path d="M140 188 L140 214 Q160 224 180 214 L180 188" fill="none" stroke="#3df5b4" stroke-width="3" stroke-opacity="0.7"/&gt;&lt;rect x="196" y="188" width="72" height="46" rx="5" fill="none" stroke="#3df5b4" stroke-width="2.5"/&gt;&lt;polyline points="202,222 212,222 218,200 226,232 234,208 242,222 262,222" fill="none" stroke="#3df5b4" stroke-width="2.5" stroke-linejoin="round"/&gt;&lt;circle cx="186" cy="196" r="5" fill="#3df5b4"/&gt;&lt;/svg&gt;&lt;/div&gt;
&lt;h3 class="team-card__name"&gt;Priya&lt;/h3&gt;
&lt;p class="team-card__role"&gt;Real-time firmware lead · ex-QuantumScape&lt;/p&gt;</description></item></channel></rss>