<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Joestar</title>
    <description>The latest articles on Forem by Joestar (@joestarsan).</description>
    <link>https://forem.com/joestarsan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3844941%2F98539d54-1481-4ec1-b576-550a27b02fcf.jpeg</url>
      <title>Forem: Joestar</title>
      <link>https://forem.com/joestarsan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/joestarsan"/>
    <language>en</language>
    <item>
      <title>OBJECTION! This App Puts Your Trades on Trial Using Blockchain Data</title>
      <dc:creator>Joestar</dc:creator>
      <pubDate>Thu, 26 Mar 2026 16:28:16 +0000</pubDate>
      <link>https://forem.com/joestarsan/objection-this-app-puts-your-trades-on-trial-using-blockchain-data-1fh</link>
      <guid>https://forem.com/joestarsan/objection-this-app-puts-your-trades-on-trial-using-blockchain-data-1fh</guid>
      <description>&lt;p&gt;Ever made a trade and wondered if it was actually smart or just lucky? I built &lt;strong&gt;The Market Witness&lt;/strong&gt;, a pixel-art courtroom where your real trades get judged. A shark prosecutor, a defense attorney, and a judge argue over your trade using live blockchain oracle data as evidence. Think Ace Attorney, but for your portfolio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://market-witness.vercel.app" rel="noopener noreferrer"&gt;market-witness.vercel.app&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/Joestarsan/market-witness" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Here's what it looks like
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fykl071tp4s8yegfqwlff.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fykl071tp4s8yegfqwlff.png" alt="Trade input form with asset selector, BUY/SELL buttons, and date pickers"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wvfsqirkexaveywvemt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wvfsqirkexaveywvemt.jpg" alt="Courtroom trial in progress with Chop the Shark prosecuting and Planck defending"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxd0ld354dfe4lhmq1oyg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxd0ld354dfe4lhmq1oyg.png" alt="Verdict screen with Judge PIRB delivering guilty ruling and guilt score bar"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Wait, What's Oracle Data?
&lt;/h2&gt;

&lt;p&gt;If you're not into crypto, no worries. Quick version.&lt;/p&gt;

&lt;p&gt;Blockchains can't check the price of Bitcoin, gold, or Tesla stock on their own. They're isolated. &lt;strong&gt;Oracles&lt;/strong&gt; are services that feed real-world data into blockchains: prices, timestamps, confidence levels.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pyth.network" rel="noopener noreferrer"&gt;Pyth Network&lt;/a&gt; is one of the biggest oracle networks out there. It covers 500+ assets (crypto, forex, equities, commodities) with sub-second updates. But here's what makes it interesting for devs: Pyth doesn't just give you a price number. Each update includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Price&lt;/strong&gt; - the actual asset price&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidence interval&lt;/strong&gt; - how certain the market is (tight = stable, wide = volatile)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EMA price&lt;/strong&gt; - exponential moving average, showing the trend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EMA confidence&lt;/strong&gt; - trend stability over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On top of that, &lt;strong&gt;Pyth Benchmarks&lt;/strong&gt; gives you historical OHLC (open-high-low-close) candle data.&lt;/p&gt;

&lt;p&gt;Most projects just slap these numbers into a dashboard. I wanted to turn them into a game mechanic.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Concept: Your Trade Goes to Court
&lt;/h2&gt;

&lt;p&gt;You enter a real trade. Pick any asset from 500+ Pyth feeds, choose BUY or SELL, set the dates. Then the trial begins.&lt;/p&gt;

&lt;p&gt;Three original pixel-art characters run the courtroom:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chop the Shark&lt;/strong&gt; (Prosecutor) - a ruthless red shark out to prove your trade was reckless&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Planck&lt;/strong&gt; (Defense Attorney) - calm green guy who argues your trade was well-reasoned&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Judge PIRB&lt;/strong&gt; - the purple judge who delivers the final verdict&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each round of the trial is tied to a specific Pyth data point. The prosecution and defense don't throw generic insults. They argue with &lt;em&gt;real numbers from your actual trade&lt;/em&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  How Pyth Data Becomes Courtroom Evidence
&lt;/h2&gt;

&lt;p&gt;This is the core of the project. Each Pyth data field maps to a distinct piece of evidence:&lt;/p&gt;
&lt;h3&gt;
  
  
  Round 1: Price &amp;amp; P&amp;amp;L
&lt;/h3&gt;

&lt;p&gt;The most basic question: did you make money?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pricePctChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;exitPrice&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;entryPrice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;entryPrice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prosecution uses a loss as proof of guilt. Defense argues a profit shows good judgment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Round 2: Confidence Interval
&lt;/h3&gt;

&lt;p&gt;This is where it gets fun. Pyth's &lt;code&gt;conf&lt;/code&gt; field tells you how uncertain the market was when you entered.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;confPctOfPrice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;conf&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wide confidence (say, &amp;gt;0.5% of price)? The prosecutor goes: &lt;em&gt;"The market couldn't even agree on a price, and you still hit Buy?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Tight confidence? Defense fires back: &lt;em&gt;"Tight spread, clean entry. This trader knew what they were doing."&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Round 3: EMA Divergence
&lt;/h3&gt;

