<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://mrblahhhh.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://mrblahhhh.github.io/" rel="alternate" type="text/html" hreflang="en" /><updated>2026-06-30T21:27:09-04:00</updated><id>https://mrblahhhh.github.io/feed.xml</id><title type="html">Garage &amp;amp; Code</title><subtitle>Automotive tuning, embedded telemetry, and custom fabrication.
</subtitle><author><name>mrblahhhh</name></author><entry><title type="html">R53 Mini ECU Cover — Printable Replacement</title><link href="https://mrblahhhh.github.io/car/tech/2026/06/30/r53-mini-ecu-cover.html" rel="alternate" type="text/html" title="R53 Mini ECU Cover — Printable Replacement" /><published>2026-06-30T00:00:00-04:00</published><updated>2026-06-30T00:00:00-04:00</updated><id>https://mrblahhhh.github.io/car/tech/2026/06/30/r53-mini-ecu-cover</id><content type="html" xml:base="https://mrblahhhh.github.io/car/tech/2026/06/30/r53-mini-ecu-cover.html"><![CDATA[<!--more-->

<p>I broke another ECU cover retainer clip while testing an ECU for a customer — another <strong>JCW VIN change and immobilizer delete</strong>. Same story every time: pull the cover, hear the snap, clip’s gone.</p>

<p>I sell plug-and-play unlocked <strong>R53 ECUs</strong> with VIN changed and <strong>S</strong>, <strong>JCW</strong>, or <strong>GP1</strong> software on <a href="https://www.facebook.com/share/1JFpRKxSGq/">Facebook Marketplace</a> and <strong>NAM</strong>. The STL is on Cults3D if you want to print your own.</p>

<p><strong>2001–2007 R53 Minis</strong> and <strong>R52 Cooper S</strong> models share a plastic ECU cover over the fuse box in the engine bay. The OEM clips are brittle — they snap off when you remove the cover for the first time, or the next time, or the time after that. Once the clips are gone the cover rattles and the wiring underneath is exposed.</p>

<h2 id="scanning-the-oem-cover">Scanning the OEM cover</h2>

<p>First time using my <strong>Pop 4</strong> scanner, and first time in <strong>blue laser</strong> mode.</p>

<p><img src="/assets/images/r53-ecu-cover/Screenshot%202026-06-30%20212118.png" alt="Pop 4 blue laser scan of OEM ECU cover" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>First scan with the Pop 4 — blue laser mode. Not a closed mesh, but enough to trace the cover.</em></p>

<p>Didn’t get a fully solid mesh — holes along the bottom edge and incomplete clip geometry — but it was good enough to sketch the replacement around in <strong>Fusion 360</strong>.</p>

<p><img src="/assets/images/r53-ecu-cover/Screenshot%202026-06-30%20211726.png" alt="Fusion 360 — mesh scan reference for ECU cover" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Imported mesh in Fusion — <code class="language-plaintext highlighter-rouge">r53_ecu_cover</code> and <code class="language-plaintext highlighter-rouge">r53_ecu_cover_Edited</code> bodies, solid <code class="language-plaintext highlighter-rouge">ecu-cover</code> sketched on top.</em></p>

<p>Printed in <strong>ASA</strong> and put the STL on Cults3D.</p>

<h2 id="the-part">The part</h2>

<p>One piece — <code class="language-plaintext highlighter-rouge">ecu-cover.stl</code> — with integrated snap clips on the sides and a clip on the bottom edge that hooks the fuse box housing. Same overall shape as the factory cover so it drops in without modifying the car.</p>

<p><img src="/assets/images/r53-ecu-cover/part-clips.jpg" alt="Printed ECU cover — clip side" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Clip geometry on the long edge — modeled to match the OEM latch points.</em></p>

<p><img src="/assets/images/r53-ecu-cover/part-top.jpg" alt="Printed ECU cover — top view" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Top surface and bottom-edge clip — same footprint as the factory cover.</em></p>

<h2 id="installed">Installed</h2>

<p>Snaps into the existing fuse box and ECU harness routing. No zip ties, no tape, no hoping the old broken clips still sort of work.</p>

<p><img src="/assets/images/r53-ecu-cover/installed.jpg" alt="ECU cover installed in the engine bay" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Replacement cover clipped in — red intake plumbing and fuse box unchanged.</em></p>

<p><img src="/assets/images/r53-ecu-cover/installed-close.jpg" alt="ECU cover installed — close-up" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Bottom-edge clip engaged on the fuse box lip.</em></p>

<h2 id="how-to-print-it">How to print it</h2>

<div><div class="extensions extensions--video">
  <iframe src="https://www.youtube.com/embed/4SF-1RPapOk?rel=0&amp;showinfo=0" frameborder="0" scrolling="no" allowfullscreen=""></iframe>
</div>
</div>

<p>Print <strong>standing up</strong> so the clip layers run the full length of each tab — much stronger than printing flat where the clips are built from short layer bonds. <strong>ASA</strong> works and handles under-hood heat; <strong>nylon</strong> would be better for clip flex and long-term fatigue if you have it.</p>

<table>
  <thead>
    <tr>
      <th>Setting</th>
      <th>Notes</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Material</strong></td>
      <td>ASA (what I used) or nylon (preferred for the clips)</td>
    </tr>
    <tr>
      <td><strong>Orientation</strong></td>
      <td>Vertical — clips along Z, not across layer lines</td>
    </tr>
    <tr>
      <td><strong>Size</strong></td>
      <td>62 × 54 × 218 mm — check your bed before you slice</td>
    </tr>
  </tbody>
</table>

<h2 id="download-the-stl">Download the STL</h2>

<table>
  <thead>
    <tr>
      <th>Item</th>
      <th>Details</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>File</strong></td>
      <td><code class="language-plaintext highlighter-rouge">ecu-cover.stl</code></td>
    </tr>
    <tr>
      <td><strong>Fits</strong></td>
      <td>2001–2007 <strong>R53</strong> Mini, <strong>R52</strong> Cooper S</td>
    </tr>
    <tr>
      <td><strong>Price</strong></td>
      <td><strong>$5</strong> on Cults3D</td>
    </tr>
  </tbody>
</table>

<blockquote>
  <p><strong>Download:</strong> <a href="https://cults3d.com/en/3d-model/tool/r53-mini-ecu-cover">R53 mini ECU cover on Cults3D</a> — $5.</p>
</blockquote>]]></content><author><name>mrblahhhh</name></author><category term="car" /><category term="tech" /><category term="3d-printing" /><category term="fusion-360" /><category term="mini" /><category term="r53" /><category term="r52" /><category term="ecu" /><category term="cults3d" /><summary type="html"><![CDATA[Printable ECU cover for R53 Mini and R52 Cooper S]]></summary></entry><entry><title type="html">AN-12 ORB Oil Funnel — Two-Part Swivel Fill</title><link href="https://mrblahhhh.github.io/car/tech/2026/06/27/an-12-orb-oil-funnel.html" rel="alternate" type="text/html" title="AN-12 ORB Oil Funnel — Two-Part Swivel Fill" /><published>2026-06-27T00:00:00-04:00</published><updated>2026-06-27T00:00:00-04:00</updated><id>https://mrblahhhh.github.io/car/tech/2026/06/27/an-12-orb-oil-funnel</id><content type="html" xml:base="https://mrblahhhh.github.io/car/tech/2026/06/27/an-12-orb-oil-funnel.html"><![CDATA[<!--more-->

<p>The <a href="/car/2025/10/15/135i-l92-track-build.html">135i track build</a> runs an <strong>LS BTR valve cover</strong> with an <strong>AN-12 ORB</strong> oil fill port. Off-the-shelf funnels for that fitting basically do not exist — and the port sits at an angle in a crowded bay, so a straight drop-in funnel is awkward to use anyway.</p>

<p>I mocked up a two-piece funnel in <strong>Fusion 360</strong>, printed it in ASA, and it works well enough that I put the STLs up on Cults3D.</p>

<h2 id="two-parts-one-swivel-joint">Two parts, one swivel joint</h2>

<p>The funnel splits into a <strong>basin</strong> (<code class="language-plaintext highlighter-rouge">oilfillfunnel.stl</code>) and a <strong>threaded base</strong> (<code class="language-plaintext highlighter-rouge">oilfillbase.stl</code>). They lock together with a small interference lip — enough to stay assembled, not enough to spin on their own. You can hold the funnel still while you thread the base into the port, or spin the base independently once it is seated.</p>

<p><img src="/assets/images/an-12-orb-oil-funnel/funnel-cad.png" alt="Fusion 360 — AN-12 ORB oil funnel CAD" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Wide basin, offset neck, and a separate AN-12 ORB base — modeled around the LS BTR valve cover fill location.</em></p>

<h2 id="snap-fit-joint">Snap-fit joint</h2>

<p>The retention geometry is a simple groove-and-lip with chamfered lead-ins. Press the two halves together until they snap; the lip rides in the groove with a small clearance gap so the parts rotate freely but cannot pull apart vertically.</p>

<p><img src="/assets/images/an-12-orb-oil-funnel/joint-section.png" alt="Cross-section — swivel joint between funnel and base" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Section view of the interference lip — captive joint with enough clearance for independent rotation.</em></p>

<h2 id="in-the-engine-bay">In the engine bay</h2>

<p>Printed in black ASA and installed on the red valve cover — the offset neck keeps the wide opening level even though the port is angled. No more balancing a cut bottle or a generic funnel that does not seal to ORB threads.</p>

<p><img src="/assets/images/an-12-orb-oil-funnel/installed.jpg" alt="AN-12 ORB oil funnel installed on the LS BTR valve cover" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Two-piece funnel on the fill port — basin stays put while the base threads in.</em></p>

<h2 id="download-the-stls">Download the STLs</h2>

<p>The files are <strong>free or pay what you want</strong> on Cults3D:</p>

<table>
  <thead>
    <tr>
      <th>Part</th>
      <th>File</th>
      <th>Approx. size</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Funnel basin</strong></td>
      <td><code class="language-plaintext highlighter-rouge">oilfillfunnel.stl</code></td>
      <td>109 × 141 × 105 mm</td>
    </tr>
    <tr>
      <td><strong>AN-12 ORB base</strong></td>
      <td><code class="language-plaintext highlighter-rouge">oilfillbase.stl</code></td>
      <td>40 × 42 × 40 mm</td>
    </tr>
  </tbody>
</table>

<blockquote>
  <p><strong>Download:</strong> <a href="https://cults3d.com/en/3d-model/tool/an-12-orb-oil-funnel">AN-12 ORB oil funnel on Cults3D</a> — free / open priced.</p>
</blockquote>

<h3 id="print-settings">Print settings</h3>

<ul>
  <li><strong>ASA</strong> recommended — holds up to under-hood heat better than PLA or PETG</li>
  <li>Two separate prints, then snap the base into the funnel neck</li>
  <li>No supports needed on either part if you orient the base threads down and the funnel basin opening up</li>
</ul>

<p>Designed for the <strong>LS BTR valve cover</strong> AN-12 ORB fill. If your port location or angle differs, measure before you commit filament.</p>]]></content><author><name>mrblahhhh</name></author><category term="car" /><category term="tech" /><category term="3d-printing" /><category term="fusion-360" /><category term="an-12" /><category term="orb" /><category term="ls3" /><category term="oil-change" /><category term="cults3d" /><summary type="html"><![CDATA[Two-piece AN-12 ORB funnel for the LS BTR valve cover]]></summary></entry><entry><title type="html">TPMS Monitor — My Own Android App for Cheap BLE Sensors</title><link href="https://mrblahhhh.github.io/car/tech/2026/06/21/tpms-monitor-app.html" rel="alternate" type="text/html" title="TPMS Monitor — My Own Android App for Cheap BLE Sensors" /><published>2026-06-21T00:00:00-04:00</published><updated>2026-06-21T00:00:00-04:00</updated><id>https://mrblahhhh.github.io/car/tech/2026/06/21/tpms-monitor-app</id><content type="html" xml:base="https://mrblahhhh.github.io/car/tech/2026/06/21/tpms-monitor-app.html"><![CDATA[<!--more-->