&lt;p&gt;Were you trading with or against the trend?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emaDivergence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;emaPrice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;emaPrice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Positive divergence on a BUY means price is above EMA, you bought into momentum. Negative means you went against the trend. The prosecution loves counter-trend entries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Round 4: EMA Confidence Ratio
&lt;/h3&gt;

&lt;p&gt;The sneakiest metric. Comparing EMA confidence to spot confidence shows if market stability is getting better or worse.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emaConfRatio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;emaConf&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ratio &amp;gt; 1 means the EMA is less certain than spot. Conditions are deteriorating. The prosecution uses this to argue you ignored warning signs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Round 5: Benchmarks Volatility
&lt;/h3&gt;

&lt;p&gt;Using Pyth Benchmarks API, I fetch 5-minute OHLC candles in a 2-hour window around the trade:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;volatilityPct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;periodHigh&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;periodLow&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;periodOpen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;High volatility + counter-trend entry = the prosecutor's dream argument.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 14&lt;/strong&gt; (App Router, TypeScript)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS v4&lt;/strong&gt; with Pyth brand colors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framer Motion&lt;/strong&gt; for character animations, verdict stamps, slide-ins&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Audio API&lt;/strong&gt; for all sound effects (synthesized in code, zero audio files)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenRouter API&lt;/strong&gt; for server-side AI dialogue generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pyth Hermes API&lt;/strong&gt; for real-time and historical price feeds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pyth Pro Benchmarks&lt;/strong&gt; for historical OHLC data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; for deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sound Design Without Audio Files
&lt;/h3&gt;

&lt;p&gt;Every sound in the game is generated with the Web Audio API. No MP3s, no WAVs, nothing imported.&lt;/p&gt;

&lt;p&gt;The gavel hit is a 150Hz square wave mixed with a noise burst. The "OBJECTION!" sting is a 600Hz sawtooth layered with an 800Hz square wave and 100Hz bass. The victory fanfare is a C-E-G-C arpeggio on triangle oscillators.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Gavel sound: square wave + noise burst&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;osc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createOscillator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;osc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;square&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;osc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;frequency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// mixed with white noise for the "crack"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tiny bundle, full control over timing.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Dialogue With Real Data
&lt;/h3&gt;

&lt;p&gt;Each trial is unique. AI generates dialogue based on actual evidence. The prompt includes all Pyth metrics, and the AI returns structured JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;rounds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prosecution&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The confidence interval was 0.8% of price. The market was screaming uncertainty and you still pulled the trigger!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;evidence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Pyth Price Feeds&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;+-0.8%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Confidence Interval&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;...],&lt;/span&gt;
  &lt;span class="nx"&gt;verdict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GUILTY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;72&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If AI is unavailable, a deterministic mock trial kicks in. Same UI, same evidence cards, just calculated from heuristics instead. The app always works.&lt;/p&gt;

&lt;h3&gt;
  
  
  Server-Side API Protection
&lt;/h3&gt;

&lt;p&gt;All API keys live behind Next.js API routes. The frontend never touches them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/api/trial      -&amp;gt; proxies to OpenRouter (AI generation)
/api/benchmark  -&amp;gt; proxies to Pyth Pro Benchmarks (OHLC data)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Data Flow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User enters trade (asset, BUY/SELL, dates)
         |
Fetch Pyth data in parallel:
  |-- Hermes API -&amp;gt; historical prices at open/close
  |-- Hermes API -&amp;gt; current price
  |-- /api/benchmark -&amp;gt; Pyth Pro OHLC candles
         |
Calculate 6 evidence metrics
         |
Generate trial (AI or mock fallback)
         |
Interactive courtroom with character animations
         |
Verdict + guilt score (0-100)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Oracle data is way richer than most people think.&lt;/strong&gt; Before this project, I assumed price feeds were just... prices. The confidence interval and EMA fields turned out to be the most interesting parts. They tell a story about market conditions that raw price alone can't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gamification makes data click.&lt;/strong&gt; Nobody wants to stare at a table of oracle metrics. But when a pixel-art shark screams "OBJECTION!" and waves your confidence interval in your face, suddenly everyone gets what it means.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build the fallback first.&lt;/strong&gt; The mock trial system gave me a working demo from day one, even while I was still iterating on AI prompts. Both paths share the same TypeScript interface, so the UI doesn't know or care which one generated the trial.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;Pick any trade you've made (or make one up) and see if the courtroom finds you guilty:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://market-witness.vercel.app" rel="noopener noreferrer"&gt;market-witness.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Also posted about this on &lt;a href="https://x.com/Joestar_sann/status/2034656358730011085" rel="noopener noreferrer"&gt;X/Twitter&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Built for the &lt;a href="https://dev-forum.pyth.network" rel="noopener noreferrer"&gt;Pyth Playground Community Hackathon&lt;/a&gt;. Source code on &lt;a href="https://github.com/Joestarsan/market-witness" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; under Apache 2.0.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pro tip: try a meme coin trade during a crash. Chop the Shark will have a field day.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