<p>Cheap <strong>BLE valve-stem TPMS sensors</strong> are everywhere now — Tesla-style 401 MHz units that broadcast pressure, temperature, and battery over Bluetooth Low Energy. They wake on motion or a few PSI of change, so you get live readings without a dedicated receiver box.</p>

<p>The hardware is fine. The <strong>bundled Android apps are not</strong> — clunky UIs, questionable permissions, and the usual “Chinese app store” feel. I already decode these sensors in <a href="/car/tech/2026/06/18/trackday-pyrometer-helper.html">TrackDayPyrometerHelper</a> for cold/hot PSI on the 135i, but I wanted a <strong>dedicated monitor</strong> that runs in the background, alerts on pressure drops, and handles the layouts I actually drive: a car, a truck, an RV with dually rear wheels, and trailers with different wheel counts.</p>

<p><strong>TPMS Monitor</strong> is that app. Source is private for now; Play Store release is on the someday list.</p>

<h2 id="live-dashboard">Live dashboard</h2>

<p>Pick a vehicle from the garage and the main screen shows every bound corner — pressure, temperature, battery, and how fresh the reading is.</p>

<p><img src="/assets/images/tpms-monitor-app/monitor-jcw-live.jpg" alt="TPMS Monitor live view — JCW, four corners" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>JCW profile — 33.9 / 34.7 / 34.5 / 34.0 psi, all live. Color dots match the paint marks on each valve stem.</em></p>

<p>Each tire card goes green when pressure is in range, and the header shows how many sensors are bound vs. expected for the current layout.</p>

<h2 id="scan-and-bind">Scan and bind</h2>

<p>Pairing is a three-step flow so you are not guessing which MAC address is which tire:</p>

<ol>
  <li><strong>Mark the sensor</strong> — dab the valve stem with a paint color (red, blue, green, etc.).</li>
  <li><strong>Pick the wheel position</strong> — FL, FR, RL, RR, or the RV/trailer slots below.</li>
  <li><strong>Tap the sensor</strong> — hold the phone near the marked sensor while it is broadcasting. Wake it with motion or roughly 4 psi of pressure change if it is asleep.</li>
</ol>

<p><img src="/assets/images/tpms-monitor-app/scan-and-bind.jpg" alt="Scan and bind — color tag, wheel position, nearby sensor list" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Only unbound sensors show up. Bound ones stay out of the list so you can pair one tire at a time without confusion.</em></p>

<p><strong>Broad scan</strong> is there when the filtered list is empty — useful if a sensor is broadcasting under a name the narrow filter missed.</p>

<h2 id="garage--vehicle-and-trailer-profiles">Garage — vehicle and trailer profiles</h2>

<p>Bindings are saved <strong>per tow vehicle and per trailer</strong>, not as one giant list. Swap the F-150 for the RV on Monday and the same carhauler trailer keeps its four sensor assignments.</p>

<p><img src="/assets/images/tpms-monitor-app/garage.jpg" alt="Garage — tow vehicle and trailer picker" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>JCW (car, 4 sensors), wini (RV, 6 sensors), f150 (truck, 4 sensors) — plus trailers from none up to a 4-wheel carhauler or 2-wheel ATV hauler.</em></p>

<p>Each profile stores its own layout type and sensor map. Add, rename, or delete vehicles and trailers from here.</p>

<h2 id="rv-plus-trailer-layout">RV plus trailer layout</h2>

<p>The RV profile is a <strong>6-wheel motorhome</strong> — front axle plus dually rear (FL, FR, RL, RR, inner left, inner right) — with a <strong>4-wheel trailer</strong> hung off the back. Ten positions total on one screen.</p>

<p><img src="/assets/images/tpms-monitor-app/monitor-rv-carhauler.jpg" alt="TPMS Monitor — wini RV plus carhauler trailer, 10 positions" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>RV-FL through RV-IR up top, T-FL through T-RR on the trailer. Positions show “Unassigned” until each sensor is bound.</em></p>

<h2 id="truck-plus-small-trailer">Truck plus small trailer</h2>

<p>Not every haul is ten wheels. The F-150 plus ATV trailer profile is <strong>four truck corners and two trailer tires</strong> — same app, different layout template.</p>

<p><img src="/assets/images/tpms-monitor-app/monitor-f150-atvtrailer.jpg" alt="TPMS Monitor — F-150 plus ATV trailer, six positions" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>TK-FL/FR/RL/RR for the truck, T-FL/FR for the trailer.</em></p>

<h2 id="background-monitoring-and-alerts">Background monitoring and alerts</h2>

<p>The part that makes this worth running daily: a <strong>foreground service</strong> keeps scanning while you drive. A persistent notification shows summary status — all tires OK, or which corner dropped.</p>

<p><img src="/assets/images/tpms-monitor-app/notification-ok.jpg" alt="Background notification — all tires OK" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Silent ongoing notification — no sound unless something is wrong.</em></p>

<p>Expand it for per-corner PSI and temperature without opening the app.</p>

<p><img src="/assets/images/tpms-monitor-app/notification-detail.jpg" alt="Expanded notification — FL/FR/RL/RR PSI and temp" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>34 / 35 / 35 / 34 psi at a glance from the shade.</em></p>

<p>When pressure falls below your threshold, the notification escalates — you get a <strong>PSI drop alert</strong> even if the app is not in the foreground. That is the whole point of TPMS on a tow rig.</p>

<h2 id="what-is-not-tested-yet">What is not tested yet</h2>

<p>Layout and binding logic are done. <strong>Sensor range on a long RV-plus-trailer haul is not.</strong> BLE is short-range by design; the phone sits in the cab while trailer sensors can be 30+ feet back. I have verified binding and live reads in the driveway and on short trips. A full highway tow with all ten sensors reporting reliably is still on the to-do list — repeater placement, phone mount location, and whether the sensors rebroadcast often enough at highway speed all need real miles.</p>

<h2 id="what-is-next">What is next</h2>

<p>Play Store submission when the range question is answered and I am happy with alert tuning. Until then it is my daily driver for anything with color-tagged BLE sensors on the stems.</p>

<p>If you are running the same cheap sensors, the paint-and-position bind flow is the workflow — mark one, assign one, move on. No MAC-address spreadsheet required.</p>]]></content><author><name>mrblahhhh</name></author><category term="car" /><category term="tech" /><category term="android" /><category term="tpms" /><category term="ble" /><category term="rv" /><category term="trailer" /><category term="tire-pressure" /><summary type="html"><![CDATA[BLE TPMS monitor for cars, RVs, and trailers]]></summary></entry><entry><title type="html">Pip-Boy Check Engine Display — Haltech CAN Warnings</title><link href="https://mrblahhhh.github.io/car/tech/2026/06/19/pipboy-check-engine-display.html" rel="alternate" type="text/html" title="Pip-Boy Check Engine Display — Haltech CAN Warnings" /><published>2026-06-19T00:00:00-04:00</published><updated>2026-06-19T00:00:00-04:00</updated><id>https://mrblahhhh.github.io/car/tech/2026/06/19/pipboy-check-engine-display</id><content type="html" xml:base="https://mrblahhhh.github.io/car/tech/2026/06/19/pipboy-check-engine-display.html"><![CDATA[<!--more-->

<p>The <a href="/car/2025/10/15/135i-l92-track-build.html">135i track build</a> runs a <strong>Haltech Rebel LS</strong> with the factory BMW dash still in place — speed, temps, and the usual cluster stuff all work fine. What it does <strong>not</strong> show are Haltech-side warnings: high oil temp, low oil pressure, and other fault states the ECU knows about but never forwards to the BMW cluster.</p>

<p>This is a small <strong>Pip-Boy-style display</strong> mounted in the driver-side vent as a <strong>second readout</strong>, fed from the Haltech CAN bus over WiFi. Same car, two dashes — factory cluster for driving, Pip-Boy for the stuff Haltech won’t put on the BMW screen.</p>

<h2 id="how-it-works">How it works</h2>

<p>A <strong>RaceCapture ESP32-CAN-X2</strong> (<a href="https://wiki.autosportlabs.com/ESP32-CAN-X2">Autosport Labs</a>) sits on the Haltech CAN network, reads the channels I care about, and sends updates wirelessly to the display module. The screen is a separate <strong>Waveshare ESP32-S3-Touch-AMOLED-2.41</strong> — 2.41″ square AMOLED at <strong>600×450</strong>, capacitive touch, WiFi/BLE — running a Pip-Boy boot sequence and alert UI.</p>

<p>On track, if oil pressure or oil temp crosses a limit, the display flashes the warning immediately.</p>

<div><div class="extensions extensions--video">
  <iframe src="https://www.youtube.com/embed/4_iXQk7Ijtc?rel=0&amp;showinfo=0" frameborder="0" scrolling="no" allowfullscreen=""></iframe>
</div>
</div>

<p>Boot sequence and normal operation — Pip-Boy aesthetic, real Haltech data behind it.</p>

<h2 id="display-hardware">Display hardware</h2>

<p><img src="/assets/images/pipboy-check-engine-display/pipboy-installed.jpg" alt="Pip-Boy display mounted in the driver-side vent" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Waveshare 2.41″ AMOLED in the vent gauge pod — USB power routed through the mount.</em></p>

<p>The dev board is a <a href="https://www.waveshare.com/esp32-s3-touch-amoled-2.41.htm">Waveshare ESP32-S3-Touch-AMOLED-2.41</a>: RM690B0 AMOLED over QSPI, FT6336 capacitive touch on I2C, QMI8658 IMU and RTC on board. USB-C for power and programming.</p>

<h2 id="dash-mount">Dash mount</h2>

<p><img src="/assets/images/pipboy-check-engine-display/pipboy-cad.png" alt="Fusion 360 — vent gauge pod bracket" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Bracket modeled around the 2.41″ AMOLED module — replaces the vent louver section and keeps airflow slots.</em></p>

<p><img src="/assets/images/pipboy-check-engine-display/gauge-pod-bracket.jpg" alt="Gauge pod bracket — printed part" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Square gauge pod bracket — snap-fit geometry for the E82 driver-side vent.</em></p>

<p><img src="/assets/images/pipboy-check-engine-display/ram-mount-adapter.jpg" alt="RAM mount adapter for the vent opening" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Separate RAM-ball adapter if you want an adjustable arm instead of the fixed pod.</em></p>

<p><img src="/assets/images/pipboy-check-engine-display/vent-gauge-installed.jpg" alt="Vent mount with gauge pod and RAM base installed" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Both mounts fit the E82/128i/135i driver-side top vent. RAM ball for phone or secondary gauge; pod bracket for the Pip-Boy screen.</em></p>

<p>Two 3D-printed parts, both PETG or ASA minimum for in-car heat:</p>

<table>
  <thead>
    <tr>
      <th>Part</th>
      <th>Link</th>
      <th>Price</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>E82 vent gauge square gauge pod bracket</strong> (LCD mount)</td>
      <td><a href="https://cults3d.com/en/3d-model/tool/e82-vent-gauge-square-gauge-pod-bracket">Cults3D — free STL</a></td>
      <td>Free</td>
    </tr>
    <tr>
      <td><strong>E82 driver left-side vent RAM mount</strong></td>
      <td><a href="https://cults3d.com/en/3d-model/various/e82-drivers-left-side-vent-ram-mount">Cults3D — RAM ball adapter</a></td>
      <td>Paid</td>
    </tr>
  </tbody>
</table>

<p>The free bracket is sized for the Waveshare 2.41″ AMOLED module. The RAM mount is a vent insert with a standard RAM ball — useful on its own or combined with the pod above it.</p>

<h2 id="parts-list">Parts list</h2>

<table>
  <thead>
    <tr>
      <th>Item</th>
      <th>Notes</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><a href="https://www.waveshare.com/esp32-s3-touch-amoled-2.41.htm">Waveshare ESP32-S3-Touch-AMOLED-2.41</a></td>
      <td>2.41″ AMOLED 600×450, touch, ESP32-S3</td>
    </tr>
    <tr>
      <td><strong>RaceCapture ESP32-CAN-X2</strong></td>
      <td><a href="https://wiki.autosportlabs.com/ESP32-CAN-X2">Autosport Labs ESP32-CAN-X2</a> — dual CAN, automotive power, WiFi/BLE</td>
    </tr>
    <tr>
      <td><strong>Haltech Rebel LS</strong></td>
      <td>Already in the 135i — CAN source for oil pressure, oil temp, fault flags</td>
    </tr>
    <tr>
      <td><strong>E82 vent gauge pod bracket</strong></td>
      <td><a href="https://cults3d.com/en/3d-model/tool/e82-vent-gauge-square-gauge-pod-bracket">Free STL on Cults3D</a> — print PETG/ASA</td>
    </tr>
    <tr>
      <td><strong>E82 vent RAM mount</strong> (optional)</td>
      <td><a href="https://cults3d.com/en/3d-model/various/e82-drivers-left-side-vent-ram-mount">Cults3D listing</a></td>
    </tr>
    <tr>
      <td><strong>RAM arm + phone holder</strong> (optional)</td>
      <td>Standard 1″ RAM components if using the RAM vent mount</td>
    </tr>
  </tbody>
</table>]]></content><author><name>mrblahhhh</name></author><category term="car" /><category term="tech" /><category term="esp32" /><category term="can-bus" /><category term="haltech" /><category term="bmw" /><category term="135i" /><category term="e82" /><category term="pip-boy" /><category term="telemetry" /><summary type="html"><![CDATA[Pip-Boy display for Haltech CAN warnings]]></summary></entry><entry><title type="html">BMW prop/driveshaft seal replacement</title><link href="https://mrblahhhh.github.io/car/2026/06/18/bmw-prop-driveshaft-seal-replacement.html" rel="alternate" type="text/html" title="BMW prop/driveshaft seal replacement" /><published>2026-06-18T00:00:00-04:00</published><updated>2026-06-18T00:00:00-04:00</updated><id>https://mrblahhhh.github.io/car/2026/06/18/bmw-prop-driveshaft-seal-replacement</id><content type="html" xml:base="https://mrblahhhh.github.io/car/2026/06/18/bmw-prop-driveshaft-seal-replacement.html"><![CDATA[<p>The rear CV seal on a BMW prop shaft is normally not serviceable. I found a replacement seal — BMW part <strong>11553453300</strong> — and ordered a few from <a href="https://shem-group.com">Shem Group</a> in Ukraine.</p>

<!--more-->

<h2 id="removing-the-old-seal">Removing the old seal</h2>

<p>The old seal is press-clamped onto the shaft. I pick every bit of the old rubber out of the lip before installing the new one. Clean the lip thoroughly, then clean it again.</p>

<div><div class="extensions extensions--video">
  <iframe src="https://www.youtube.com/embed/8pNaqQrz-OY?rel=0&amp;showinfo=0" frameborder="0" scrolling="no" allowfullscreen=""></iframe>
</div>
</div>

<h2 id="repacking-the-joint">Repacking the joint</h2>

<p>I repack the CV joint with a syringe before installing the seal:</p>

<ol>
  <li>Grease inside the joint first</li>
  <li>A dab on each ball on the outside</li>
</ol>

<p>Don’t overdo the grease — if it gets on the glue surface the seal won’t bond.</p>

<p><img src="/assets/images/driveshaft-cv/grease-syringe.jpg" alt="Grease syringe for repacking the CV joint" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Grease loaded in a syringe for repacking.</em></p>

<p><img src="/assets/images/driveshaft-cv/cv-joint-repack.jpg" alt="CV joint repacked with grease on each ball" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Grease inside the joint and a dab on each ball.</em></p>

<h2 id="the-new-seal">The new seal</h2>

<p><img src="/assets/images/driveshaft-cv/new-seal.jpg" alt="New rear CV seal, part 11553453300" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Replacement seal from Shem Group, part 11553453300.</em></p>

<p>Shem Group sells the seal under part number <strong>11553453300</strong>. It includes a ring for the inner lip — I remove that ring and use <strong>safety wire</strong> instead, because with the ring in place it’s too hard to get the seal on fast enough once the adhesive is applied.</p>

<h2 id="installing-the-seal">Installing the seal</h2>

<p class="text-center"><img src="/assets/images/driveshaft-cv/3m-adhesive.jpg" alt="3M 08008 weatherstrip adhesive" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>3M Black Super Weatherstrip and Gasket Adhesive (08008).</em></p>

<p>I use <strong>3M Black Super Weatherstrip and Gasket Adhesive (08008)</strong>. It dries fast — have everything ready before you open the tube.</p>

<p><strong>Order of operations:</strong></p>

<ol>
  <li>Clean and grease the joint (no adhesive yet)</li>
  <li>Run a bead of 08008 on the shaft outer lip, inner lip, and the seal outer lip</li>
  <li>Press the seal on quickly — it will resist the whole way</li>
</ol>

<p>If it leaks, it’ll be at the outer lip. That joint is somewhat serviceable if you’re careful on the next attempt.</p>]]></content><author><name>mrblahhhh</name></author><category term="car" /><category term="bmw" /><category term="driveshaft" /><category term="cv-joint" /><category term="maintenance" /><category term="11553453300" /><summary type="html"><![CDATA[BMW prop shaft rear CV seal replacement]]></summary></entry><entry><title type="html">My First Android App, TrackDayPyrometerHelper</title><link href="https://mrblahhhh.github.io/car/tech/2026/06/18/trackday-pyrometer-helper.html" rel="alternate" type="text/html" title="My First Android App, TrackDayPyrometerHelper" /><published>2026-06-18T00:00:00-04:00</published><updated>2026-06-18T00:00:00-04:00</updated><id>https://mrblahhhh.github.io/car/tech/2026/06/18/trackday-pyrometer-helper</id><content type="html" xml:base="https://mrblahhhh.github.io/car/tech/2026/06/18/trackday-pyrometer-helper.html"><![CDATA[<!--more-->

<p><strong>TrackDayPyrometerHelper</strong> is my first Android app. The main focus is tire temps — a custom BLE pyrometer to replace my broken gun, synced into the app for OUT/MID/IN sessions on all four corners. It grew from there into TPMS for hot and cold pressures, and ProForm corner scales over Bluetooth. Everything lives in one place for the LS3 135i.</p>

<p>The Android source is private for now; I’m aiming for the Play Store next month. The ESP32 pyrometer firmware is public: <a href="https://github.com/MrBlahhhh/PyroTC">MrBlahhhh/PyroTC</a>.</p>

<h2 id="tire-temps">Tire temps</h2>

<p>While a basic tire pressure gauge just tells you how much air is inside, a pyrometer — a highly accurate temperature probe — shows you the physical stress the tire is actually experiencing. By measuring the heat at three distinct points across the tire’s surface (the inside edge, the middle, and the outside edge), a driver can see exactly how the car is planting its weight onto the pavement. Those three temperature readings act like a diagnostic report, revealing flaws in how the car’s suspension is adjusted that even an experienced driver might not feel from behind the wheel.</p>

<p><img src="/assets/images/trackday-pyrometer-helper/tiretemp-home.jpg" alt="Tire temp sessions list" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Sessions are timestamped and tagged by compound — slick, R-Comp, RE-71RS, etc.</em></p>

<p><img src="/assets/images/trackday-pyrometer-helper/tiretemp-reading.jpg" alt="Tire temp entry with pyrometer and PSI sync" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>OUT / MID / IN per corner, plus sync from the pyrometer and from TPMS for cold and hot PSI.</em></p>

<p>The <strong>TIRES</strong> tab records <strong>OUT</strong>, <strong>MID</strong>, and <strong>IN</strong> for all four corners. Static camber per corner feeds setup notes. Aim for the lowest hot pressure that doesn’t roll the outer shoulder — outer-edge heat or graining is the rollover signal. Take temps right after coming in; they fade fast.</p>

<p><strong>SYNC FROM PYROMETER</strong> pulls live readings from PyroTC over BLE — tap record on the gun, hit sync in the app, and cells fill.</p>

<h2 id="pyrotc--custom-ble-pyrometer">PyroTC — custom BLE pyrometer</h2>

<p>My old tire pyrometer died. Rather than buy another standalone gun, I built <strong>PyroTC</strong>: a handheld K-type reader on the Waveshare round ESP32-S3 touch LCD, in a 3D-printed enclosure.</p>

<p><img src="/assets/images/trackday-pyrometer-helper/pyro-cad.png" alt="PyroTC enclosure CAD exploded view" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Head, handle, faceplate, and screw-on battery cap — designed around the round display module and an 18650 in the grip.</em></p>

<p>The device owns all twelve readings (four corners × OUT/MID/IN). On the <strong>SELECT</strong> screen you pick LF/RF/LR/RR; on <strong>RECORD</strong> you see live probe temp, the three slots, and big <strong>RECORD</strong> / <strong>CLEAR</strong> / <strong>BACK</strong> buttons. A short beep confirms a capture — no hardwired trigger.</p>

<div><div class="extensions extensions--video">
  <iframe src="https://www.youtube.com/embed/VCvQOdNqaJc?rel=0&amp;showinfo=0" frameborder="0" scrolling="no" allowfullscreen=""></iframe>
</div>
</div>

<p>Tap a corner, record OUT → MID → IN, hit <strong>SYNC FROM PYROMETER</strong> in the app — cells fill live over BLE.</p>

<p>Firmware is a single <code class="language-plaintext highlighter-rouge">main.cpp</code> (~450 lines), PlatformIO, <strong>NimBLE-Arduino 2.x</strong>, and a <strong>MAX6675</strong> on software SPI. Full source: <a href="https://github.com/MrBlahhhh/PyroTC">github.com/MrBlahhhh/PyroTC</a>.</p>

<blockquote>
  <p><strong>Download the enclosure:</strong> <a href="/cad/pyrotc/tiretester.stl"><code class="language-plaintext highlighter-rouge">tiretester.stl</code></a> (body), <a href="/cad/pyrotc/cover.stl"><code class="language-plaintext highlighter-rouge">cover.stl</code></a> (faceplate), <a href="/cad/pyrotc/cap.stl"><code class="language-plaintext highlighter-rouge">cap.stl</code></a> (battery cap) — in <a href="/cad/pyrotc/"><code class="language-plaintext highlighter-rouge">/cad/pyrotc/</code></a>.</p>
</blockquote>

<h3 id="ble-contract">BLE contract</h3>

<p>The app (<code class="language-plaintext highlighter-rouge">PyroSync.kt</code>) and firmware share a fixed GATT layout — change either side without updating the other and things break silently.</p>

<table>
  <thead>
    <tr>
      <th>Item</th>
      <th>Value</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Device name</td>
      <td><code class="language-plaintext highlighter-rouge">PyroTC</code></td>
    </tr>
    <tr>
      <td>Service</td>
      <td><code class="language-plaintext highlighter-rouge">a1b20001-7a9c-4b1e-9d3a-2f6c8e5d4c30</code></td>
    </tr>
    <tr>
      <td><strong>TEMP</strong> <code class="language-plaintext highlighter-rouge">…0002</code></td>
      <td>READ + NOTIFY ~4 Hz — <code class="language-plaintext highlighter-rouge">float32</code> LE °C + <code class="language-plaintext highlighter-rouge">uint8</code> fault (live probe)</td>
    </tr>
    <tr>
      <td><strong>STATE</strong> <code class="language-plaintext highlighter-rouge">…0003</code></td>
      <td>READ + NOTIFY on change — 24 bytes, 12 × <code class="language-plaintext highlighter-rouge">int16</code> LE deci-°C in order LF[O,M,I], RF[O,M,I], LR[O,M,I], RR[O,M,I]; <code class="language-plaintext highlighter-rouge">-32768</code> = empty</td>
    </tr>
  </tbody>
</table>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash">pio run <span class="nt">-t</span> upload
pio device monitor <span class="nt">-b</span> 115200</code></pre></figure>

<h2 id="tpms-sensors">TPMS sensors</h2>

<p><img src="/assets/images/trackday-pyrometer-helper/tpms-sensors.jpg" alt="TPMS sensor mapping by color tag" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Tag each sensor by valve-stem color, map colors to corners. Rotate tires — re-point colors, not MAC addresses.</em></p>

<p>TPMS decoding lives in the app, not the pyrometer firmware. Scan finds nearby sensors (they only broadcast while rolling or just stopped), you tag each one with a color on the valve stem, then assign colors to LF/RF/LR/RR. Saved <strong>sets</strong> cover different wheel/tire combos.</p>

<p><strong>SYNC COLD PSI</strong> and <strong>SYNC HOT PSI</strong> on the tire temp screen fill pressures from mapped sensors. Ambient temperature comes from a one-shot Open-Meteo lookup so the app can flag cold tires.</p>

<h2 id="proform-corner-scales">ProForm corner scales</h2>

<p>What started as a side project — I wanted live weights from my <strong>ProForm wireless scale pads</strong> on my phone instead of juggling the factory display. Reverse-engineering the BLE protocol got the four pads waking, mapping to FL/FR/RL/RR, and streaming live weights.</p>

<p><img src="/assets/images/trackday-pyrometer-helper/livescales-setup.jpg" alt="ProForm scales wake and map screen" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Wake each pad over BLE, map to a corner, calibrate, then zero with the car off the pads.</em></p>

<p><img src="/assets/images/trackday-pyrometer-helper/livescales.jpg" alt="Live corner weights from four scale pads" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Live mode streams all four corners. Manual entry works when you only have corner numbers from somewhere else.</em></p>

<p>The scales screen handles the painful parts: waking sleepy pads by MAC, per-corner calibration, and <strong>ZERO ALL</strong> with the car off the pads.</p>

<h3 id="corner-balance">Corner balance</h3>

<p><img src="/assets/images/trackday-pyrometer-helper/crossweight.jpg" alt="Cross weight with manual corner entry" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Manual entry still gives you cross weight, diagonal totals, and whether to adjust perches.</em></p>

<p><img src="/assets/images/trackday-pyrometer-helper/crossweight-bottom.jpg" alt="Cross weight recommendation with perch guidance" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Example: 44.83% cross on 2,904 lb — move 150 lb onto the RF+LR diagonal to hit 50%.</em></p>

<p>The <strong>BALANCE</strong> tab shows FL/FR/RL/RR weights, total, front/rear and left/right split, and cross weight against a target (I run <strong>50.00%</strong>). When cross is off, the app tells you how much weight to move onto the RF+LR diagonal and whether to raise RF/LR or lower LF/RR. Optional perch-turn calibration converts pounds into turns.</p>

<h2 id="parts-list">Parts list</h2>

<h3 id="pyrotc-pyrometer">PyroTC pyrometer</h3>

<table>
  <thead>
    <tr>
      <th>Part</th>
      <th>Notes</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Waveshare <strong>ESP32-S3-Touch-LCD-1.28</strong></td>
      <td>GC9A01 round LCD + CST816S touch; display, touch, IMU, and battery ADC are onboard</td>
    </tr>
    <tr>
      <td><strong>MAX6675</strong> breakout</td>
      <td>K-type, software SPI — SCK GPIO15, SDO GPIO17, CS GPIO18</td>
    </tr>
    <tr>
      <td>K-type <strong>tire pyrometer probe</strong></td>
      <td>Yellow +, red − on the terminal block</td>
    </tr>
    <tr>
      <td><strong>Active buzzer</strong></td>
      <td>GPIO33 → (+), (−) → GND (<code class="language-plaintext highlighter-rouge">BUZZER_ACTIVE 1</code> in firmware)</td>
    </tr>
    <tr>
      <td><strong>18650</strong> Li-ion cell</td>
      <td>Fits the printed handle; screw-on cap with contact spring at the base</td>
    </tr>
    <tr>
      <td><strong>Rocker power switch</strong></td>
      <td>Panel mount in the head — <a href="https://www.amazon.com/dp/B07S2QJKTX">Amazon B07S2QJKTX</a></td>
    </tr>
    <tr>
      <td><strong>USB</strong> charge/data port</td>
      <td>CH343P USB-UART on the Waveshare board</td>
    </tr>
    <tr>
      <td><strong>3D-printed enclosure</strong></td>
      <td><a href="/cad/pyrotc/tiretester.stl"><code class="language-plaintext highlighter-rouge">tiretester.stl</code></a> (body), <a href="/cad/pyrotc/cover.stl"><code class="language-plaintext highlighter-rouge">cover.stl</code></a> (faceplate), <a href="/cad/pyrotc/cap.stl"><code class="language-plaintext highlighter-rouge">cap.stl</code></a> (battery cap)</td>
    </tr>
  </tbody>
</table>

<p>Optional: 3.7 V LiPo on the board’s MX1.25 connector instead of the 18650 grip pack.</p>

<h3 id="tpms">TPMS</h3>

<ul>
  <li><strong>BLE TPMS sensors</strong> (Tesla-style 401 MHz valve-stem units) — one per corner, color-tagged on the stem</li>
</ul>

<h3 id="proform-corner-scales-existing-hardware">ProForm corner scales (existing hardware)</h3>

<ul>
  <li><strong>ProForm wireless corner weight scale pads</strong> (4) — BLE, wake-on-connect</li>
</ul>

<h3 id="phone">Phone</h3>

<ul>
  <li>Android device with BLE — app targets Play Store release soon</li>
</ul>

<h2 id="whats-next">What’s next</h2>

<p>Play Store submission is the immediate goal. The pyrometer hardware and firmware are done enough for track weekends; the app already replaced my paper log for cross, temps, and pressures on the 135i.</p>

<p>If you build a PyroTC, start with <a href="https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp">nRF Connect</a>: confirm <strong>TEMP</strong> tracks the probe and <strong>STATE</strong> updates when you tap RECORD. Flip <code class="language-plaintext highlighter-rouge">TOUCH_FLIP_X</code> / <code class="language-plaintext highlighter-rouge">TOUCH_FLIP_Y</code> in firmware if corner buttons land wrong on your panel.</p>]]></content><author><name>mrblahhhh</name></author><category term="car" /><category term="tech" /><category term="android" /><category term="esp32" /><category term="pyrometer" /><category term="proform" /><category term="tpms" /><category term="ble" /><category term="track-day" /><summary type="html"><![CDATA[Track-day app with pyrometer, TPMS, and corner scales]]></summary></entry><entry><title type="html">2009 BMW 135i — L92 Track Build</title><link href="https://mrblahhhh.github.io/car/2025/10/15/135i-l92-track-build.html" rel="alternate" type="text/html" title="2009 BMW 135i — L92 Track Build" /><published>2025-10-15T10:00:00-04:00</published><updated>2025-10-15T10:00:00-04:00</updated><id>https://mrblahhhh.github.io/car/2025/10/15/135i-l92-track-build</id><content type="html" xml:base="https://mrblahhhh.github.io/car/2025/10/15/135i-l92-track-build.html"><![CDATA[<!--more-->

<h2 id="drivetrain">Drivetrain</h2>

<p>Factory six-speed manual, kept behind the L92 with an <strong>MC Motorsport Stage 1</strong> adapter — <strong>S1-LS-HGU-952</strong> (Chevrolet LS to BMW M57N HGU / N54, 240 mm / 9.45″). LSE9X engine and transmission mounts for the swap.</p>

<h2 id="engine">Engine</h2>

<p><img src="/assets/images/135i/engine-photo.jpg" alt="L92 engine bay with 3D-printed ducting" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>L92 in the 135i bay — heat-wrapped intake, 3D-printed ducting, catch can plumbing.</em></p>

<p>The N54 had spun a rod bearing. It had index 12 injectors, a baffled oil pan, and a full refresh roughly a year before failure — factory turbos, rod bearings, gaskets, coil packs, spark plugs, and a new power steering cooler. Full records came with the car.</p>

<p>The L92 has a DOD &amp; VVT delete, Summit 8711R3 cam, LS3 intake, and LSE9X long-tube headers. <strong>LS7 lifters and trays</strong>, <strong>BTR trunnion upgrade</strong>, <strong>BTR valve covers</strong>, <strong>ARP</strong> hardware throughout. Valve cover breathers run <strong>-12AN</strong> vent lines to a <strong>3D-printed catch can</strong>. <strong>Continental flex-fuel sensor</strong> on the Haltech Rebel LS ECU, with an ESP32 CAN bus translator for BMW chassis integration.</p>

<h2 id="cooling-and-oiling">Cooling and oiling</h2>

<p>Remote oil cooler with a <strong>Bosch</strong> combined temp/oil-pressure sensor. The dual parallel oil coolers were replaced with a single E90 M3 oil cooler and 3D-printed ducting routed for the LS. <strong>Moroso 3 qt oil accumulator</strong>, Haltech-controlled — pre-oils and dumps back into the pan when oil pressure drops below <strong>25 psi</strong>. Exhaust: 3″ to 2.5″ to single 3.5″ to Berk street muffler.</p>

<h2 id="interior">Interior</h2>

<p>Mostly gutted, sunroof deleted. Factory dash retained. An ESP32-powered Pip-Boy warning light handles alerts. Antigravity lithium battery.</p>

<h2 id="suspension">Suspension</h2>

<p>MCS 2WNR two-way adjustable dampers (2022). 650 lb/in front and 900 lb/in rear Hypercoil springs. Front: 60 mm helper springs, Torrington bearings, Turner upper control arms and bushings, Vorshlag camber plates, M3 strut tower braces, upgraded sway bar links. Rear: Ground Control articulating spring perches, M3 subframe bushings, M3 camber link conversion, adjustable camber and toe arms, UUC anti-roll bar.</p>

<h2 id="wheels-and-safety">Wheels and safety</h2>

<p>Clenched fender flares clearing up to 10.5” wheels. Square setup:  18×10 with 275 tires. Autopower bolt-in roll bar, omp halo seats.</p>

<p><img src="/assets/images/135i/overhead-photo.jpg" alt="On track leading a pack" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Vented hood, splitter, and flares at work.</em></p>

<p><img src="/assets/images/135i/side-pan-photo.jpg" alt="Side pan at speed, #78" class="border rounded" style="max-width:420px;display:block;margin:1.25rem auto;" />
<em>Several weekends in post-swap.</em></p>

<h2 id="on-track">On track</h2>

<p><strong>2:02.9</strong> at VIR (Virginia International Raceway).</p>

<div><div class="extensions extensions--video">
  <iframe src="https://www.youtube.com/embed/Nnp8NiAkXNw?rel=0&amp;showinfo=0" frameborder="0" scrolling="no" allowfullscreen=""></iframe>
</div>
</div>]]></content><author><name>mrblahhhh</name></author><category term="car" /><category term="bmw" /><category term="135i" /><category term="ls-swap" /><category term="track" /><category term="l92" /><category term="haltech" /><summary type="html"><![CDATA[E82 135i L92 track car build]]></summary></entry></feed>