<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://joemozden.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://joemozden.com/" rel="alternate" type="text/html" /><updated>2026-07-06T15:49:24+00:00</updated><id>https://joemozden.com/feed.xml</id><title type="html">Joe Mozden</title><subtitle>Personal website of Joe Mozden</subtitle><entry><title type="html">Project Diary: Lanternfall</title><link href="https://joemozden.com/tech/2026/07/05/lanternfall.html" rel="alternate" type="text/html" title="Project Diary: Lanternfall" /><published>2026-07-05T17:00:00+00:00</published><updated>2026-07-05T17:00:00+00:00</updated><id>https://joemozden.com/tech/2026/07/05/lanternfall</id><author><name></name></author><category term="tech" /><category term="claudecode" /><category term="digitalocean" /><category term="ssh" /><summary type="html"><![CDATA[Letting an AI build a town: how I set it up, how I secured it, what it cost, and what it made.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://joemozden.com/assets/images/lanternfall-card.png" /><media:content medium="image" url="https://joemozden.com/assets/images/lanternfall-card.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">2026 World Cup Live Updates</title><link href="https://joemozden.com/worldcup/" rel="alternate" type="text/html" title="2026 World Cup Live Updates" /><published>2026-06-11T14:00:00+00:00</published><updated>2026-06-11T14:00:00+00:00</updated><id>https://joemozden.com/world-cup-log</id><content type="html" xml:base="https://joemozden.com/worldcup/"><![CDATA[<!-- Fonts (Inter / Archivo / Space Mono) are loaded site-wide in _layouts/default.html -->

<style>
  /* ---- tokens (same values as the preview) ---- */
  :root{
    --pitch:#08201b; --pitch-2:#0c2a22; --turf:#15613f; --turf-line:#7fdcab;
    --chalk:#f4f8f3; --paper:#fafbfa; --ink:#0d211c; --ink-soft:#46584f;
    --accent:#ff4332; --accent-ink:#c8261a; --blue:#2f6bff; --gold:#e4b14c;
    --line:#e2e7e2; --radius:14px; --maxw:1080px;
  }
  .wcl *{box-sizing:border-box;margin:0;padding:0}
  .wcl{font-family:'Inter',system-ui,sans-serif;color:var(--ink);background:var(--paper);line-height:1.65;-webkit-font-smoothing:antialiased}
  .wcl h1,.wcl h2,.wcl h3{font-family:'Archivo',sans-serif;line-height:1.04;letter-spacing:-.02em}
  .wcl p{margin:0 0 1rem}
  .wcl a{color:var(--accent-ink)}
  .wcl .wrap{max-width:var(--maxw);margin:0 auto;padding:0 24px}
  .eyebrow{font-family:'Space Mono',monospace;font-size:.78rem;letter-spacing:.04em;text-transform:uppercase;color:var(--accent-ink);font-weight:700}
  .eyebrow .num{color:var(--ink-soft)}
  @media (prefers-reduced-motion:reduce){.wcl *{transition:none!important;animation:none!important}}

  /* ---- header band ---- */
  .wcl-hero{background:radial-gradient(120% 120% at 80% -10%,var(--pitch-2),var(--pitch) 60%);color:var(--chalk);padding:54px 0 30px}
  .wcl-hero .eyebrow{color:#ff8c7f}
  .wcl-hero h1{font-size:clamp(2rem,6vw,3.4rem);font-weight:900;text-transform:uppercase;margin:.4rem 0 .6rem;max-width:18ch}
  .wcl-hero p.sub{color:#cfe0d7;max-width:52ch;font-size:1.05rem;margin:0}
  .wcl-next{font-family:'Space Mono',monospace;font-size:.8rem;color:#9fc4b3;margin-top:18px}
  .wcl-next b{color:var(--chalk)}
  /* evergreen "start here" link to the tournament preview — pinned in the hero so it
     never scrolls away into the dated stream below */
  .wcl-pinned{margin-top:16px}
  .wcl-pinned a{display:inline-flex;align-items:center;gap:8px;font-family:'Space Mono',monospace;font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--chalk);text-decoration:none;background:rgba(255,255,255,.06);border:1px solid rgba(127,220,171,.28);border-left:3px solid var(--accent);border-radius:999px;padding:9px 16px;transition:all .18s}
  .wcl-pinned a:hover{background:rgba(255,255,255,.12);border-color:var(--accent)}
  .wcl-pinned .pin{font-size:.9rem}

  /* ---- scores panel (yesterday / today live / collapsible all) ---- */
  .wcl-scores{background:var(--pitch-2);border-top:1px solid rgba(127,220,171,.16)}
  .wcl-scores .wrap{padding-top:16px;padding-bottom:16px}
  .wcl-scores-inner{display:flex;flex-direction:column;gap:12px}
  .score-day{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}
  .wcl-scores .lbl{font-family:'Space Mono',monospace;font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#9fc4b3;min-width:76px}
  .live-flag{color:var(--accent);margin-left:8px}
  .score-row{display:flex;gap:8px;flex-wrap:wrap}
  .score-chip{font-family:'Space Mono',monospace;font-size:.82rem;color:var(--chalk);background:rgba(255,255,255,.06);border:1px solid rgba(127,220,171,.18);border-radius:999px;padding:6px 12px;white-space:nowrap}
  .score-chip i{font-style:normal;color:#9fc4b3;margin-left:4px}
  .score-chip.live{border-color:rgba(255,67,50,.55)}
  .score-chip.live i{color:#ff8c7f}
  .score-chip .dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--accent);margin-right:6px;vertical-align:middle;animation:wcpulse 1.4s ease-in-out infinite}
  @keyframes wcpulse{0%,100%{opacity:1}50%{opacity:.25}}
  /* 🦅 easter egg: USA-win chips are clickable */
  .score-chip.usa-win{cursor:pointer}
  .score-chip.usa-win:hover{border-color:rgba(255,255,255,.45)}
  .wc-eagle{position:fixed;left:0;top:42%;z-index:9999;font-size:56px;line-height:1;white-space:nowrap;pointer-events:none;will-change:transform;filter:drop-shadow(0 8px 10px rgba(0,0,0,.3));animation:wc-fly 2.4s ease-in-out forwards}
  .wc-eagle .bird{display:inline-block;transform:scaleX(-1)}  /* face the direction of travel */
  .wc-eagle .ball{display:inline-block;font-size:34px;margin-left:-8px;vertical-align:super;animation:wc-spin .5s linear infinite}
  @keyframes wc-fly{
    0%{transform:translateX(-30vw) translateY(0)}
    20%{transform:translateX(5vw) translateY(-9vh)}
    40%{transform:translateX(30vw) translateY(7vh)}
    60%{transform:translateX(55vw) translateY(-7vh)}
    80%{transform:translateX(80vw) translateY(6vh)}
    100%{transform:translateX(125vw) translateY(-3vh)}
  }
  @keyframes wc-spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}
  .score-empty{font-family:'Space Mono',monospace;font-size:.76rem;color:#6f8c7e}
  /* collapsible full schedule — tucked away, doesn't dominate the strip */
  .score-all{border-top:1px solid rgba(127,220,171,.16);padding-top:12px}
  .score-all summary{font-family:'Space Mono',monospace;font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#9fc4b3;cursor:pointer;list-style:none}
  .score-all summary::-webkit-details-marker{display:none}
  .score-all summary::before{content:'\25B8  ';color:var(--accent)}
  .score-all[open] summary::before{content:'\25BE  '}
  .score-all-body{padding-top:14px;display:flex;flex-direction:column;gap:12px}
  .score-all-day{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}
  .score-all-day .d{font-family:'Space Mono',monospace;font-size:.7rem;text-transform:uppercase;color:#6f8c7e;min-width:76px}

  /* ---- filter toolbar (non-sticky; scrolls away with the page) ---- */
  .wcl-bar{background:var(--paper);border-bottom:1px solid var(--line)}
  .wcl-bar .wrap{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding-top:14px;padding-bottom:14px}
  .wc-pill{font-family:'Space Mono',monospace;font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.02em;cursor:pointer;border:1px solid var(--line);background:#fff;color:var(--ink-soft);padding:8px 15px;border-radius:999px;transition:all .18s}
  .wc-pill:hover{border-color:var(--accent);color:var(--accent-ink)}
  .wc-pill.on{background:var(--accent);border-color:var(--accent);color:#fff}
  .wc-count{font-family:'Space Mono',monospace;font-size:.72rem;color:var(--ink-soft);margin-left:auto}

  /* ---- the stream ---- */
  .wcl-stream{padding:30px 0 80px}
  .wc-entry{border-bottom:1px solid var(--line);padding:26px 0}
  .wc-entry:first-child{padding-top:6px}
  .wc-entry-meta{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:12px}
  .wc-time{font-family:'Space Mono',monospace;font-size:.74rem;color:var(--ink-soft);text-transform:uppercase;letter-spacing:.03em}
  .chip{font-family:'Space Mono',monospace;font-size:.66rem;font-weight:700;text-transform:uppercase;letter-spacing:.03em;padding:3px 9px;border-radius:999px}
  .chip.usmnt{background:rgba(47,107,255,.12);color:#1b3a8a;border:1px solid rgba(47,107,255,.3)}
  .chip.tournament{background:rgba(21,97,63,.12);color:#0d4a2e;border:1px solid rgba(21,97,63,.32)}
  .chip.offpitch{background:rgba(228,177,76,.2);color:#7a5512;border:1px solid rgba(228,177,76,.5)}
  .wc-entry h3{font-size:1.5rem;text-transform:uppercase;margin:0 0 8px}
  .wc-entry p{font-size:1.02rem}
  .wc-entry p:last-child{margin-bottom:0}

  /* ---- reused treatments from the preview ---- */
  .translate{border-left:4px solid var(--blue);background:#f1f5ff;border-radius:0 12px 12px 0;padding:14px 18px;margin:6px 0 0;font-size:.98rem}
  .translate b{font-family:'Space Mono',monospace;font-size:.74rem;text-transform:uppercase;letter-spacing:.04em;color:var(--blue);display:block;margin-bottom:4px}
  .prediction{background:radial-gradient(120% 140% at 85% -20%,var(--pitch-2),var(--pitch) 65%);color:var(--chalk);border:1px solid rgba(127,220,171,.25);border-left:5px solid var(--accent);border-radius:var(--radius);padding:22px 24px;margin:6px 0 0}
  .prediction .pl{font-family:'Space Mono',monospace;font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#ff8c7f;display:block;margin-bottom:8px}
  .prediction .pbig{font-family:'Archivo';font-weight:900;font-size:clamp(1.4rem,4vw,2rem);text-transform:uppercase;line-height:1.05;margin:0 0 10px}
  .prediction .pbig em{font-style:normal;color:var(--accent)}
  .prediction p{color:#cfe0d7;font-size:.96rem;margin:0}
  .match{display:flex;align-items:center;gap:16px;background:#fff;border:1px solid var(--line);border-left:4px solid var(--accent);border-radius:12px;padding:14px 18px;margin-top:6px}
  .match .score{font-family:'Archivo';font-weight:900;font-size:1.2rem;text-transform:uppercase}
  .match .tag{font-family:'Space Mono',monospace;font-size:.72rem;color:var(--ink-soft);margin-left:auto}
  /* "add to calendar" button — accent pill, overrides the default .wcl a link color */
  .wcl a.wc-cal{display:inline-flex;align-items:center;gap:8px;font-family:'Space Mono',monospace;font-size:.78rem;font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:#fff;text-decoration:none;background:var(--accent);border-radius:999px;padding:9px 16px;margin-top:4px;transition:all .18s}
  .wcl a.wc-cal:hover{background:var(--accent-ink)}

  /* ---- long-form extras: lists, photo grid, responsive video embeds ---- */
  .wc-entry ul{margin:0 0 1rem;padding-left:1.2em;list-style:disc}
  .wc-entry ol{margin:0 0 1rem;padding-left:2.2em;list-style:decimal}
  .wc-entry li{font-size:1.02rem;margin:0 0 .45rem}
  .wc-shots{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin:18px 0 0}
  @media(max-width:640px){.wc-shots{grid-template-columns:1fr}}
  .wc-shot img{width:100%;aspect-ratio:4/5;object-fit:cover;border-radius:12px;border:1px solid var(--line);display:block}
  .wc-shot figcaption{font-family:'Space Mono',monospace;font-size:.7rem;color:var(--ink-soft);margin-top:6px;line-height:1.45}
  /* single landscape photo (e.g. a TV set shot) — full width, wide aspect */
  .wc-shot-wide{margin:18px 0 0}
  .wc-shot-wide img{aspect-ratio:16/9}
  /* full-bleed diagram (e.g. the knockout bracket): show the WHOLE image, no crop */
  .wc-bracket img{width:100%;height:auto;aspect-ratio:auto;object-fit:contain}
  .wc-video{position:relative;padding-bottom:56.25%;height:0;margin:18px 0 0;border-radius:12px;overflow:hidden;border:1px solid var(--line)}
  .wc-video iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
  /* two embeds side by side — stacks on narrow screens so they don't get cramped */
  .wc-videos{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:18px 0 0}
  @media(max-width:640px){.wc-videos{grid-template-columns:1fr}}
  .wc-videos .wc-video{margin:0}
  .wc-videos figure{margin:0}
  .wc-videos figcaption{font-family:'Space Mono',monospace;font-size:.7rem;color:var(--ink-soft);margin-top:6px;line-height:1.45}

  /* ---- simple bar chart: all-time World Cup top scorers ---- */
  .wc-chart{margin:18px 0 0;border:1px solid var(--line);border-radius:var(--radius);padding:18px 18px 14px;background:#fff}
  .wc-chart-title{font-family:'Space Mono',monospace;font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-soft);margin:0 0 14px}
  .wc-scorers{display:flex;flex-direction:column;gap:11px}
  .wc-scorer{display:grid;grid-template-columns:150px 1fr;gap:12px;align-items:center}
  .wc-scorer .who{font-family:'Space Mono',monospace;font-size:.72rem;line-height:1.3;color:var(--ink-soft)}
  .wc-scorer .who b{font-family:'Inter',sans-serif;font-weight:700;font-size:.92rem;color:var(--ink);display:block}
  .wc-bar{position:relative;background:#eef2ee;border-radius:8px;height:32px;overflow:hidden}
  .wc-bar .fill{position:absolute;inset:0 auto 0 0;min-width:34px;background:linear-gradient(90deg,var(--turf),#1f7a4f);border-radius:8px;display:flex;align-items:center;justify-content:flex-end;padding:0 10px;color:#fff;font-family:'Archivo',sans-serif;font-weight:900;font-size:.95rem}
  .wc-scorer.active .fill{background:linear-gradient(90deg,var(--accent),var(--accent-ink))}
  .wc-chart-legend{font-family:'Space Mono',monospace;font-size:.68rem;color:var(--ink-soft);margin:14px 0 0;display:flex;gap:16px;flex-wrap:wrap}
  .wc-chart-legend .key{display:inline-flex;align-items:center;gap:6px}
  .wc-chart-legend .sw{width:12px;height:12px;border-radius:3px;display:inline-block}
  .wc-chart-legend .sw.active{background:var(--accent)}
  .wc-chart-legend .sw.retired{background:var(--turf)}
  @media(max-width:560px){.wc-scorer{grid-template-columns:118px 1fr;gap:8px}.wc-scorer .who b{font-size:.82rem}}
</style>

<div class="wcl">

<!-- ===== HEADER ===== -->
<header class="wcl-hero">
  <div class="wrap">
    <span class="eyebrow">// Running log</span>
    <h1>The World Cup, as it happens</h1>
    <p class="sub">Some takes as the tournament goes along. Will provide extra emphasis on USMNT analysis. Feel free to use the filter buttons below!</p>
    <p class="wcl-next" id="wc-next-line">Next USMNT match in <b id="wc-next">—</b> · USA vs Belgium, Jul 6 · 8:00 PM ET</p>
    <p class="wcl-pinned"><a href="/sports/2026/06/10/wc-preview.html"><span class="pin">⚽</span> Start here: my full World Cup preview →</a></p>
  </div>
</header>

<!-- ===== SCORES PANEL (today live + yesterday + collapsible all) ===== -->
<!-- Renders instantly from _data/scores.json, then overlays live data from ESPN's
     free scoreboard endpoint (polled client-side; see the script at the bottom). -->
<div class="wcl-scores">
  <div class="wrap wcl-scores-inner">
    <div class="score-day">
      <span class="lbl">Today<span class="live-flag" id="wc-live-flag" hidden="">● Live</span></span>
      <div class="score-row" id="wc-today-row"></div>
    </div>
    <div class="score-day">
      <span class="lbl">Yesterday</span>
      <div class="score-row" id="wc-yesterday-row"></div>
    </div>
    <details class="score-all">
      <summary>Click here to see all results so far</summary>
      <div class="score-all-body" id="wc-all-body"></div>
    </details>
  </div>
</div>

<!-- ===== FILTER BAR ===== -->
<div class="wcl-bar">
  <div class="wrap">
    <button class="wc-pill on" data-filter="all">All</button>
    <button class="wc-pill" data-filter="usmnt">USMNT</button>
    <button class="wc-pill" data-filter="tournament">Around the tournament</button>
    <button class="wc-pill" data-filter="offpitch">Off the pitch</button>
    <span class="wc-count" id="wc-count"></span>
  </div>
</div>

<!-- ===== THE STREAM =====
     Newest first. Entries auto-sort by their data-time (ISO 8601, ET) on load, so
     you can paste a new <article> anywhere — just give it a correct data-time.
     Need a layout? Copy one from the TEMPLATE GALLERY in the comment block below. -->
<div class="wcl-stream">
  <div class="wrap">

    <!-- USMNT: Balogun red card suspension lifted ahead of Belgium -->
    <article class="wc-entry" data-tags="usmnt" data-time="2026-07-06T00:10">
      <div class="wc-entry-meta">
        <span class="wc-time">Jul 6 · 12:10 AM</span>
        <span class="chip usmnt">USMNT</span>
      </div>
      <h3>BALOGUN RED CARD SUSPENSION LIFTED!</h3>
      <p>In a shocking turn of events, the red card suspension for Flo Balogun has been LIFTED for next game. Specifically, his suspension has been delayed a year, so he can serve it during some meaningless game next year, and he is now allowed to play against Belgium in the round of 16.</p>
      <p>This is an unprecedented move, and likely would not have happened if not for some level of US political intervention. At least we think. I don't know if we'll ever get the full and transparent story, but this seems to happen either to big players or for big nations. <a href="https://www.foxsports.com/stories/soccer/cristiano-ronaldo-folarin-balogun-red-card-suspension" target="_blank" rel="noopener">Something of the sort happened to Ronaldo not too long ago.</a></p>
      <p>Many people will have opinions. You will see and hear them leading up to the game and probably afterward too. All I can say is that they're probably all correct.</p>
      <p>Belgium have every right to be mad about this decision, as under normal circumstances it probably wouldn't have happened. The USMNT have every right to believe it's the right choice, since a large majority of people agree the red card was a really bad call in the first place. It helps the US because they have their best striker back and it hurts them because they lose the goodwill of many people. It helps Belgium because it'll fire them up and hurts them because the US are stronger for it. Whatever opinion you have, you are likely valid in said opinion. The only thing most people can agree on is the process &mdash; from the red card decision in the first place to now the overturning of the suspension &mdash; has been murky at best.</p>
      <p>In the end, while a controversial call, the game on the field is the only thing that matters. Time will likely wash away the commotion surrounding this decision, but won't wash away the result. The goal remains the same &mdash; beat Belgium and push us through to the quarterfinals.</p>
    </article>

    <!-- Around the tournament: round of 32 wraps up, R16 preview -->
    <article class="wc-entry" data-tags="tournament" data-time="2026-07-04T14:49">
      <div class="wc-entry-meta">
        <span class="wc-time">Jul 4 · 2:49 PM</span>
        <span class="chip tournament">Around the tournament</span>
      </div>
      <h3>To the round of 16 we go</h3>
      <p>First and foremost, happy July 4th!! Belgium are lucky they aren't playing us today, because the USA is undefeated on Independence Day. <a href="https://www.youtube.com/watch?v=Bemyn03pxdM" target="_blank" rel="noopener">Neva lost!</a></p>
      <p>The first stage of the knockout rounds are over and we're into the round of 16! Overall, I thought this was an absolutely thrilling slate of soccer games. You had giants like Germany go down in penalties, DR Congo taking England to the brink, Cabo Verde pulling off a near miracle against Argentina, and all three co-hosts going through, amongst other great results.</p>
      <p>10 of the 16 games were decided by 1 goal or less. 5 games went to added extra time. 3 went to penalties. Overall, I was pleasantly surprised at the level of competition and drama in this round. This is the first time we've had a round of 32 in a World Cup (typically went straight to the R16), which could've led to some cakewalk / uncompetitive games. While there were a few of those (see: Spain–Austria, France–Sweden), we otherwise had awesome matches all over.</p>
      <p>Looking forward, we are down from the 48 teams to begin the tournament to the final 16. A few matches to look forward to:</p>
      <ul>
        <li><b>USA vs. Belgium (7/6 @ 8pm EST):</b> Of COURSE the number one game to look forward to is the USMNT! Even without our best player this tournament, Flo Balogun, we have a decent shot of knocking off the Belgians. Getting to the quarterfinals would be a HUGE result for us.</li>
        <li><b>Mexico vs. England (7/5 @ 8pm EST):</b> Absolutely cracking game incoming. Typically, England would be a strong favorite, but this game is being played at Estadio Azteca in Mexico City, the cathedral stadium of world soccer. This game will be loud, physical, and played at a high altitude that favors the Mexicans.</li>
        <li><b>Spain vs. Portugal (7/6 @ 3pm EST):</b> The Iberian Derby! While Spain is favored, this is still the FIFA ranking 3 vs. 7 teams facing off. Lots of great history between these two nations, and two of the three co-hosts of the 2030 World Cup (along with Morocco).</li>
        <li><b>Brazil vs. Norway (7/5 @ 4pm EST):</b> I had Brazil on upset alert last round against Japan and I have them on upset alert vs. Norway, too. Norway's attack has just looked deadly and they seem to be clicking more than Brazil. Vini Jr. vs. Haaland should be epic.</li>
      </ul>
      <p>See below for all matchups in the round of 16.</p>
      <figure class="wc-shot wc-bracket">
        <img src="/assets/images/round-of-16.jpeg" alt="All 2026 World Cup round of 16 matchups" loading="lazy" />
      </figure>
    </article>

    <!-- USMNT: favorite moment so far — Poch singing Country Roads -->
    <article class="wc-entry" data-tags="usmnt" data-time="2026-07-02T10:30">
      <div class="wc-entry-meta">
        <span class="wc-time">Jul 2 · 10:30 AM</span>
        <span class="chip usmnt">USMNT</span>
      </div>
      <h3>My favorite moment so far</h3>
      <p>No matter what happens, I'll never forget the all-time good vibes of Pochettino singing Country Roads after this World Cup. Truly an all-time moment for me, and hopefully an all-time moment for the USA.</p>
      <figure class="wc-shot" style="max-width:440px;margin-inline:auto">
        <img src="/assets/images/poch-singing.jpeg" alt="Mauricio Pochettino singing Country Roads with the USMNT" loading="lazy" />
        <figcaption><a href="https://x.com/FOXSports/status/2072508357852983446" target="_blank" rel="noopener">Watch Poch sing Country Roads →</a></figcaption>
      </figure>
    </article>

    <!-- Around the tournament: all three co-hosts reach the R16 -->
    <article class="wc-entry" data-tags="tournament" data-time="2026-07-02T09:30">
      <div class="wc-entry-meta">
        <span class="wc-time">Jul 2 · 9:30 AM</span>
        <span class="chip tournament">Around the tournament</span>
      </div>
      <h3>Co-hosts still hostin'!</h3>
      <p>All three co-hosts — USA, Mexico, and Canada — have moved on to the Round of 16. All three have actually looked pretty good in doing so. The World Cup is better when co-hosts do well, and I'm happy to see everyone progressing, even if it does mean reluctantly rooting for Mexico at times. Next up: Canada v Morocco, Mexico v England, and USA v Belgium. While unlikely, it's not impossible all three move on to the Round of 8. I would give Mexico in Mexico City and USA in Seattle the best chances of those 3.</p>
    </article>

    <!-- USMNT: instant reaction — beat Bosnia & Herzegovina to reach the R16 -->
    <article class="wc-entry" data-tags="usmnt" data-time="2026-07-01T22:14">
      <div class="wc-entry-meta">
        <span class="wc-time">Jul 1 · 10:14 PM</span>
        <span class="chip usmnt">USMNT</span>
      </div>
      <h3>Instant reaction — USMNT defeat Bosnia and Herzegovina to move on to the Round of 16! Vamos USA!</h3>
      <p>Cue Country Roads, which has become a song symbolic with the winning ways of the USMNT this tournament.</p>
      <p>The USA beat BIH 2&ndash;0 tonight in San Francisco, even doing so while going down to 10 men in the 64th minute after an <em>extremely controversial</em> red card sent off Flo Balogun. In many ways, this win was emblematic of the other wins the US has had this tournament: creative, decisive, and in control. In other ways, this game was very unique: for the first time all World Cup, the US was truly tested through the way they had to dig in with only ten men. Not only did they pass that test, but they did it with flying colors, doubling their lead down a man in the 82nd minute off of Malik Tillman's free kick. That free kick took so much pressure off this team defending a one-goal lead, and it's a moment I'm not sure teams of the past would've capitalized on. This is the USMNT's first win against a European side in 10 attempts, and our first knockout round win since 2002.</p>
      <p>The red card is the one true blemish on this game, and the only thing truly taking away from the otherwise impeccable vibes of this victory. While maybe we didn't have as many shots on goal as we would've ultimately wanted, we looked in control all game, with talented players living up to their potential.</p>
      <p>Balogun was utterly dominant until he was sent off. He had the BIH defense seeing fits, and had one goal called back for offside before finding the net right before halftime. In my opinion, Flo has been our best player this tournament and a striker that the USA has sorely needed in this World Cup and World Cups of past. With his red card, he will not be able to play the next game against Belgium on Monday.</p>
      <p>The red card and Flo's one game suspension is something that we will need to get over, but right now, I'm going to bitch a little bit about it. In real time, there was no call for a foul by either player, meaning at game pace, the ref did not see a reason to issue any sort of card. The tackle, while quite nasty, was without malicious intent and happened only because the defender came in with his leg at the very last second. Additionally, we saw the SAME <a href="https://www.youtube.com/watch?v=xHKoOiWE8Wg" target="_blank" rel="noopener">exact type of tackle from Messi</a> earlier in this tournament, yet he was given no penalty. My issue primarily comes from the use of VAR here — for VAR checks, <em>"in general, slow motion replays should only be used for facts&hellip; normal speed should be used for 'intensity of an offence.'"</em> At normal speed, this looks like a yellow. In slow motion, of course it looks like a red. To have nothing called originally, only to get signaled over to VAR and then deliver a card based on slow motion, is really frustrating, and will be something that has repercussions into the rest of this tournament.</p>
      <p>Groveling aside, we look forward to Monday, where we will face off against Belgium in the Round of 16 — who we lost to 2&ndash;1 back in 2014 after a <a href="https://www.youtube.com/watch?v=nyDS6hLJXmM" target="_blank" rel="noopener">famously amazing performance by Tim Howard</a>. The teams are much different since then. Belgium, while still strong, is nothing like their 2014 team, in which their "golden generation" of talent were all in their prime. On the contrary, we now have the team of youth and prime, and have every ability to take it to Belgium in this game.</p>
      <p>Two things can be true — Flo Balogun's absence really hurts our chances to win this game, as he has been incredible this tournament so far; however, we can still win this game given our form, confidence, and depth at that position.</p>
      <p>Tonight's win was so important because you get to extend the American party — every W is another ~5 days of our country talking about soccer, of young fans watching us play on the biggest stage and dreaming of growing up to be one of those players.</p>
      <p>Mark your calendars now, because arguably the biggest game in USMNT history is about to happen on Monday. I truly mean it when I say that. Teams of USA's past have had the grit to compete, but often fizzled out against more talented opponents. Teams of recent memory (think 2022) were really talented but young, inexperienced, and not battle tested. This team combines the grit of old with the skill of new. It's our best players in their prime looking to prove something to the world.</p>
      <p><a class="wc-cal" href="/assets/usmnt-belgium.ics">🗓 Add USA v Belgium to your calendar</a></p>
      <p>We've met expectations, if not exceeded them, based on "vibes" alone. Monday gives us the chance, on home soil, to beat a good European team and declare to the world that we have arrived as a soccer nation. Vamos USA, and make us proud. LFG.</p>
      <div class="wc-video">
        <iframe src="https://www.youtube.com/embed/NuuMIICMQxo" title="USA 2–0 Bosnia and Herzegovina — highlights" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>
      </div>
    </article>

    <!-- Around the tournament: contenders check-in entering the knockouts -->
    <article class="wc-entry" data-tags="tournament" data-time="2026-06-29T08:16">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 29 · 8:16 AM</span>
        <span class="chip tournament">Around the tournament</span>
      </div>
      <h3>Checking in on the contenders</h3>
      <p>As we enter the knockout rounds, checking in on some of the tournament contenders.</p>
      <ul>
        <li><b>Above the rest: France (1A) and Argentina (1B).</b> The finalists of 2022 still look like the best teams in 2026. I would not be surprised to see a rematch again this year. Given what I've seen so far, I would favor France in another epic matchup.</li>
        <li><b>Slightly underwhelming but still dangerous: England and Spain.</b> I don't think we've seen either fully kick into form yet, but there have been spurts of greatness from both sides in group play. On a good day, both of these teams can beat anyone. Let's just see if they can get into that highest gear. I have more faith in Spain to do that than England, but seeing as England are my pick to win it all, I would hope they prove me wrong.</li>
        <li><b>Expect the unexpected: Germany, Portugal, and Brazil.</b> Brazil has won two of their games 3&ndash;0. Germany put 7 goals past Curaçao and beat a good Ivory Coast team at the death. Portugal put up 5 against Uzbekistan. Even so, I would say all these teams remain unconvincing against better competition, and I wouldn't be surprised if any of these teams made it to the semi-finals OR lost in the round of 16 or earlier.</li>
        <li><b>Co-hosts having fun: USMNT, Mexico, Canada.</b> Canada won their first knockout and is in the round of 16. Mexico have a tough schedule but are at home until the quarterfinals. And the USMNT are in great form looking to make the quarters as well. Hopefully all these teams can go far.</li>
      </ul>
    </article>

    <!-- Around the tournament: knockout stage begins, bracket + round-of-32 watch -->
    <article class="wc-entry" data-tags="tournament" data-time="2026-06-28T12:00">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 28 · 12:00 PM</span>
        <span class="chip tournament">Around the tournament</span>
      </div>
      <h3>The knockout stage has begun</h3>
      <p>The group stage is over and we have officially entered the knockout rounds. Every game from here on out is win or go home. You can see an image of how the playoff bracket looks below.</p>
      <figure class="wc-shot wc-bracket">
        <img src="/assets/images/knockout-bracket.jpeg" alt="2026 World Cup knockout-stage bracket" loading="lazy" />
      </figure>
      <p>A few round of 32 games that look mighty tasty:</p>
      <ul>
        <li><b>Brazil vs. Japan (6/29):</b> Traditional powerhouse Brazil looking to return to former glory coming up against one of the most fun teams of the tournament, Japan. Don't be surprised to see a Japan upset here.</li>
        <li><b>Morocco vs. Netherlands (6/30):</b> A clash of two of the tournament's strongest sides, sitting right next to each other in the FIFA world rankings at 6th and 7th. On paper, one of the most evenly matched ties of the round.</li>
        <li><b>Mexico vs. Ecuador (6/30):</b> Mexico's reward for winning all 3 group games? A matchup against Ecuador who, while they did underperform during group play, are a very strong defensive side.</li>
        <li><b>Portugal vs. Croatia (7/2):</b> Two 40+ year old legends of the game come up against each other as Ronaldo and Portugal take on Modrić and Croatia.</li>
      </ul>
      <p>A few other brief observations&hellip;</p>
      <ul>
        <li>World Cup holders Argentina have a favorable path to the semi-final, with Colombia likely their stiffest test in the quarter-finals. I do not see many chances for an upset here and would be shocked if we didn't see them in the final four.</li>
        <li>Looking ahead, if both England and Mexico win their first knockout games, a R16 matchup between the two of them in Mexico City would be must-see TV.</li>
        <li>The USA have a moderately favorable draw. They should be favored in their first knockout game (Bosnia Herz.), about a coin flip in their next (Belgium or Senegal), and underdogs in the quarters (probably Spain). Going past the R16 would be a huge deal for us.</li>
      </ul>
    </article>

    <!-- USMNT: dead-rubber loss to Turkey closes out group play -->
    <article class="wc-entry" data-tags="usmnt" data-time="2026-06-26T09:30">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 26 · 9:30 AM</span>
        <span class="chip usmnt">USMNT</span>
      </div>
      <h3>USMNT lose to Turkey, but mission accomplished</h3>
      <p>Last night wrapped up the last game of the USMNT group play, as the USMNT lost to Turkey 2&ndash;3 in a packed SoFi Stadium. As I mentioned in a previous post, before this game both teams were already locked into their final group standings &mdash; the US as first in the group and Turkey as last (and eliminated from the tournament) &mdash; so this game was a "dead rubber" match&hellip;meaningless from an outcome perspective.</p>
      <p>Pochettino did what I hoped he would do, which was a near-full turnover of the roster. Only one usual starter, Weston McKennie, started in this game, while the rest of the starters were usually bench players. While it sucks the USMNT did lose &mdash; on the last kick of the game, for that matter &mdash; my verdict remains that this was still "mission accomplished": we got to rest everyone that needed a rest, Pulisic got some playing time after coming back from injury, we got to see some of our squad depth in action, and most importantly, no one got seriously injured. The USMNT put themselves in the wonderful position of being able to play a meaningless match, and although it wasn't the outcome we would've hoped for, the meaningless result was, in and of itself, the win.</p>
      <p>On the game itself &mdash; to speak the obvious, there is a clear gap in quality between our starting 11 and our backup 11, especially in the defensive half. This game further emphasized the importance of Tyler Adams, our defensive midfielder who not only is incredibly skilled, but also does a great job at keeping the defense organized, something I thought was missing from our team last night. Additionally, this game was a good reminder of the drop off specifically amongst our center backs, who were not the best last night. Injuries in this tournament to Tim Ream or especially Chris Richards, our starting center backs, would be very bad.</p>
      <p>Otherwise, I thought Gio Reyna played pretty well and I could see him getting more playing time in the tournament. Sebastian Berhalter was also pretty good with a goal and an assist. Tim Weah, who I'm a fan of, played very poorly, but I'm sure he will have better days.</p>
      <p>All in all, an exciting, if not super high quality game that will be shortly forgotten. Come Wednesday when the USMNT play in their first knockout game against Bosnia and Herzegovina, this loss will be but a distant memory. I think homefield advantage is particularly helpful here, because even though we might've lost a little momentum (not even entirely sure that is the case) with a meaningless L, that stadium will be going absolutely bonkers come game time. Surely all the momentum will be back with us leading up to kickoff.</p>
      <div class="wc-video">
        <iframe src="https://www.youtube.com/embed/7JJLMyKBG90" title="USA 2–3 Turkey — highlights" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>
      </div>
    </article>

    <!-- Around the tournament: Messi sets the all-time WC scoring record -->
    <article class="wc-entry" data-tags="tournament" data-time="2026-06-23T07:28">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 23 · 7:28 AM</span>
        <span class="chip tournament">Around the tournament</span>
      </div>
      <h3>History made! And history incoming?</h3>
      <p>With two goals against Austria, Lionel Messi is now the official all-time leading World Cup goal scorer with 18, passing the previous record holder Miroslav Klose's 16. Crazily enough, Mbappé, with two goals himself against Iraq, now brings his total to 16, right behind Messi. Mbappé is 12 years younger than Messi, and surely at this pace will surpass Messi in due time — perhaps even this World Cup.</p>
      <div class="wc-chart">
        <p class="wc-chart-title">All-time World Cup top scorers · goals (matches played)</p>
        <div class="wc-scorers">
          <div class="wc-scorer active">
            <div class="who"><b>🇦🇷 Messi</b><span>28 matches</span></div>
            <div class="wc-bar"><span class="fill" style="width:100%">18</span></div>
          </div>
          <div class="wc-scorer active">
            <div class="who"><b>🇫🇷 Mbappé</b><span>16 matches</span></div>
            <div class="wc-bar"><span class="fill" style="width:88.9%">16</span></div>
          </div>
          <div class="wc-scorer">
            <div class="who"><b>🇩🇪 Klose</b><span>24 matches</span></div>
            <div class="wc-bar"><span class="fill" style="width:88.9%">16</span></div>
          </div>
          <div class="wc-scorer">
            <div class="who"><b>🇧🇷 Ronaldo</b><span>19 matches</span></div>
            <div class="wc-bar"><span class="fill" style="width:83.3%">15</span></div>
          </div>
          <div class="wc-scorer">
            <div class="who"><b>🇩🇪 Gerd Müller</b><span>13 matches</span></div>
            <div class="wc-bar"><span class="fill" style="width:77.8%">14</span></div>
          </div>
          <div class="wc-scorer">
            <div class="who"><b>🇫🇷 Fontaine</b><span>6 matches</span></div>
            <div class="wc-bar"><span class="fill" style="width:72.2%">13</span></div>
          </div>
          <div class="wc-scorer">
            <div class="who"><b>🇧🇷 Pelé</b><span>14 matches</span></div>
            <div class="wc-bar"><span class="fill" style="width:66.7%">12</span></div>
          </div>
        </div>
        <p class="wc-chart-legend">
          <span class="key"><span class="sw active"></span> Still active</span>
          <span class="key"><span class="sw retired"></span> Retired</span>
        </p>
      </div>
    </article>

    <!-- USMNT: the knockout path is setting up nicely -->
    <article class="wc-entry" data-tags="usmnt" data-time="2026-06-22T10:19">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 22 · 10:19 AM</span>
        <span class="chip usmnt">USMNT</span>
      </div>
      <p>With Belgium drawing Iran and Egypt beating New Zealand yesterday, the USMNT's path to the quarterfinals (final 8) is actually setting up quite nicely. As I said in my previous post, you never really know your path until it's finalized, but the most likely outcome at this point is playing Bosnia and Herzegovina in the round of 32 and then Egypt in the round of 16. While both teams could pose problems, that is a tastier setup than many other teams would have to the final 8.</p>
      <figure class="wc-shot wc-shot-wide">
        <img src="/assets/images/usmnt-knockout-path-possibility.png" alt="A possible USMNT knockout path to the quarterfinals" loading="lazy" />
      </figure>
    </article>

    <!-- USMNT: the ceiling for this team -->
    <article class="wc-entry" data-tags="usmnt" data-time="2026-06-22T11:00">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 22 · 11:00 AM</span>
        <span class="chip usmnt">USMNT</span>
      </div>
      <h3>USMNT ceiling</h3>
      <p>When someone asks me the ceiling for this USMNT, it basically to me comes down to the first time we play France, Spain, Argentina, or England. I think those teams are a class above the rest in this tournament and would be very tough for the USMNT to beat. Any other team, however, including the likes of Brazil, Germany, the Netherlands, etc., I think we could absolutely beat. Won't always mean we're favored, but would definitely have a fighting chance.</p>
      <p>So my guess is that we go as we can until going up against one of those big boys. While you never know how the bracket shakes out, that seems like the elite eight — we might run into someone like Spain. But the beauty is you might never know… one of them could be upset by someone else, or even us on the right day. The point is that we've looked more dangerous than ever before, and I'm sure many teams would NOT want to be going up against us right now, especially as co-hosts with home field advantage.</p>
    </article>

    <!-- Around the tournament: my five favorite games so far -->
    <article class="wc-entry" data-tags="tournament" data-time="2026-06-20T16:30">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 20 · 4:30 PM</span>
        <span class="chip tournament">Around the tournament</span>
      </div>
      <h3>Favorite games so far</h3>
      <p>In no particular order:</p>
      <ol>
        <li><a href="https://youtu.be/r8SvHZxALQs" target="_blank" rel="noopener">Netherlands vs. Japan</a></li>
        <li><a href="https://youtu.be/memCfdob60w" target="_blank" rel="noopener">Iran vs. New Zealand</a></li>
        <li><a href="https://youtu.be/ynqGWHJPkuQ" target="_blank" rel="noopener">England vs. Croatia</a></li>
        <li><a href="https://youtu.be/BXD1_mhODBU" target="_blank" rel="noopener">USA vs. Paraguay</a></li>
        <li><a href="https://youtu.be/n3JDGlOwMJ4" target="_blank" rel="noopener">France vs. Senegal</a></li>
      </ol>
      <p>OK, I'm a bit biased — I'm a USMNT fan, so USA smashing Paraguay was always making the list, and I saw France vs. Senegal in person. But both were still great games!!</p>
    </article>

    <!-- Off the pitch: The Athletic's World Cup coverage -->
    <article class="wc-entry" data-tags="offpitch" data-time="2026-06-20T14:00">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 20 · 2:00 PM</span>
        <span class="chip offpitch">Off the pitch</span>
      </div>
      <p>The Athletic has had incredible coverage leading up to and during the World Cup. Between YouTube, Podcasts, the App, and more, it has been my favorite place for everything World Cup. I would really recommend subscribing for anyone that wants to lean more into the tournament.</p>
      <p>It was a nice touch that for a few weeks ahead of the World Cup, every time you opened the app there was a countdown to the beginning of the WC. Sometimes it felt like the US and NYC weren't hyping up the World Cup enough — that was a fun little way to be reminded every single day of the massive event coming up.</p>
    </article>

    <!-- Around the tournament: Australia beat Türkiye, raising the stakes for Friday -->
    <article class="wc-entry" data-tags="usmnt" data-time="2026-06-14T09:00">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 14 · 9:00 AM</span>
        <span class="chip usmnt">USMNT</span>
      </div>
      <div class="match">
        <span class="score">AUS 2–0 TÜR</span>
        <span class="tag">Group D</span>
      </div>
      <p>With Australia's 2–0 win over Türkiye, all of a sudden the USMNT–Australia game on Friday gets a lot more interesting. I thought the USMNT and Türkiye were the two best teams in this group, but an Australia performance like that means we'll get treated to some better soccer that I would've initially expected. The US need to come with the same intensity they brought against Paraguay. You won't want to miss this clash between the two top teams in the group right now.</p>
      <p><a class="wc-cal" href="/assets/usmnt-australia.ics">🗓 Add USA v Australia to your calendar</a></p>
    </article>

    <!-- USMNT: Group D won outright after Paraguay beat Türkiye -->
    <article class="wc-entry" data-tags="usmnt" data-time="2026-06-20T01:30">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 20 · 1:30 AM</span>
        <span class="chip usmnt">USMNT</span>
      </div>
      <h3>Group D winners! USA!</h3>
      <p>With Paraguay beating Türkiye last night / early this morning, the USA has officially won Group D! We last won our World Cup group in 2010, advancing on 5 points through three games. We already have 6 points in two games.</p>
      <p>Already winning the group puts us in an interesting, advantageous position. Effectively, <strong>it means the next game means nothing to us.</strong> Win, lose, or draw, we still advance FIRST out of the group. Türkiye, our last group stage opponent, on the other hand, also has nothing to lose — but that's because they've already been eliminated from the tournament.</p>
      <p>So what is the USMNT to do? Well, for starters, you continue to rest Christian Pulisic, who was out last game with an injury. You also DON'T play Tyler Adams, Flo Balogun, Antonee Robinson, and Chris Richards. That is because they each have a yellow card. The way the rules work for this WC tournament is that if you pick up two yellow cards, even if they are in separate games, you cannot play the next game; however, the yellow cards are "erased" after the group stages. So if one of those players played the third group stage game and got a yellow card, they would not be able to play the round of 32. By not playing next game, all of that resets.</p>
      <p>As for the rest of the team… this is like in football when it's week 18 and you've already locked in your playoff spot. Do you start your starters so they don't get rusty, or rest them? In my opinion, you rest them, and I would start ENTIRELY backups for this game against Türkiye. It's debatable of course, but I think the risk of getting a starter injured outweighs the benefit of playing them so they don't "get rusty." Besides, it's likely you wouldn't play them the entire 90 minutes anyway.</p>
      <p>Regardless, enjoy a fun and interesting match against Türkiye for our final group stage match. Remember, the outcome doesn't matter to us — we already won our group. So in that case, maybe our manager Pochettino gets a little weird with the formation and tactics. We'll find out soon.</p>
      <p>All in all, the best outcome through two games we could've asked for.</p>
    </article>

    <!-- USMNT long-form: USA 2–0 Australia, second straight win -->
    <article class="wc-entry" data-tags="usmnt" data-time="2026-06-19T17:45">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 19 · 5:45 PM</span>
        <span class="chip usmnt">USMNT</span>
      </div>
      <h3>USA beats Australia 2–0 — LET'S GOOOO</h3>
      <div class="match">
        <span class="score">USA 2–0 AUS</span>
        <span class="tag">Group D · matchday 2</span>
      </div>
      <p>The US beat Australia in front of a raucous crowd at Lumen Stadium (aka Seattle Stadium) today, giving the USMNT 6 points and their second win in two games. The last time the USMNT won two group stage games was in 1930.</p>
      <p>A few thoughts about the game itself — while this game wasn't as entertaining as US vs. Paraguay, in my mind, it was still as dominant. We scored 2 goals in the first half, and while there were a few nervy moments in the second half, we looked to be mostly in control the entire game. Australia plays in a 5–4–1, meaning they have a LOT of defenders and are comfortable not having possession. They will sit back, defend, and then look for an opportunity to counterattack. When a team like us goes up two goals in the first half, it kind of messes up Australia's game plan.</p>
      <p>In the second half, we were more than fine soaking up some pressure and playing the game out. From a tactical perspective, we did just about everything you could've wanted the team to do — we were organized, compact, and prevented Australia from ever really being dangerous. All in all, it was a dominant effort.</p>
      <p>I've gotten this far without even mentioning the fact we won comfortably without our best player, Christian Pulisic. We will absolutely need him for the later games against better teams, but the fact we could easily dispatch of an inferior opponent without him goes to show the growth of this team over the past few years. I would've been extremely nervous without him in the past against ANY team — this time around, I actually felt ok going into it. That goes to show the level of chemistry and talent we're playing with this time around.</p>
      <p>This is the best two-game stretch we've played in recent history (if not ever) and it couldn't come at a better time. We're winning in multiple ways — we ran up the score on a Paraguay team that played more open, and scored a few early and locked down on defense against another really defensive team.</p>
      <p>If you weren't excited before, you should be now. Legends like Landon Donovan and Clint Dempsey are openly talking about how incredible this team looks, which is how you know something special is brewing. Start believing USA… it could be a great ride.</p>
      <div class="wc-shots">
        <figure class="wc-shot">
          <img src="/assets/images/USMNT-AUS-Legends.jpeg" alt="Me and Christina watching the USMNT at Legends in Manhattan" loading="lazy" />
          <figcaption>Me and Christina watched the game at Legends in Manhattan, which was a proper soccer bar</figcaption>
        </figure>
        <figure class="wc-shot">
          <img src="/assets/images/USMNT-AUS-biking-home.jpeg" alt="Me biking home after the USMNT win over Australia" loading="lazy" />
          <figcaption>Me biking home after the game, full of life and bliss</figcaption>
        </figure>
      </div>
    </article>

    <!-- Around the tournament: England look the part, vindicating the preview pick -->
    <article class="wc-entry" data-tags="tournament" data-time="2026-06-17T19:00">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 17 · 7:00 PM</span>
        <span class="chip tournament">Around the tournament</span>
      </div>
      <p>Is there a lot of tournament to go? Yes. Do I feel good about my prediction that England would win it all since they are transitioning their team to run through their best player Harry Kane, who did absolutely everything in the win against Croatia? Yes, I do.</p>
      <p><a href="/sports/2026/06/10/wc-preview.html">My preview prediction before the world cup</a>:</p>
      <div class="prediction">
        <span class="pl">// My pick to win it all</span>
        <p class="pbig">It's coming home: <em>England.</em></p>
        <p>The smart money would be on France or Spain, but something tells me it's finally coming home for England. Their best player, Harry Kane, is in the form of his life, and they have the talent and coach to make it happen.</p>
      </div>
    </article>

    <!-- Around the tournament: the superstars all delivered on the same matchday -->
    <article class="wc-entry" data-tags="tournament" data-time="2026-06-17T10:10">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 17 · 10:10 AM</span>
        <span class="chip tournament">Around the tournament</span>
      </div>
      <p>Yesterday's matchday had all the brightest stars on center stage, and they all delivered. Mbappé scored <a href="https://www.youtube.com/watch?v=2AQGEqU9biI" target="_blank" rel="noopener">two</a> — in the process becoming France's all-time leading World Cup goalscorer — Haaland scored <a href="https://www.youtube.com/watch?v=pk_d-aFnZ0c" target="_blank" rel="noopener">two</a>, and then, as if he needed to remind everyone who the hell he is, Messi scored <a href="https://www.youtube.com/watch?v=7M3IPdkAfM4" target="_blank" rel="noopener">THREE</a>!</p>
      <p>With that hat trick, Messi has officially tied Miroslav Klose for the most World Cup goals ever, at 16. And at this rate, who would dare doubt that he breaks the record before this campaign is done?</p>
    </article>

    <!-- Off the pitch: the NBC studio crew isn't clicking -->
    <article class="wc-entry" data-tags="offpitch" data-time="2026-06-16T09:05">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 16 · 9:05 AM</span>
        <span class="chip offpitch">Off the pitch</span>
      </div>
      <p>This crew of Rebecca Lowe, Zlatan, Thierry Henry, and Alexi Lalas just isn't clicking super well in my opinion. Rebecca is always great, but Zlatan, for as much as I love his personality, is just not good at this (at least not yet). Thierry looks disengaged and is a lot better when he has better analysts around him, like he <a href="https://youtu.be/OT-pl47XZLE" target="_blank" rel="noopener">does for Champions League coverage</a>.</p>
      <p>And Alexi Lalas... my god... has been poisoning my ears for years. The WOAT.</p>
    </article>

    <!-- Off the pitch: ITV's NYC skyline set -->
    <article class="wc-entry" data-tags="offpitch" data-time="2026-06-16T09:38">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 16 · 9:38 AM</span>
        <span class="chip offpitch">Off the pitch</span>
      </div>
      <p>I'm not sure how ITV got this hook up but this set is absolutely beautiful with the NYC skyline backdrop. Only the best for Roy, Gary, and my boy Big Ange.</p>
      <figure class="wc-shot wc-shot-wide">
        <img src="/assets/images/ITV-WC-set.png" alt="ITV's World Cup studio set with the downtown NYC skyline as a backdrop" loading="lazy" />
      </figure>
    </article>

    <!-- Around the tournament: dark horses to follow — Japan & Sweden -->
    <article class="wc-entry" data-tags="tournament" data-time="2026-06-15T10:14">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 15 · 10:14 AM</span>
        <span class="chip tournament">Around the tournament</span>
      </div>
      <h3>Two teams to watch — Japan and Sweden</h3>
      <p>If you don't have allegiance to any of teams (beside the USMNT, of course!) two fun teams to follow might be Japan and surprisingly Sweden, both from Group F.</p>
      <p>Japan played a really strong game and tied 2–2 against a Dutch side that went ahead two times in the game. Japan are interesting in the perspective that they are quite flexible — in the game, they showed their ability to both defend compactly but also open up and go into attack mode. It's not common that teams can do both well — typically, teams will have an "identity" they stick to. Since Japan is flexible, that will make them dangerous if they make the knockout rounds since they can play against any style. Of all the early "dark horses," they have looked the best to me. Also, look how fresh those away jerseys are:</p>
      <figure class="wc-shot wc-shot-wide">
        <img src="/assets/images/japan_2026_away_jersey.jpg" alt="Japan's 2026 World Cup away jersey" loading="lazy" />
      </figure>
      <p>Sweden might not be as good as Japan but they were fun to watch. They beat up on an inferior opponent in Tunisia, but they had a few rocket goals and are quite entertaining at the very least. They don't need a lot of possession, so it'll be interesting to see how they play against other teams; however, when they do get it, they are big, physical, and have two really good strikers always looking to put shots on goal. I don't expect them to go super far, but I do expect them to be fun to watch.</p>
      <div class="wc-videos">
        <figure>
          <div class="wc-video">
            <iframe src="https://www.youtube.com/embed/m7sQP_AZ5vM" title="Netherlands v Japan — highlights" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>
          </div>
          <figcaption>Netherlands 2–2 Japan — highlights</figcaption>
        </figure>
        <figure>
          <div class="wc-video">
            <iframe src="https://www.youtube.com/embed/MWsgrEPIni4" title="Sweden v Tunisia — highlights" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>
          </div>
          <figcaption>Sweden v Tunisia — highlights</figcaption>
        </figure>
      </div>
    </article>

    <!-- USMNT long-form: USA 4–1 Paraguay -->
    <article class="wc-entry" data-tags="usmnt" id="usa-paraguay-breakdown" data-time="2026-06-13T11:00">
      <div class="wc-entry-meta">
        <span class="wc-time">Jun 13 · 11:00 AM</span>
        <span class="chip usmnt">USMNT</span>
      </div>
      <h3>USA–Paraguay: the best I've ever seen us play</h3>
      <div class="match">
        <span class="score">USA 4–1 PAR</span>
        <span class="tag">Group D · matchday 1</span>
      </div>
      <p>Let me start with this — that was some of the BEST soccer I've ever seen the USMNT play.</p>
      <p>Typically, the great USMNT teams of the past have gotten points off grit and effort — <a href="https://www.youtube.com/watch?v=H99a2DYyRAo" target="_blank" rel="noopener">0–0</a> draws, <a href="https://www.youtube.com/watch?v=TNl7ZcnDB0Q" target="_blank" rel="noopener">1–0</a> wins, where maybe we didn't have the most possession but we put in strong showings that embodied our spirit of being incredibly physical, if sometimes lacking true quality. So much of our game under the previous coach was: grab an early goal, then sit back and defend, doing our best not to concede instead of chasing more.</p>
      <p>This game was different because I've never seen us outright DOMINATE another team like that — our possession, our attacking sequences so full of conviction and purpose. Especially in the first half, whenever we had the ball we were direct and always threatening Paraguay. Whenever we lost it, we immediately jumped and pressed, trying to win it straight back.</p>
      <p>The goals were great, too. It was important to get up early on a defensive team like Paraguay, who are very good at sitting back, defending, and waiting for their chance to strike on the counter. The first goal was fortunate, but it showcased why Pulisic is so important to this team. Notice how he ATTACKS those two defenders — players who can go at defenders in one-on-one (or even one-on-two!) situations are crucial. It all starts with him splitting them. <a href="https://youtu.be/BXD1_mhODBU?t=22" target="_blank" rel="noopener">(Watch the goal →)</a></p>
      <p>Goals 2 and 3 came from Flo Balogun, who had really strong finishing on both — especially the third, with his weaker left foot into the top bin. My goodness. Traditionally the USMNT hasn't had the best strikers in recent years, so having one who can capitalize on his chances is extremely promising.</p>
      <p>The fourth goal was gravy on top, but it came from a player with so much potential who's been in poor form lately. Gio Reyna needed a confidence boost, and that was about as good of one as you can get. What an awesome shot.</p>
      <p>Other quick notes from the game:</p>
      <ul>
        <li>I loved that someone got a yellow card for flopping. That's exactly what we're trying to get out of the game.</li>
        <li>The only way this could've gone better was a clean sheet — but I didn't see anything structurally wrong with the defense. Just Richards and Ream not marking super tightly and the ball bouncing around.</li>
        <li>It was good to see Chris Richards play all 90. Given he was an injury worry coming into the World Cup, that was promising.</li>
        <li>It's really important to win your first game in the world cup, and this result sets us up well to get out of our group and into the knockout rounds</li>
        <li>That was just so much fun. I'm so glad I got to watch.</li>
      </ul>
      <div class="prediction">
        <span class="pl">// The takeaway</span>
        <p class="pbig">Style points <em>matter.</em></p>
        <p>I still worry about what more quality teams might do to our defense, but this game was extremely promising and gives me real hope we can make a run. We dominated a weaker (yet still good!) opponent, and we did it in style. Style points DO matter when you're trying to change the culture of a country — you want awesome highlights kids can watch and go "I want to be like that." Winning, above all, helps that the most.</p>
      </div>
      <p>The full highlights, if you want to watch:</p>
      <div class="wc-video">
        <iframe src="https://www.youtube.com/embed/BXD1_mhODBU" title="USA 4–1 Paraguay — highlights" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>
      </div>
      <div class="wc-shots">
        <figure class="wc-shot">
          <img src="/assets/images/USMNT-slainte-1.jpeg" alt="The crowd watching the USMNT at Sláinte in Manhattan, under World Cup bunting" loading="lazy" />
          <figcaption>Me and Tina in our US soccer jerseys</figcaption>
        </figure>
        <figure class="wc-shot">
          <img src="/assets/images/USMNT-slainte-2.jpeg" alt="Christina and me in our USMNT jerseys" loading="lazy" />
          <figcaption>The atmosphere at Sláinte, Manhattan.</figcaption>
        </figure>
        <figure class="wc-shot">
          <img src="/assets/images/usmnt-2014-chicago-game.jpeg" alt="2014 USMNT watch-party crowd selfie in USA gear" loading="lazy" />
          <figcaption>Throwback: 2014, the night we beat Ghana <a href="https://www.youtube.com/watch?v=5Pp_sK5snmc" target="_blank" rel="noopener">2–1</a>.</figcaption>
        </figure>
      </div>
    </article>

  </div>
</div>

<!-- ============================================================================
     TEMPLATE GALLERY — none of this renders (the whole block is an HTML comment).
     Copy any <article> below up into the stream and edit it.

     Every entry needs:
       data-time="YYYY-MM-DDTHH:MM"   ISO 8601, Eastern — drives the newest-first sort
       data-tags="usmnt" | "tournament" | "offpitch" | ""   drives the filter pills
       a matching <span class="wc-time"> label you write by hand

     === 1) Match recap with score card  (data-tags="tournament") ===
     <article class="wc-entry" data-tags="tournament" data-time="2026-06-14T11:05">
       <div class="wc-entry-meta">
         <span class="wc-time">Jun 14 · 11:05 AM</span>
         <span class="chip tournament">Around the tournament</span>
       </div>
       <h3>Get on the Japan bandwagon</h3>
       <p>End to end, four goals, and Japan playing without a hint of fear. If you needed a second team to adopt, this was your audition tape.</p>
       <div class="match">
         <span class="score">NED 2–2 JPN</span>
         <span class="tag">Group F · matchday 1</span>
       </div>
     </article>

     === 2) Prediction / bold-call box  (data-tags="usmnt") ===
     <article class="wc-entry" data-tags="usmnt" data-time="2026-06-14T09:30">
       <div class="wc-entry-meta">
         <span class="wc-time">Jun 14 · 9:30 AM</span>
         <span class="chip usmnt">USMNT</span>
       </div>
       <div class="prediction">
         <span class="pl">// Calling it</span>
         <p class="pbig">Friday just got <em>bigger.</em></p>
         <p>After the Paraguay result, USA–Australia stopped being a tune-up and became the game that basically decides the group. Win it and we're through with a match to spare.</p>
       </div>
     </article>

     === 3) Hot take / blue translate box  (data-tags="tournament") ===
     <article class="wc-entry" data-tags="tournament" data-time="2026-06-13T19:20">
       <div class="wc-entry-meta">
         <span class="wc-time">Jun 13 · 7:20 PM</span>
         <span class="chip tournament">Around the tournament</span>
       </div>
       <div class="translate">
         <b>Germany watch</b>
         Sharp going forward — Musiala was a problem all night. But that back line got turned twice and got away with it. Better teams won't be so forgiving.
       </div>
     </article>

     === 4) Long-form USMNT breakdown + prediction verdict  (data-tags="usmnt") ===
     <article class="wc-entry" data-tags="usmnt" id="usa-paraguay-breakdown" data-time="2026-06-13T14:15">
       <div class="wc-entry-meta">
         <span class="wc-time">Jun 13 · 2:15 PM</span>
         <span class="chip usmnt">USMNT</span>
       </div>
       <h3>USA–Paraguay: the full breakdown</h3>
       <p>We got the result, but the performance is more interesting than the 4–1 suggests. Pochettino's back three held up better than I expected, and the wing-backs — Robinson and Dest — were the story, pinning Paraguay deep for long stretches and turning our two fastest players into a constant outlet.</p>
       <p>The worry is the same one from the preview: we went flat for fifteen minutes after the second goal and nearly handed it back. Against Türkiye's attacking talent, a lull like that gets punished.</p>
       <div class="prediction">
         <span class="pl">// Still holding</span>
         <p class="pbig">Quarterfinals are <em>still on the table.</em></p>
         <p>One good performance doesn't change the call, but it doesn't hurt it either. Win the group and the bracket opens up.</p>
       </div>
     </article>

     === 5) Off the pitch — plain note  (data-tags="offpitch") ===
     <article class="wc-entry" data-tags="offpitch" data-time="2026-06-13T08:00">
       <div class="wc-entry-meta">
         <span class="wc-time">Jun 13 · 8:00 AM</span>
         <span class="chip offpitch">Off the pitch</span>
       </div>
       <p>I'll die on this hill: the hydration breaks kill every ounce of momentum and exist mostly to sell ads. Just play the game.</p>
     </article>

     === 6) Untagged one-off — only shows under the "All" filter  (data-tags="") ===
     <article class="wc-entry" data-tags="" data-time="2026-06-12T20:40">
       <div class="wc-entry-meta">
         <span class="wc-time">Jun 12 · 8:40 PM</span>
       </div>
       <p>Brief interlude from your regularly scheduled soccer: the Knicks won last night, and I am somehow watching more sports this month than ever. Back to it.</p>
     </article>
============================================================================ -->

<!-- ===== SCORES DATA: sourced from _data/scores.json, refreshed by .github/workflows/scores.yml ===== -->
<script type="application/json" id="wc-scores-data">{"updated":"2026-07-06T15:48:59.171Z","matches":[{"date":"2026-06-11","home":"Mexico","away":"South Africa","homeScore":2,"awayScore":0,"status":"FT","homeCode":"MEX","awayCode":"RSA","group":"A"},{"date":"2026-06-11","home":"South Korea","away":"Czech Republic","homeScore":2,"awayScore":1,"status":"FT","homeCode":"KOR","awayCode":"CZE","group":"A"},{"date":"2026-06-12","home":"Canada","away":"Bosnia & Herzegovina","homeScore":1,"awayScore":1,"status":"FT","homeCode":"CAN","awayCode":"BIH","group":"B"},{"date":"2026-06-12","home":"USA","away":"Paraguay","homeScore":4,"awayScore":1,"status":"FT","homeCode":"USA","awayCode":"PAR","group":"D"},{"date":"2026-06-13","home":"Qatar","away":"Switzerland","homeScore":1,"awayScore":1,"status":"FT","homeCode":"QAT","awayCode":"SUI","group":"B"},{"date":"2026-06-13","home":"Brazil","away":"Morocco","homeScore":1,"awayScore":1,"status":"FT","homeCode":"BRA","awayCode":"MAR","group":"C"},{"date":"2026-06-13","home":"Haiti","away":"Scotland","homeScore":0,"awayScore":1,"status":"FT","homeCode":"HAI","awayCode":"SCO","group":"C"},{"date":"2026-06-13","home":"Australia","away":"Turkey","homeScore":2,"awayScore":0,"status":"FT","homeCode":"AUS","awayCode":"TUR","group":"D"},{"date":"2026-06-14","home":"Germany","away":"Curaçao","homeScore":7,"awayScore":1,"status":"FT","homeCode":"GER","awayCode":"CUW","group":"E"},{"date":"2026-06-14","home":"Ivory Coast","away":"Ecuador","homeScore":1,"awayScore":0,"status":"FT","homeCode":"CIV","awayCode":"ECU","group":"E"},{"date":"2026-06-14","home":"Netherlands","away":"Japan","homeScore":2,"awayScore":2,"status":"FT","homeCode":"NED","awayCode":"JPN","group":"F"},{"date":"2026-06-14","home":"Sweden","away":"Tunisia","homeScore":5,"awayScore":1,"status":"FT","homeCode":"SWE","awayCode":"TUN","group":"F"},{"date":"2026-06-15","home":"Belgium","away":"Egypt","homeScore":1,"awayScore":1,"status":"FT","homeCode":"BEL","awayCode":"EGY","group":"G"},{"date":"2026-06-15","home":"Iran","away":"New Zealand","homeScore":2,"awayScore":2,"status":"FT","homeCode":"IRN","awayCode":"NZL","group":"G"},{"date":"2026-06-15","home":"Spain","away":"Cape Verde","homeScore":0,"awayScore":0,"status":"FT","homeCode":"ESP","awayCode":"CPV","group":"H"},{"date":"2026-06-15","home":"Saudi Arabia","away":"Uruguay","homeScore":1,"awayScore":1,"status":"FT","homeCode":"KSA","awayCode":"URU","group":"H"},{"date":"2026-06-16","home":"France","away":"Senegal","homeScore":3,"awayScore":1,"status":"FT","homeCode":"FRA","awayCode":"SEN","group":"I"},{"date":"2026-06-16","home":"Iraq","away":"Norway","homeScore":1,"awayScore":4,"status":"FT","homeCode":"IRQ","awayCode":"NOR","group":"I"},{"date":"2026-06-16","home":"Argentina","away":"Algeria","homeScore":3,"awayScore":0,"status":"FT","homeCode":"ARG","awayCode":"ALG","group":"J"},{"date":"2026-06-16","home":"Austria","away":"Jordan","homeScore":3,"awayScore":1,"status":"FT","homeCode":"AUT","awayCode":"JOR","group":"J"},{"date":"2026-06-17","home":"Portugal","away":"DR Congo","homeScore":1,"awayScore":1,"status":"FT","homeCode":"POR","awayCode":"COD","group":"K"},{"date":"2026-06-17","home":"Uzbekistan","away":"Colombia","homeScore":1,"awayScore":3,"status":"FT","homeCode":"UZB","awayCode":"COL","group":"K"},{"date":"2026-06-17","home":"England","away":"Croatia","homeScore":4,"awayScore":2,"status":"FT","homeCode":"ENG","awayCode":"CRO","group":"L"},{"date":"2026-06-17","home":"Ghana","away":"Panama","homeScore":1,"awayScore":0,"status":"FT","homeCode":"GHA","awayCode":"PAN","group":"L"},{"date":"2026-06-18","home":"Czech Republic","away":"South Africa","homeScore":1,"awayScore":1,"status":"FT","homeCode":"CZE","awayCode":"RSA","group":"A"},{"date":"2026-06-18","home":"Mexico","away":"South Korea","homeScore":1,"awayScore":0,"status":"FT","homeCode":"MEX","awayCode":"KOR","group":"A"},{"date":"2026-06-18","home":"Switzerland","away":"Bosnia & Herzegovina","homeScore":4,"awayScore":1,"status":"FT","homeCode":"SUI","awayCode":"BIH","group":"B"},{"date":"2026-06-18","home":"Canada","away":"Qatar","homeScore":6,"awayScore":0,"status":"FT","homeCode":"CAN","awayCode":"QAT","group":"B"},{"date":"2026-06-19","home":"Scotland","away":"Morocco","homeScore":0,"awayScore":1,"status":"FT","homeCode":"SCO","awayCode":"MAR","group":"C"},{"date":"2026-06-19","home":"Brazil","away":"Haiti","homeScore":3,"awayScore":0,"status":"FT","homeCode":"BRA","awayCode":"HAI","group":"C"},{"date":"2026-06-19","home":"USA","away":"Australia","homeScore":2,"awayScore":0,"status":"FT","homeCode":"USA","awayCode":"AUS","group":"D"},{"date":"2026-06-19","home":"Turkey","away":"Paraguay","homeScore":0,"awayScore":1,"status":"FT","homeCode":"TUR","awayCode":"PAR","group":"D"},{"date":"2026-06-20","home":"Germany","away":"Ivory Coast","homeScore":2,"awayScore":1,"status":"FT","homeCode":"GER","awayCode":"CIV","group":"E"},{"date":"2026-06-20","home":"Ecuador","away":"Curaçao","homeScore":0,"awayScore":0,"status":"FT","homeCode":"ECU","awayCode":"CUW","group":"E"},{"date":"2026-06-20","home":"Netherlands","away":"Sweden","homeScore":5,"awayScore":1,"status":"FT","homeCode":"NED","awayCode":"SWE","group":"F"},{"date":"2026-06-20","home":"Tunisia","away":"Japan","homeScore":0,"awayScore":4,"status":"FT","homeCode":"TUN","awayCode":"JPN","group":"F"},{"date":"2026-06-21","home":"Belgium","away":"Iran","homeScore":0,"awayScore":0,"status":"FT","homeCode":"BEL","awayCode":"IRN","group":"G"},{"date":"2026-06-21","home":"New Zealand","away":"Egypt","homeScore":1,"awayScore":3,"status":"FT","homeCode":"NZL","awayCode":"EGY","group":"G"},{"date":"2026-06-21","home":"Spain","away":"Saudi Arabia","homeScore":4,"awayScore":0,"status":"FT","homeCode":"ESP","awayCode":"KSA","group":"H"},{"date":"2026-06-21","home":"Uruguay","away":"Cape Verde","homeScore":2,"awayScore":2,"status":"FT","homeCode":"URU","awayCode":"CPV","group":"H"},{"date":"2026-06-22","home":"France","away":"Iraq","homeScore":3,"awayScore":0,"status":"FT","homeCode":"FRA","awayCode":"IRQ","group":"I"},{"date":"2026-06-22","home":"Norway","away":"Senegal","homeScore":3,"awayScore":2,"status":"FT","homeCode":"NOR","awayCode":"SEN","group":"I"},{"date":"2026-06-22","home":"Argentina","away":"Austria","homeScore":2,"awayScore":0,"status":"FT","homeCode":"ARG","awayCode":"AUT","group":"J"},{"date":"2026-06-22","home":"Jordan","away":"Algeria","homeScore":1,"awayScore":2,"status":"FT","homeCode":"JOR","awayCode":"ALG","group":"J"},{"date":"2026-06-23","home":"Portugal","away":"Uzbekistan","homeScore":5,"awayScore":0,"status":"FT","homeCode":"POR","awayCode":"UZB","group":"K"},{"date":"2026-06-23","home":"Colombia","away":"DR Congo","homeScore":1,"awayScore":0,"status":"FT","homeCode":"COL","awayCode":"COD","group":"K"},{"date":"2026-06-23","home":"England","away":"Ghana","homeScore":0,"awayScore":0,"status":"FT","homeCode":"ENG","awayCode":"GHA","group":"L"},{"date":"2026-06-23","home":"Panama","away":"Croatia","homeScore":0,"awayScore":1,"status":"FT","homeCode":"PAN","awayCode":"CRO","group":"L"},{"date":"2026-06-24","home":"Czech Republic","away":"Mexico","homeScore":0,"awayScore":3,"status":"FT","homeCode":"CZE","awayCode":"MEX","group":"A"},{"date":"2026-06-24","home":"South Africa","away":"South Korea","homeScore":1,"awayScore":0,"status":"FT","homeCode":"RSA","awayCode":"KOR","group":"A"},{"date":"2026-06-24","home":"Switzerland","away":"Canada","homeScore":2,"awayScore":1,"status":"FT","homeCode":"SUI","awayCode":"CAN","group":"B"},{"date":"2026-06-24","home":"Bosnia & Herzegovina","away":"Qatar","homeScore":3,"awayScore":1,"status":"FT","homeCode":"BIH","awayCode":"QAT","group":"B"},{"date":"2026-06-24","home":"Scotland","away":"Brazil","homeScore":0,"awayScore":3,"status":"FT","homeCode":"SCO","awayCode":"BRA","group":"C"},{"date":"2026-06-24","home":"Morocco","away":"Haiti","homeScore":4,"awayScore":2,"status":"FT","homeCode":"MAR","awayCode":"HAI","group":"C"},{"date":"2026-06-25","home":"Turkey","away":"USA","homeScore":3,"awayScore":2,"status":"FT","homeCode":"TUR","awayCode":"USA","group":"D"},{"date":"2026-06-25","home":"Paraguay","away":"Australia","homeScore":0,"awayScore":0,"status":"FT","homeCode":"PAR","awayCode":"AUS","group":"D"},{"date":"2026-06-25","home":"Curaçao","away":"Ivory Coast","homeScore":0,"awayScore":2,"status":"FT","homeCode":"CUW","awayCode":"CIV","group":"E"},{"date":"2026-06-25","home":"Ecuador","away":"Germany","homeScore":2,"awayScore":1,"status":"FT","homeCode":"ECU","awayCode":"GER","group":"E"},{"date":"2026-06-25","home":"Japan","away":"Sweden","homeScore":1,"awayScore":1,"status":"FT","homeCode":"JPN","awayCode":"SWE","group":"F"},{"date":"2026-06-25","home":"Tunisia","away":"Netherlands","homeScore":1,"awayScore":3,"status":"FT","homeCode":"TUN","awayCode":"NED","group":"F"},{"date":"2026-06-26","home":"Egypt","away":"Iran","homeScore":1,"awayScore":1,"status":"FT","homeCode":"EGY","awayCode":"IRN","group":"G"},{"date":"2026-06-26","home":"New Zealand","away":"Belgium","homeScore":1,"awayScore":5,"status":"FT","homeCode":"NZL","awayCode":"BEL","group":"G"},{"date":"2026-06-26","home":"Cape Verde","away":"Saudi Arabia","homeScore":0,"awayScore":0,"status":"FT","homeCode":"CPV","awayCode":"KSA","group":"H"},{"date":"2026-06-26","home":"Uruguay","away":"Spain","homeScore":0,"awayScore":1,"status":"FT","homeCode":"URU","awayCode":"ESP","group":"H"},{"date":"2026-06-26","home":"Norway","away":"France","homeScore":1,"awayScore":4,"status":"FT","homeCode":"NOR","awayCode":"FRA","group":"I"},{"date":"2026-06-26","home":"Senegal","away":"Iraq","homeScore":5,"awayScore":0,"status":"FT","homeCode":"SEN","awayCode":"IRQ","group":"I"},{"date":"2026-06-27","home":"Algeria","away":"Austria","homeScore":3,"awayScore":3,"status":"FT","homeCode":"ALG","awayCode":"AUT","group":"J"},{"date":"2026-06-27","home":"Jordan","away":"Argentina","homeScore":1,"awayScore":3,"status":"FT","homeCode":"JOR","awayCode":"ARG","group":"J"},{"date":"2026-06-27","home":"Colombia","away":"Portugal","homeScore":0,"awayScore":0,"status":"FT","homeCode":"COL","awayCode":"POR","group":"K"},{"date":"2026-06-27","home":"DR Congo","away":"Uzbekistan","homeScore":3,"awayScore":1,"status":"FT","homeCode":"COD","awayCode":"UZB","group":"K"},{"date":"2026-06-27","home":"Panama","away":"England","homeScore":0,"awayScore":2,"status":"FT","homeCode":"PAN","awayCode":"ENG","group":"L"},{"date":"2026-06-27","home":"Croatia","away":"Ghana","homeScore":2,"awayScore":1,"status":"FT","homeCode":"CRO","awayCode":"GHA","group":"L"},{"date":"2026-06-28","home":"South Africa","away":"Canada","homeScore":0,"awayScore":1,"status":"FT","homeCode":"RSA","awayCode":"CAN"},{"date":"2026-06-29","home":"Germany","away":"Paraguay","homeScore":1,"awayScore":1,"status":"FT","homeCode":"GER","awayCode":"PAR"},{"date":"2026-06-29","home":"Netherlands","away":"Morocco","homeScore":1,"awayScore":1,"status":"FT","homeCode":"NED","awayCode":"MAR"},{"date":"2026-06-29","home":"Brazil","away":"Japan","homeScore":2,"awayScore":1,"status":"FT","homeCode":"BRA","awayCode":"JPN"},{"date":"2026-06-30","home":"France","away":"Sweden","homeScore":3,"awayScore":0,"status":"FT","homeCode":"FRA","awayCode":"SWE"},{"date":"2026-06-30","home":"Ivory Coast","away":"Norway","homeScore":1,"awayScore":2,"status":"FT","homeCode":"CIV","awayCode":"NOR"},{"date":"2026-06-30","home":"Mexico","away":"Ecuador","homeScore":2,"awayScore":0,"status":"FT","homeCode":"MEX","awayCode":"ECU"},{"date":"2026-07-01","home":"England","away":"DR Congo","homeScore":2,"awayScore":1,"status":"FT","homeCode":"ENG","awayCode":"COD"},{"date":"2026-07-01","home":"USA","away":"Bosnia & Herzegovina","homeScore":2,"awayScore":0,"status":"FT","homeCode":"USA","awayCode":"BIH"},{"date":"2026-07-01","home":"Belgium","away":"Senegal","homeScore":2,"awayScore":2,"status":"FT","homeCode":"BEL","awayCode":"SEN"},{"date":"2026-07-02","home":"Portugal","away":"Croatia","homeScore":2,"awayScore":1,"status":"FT","homeCode":"POR","awayCode":"CRO"},{"date":"2026-07-02","home":"Spain","away":"Austria","homeScore":3,"awayScore":0,"status":"FT","homeCode":"ESP","awayCode":"AUT"},{"date":"2026-07-02","home":"Switzerland","away":"Algeria","homeScore":2,"awayScore":0,"status":"FT","homeCode":"SUI","awayCode":"ALG"},{"date":"2026-07-03","home":"Argentina","away":"Cape Verde","homeScore":1,"awayScore":1,"status":"FT","homeCode":"ARG","awayCode":"CPV"},{"date":"2026-07-03","home":"Colombia","away":"Ghana","homeScore":1,"awayScore":0,"status":"FT","homeCode":"COL","awayCode":"GHA"},{"date":"2026-07-03","home":"Australia","away":"Egypt","homeScore":1,"awayScore":1,"status":"FT","homeCode":"AUS","awayCode":"EGY"},{"date":"2026-07-04","home":"Paraguay","away":"France","homeScore":0,"awayScore":1,"status":"FT","homeCode":"PAR","awayCode":"FRA"},{"date":"2026-07-04","home":"Canada","away":"Morocco","homeScore":0,"awayScore":3,"status":"FT","homeCode":"CAN","awayCode":"MAR"},{"date":"2026-07-05","home":"Brazil","away":"Norway","homeScore":1,"awayScore":2,"status":"FT","homeCode":"BRA","awayCode":"NOR"},{"date":"2026-07-05","home":"Mexico","away":"England","homeScore":2,"awayScore":3,"status":"FT","homeCode":"MEX","awayCode":"ENG"},{"date":"2026-07-06","home":"Portugal","away":"Spain","homeScore":null,"awayScore":null,"status":"scheduled","homeCode":"POR","awayCode":"ESP","kickoff":"14:00 UTC-5"},{"date":"2026-07-06","home":"USA","away":"Belgium","homeScore":null,"awayScore":null,"status":"scheduled","homeCode":"USA","awayCode":"BEL","kickoff":"17:00 UTC-7"},{"date":"2026-07-07","home":"Argentina","away":"Egypt","homeScore":null,"awayScore":null,"status":"scheduled","homeCode":"ARG","awayCode":"EGY","kickoff":"12:00 UTC-4"},{"date":"2026-07-07","home":"Switzerland","away":"Colombia","homeScore":null,"awayScore":null,"status":"scheduled","homeCode":"SUI","awayCode":"COL","kickoff":"13:00 UTC-7"},{"date":"2026-07-09","home":"France","away":"Morocco","homeScore":null,"awayScore":null,"status":"scheduled","homeCode":"FRA","awayCode":"MAR","kickoff":"16:00 UTC-4"},{"date":"2026-07-10","home":"W93","away":"W94","homeScore":null,"awayScore":null,"status":"scheduled","kickoff":"12:00 UTC-7"},{"date":"2026-07-11","home":"Norway","away":"England","homeScore":null,"awayScore":null,"status":"scheduled","homeCode":"NOR","awayCode":"ENG","kickoff":"17:00 UTC-4"},{"date":"2026-07-11","home":"W95","away":"W96","homeScore":null,"awayScore":null,"status":"scheduled","kickoff":"20:00 UTC-5"},{"date":"2026-07-14","home":"W97","away":"W98","homeScore":null,"awayScore":null,"status":"scheduled","kickoff":"14:00 UTC-5"},{"date":"2026-07-15","home":"W99","away":"W100","homeScore":null,"awayScore":null,"status":"scheduled","kickoff":"15:00 UTC-4"},{"date":"2026-07-18","home":"L101","away":"L102","homeScore":null,"awayScore":null,"status":"scheduled","kickoff":"17:00 UTC-4"},{"date":"2026-07-19","home":"W101","away":"W102","homeScore":null,"awayScore":null,"status":"scheduled","kickoff":"15:00 UTC-4"}]}</script>

</div>

<script>
(function(){
  /* ---- tag filter (same idea as the preview's setPhase toggle) ---- */
  var pills = [].slice.call(document.querySelectorAll('.wc-pill'));
  var entries = [].slice.call(document.querySelectorAll('.wc-entry'));
  var count = document.getElementById('wc-count');

  /* keep the stream in reverse-chronological order (newest first) regardless of how
     entries are pasted into the HTML — sort by data-time (ISO strings sort by date). */
  (function(){
    var stream = entries.length && entries[0].parentNode;
    if (!stream) return;
    entries.slice().sort(function(a,b){
      return (b.getAttribute('data-time') || '').localeCompare(a.getAttribute('data-time') || '');
    }).forEach(function(e){ stream.appendChild(e); });
  })();
  function apply(tag){
    pills.forEach(function(p){ p.classList.toggle('on', p.dataset.filter === tag); });
    var shown = 0;
    entries.forEach(function(e){
      var tags = (e.getAttribute('data-tags') || '').trim().split(/\s+/);
      var vis = tag === 'all' || tags.indexOf(tag) > -1;
      e.style.display = vis ? '' : 'none';
      if (vis) shown++;
    });
    if (count) count.textContent = shown + (shown === 1 ? ' entry' : ' entries');
  }
  pills.forEach(function(p){ p.addEventListener('click', function(){ apply(p.dataset.filter); }); });
  apply('all');

  /* ---- scores panel: today (live) + yesterday + collapsible all ----
     Strategy: render immediately from the committed _data/scores.json so there's
     no blank flash, then overlay genuinely live data from ESPN's free, no-key
     scoreboard endpoint (CORS-open). Polling happens in the visitor's browser —
     zero GitHub Actions compute — and only runs while a match is live/upcoming
     today, pausing when the tab is hidden. If ESPN is ever unreachable we just
     keep showing the static data. */
  (function(){
    var POLL_MS = 60000;
    var ESPN = 'https://site.api.espn.com/apis/site/v2/sports/soccer/fifa.world/scoreboard';
    var todayRow = document.getElementById('wc-today-row');
    var yestRow  = document.getElementById('wc-yesterday-row');
    var allBody  = document.getElementById('wc-all-body');
    var liveFlag = document.getElementById('wc-live-flag');
    if (!todayRow) return;

    /* Everything is bucketed and displayed in US Eastern (ET), regardless of the
       visitor's timezone, and keyed off each match's KICKOFF INSTANT — so a game
       that starts late-night ET (early-morning UTC) stays on its ET calendar day
       instead of bleeding into the previous/next day. */
    var TZ = 'America/New_York';
    var _dayFmt = new Intl.DateTimeFormat('en-US', {timeZone:TZ, year:'numeric', month:'2-digit', day:'2-digit'});
    function estDay(d){ var p={}; _dayFmt.formatToParts(d).forEach(function(x){ p[x.type]=x.value; }); return p.year+'-'+p.month+'-'+p.day; }
    function addDays(str, n){ var p=str.split('-'); var dt=new Date(Date.UTC(+p[0],+p[1]-1,+p[2])); dt.setUTCDate(dt.getUTCDate()+n); return dt.toISOString().slice(0,10); }
    /* A "matchday" runs from MATCHDAY_START_ET to the same hour the next morning, so a
       late-night kickoff (midnight / 1 AM ET) stays grouped with the evening slate it
       belongs to instead of jumping to the next calendar day. Safe because no WC match
       kicks off between midnight and noon ET — the cutoff sits in a dead zone, so it
       only ever rolls back genuine late games, never misfiles a daytime one. */
    var MATCHDAY_START_ET = 6;                // 6 AM ET — games before this count as the prior day
    function matchDay(d){ return estDay(new Date(d.getTime() - MATCHDAY_START_ET*3600000)); }
    var todayKey = matchDay(new Date());      // current matchday, 'YYYY-MM-DD'
    var yestKey  = addDays(todayKey, -1);
    var tomKey   = addDays(todayKey, 1);
    function ymd(str){ return str.replace(/-/g, ''); }          // 'YYYY-MM-DD' -> 'YYYYMMDD' for ESPN's dates param
    function esc(s){ return String(s == null ? '' : s).replace(/[&<>]/g, function(c){ return {'&':'&amp;','<':'&lt;','>':'&gt;'}[c]; }); }
    var _timeFmt = new Intl.DateTimeFormat('en-US', {timeZone:TZ, hour:'numeric', minute:'2-digit'});
    function fmtTime(d){ try { return _timeFmt.format(d) + ' ET'; } catch(e){ return ''; } }
    var _dayLabelFmt = new Intl.DateTimeFormat('en-US', {timeZone:TZ, weekday:'short', month:'short', day:'numeric'});
    function fmtDay(d){ try { return _dayLabelFmt.format(d); } catch(e){ return ''; } }

    /* --- normalize the two data sources into one shape --- */
    function normStatic(m){
      return {
        when: new Date(m.date + 'T00:00:00'),
        key: m.date,                          // fallback data has no kickoff time; trust its published matchday date
        home: m.homeCode || m.home, away: m.awayCode || m.away,
        homeScore: m.homeScore, awayScore: m.awayScore,
        state: m.status === 'FT' ? 'post' : 'pre',
        clock: 'FT', kickoff: m.kickoff
      };
    }
    function normEspn(ev){
      var c = (ev.competitions && ev.competitions[0]) || {};
      var cs = c.competitors || [];
      var h = cs[0] || {}, a = cs[1] || {};
      for (var i=0;i<cs.length;i++){ if (cs[i].homeAway === 'home') h = cs[i]; if (cs[i].homeAway === 'away') a = cs[i]; }
      var t = (c.status && c.status.type) || {};
      var when = new Date(ev.date);
      function sc(x){ return (x.score == null || x.score === '') ? null : +x.score; }
      function nm(x){ var tm = x.team || {}; return tm.abbreviation || tm.shortDisplayName || tm.displayName || '?'; }
      return {
        when: when, key: matchDay(when),      // bucket by ET matchday of the kickoff instant
        home: nm(h), away: nm(a),
        homeScore: sc(h), awayScore: sc(a),
        state: t.state || 'pre',                 // 'pre' | 'in' | 'post'
        clock: (c.status && c.status.displayClock) || t.shortDetail || '',
        kickoff: null
      };
    }

    // 🦅 easter egg: true when the USA has more goals (a win at FT, or leading live)
    function usaWon(m){
      if (m.homeScore == null || m.awayScore == null) return false;
      if (m.home === 'USA' && m.homeScore > m.awayScore) return true;
      if (m.away === 'USA' && m.awayScore > m.homeScore) return true;
      return false;
    }
    function chip(m){
      var hs = m.homeScore == null ? 0 : m.homeScore;
      var as = m.awayScore == null ? 0 : m.awayScore;
      var egg = usaWon(m) ? ' usa-win" title="🦅' : '';   // closes class attr, adds a title hint
      if (m.state === 'in'){
        return '<span class="score-chip live' + egg + '"><span class="dot"></span>' + esc(m.home) + ' ' + hs + '–' + as + ' ' + esc(m.away) + ' <i>' + esc(m.clock || 'LIVE') + '</i></span>';
      }
      if (m.state === 'post'){
        return '<span class="score-chip' + egg + '">' + esc(m.home) + ' ' + hs + '–' + as + ' ' + esc(m.away) + ' <i>FT</i></span>';
      }
      var t = m.kickoff || (m.when && fmtTime(m.when)) || 'soon';
      return '<span class="score-chip">' + esc(m.home) + ' v ' + esc(m.away) + ' <i>' + esc(t) + '</i></span>';
    }
    function row(el, list, emptyMsg){
      el.innerHTML = list.length ? list.map(chip).join('') : '<span class="score-empty">' + emptyMsg + '</span>';
    }

    function buckets(list){
      var t = [], y = [];
      list.forEach(function(m){ if (m.key === todayKey) t.push(m); else if (m.key === yestKey) y.push(m); });
      function byWhen(a,b){ return a.when - b.when; }
      t.sort(byWhen); y.sort(byWhen);
      return { today: t, yest: y };
    }

    function renderDays(b){
      row(todayRow, b.today, 'No matches today');
      row(yestRow, b.yest, 'No matches');
      liveFlag.hidden = !b.today.some(function(m){ return m.state === 'in'; });
    }

    /* --- completed results only, grouped by date, newest first, in the collapsed
       <details>. Unplayed matches are intentionally excluded (they'd also surface
       meaningless knockout-bracket placeholders like "1A"/"W73"). --- */
    function renderAll(staticMatches){
      var byDay = {}, order = [];
      staticMatches.map(normStatic).filter(function(m){ return m.state === 'post'; }).forEach(function(m){
        var iso = m.key;
        if (!byDay[iso]){ byDay[iso] = []; order.push(iso); }
        byDay[iso].push(m);
      });
      order.sort().reverse();   // most recent matchday first
      allBody.innerHTML = order.map(function(iso){
        return '<div class="score-all-day"><span class="d">' + esc(fmtDay(new Date(iso + 'T12:00:00Z'))) +
               '</span><div class="score-row">' + byDay[iso].map(chip).join('') + '</div></div>';
      }).join('') || '<span class="score-empty">No results yet</span>';
    }

    /* --- bootstrap from static data (instant) --- */
    var staticMatches = [];
    try { staticMatches = (JSON.parse(document.getElementById('wc-scores-data').textContent).matches) || []; } catch(e){}
    var staticB = buckets(staticMatches.map(normStatic));
    renderDays(staticB);
    renderAll(staticMatches);

    /* --- 🦅 easter egg: click a USA-win chip and an eagle (with a spinning ball)
       soars across the screen. Event delegation on the stable row containers, so it
       keeps working after the live re-renders swap their innerHTML. --- */
    function flyEagle(){
      if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
      var prev = document.querySelector('.wc-eagle'); if (prev) prev.remove();
      var e = document.createElement('div');
      e.className = 'wc-eagle';
      e.setAttribute('aria-hidden', 'true');
      e.innerHTML = '<span class="bird">🦅</span><span class="ball">⚽</span>';
      document.body.appendChild(e);
      e.addEventListener('animationend', function(){ e.remove(); });
      setTimeout(function(){ if (e.parentNode) e.remove(); }, 4000); // safety net
    }
    [todayRow, yestRow, allBody].forEach(function(el){
      el.addEventListener('click', function(ev){
        var t = ev.target.closest && ev.target.closest('.usa-win');
        if (t) flyEagle();
      });
    });

    /* --- overlay live ESPN data, polite polling --- */
    var pollTimer = null;
    function maybeSchedule(todayList){
      var active = todayList.some(function(m){ return m.state === 'in' || m.state === 'pre'; });
      if (active && !pollTimer) pollTimer = setInterval(tick, POLL_MS);
      else if (!active && pollTimer){ clearInterval(pollTimer); pollTimer = null; }
    }
    function tick(){ if (!document.hidden) refresh(); }
    function refresh(){
      fetch(ESPN + '?dates=' + ymd(yestKey) + '-' + ymd(tomKey))
        .then(function(r){ if (!r.ok) throw new Error(r.status); return r.json(); })
        .then(function(j){
          var b = buckets(((j && j.events) || []).map(normEspn));
          // keep static for a day ESPN returned nothing for, so we never blank it out
          if (!b.today.length) b.today = staticB.today;
          if (!b.yest.length)  b.yest  = staticB.yest;
          renderDays(b);
          maybeSchedule(b.today);
        })
        .catch(function(){ maybeSchedule(staticB.today); }); // ESPN down: keep static, retry if today still open
    }
    document.addEventListener('visibilitychange', function(){ if (!document.hidden) refresh(); });
    refresh();
  })();

  /* ---- countdown to USA's next match (reuses the preview's countdown trick) ----
     SINGLE SOURCE OF TRUTH — update only NEXT_USMNT below after each USMNT game.
       • Known next game : set opponent + kickoff (ISO 8601 w/ ET offset) + dateLabel.
       • Date not set yet : set kickoff to null  -> the line reads "... TBD".
                            (e.g. a knockout opponent/time we don't know yet)
       • USA eliminated  : set eliminated to true -> the whole line is removed. */
  var NEXT_USMNT = {
    opponent : 'USA vs Belgium',
    kickoff  : '2026-07-06T20:00:00-04:00', // null when unknown -> shows TBD
    dateLabel: 'Jul 6 · 8:00 PM ET',
    eliminated: false                        // true -> hide the line entirely
  };
  (function(){
    var line = document.getElementById('wc-next-line');
    var el   = document.getElementById('wc-next');
    if (!line || !el) return;

    if (NEXT_USMNT.eliminated) { line.remove(); return; }

    // No confirmed date yet -> TBD, no live countdown.
    if (!NEXT_USMNT.kickoff) {
      line.innerHTML = 'Next USMNT match · ' + NEXT_USMNT.opponent + ' · TBD';
      return;
    }

    line.innerHTML = 'Next USMNT match in <b id="wc-next">—</b> · ' +
                     NEXT_USMNT.opponent + ' · ' + NEXT_USMNT.dateLabel;
    el = document.getElementById('wc-next');
    var target = new Date(NEXT_USMNT.kickoff).getTime();
    function tick(){
      var d = target - Date.now();
      if (d < 0) { el.textContent = 'now'; return; }
      var days = Math.floor(d / 864e5), h = Math.floor(d % 864e5 / 36e5);
      el.textContent = days + 'd ' + h + 'h';
    }
    tick(); setInterval(tick, 60000);
  })();
})();
</script>]]></content><author><name></name></author><category term="sports" /><category term="sports" /><category term="soccer" /><summary type="html"><![CDATA[Following the 2026 World Cup as it happens]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://jmozden3.github.io/assets/images/usmnt-goal-hug.png" /><media:content medium="image" url="https://jmozden3.github.io/assets/images/usmnt-goal-hug.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">2026 World Cup Preview</title><link href="https://joemozden.com/sports/2026/06/10/wc-preview.html" rel="alternate" type="text/html" title="2026 World Cup Preview" /><published>2026-06-10T17:00:00+00:00</published><updated>2026-06-10T17:00:00+00:00</updated><id>https://joemozden.com/sports/2026/06/10/wc-preview</id><content type="html" xml:base="https://joemozden.com/sports/2026/06/10/wc-preview.html"><![CDATA[<style>
  :root{
    --pitch:#08201b;          /* stadium night */
    --pitch-2:#0c2a22;
    --turf:#15613f;           /* mown grass */
    --turf-line:#7fdcab;
    --chalk:#f4f8f3;          /* pitch lines / light text */
    --paper:#fafbfa;          /* page bg */
    --ink:#0d211c;            /* near-black green */
    --ink-soft:#46584f;
    --accent:#ff4332;         /* kit red — energy */
    --accent-ink:#c8261a;
    --blue:#2f6bff;           /* away kit blue */
    --gold:#e4b14c;           /* trophy */
    --line:#e2e7e2;
    --radius:14px;
    --maxw:1080px;
  }
  .wcg *{box-sizing:border-box;margin:0;padding:0}
  html{scroll-behavior:smooth}
  .wcg{
    font-family:'Inter',system-ui,sans-serif;
    color:var(--ink);background:var(--paper);
    line-height:1.65;-webkit-font-smoothing:antialiased;
  }
  @media (prefers-reduced-motion:reduce){
    html{scroll-behavior:auto}
    .wcg *{transition:none!important;animation:none!important}
  }

  /* ---------- type ---------- */
  .wcg h1,.wcg h2,.wcg h3{font-family:'Archivo',sans-serif;line-height:1.02;letter-spacing:-.02em}
  .eyebrow{
    font-family:'Space Mono',monospace;font-size:.78rem;letter-spacing:.04em;
    text-transform:uppercase;color:var(--accent-ink);font-weight:700;
  }
  .eyebrow .num{color:var(--ink-soft)}
  .wcg p{margin:0 0 1rem}
  .wcg a{color:var(--accent-ink)}

  /* ---------- layout ---------- */
  .wrap{max-width:var(--maxw);margin:0 auto;padding:0 24px}
  .wcg section{padding:84px 0;border-bottom:1px solid var(--line);scroll-margin-top:84px}
  @media(max-width:768px){.wcg section{scroll-margin-top:150px}}
  .sec-head{max-width:680px;margin-bottom:34px}
  .sec-head h2{font-size:clamp(2rem,5vw,3.1rem);font-weight:900;margin:.35rem 0 .5rem;text-transform:uppercase}
  .sec-head p.lede{font-size:1.12rem;color:var(--ink-soft)}

  /* ---------- nav ---------- */

  /* ---------- table of contents (non-sticky) ---------- */
  .toc-wrap{padding-top:44px;padding-bottom:44px}
  .toc{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:24px 26px}
  .toc-head{
    font-family:'Space Mono',monospace;font-size:.78rem;letter-spacing:.04em;
    text-transform:uppercase;color:var(--accent-ink);font-weight:700;display:block;margin-bottom:16px;
  }
  .toc-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}
  @media(max-width:680px){.toc-grid{grid-template-columns:1fr}}
  .toc-item{
    display:flex;align-items:baseline;gap:12px;text-decoration:none;color:var(--ink);
    border:1px solid transparent;border-radius:10px;padding:10px 12px;transition:all .15s;
  }
  .toc-item:hover,.toc-item:focus-visible{border-color:var(--accent);background:rgba(255,67,50,.04);transform:translateX(3px);outline:none}
  .toc-item .tn{font-family:'Space Mono',monospace;font-size:.8rem;font-weight:700;color:var(--accent-ink);min-width:1.6em}
  .toc-item .tt{font-family:'Archivo',sans-serif;font-weight:700;font-size:1rem;text-transform:uppercase;letter-spacing:-.01em;line-height:1.2}

  /* ---------- hero ---------- */
  .hero{
    background:radial-gradient(120% 120% at 80% -10%,var(--pitch-2),var(--pitch) 60%);
    color:var(--chalk);border-bottom:none;position:relative;overflow:hidden;
    padding:96px 0 104px;
  }
  .hero::after{ /* faint pitch lines */
    content:"";position:absolute;inset:0;opacity:.10;pointer-events:none;
    background:
      linear-gradient(transparent 49.6%,var(--turf-line) 49.6%,var(--turf-line) 50.4%,transparent 50.4%),
      radial-gradient(circle at 50% 50%,transparent 118px,var(--turf-line) 118px,var(--turf-line) 121px,transparent 121px);
  }
  .hero .eyebrow{color:#ff8c7f}
  .hero h1{
    font-size:clamp(2.7rem,8vw,5.6rem);font-weight:900;text-transform:uppercase;
    margin:.5rem 0 1rem;max-width:13ch;
  }
  .hero h1 em{font-style:normal;color:var(--accent)}
  .hero p.sub{font-size:1.2rem;max-width:46ch;color:#cfe0d7;margin-bottom:30px}
  .stamp{
    display:inline-flex;gap:18px;align-items:center;flex-wrap:wrap;
    font-family:'Space Mono',monospace;font-size:.82rem;color:#9fc4b3;
    border:1px solid rgba(127,220,171,.3);border-radius:999px;padding:10px 20px;
  }
  .stamp b{color:var(--chalk)}
  .countdown{display:flex;gap:14px;margin-top:34px;flex-wrap:wrap}
  .cd-box{background:rgba(255,255,255,.06);border:1px solid rgba(127,220,171,.18);border-radius:12px;padding:12px 16px;min-width:74px;text-align:center}
  .cd-box .n{font-family:'Archivo';font-weight:900;font-size:2rem;display:block;line-height:1}
  .cd-box .l{font-family:'Space Mono',monospace;font-size:.64rem;text-transform:uppercase;color:#9fc4b3;letter-spacing:.08em}

  /* ---------- draft callout (where Joe writes) ---------- */
  .draft{
    border:1.5px dashed var(--accent);border-radius:var(--radius);
    background:rgba(255,67,50,.045);padding:20px 22px;margin:8px 0 4px;
  }
  .draft .tag{
    font-family:'Space Mono',monospace;font-size:.72rem;font-weight:700;color:var(--accent-ink);
    text-transform:uppercase;letter-spacing:.04em;display:block;margin-bottom:8px;
  }
  .draft .angle{font-weight:600;margin-bottom:6px}
  .draft ul{margin:6px 0 0 18px;color:var(--ink-soft);font-size:.94rem}
  .draft li{margin-bottom:3px}

  /* ---------- clean callout (finished content) ---------- */
  .callout{background:#f4f7f4;border:1px solid var(--line);border-radius:var(--radius);padding:22px 24px;margin:8px 0 4px}
  .callout > ul{margin:0 0 0 18px;color:var(--ink);font-size:.96rem}
  .callout li{margin-bottom:7px}
  .callout ul ul{margin-top:6px;margin-left:22px}
  .callout-dark{background:rgba(255,255,255,.06);border:1px solid rgba(127,220,171,.2);border-radius:12px;padding:18px 20px;margin-top:18px}
  .callout-dark a{color:#ff8c7f}

  /* ---------- my-prediction verdict box ---------- */
  .prediction{
    background:radial-gradient(120% 140% at 85% -20%,var(--pitch-2),var(--pitch) 65%);
    color:var(--chalk);border:1px solid rgba(127,220,171,.25);border-left:5px solid var(--accent);
    border-radius:var(--radius);padding:24px 26px;margin-top:30px;
  }
  .prediction .pl{font-family:'Space Mono',monospace;font-size:.74rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#ff8c7f;display:block;margin-bottom:8px}
  .prediction .pbig{font-family:'Archivo';font-weight:900;font-size:clamp(1.5rem,4.4vw,2.15rem);text-transform:uppercase;line-height:1.04;margin:0 0 10px}
  .prediction .pbig em{font-style:normal;color:var(--accent)}
  .prediction p{color:#cfe0d7;font-size:.98rem;margin:0}

  /* ---------- "in american terms" device ---------- */
  .translate{
    border-left:4px solid var(--blue);background:#f1f5ff;border-radius:0 12px 12px 0;
    padding:14px 18px;margin:18px 0;font-size:.97rem;
  }
  .translate b{font-family:'Space Mono',monospace;font-size:.74rem;text-transform:uppercase;letter-spacing:.04em;color:var(--blue);display:block;margin-bottom:4px}

  /* ---------- format cards ---------- */
  .grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
  @media(max-width:760px){.grid-3{grid-template-columns:1fr}}
  .card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:22px}
  .card .big{font-family:'Archivo';font-weight:900;font-size:2.4rem;color:var(--accent-ink);line-height:1}
  .card h3{font-size:1.05rem;margin:6px 0 4px;text-transform:uppercase;letter-spacing:-.01em}
  .card p{font-size:.92rem;color:var(--ink-soft);margin:0}

  /* ---------- bracket graphic ---------- */
  .bracket{margin:26px 0 4px}
  .bracket img{width:100%;height:auto;display:block;border:1px solid var(--line);border-radius:var(--radius);background:#0d0d0d}
  .bracket figcaption{font-family:'Space Mono',monospace;font-size:.74rem;color:var(--ink-soft);text-transform:uppercase;letter-spacing:.03em;margin-top:10px;text-align:center}

  /* ---------- FORMATION PITCH (signature) ---------- */
  .pitch-section{background:linear-gradient(180deg,var(--pitch),var(--pitch-2));color:var(--chalk);border-bottom:none}
  .pitch-section .eyebrow{color:#ff8c7f}
  .pitch-section h2{color:var(--chalk)}
  .pitch-section .lede{color:#cfe0d7}
  .toggle{display:inline-flex;background:rgba(255,255,255,.07);border:1px solid rgba(127,220,171,.25);border-radius:999px;padding:5px;margin:6px 0 26px;gap:4px}
  .toggle button{
    font-family:'Space Mono',monospace;font-size:.82rem;font-weight:700;cursor:pointer;
    border:0;background:transparent;color:#cfe0d7;padding:9px 18px;border-radius:999px;transition:all .25s;text-transform:uppercase;letter-spacing:.02em;
  }
  .toggle button.on{background:var(--accent);color:#fff}
  .pitch-stage{display:grid;grid-template-columns:1.1fr .9fr;gap:30px;align-items:start}
  @media(max-width:820px){.pitch-stage{grid-template-columns:1fr}}
  .pitch{
    position:relative;width:100%;aspect-ratio:7/9;max-width:480px;margin:0 auto;
    background:
      repeating-linear-gradient(0deg,#167045 0 11.11%,#13603c 11.11% 22.22%);
    border:2px solid rgba(244,248,243,.55);border-radius:10px;overflow:hidden;
  }
  .pitch .lines{position:absolute;inset:0;pointer-events:none}
  .pitch .lines i{position:absolute;border:2px solid rgba(244,248,243,.55)}
  .l-mid{top:50%;left:0;right:0;border-width:2px 0 0 0!important}
  .l-circle{top:50%;left:50%;width:88px;height:88px;border-radius:50%;transform:translate(-50%,-50%)}
  .l-boxT{top:-2px;left:50%;width:46%;height:15%;transform:translateX(-50%)}
  .l-boxB{bottom:-2px;left:50%;width:46%;height:15%;transform:translateX(-50%)}
  .l-6T{top:-2px;left:50%;width:24%;height:7%;transform:translateX(-50%)}
  .l-6B{bottom:-2px;left:50%;width:24%;height:7%;transform:translateX(-50%)}
  .player{
    position:absolute;transform:translate(-50%,-50%);transition:top .75s cubic-bezier(.6,.05,.2,1),left .75s cubic-bezier(.6,.05,.2,1),opacity .35s ease;
    display:flex;flex-direction:column;align-items:center;cursor:pointer;width:64px;z-index:2;
  }
  .player .dot{
    width:30px;height:30px;border-radius:50%;background:var(--accent);border:2px solid #fff;
    box-shadow:0 2px 6px rgba(0,0,0,.4);transition:transform .2s,background .3s;
  }
  .player.gk .dot{background:var(--gold)}
  .player .nm{font-family:'Space Mono',monospace;font-size:.62rem;margin-top:3px;color:#fff;background:rgba(8,32,27,.7);padding:1px 5px;border-radius:4px;white-space:nowrap;font-weight:700}
  .player:hover,.player:focus-visible{z-index:20}
  .player:hover .dot,.player:focus-visible .dot{transform:scale(1.2)}
  /* ---- spotlight (strength / weakness) ---- */
  .player.dim{opacity:.2}
  .player.spot-strength .dot{box-shadow:0 0 0 4px rgba(52,199,89,.6),0 0 20px 5px rgba(52,199,89,.55);animation:spotPulseG 1.6s ease-in-out infinite}
  .player.spot-weakness .dot{box-shadow:0 0 0 4px rgba(255,176,32,.65),0 0 20px 5px rgba(255,176,32,.55);animation:spotPulseW 1.6s ease-in-out infinite}
  @keyframes spotPulseG{0%,100%{box-shadow:0 0 0 3px rgba(52,199,89,.5),0 0 14px 3px rgba(52,199,89,.5)}50%{box-shadow:0 0 0 6px rgba(52,199,89,.7),0 0 26px 7px rgba(52,199,89,.65)}}
  @keyframes spotPulseW{0%,100%{box-shadow:0 0 0 3px rgba(255,176,32,.55),0 0 14px 3px rgba(255,176,32,.5)}50%{box-shadow:0 0 0 6px rgba(255,176,32,.75),0 0 26px 7px rgba(255,176,32,.65)}}
  .spotlight{margin-top:16px}
  .spotlight .sp-label{font-family:'Space Mono',monospace;font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:#9fc4b3;display:block;margin-bottom:9px}
  .sp-btns{display:flex;gap:10px;flex-wrap:wrap}
  .sp-btn{font-family:'Space Mono',monospace;font-size:.8rem;font-weight:700;cursor:pointer;border:1px solid rgba(127,220,171,.32);background:rgba(255,255,255,.06);color:#cfe0d7;padding:9px 16px;border-radius:999px;transition:all .2s;text-transform:uppercase;letter-spacing:.02em}
  .sp-btn:hover{border-color:#fff;color:#fff}
  .sp-btn.strength.on{background:#34c759;border-color:#34c759;color:#04270f}
  .sp-btn.weakness.on{background:#ffb020;border-color:#ffb020;color:#3a2600}
  .sp-excerpt{margin:14px 0 0;font-size:.95rem;color:#e8f1ec}
  .sp-excerpt:empty{display:none}
  .player:focus-visible{outline:2px solid var(--gold);outline-offset:4px;border-radius:8px}
  .ptip{
    position:absolute;bottom:calc(100% + 8px);left:50%;transform:translateX(-50%);
    background:#fff;color:var(--ink);border-radius:8px;padding:8px 10px;width:150px;
    font-size:.74rem;line-height:1.4;box-shadow:0 6px 18px rgba(0,0,0,.25);
    opacity:0;visibility:hidden;transition:opacity .18s;z-index:5;pointer-events:none;
  }
  .ptip b{display:block;font-size:.82rem;font-family:'Archivo';font-weight:800}
  .ptip .club{color:var(--ink-soft)}
  .ptip .role{color:var(--accent-ink);font-family:'Space Mono',monospace;font-size:.66rem;text-transform:uppercase;margin-top:3px;display:block}
  .player:hover .ptip,.player:focus-visible .ptip{opacity:1;visibility:visible}
  .pitch-info h3{font-family:'Archivo';font-weight:900;font-size:1.5rem;text-transform:uppercase;color:var(--chalk)}
  .pitch-info .shape-name{font-family:'Space Mono',monospace;color:var(--gold);font-weight:700;letter-spacing:.05em}
  .pitch-info p{color:#cfe0d7;font-size:.96rem}
  .pitch-note{font-size:.78rem;color:#7fa392;font-style:italic;margin-top:14px}

  /* ---------- team explorer ---------- */
  .teams-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px}
  .team-chip{
    background:#fff;border:1px solid var(--line);border-radius:12px;padding:16px 14px;cursor:pointer;
    text-align:left;font-family:inherit;transition:transform .15s,box-shadow .15s,border-color .15s;
    display:flex;flex-direction:column;height:100%;
  }
  .team-chip:hover{transform:translateY(-3px);box-shadow:0 8px 20px rgba(13,33,28,.1);border-color:var(--accent)}
  .team-chip:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
  .team-chip .flag{font-size:1.7rem;line-height:1;height:1.7rem}
  .team-chip .tn{font-family:'Archivo';font-weight:800;font-size:1.02rem;margin-top:8px;text-transform:uppercase;line-height:1.12}
  .team-chip .meta{font-family:'Space Mono',monospace;font-size:.68rem;color:var(--ink-soft);text-transform:uppercase;margin-top:auto;padding-top:10px}
  .team-chip .fav{color:var(--gold)}
  /* modal */
  .modal-bg{position:fixed;inset:0;background:rgba(8,32,27,.6);backdrop-filter:blur(3px);display:none;align-items:center;justify-content:center;z-index:100;padding:20px}
  .modal-bg.open{display:flex}
  .modal{background:#fff;border-radius:18px;max-width:520px;width:100%;max-height:86vh;overflow:auto;padding:30px;position:relative}
  .modal .x{position:absolute;top:16px;right:16px;border:0;background:var(--paper);width:34px;height:34px;border-radius:50%;font-size:1.1rem;cursor:pointer;color:var(--ink)}
  .modal .m-flag{font-size:3rem;line-height:1}
  .modal h3{font-family:'Archivo';font-weight:900;font-size:2rem;text-transform:uppercase;margin:6px 0 2px}
  .modal .m-meta{font-family:'Space Mono',monospace;font-size:.78rem;color:var(--ink-soft);text-transform:uppercase;margin-bottom:16px}
  .modal .m-section{margin-top:14px}
  .modal .m-section .lbl{font-family:'Space Mono',monospace;font-size:.7rem;font-weight:700;text-transform:uppercase;color:var(--accent-ink);letter-spacing:.04em}
  .modal .m-section p{font-size:.96rem;margin:3px 0 0}
  .modal .ai-tag{display:inline-block;font-family:'Space Mono',monospace;font-size:.66rem;background:var(--paper);border:1px solid var(--line);border-radius:6px;padding:3px 8px;color:var(--ink-soft);margin-top:18px}

  /* ---------- watch cards ---------- */
  .match{display:flex;align-items:center;gap:16px;background:#fff;border:1px solid var(--line);border-left:4px solid var(--accent);border-radius:12px;padding:16px 20px;margin-bottom:12px}
  .match .date{font-family:'Space Mono',monospace;font-weight:700;color:var(--accent-ink);min-width:88px;font-size:.85rem}
  .match .vs{font-family:'Archivo';font-weight:800;font-size:1.15rem;text-transform:uppercase;flex:1}
  .match .where{font-family:'Space Mono',monospace;font-size:.76rem;color:var(--ink-soft);text-align:right}
  .neutral{font-size:.94rem;color:var(--ink-soft)}
  .neutral b{color:var(--ink)}

  /* ---------- starter pack ---------- */
  .pack{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
  @media(max-width:760px){.pack{grid-template-columns:1fr}}
  .pack .card .lbl{font-family:'Space Mono',monospace;font-size:.7rem;text-transform:uppercase;color:var(--accent-ink);font-weight:700}

  /* ---------- find-your-team quiz ---------- */
  .quiz{margin-top:42px;background:#fff;border:1px solid var(--line);border-radius:18px;padding:30px;max-width:640px}
  .quiz-head .eyebrow{display:block;margin-bottom:6px}
  .quiz-head h3{font-family:'Archivo';font-weight:900;font-size:1.6rem;text-transform:uppercase;margin:2px 0 4px}
  .quiz-head>p{color:var(--ink-soft);font-size:.96rem;margin-bottom:18px}
  .quiz-progress{font-family:'Space Mono',monospace;font-size:.72rem;color:var(--ink-soft);text-transform:uppercase;letter-spacing:.04em;margin-bottom:12px}
  .quiz-q{font-family:'Archivo';font-weight:800;font-size:1.3rem;margin:6px 0 16px}
  .quiz-opts{display:grid;gap:10px}
  .quiz-opt{font-family:inherit;text-align:left;background:var(--paper);border:1.5px solid var(--line);border-radius:12px;padding:14px 16px;font-size:1rem;font-weight:500;cursor:pointer;transition:all .15s;color:var(--ink)}
  .quiz-opt:hover{border-color:var(--accent);background:rgba(255,67,50,.05);transform:translateX(3px)}
  .quiz-opt:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
  .quiz-back{margin-top:14px;background:none;border:0;color:var(--ink-soft);font-family:'Space Mono',monospace;font-size:.74rem;text-transform:uppercase;letter-spacing:.04em;cursor:pointer}
  .quiz-back:hover{color:var(--accent-ink)}
  .quiz-result{text-align:center}
  .quiz-result .qr-flag{font-size:4rem;line-height:1}
  .quiz-result .qr-pre{font-family:'Space Mono',monospace;font-size:.74rem;text-transform:uppercase;color:var(--accent-ink);letter-spacing:.05em}
  .quiz-result h3{font-family:'Archivo';font-weight:900;font-size:2.4rem;text-transform:uppercase;margin:4px 0}
  .quiz-result .qr-meta{font-family:'Space Mono',monospace;font-size:.74rem;color:var(--ink-soft);text-transform:uppercase;margin-bottom:10px}
  .quiz-result .qr-why{color:var(--ink-soft);max-width:48ch;margin:0 auto 22px}
  .quiz-btns{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
  .quiz-btn{font-family:'Space Mono',monospace;font-weight:700;font-size:.82rem;text-transform:uppercase;letter-spacing:.02em;border-radius:999px;padding:11px 22px;cursor:pointer;border:1.5px solid var(--accent)}
  .quiz-btn.primary{background:var(--accent);color:#fff}
  .quiz-btn.ghost{background:transparent;color:var(--accent-ink)}
  .qr-alt{margin-top:18px;font-size:.84rem;color:var(--ink-soft)}
  .qr-alt button{background:none;border:0;color:var(--accent-ink);cursor:pointer;font:inherit;text-decoration:underline;padding:0}

</style>

<div class="wcg">
<!-- ================= HERO ================= -->
<header class="hero" id="top">
  <div class="wrap">
    <span class="eyebrow">// A novice American's guide</span>
    <h1>The World Cup is here. Let's get you <em>up to speed.</em></h1>
    <p class="sub">No soccer knowledge required. How it works, where the US stands, and what to watch.</p>
    <div class="stamp">
      <span>🏟️ First game: <b>Mexico vs South Africa</b> · Mexico City — <b>Thu, Jun 11 · 3pm ET</b></span>
    </div>
    <div class="countdown" id="countdown" aria-label="Countdown to the first game of the World Cup"></div>
  </div>
</header>

<!-- ================= TABLE OF CONTENTS ================= -->
<nav class="toc-wrap wrap" aria-label="Table of contents">
  <div class="toc">
    <span class="toc-head">// On this page</span>
    <div class="toc-grid">
      <a class="toc-item" href="#why"><span class="tn">01</span><span class="tt">Why you should care</span></a>
      <a class="toc-item" href="#how"><span class="tn">02</span><span class="tt">How this whole thing works</span></a>
      <a class="toc-item" href="#basics"><span class="tn">03</span><span class="tt">Soccer in five minutes</span></a>
      <a class="toc-item" href="#lineup"><span class="tn">04</span><span class="tt">How the US lines up</span></a>
      <a class="toc-item" href="#usa"><span class="tn">05</span><span class="tt">Team USA</span></a>
      <a class="toc-item" href="#favorites"><span class="tn">06</span><span class="tt">Who's going to win this</span></a>
      <a class="toc-item" href="#storylines"><span class="tn">07</span><span class="tt">Storylines</span></a>
      <a class="toc-item" href="#scout"><span class="tn">08</span><span class="tt">Scout any team</span></a>
      <a class="toc-item" href="#watch"><span class="tn">09</span><span class="tt">Where &amp; when to watch</span></a>
      <a class="toc-item" href="#pack"><span class="tn">10</span><span class="tt">Your bandwagon starter pack</span></a>
    </div>
  </div>
</nav>

<!-- ================= 01 WHY CARE ================= -->
<section id="why">
  <div class="wrap">
    <div class="sec-head">
      <span class="eyebrow"><span class="num">// 01</span> &nbsp;Why you should care</span>
      <h2>The biggest sporting event in the world, in our backyard</h2>
      <p class="lede">First men's World Cup on US soil since 1994 — and it'll be the largest in history.</p>
    </div>
    <div class="grid-3" style="margin-bottom:26px">
      <div class="card"><span class="big">48</span><h3>Teams</h3><p>Up from 32 — the biggest field the tournament has ever had.</p></div>
      <div class="card"><span class="big">104</span><h3>Matches</h3><p>Across the US, Canada and Mexico — the first three-nation World Cup.</p></div>
      <div class="card"><span class="big">39</span><h3>Days</h3><p>June 11 to the July 19 final at MetLife Stadium (aka New York New Jersey Stadium).</p></div>
    </div>

    <p>It's here. It's finally here. As a lifelong soccer fan, my favorite time of year is when this country comes together to care, or at least pretend to care, about soccer - specifically for the U.S. Men's National Team (commonly referred to as the USMNT). And to make things even better, this time around, IT'S ON HOME SOIL!</p>
    <p>Whether this country wants to admit it or not, this is the largest sporting event in the world. The 2022 World Cup final drew around 1.5 billion viewers worldwide (!!!), roughly 12x the ~125 million who watched this year's Super Bowl here in the US.</p>
    <p>You don't have to have grown up with the sport or been a diehard fan - all bandwagoners welcome. The World Cup is more than soccer team vs. soccer team - it's country vs country and culture vs. culture. It's a celebration of both unity and national pride, and there's something uniquely patriotic about rooting for the US to kick everyone else's ass (will that happen? TBD). It's the one time everyone from every state can come together to support one team.</p>
    <p> With that in mind, let me walk you through what to expect and how best to watch over the next 39 days. You're part of a huge moment in history - it's time to get on board!</p>
  </div>
</section>

<!-- ================= 02 HOW IT WORKS ================= -->
<section id="how">
  <div class="wrap">
    <div class="sec-head">
      <span class="eyebrow"><span class="num">// 02</span> &nbsp;How this whole thing works</span>
      <h2>Group stage games, then a knockout bracket</h2>
      <p class="lede">A slightly different version of a familiar format</p>
    </div>
    <div class="grid-3" style="margin-bottom:8px">
      <div class="card"><span class="big">12</span><h3>Groups of 4</h3><p>Everyone plays the other three teams in their group once. Win = 3 points, draw = 1, lose = 0. Groups are named Group A through Group L.</p></div>
      <div class="card"><span class="big">Top 2</span><h3>+ 8 best 3rds</h3><p>Previously, it was just the top two teams from each group advance. Now, it's top two plus the eight best third-place teams.</p></div>
      <div class="card"><span class="big">32 Teams</span><h3>Then sudden death</h3><p>After group play, 48 whittles down to 32. The 32 teams are now in the knockout stage, and one loss sends you home.</p></div>
    </div>
    <div class="translate">
      <b> Long Story Short </b>
      The group stage is round-robin pool play; the knockout round is single-elimination. That's why this tournament is so intense - happens once every four years, and one bad game can mean the end of the road until 2030.
    </div>

    <p>The USMNT are in group D, along with Paraguay, Australia, and Turkey. If the US wins all three games, that will be 9 points and a guaranteed first place finish in the group. A win, tie, and loss will get you four points. Etc. Etc. 
      Tiebreakers are determined on head to head result, then head to head goal difference, then a few more things that we don't usually have to get into.
    </p>
    <p>In previous world cups, since only the top two teams of each group advanced, 4 points would be cutting it pretty close. With this new format of also having two-thirds of the third-place teams advance, 3 points is <em>probably</em> enough to advance, but it of course depends on how the other results turn out.
      A win and a draw, or better, going into the final game of the group stage would be a good position to be in.</p>
    <p>After those three guaranteed group games, if you qualify, you enter the knockouts. From there, it's single elimination on out. It's a little confusing on who plays whom in the knockout stage, but the graphic below can help.</p>
    <p>Overall, there are mixed feelings about the new format. Soccer, like every other sport, continues to grow, and FIFA claims that going from 32 -&gt; 48 teams gives more countries the opportunity to play on the biggest stage. 
      Critics argue that it devalues the group games and that we will see more lopsided victories. Honestly, it's very similar to the <a href="https://www.youtube.com/watch?v=r1NfJFgWNRA" target="_blank" rel="noopener">CFP expansion talk</a>, and just like that conversation, this doesn't really stop at this first expansion...it's a matter of if 48 makes sense, or if they will eventually expand to <a href="https://www.espn.com/soccer/story/_/id/46361972/world-cup-2030-fifa-conmebol-leaders-discuss-64-team-expansion" target="_blank" rel="noopener">64 teams in the future</a>.</p>

    <figure class="bracket">
      <img src="/assets/images/wc-knockout-bracket.jpeg" alt="2026 World Cup knockout bracket from the Round of 32 through the final, showing how group winners, runners-up, and the eight best third-place teams are paired." />
      <figcaption>The 2026 knockout bracket — how the 32 survivors are paired from the Round of 32 to the final.</figcaption>
    </figure>
  </div>
</section>

<!-- ================= 03 SOCCER BASICS ================= -->
<section id="basics">
  <div class="wrap">
    <div class="sec-head">
      <span class="eyebrow"><span class="num">// 03</span> &nbsp;Soccer in five minutes</span>
      <h2>Some soccer basics to know</h2>
      <p class="lede">Enough to follow the lineup below and understand what you're watching a bit better</p>
    </div>
    <div class="callout">

      <ul>
        <li>There are eleven players on the field at a time. When you hear about formations, start from the back; so a team playing a 4-4-2 means four defenders, four midfielders, and two attackers. The goalie is never counted.</li>
        <li>Better teams will look to control the ball more and find openings through lots of passing, whereas weaker teams might look to play stout defense then counterattack.</li>
        <li>Typically, in world cup games, many teams will play 'pragmatic' soccer, meaning not take as many risks. This is because the stakes are so high.</li>
        <li>45 minutes per half (with 3 min. hydration breaks each half that double as ads), 15 minute half time, and typically 5-8 minutes of 'extra time' once the 90 minutes are up. The game ends on the ref's whistle, not when the clock hits an exact time </li>
        <li>Attacking third means the area of the field where teams focus their offensive play, typically near the opponent's goal. It's quite literally if the pitch was divided into three equal parts horizontally, it's the part closest to the opponent's goal. Defensive third is the opposite.</li>
        <li>Terms to know:
            <ul>
                <li>Press: when a team constantly pressures another team when they have the ball. Strong tactic but cannot do it forever (exhausing). Like full-court pressing in basketball.</li>
                <li>VAR: virtual assistant referee. It's like the replay box for officials.</li>
                <li>Fullback means left and right defenders. Centerbacks are central defenders. Wingers are outside midfielders (run a lot) and strikers are pure attackers at the top.</li>
                <li>A '9' means a striker. A '10' is usually your best player. A '6' is your defensive midfielder. You can look for those numbers on the pitch - numbers typically do mean something in soccer.</li>
            </ul>
        </li>
      </ul>
    </div>
  </div>
</section>

<!-- ================= 04 FORMATION (SIGNATURE) ================= -->
<section id="lineup" class="pitch-section">
  <div class="wrap">
    <div class="sec-head">
      <span class="eyebrow"><span class="num">// 04</span> &nbsp;How the US lines up</span>
      <h2>One team, two shapes</h2>
      <p class="lede" style="color:#fff">Modern teams don't stand still. Flip the toggle to see how the same eleven players spread out to attack get compact to defend.</p>
      
    </div>
    <div class="toggle" role="tablist" aria-label="Formation phase">
      <button id="btn-attack" class="on" role="tab" aria-selected="true" onclick="setPhase('attack')">In possession</button>
      <button id="btn-defense" role="tab" aria-selected="false" onclick="setPhase('defense')">Out of possession</button>
    </div>
    <div class="pitch-stage">
      <div class="pitch" id="pitch" aria-label="Interactive US formation">
        <div class="lines">
          <i class="l-mid"></i><i class="l-circle"></i>
          <i class="l-boxT"></i><i class="l-boxB"></i><i class="l-6T"></i><i class="l-6B"></i>
        </div>
        <!-- players injected by JS -->
      </div>
      <div class="pitch-info">
        <h3 id="shape-title">Attacking shape</h3>
        <p class="shape-name" id="shape-formation">3-4-2-1</p>
        <p id="shape-desc">Pochettino's (the manager) side builds out from the back with brave passing - this means we like passing up FROM the back, as compared to something like having a defender boot it up the field and try and get possession from there. From that end, look for defenders to pass short a decent amount, even when we're close to our own goal. Positionally, a defender like Freeman tucks in to make a back three in the center. The wing-backs like Robinson and Dest (two of our fastest players) fly up the sides of the pitch, and Pulisic (our best player) drifts into central pockets to spark quick combinations. Tap or hover any player to see who they are.</p>
        <p class="pitch-note" id="pitch-note">A simplified look at how the projected XI shifts shape. Exact starters firm up right before kickoff.</p>
        <div class="callout-dark">
          <p> The main takeaway is this, regardless of the specific formations: in attack, we usually go from 4 defenders to 3, letting fast players run up and down on the outside of the field, while our best attackers drift into the middle and find space in the attacking third. On defense, we get more organized and compact near our goal.</p>
          <div class="spotlight">
            <span class="sp-label">Spotlight a unit — see it on the pitch</span>
            <div class="sp-btns" role="group" aria-label="Highlight team strength or weakness">
              <button class="sp-btn strength" id="sp-strength" aria-pressed="false" onclick="spotlight('strength')">🟢 Our strength</button>
              <button class="sp-btn weakness" id="sp-weakness" aria-pressed="false" onclick="spotlight('weakness')">🔻 Our weakness</button>
            </div>
            <p class="sp-excerpt" id="sp-excerpt" aria-live="polite"></p>
          </div>
        </div>
      </div>
    </div>
  </div>
</section>

<!-- ================= 05 TEAM USA ================= -->
<section id="usa">
  <div class="wrap">
    <div class="sec-head">
      <span class="eyebrow"><span class="num">// 05</span> &nbsp;Team USA</span>
      <h2>Where the USMNT actually stands</h2>
      <p class="lede">A talented young side with a famous coach, home-field advantage, and one big question mark.</p>
    </div>
    <div class="grid-3" style="margin-bottom:22px">
      <div class="card"><span class="big">R16</span><h3>The expectation</h3><p>Escaping a winnable Group D is the realistic baseline.</p></div>
      <div class="card"><span class="big">SF</span><h3>The dream</h3><p>The semifinals would be the best US run since 1930.</p></div>
      <div class="card"><span class="big">#16</span><h3>FIFA rank</h3><p>Highest in their group, but no top-100 player in the world.</p></div>
    </div>
    <div class="translate">
      <b> A Group D Summary </b>
      <div id="usa-analogy">
        <p>No game in our group will be a pushover, but all are winnable. Paraguay and Australia are <em>slightly</em> inferior opponents that will play more defensive against us, looking for quick counterattacks. Turkey stack up more evenly and should be a good and exciting game, since both teams have attacking talent. Since Turkey is our last group game, if we beat the other two, we are in great position to get to the knockouts regardless of that outcome.</p>
      </div>
    </div>
    <p>This is the most talented USMNT roster I've seen in my lifetime. We have players playing all over the top-flights of Europe, and 2 years ago we brought in one of the most successful and recognized managers in world soccer, Mauricio Pochettino.</p>
    <p>If this group can bring it all together and excel in this tournament is the question. 2 years ago during Copa America ('mini-WC' tournament for just north and south america), the USMNT crashed out in the group stage, losing to inferior opponents.</p>
    <p>Since then and leading up to the World Cup, it hasn't always been great. It's taken a while for Pochettino to really form this team, but in the past few weeks, they have started looking like the best version of themselves. A 3-2 win over Senegal two weeks ago showed their attacking prowess, and although they lost 1-2 to Germany last week, there were plenty of bright spots that showed we could hang with some of the best.</p>
    <p>The USMNT faces opposing expectations — American optimism and being on home-soil pushes the expectations up, while it's rather easy for other big-soccer nations to dunk on American soccer culture and our team and say we will perform poorly and get bounced early. We are in between the two.</p>
    <p>If I was a betting man, I would guess we get to the round of 16 before losing. We should be favored, or at least even money, in every game leading up until that point, unless we somehow get third in our group and go against a really strong first-place team in the round of 32. Not getting out of the group would be an absolute disaster.</p>
    <p>All that said, part of me feels like we can really reach the quarterfinals, which would be an outstanding result. Home world cup teams typically perform better, and I think we have really rounded into form as of late and are mentally prepared for the weight of this world cup. With a world-class coach, a talented group of players, and playing in front of home crowds, anything is possible. Here's to the 'American Optimist' in me hoping for the best.</p>

    <div class="prediction">
      <span class="pl">// My prediction</span>
      <p class="pbig">A run to the <em>quarterfinals.</em></p>
      <p>The Round of 16 is the realistic floor — anything less would be an underachievement. But with home crowds, a world-class coach in Pochettino, and a team finally rounding into form, I think this group makes the quarterfinals: our deepest run since 2002, and a moment that could change how this country sees the sport.</p>
    </div>
  </div>
</section>

<!-- ================= 06 FAVORITES ================= -->
<section id="favorites">
  <div class="wrap">
    <div class="sec-head">
      <span class="eyebrow"><span class="num">// 06</span> &nbsp;Who's going to win this</span>
      <h2>The Teams</h2>
      <p class="lede">A handful of countries have a real shot, while others are a long shot. Here's some of the key teams going in.</p>
    </div>
    <div class="translate">
      <b>Co-favorites</b>
      <p><b>Spain 🇪🇸</b> — Winners of Euro 2024, and play selfless, fluid soccer. <i>Player to watch: Lamine Yamal.</i></p>
      <p style="margin-bottom:0"><b>France 🇫🇷</b> — Winners of WC 2018 and runners-up in 2022. Incredible attacking talent — their bench players alone could make a decent starting team. <i>Player to watch: Kylian Mbappé.</i></p>
    </div>
    <div class="translate">
      <b>Next tier down — but still contenders</b>
      <p><b>England 🇬🇧</b> — An incredibly talented squad with some of the best players in the world. They typically just haven't lived up to the potential, but that could change this year. <i>Player to watch: Harry Kane.</i></p>
      <p><b>Portugal 🇵🇹</b> — The most talented midfield in the competition, and Cristiano Ronaldo's last ride. <i>Player to watch: Bruno Fernandes.</i></p>
      <p><b>Argentina 🇦🇷</b> — Winners of the World Cup in 2022. Being slept on because the team is a bit older and less Messi-reliant, but still one of the best teams in the world.</p>
      <p><b>Germany 🇩🇪</b> — A typical World Cup powerhouse, but they've been bounced in the group stage in the past two tournaments. Looking to bounce back this year with a very solid defense. <i>Player to watch: Jamal Musiala.</i></p>
      <p style="margin-bottom:0"><b>Brazil 🇧🇷</b> — Another World Cup powerhouse that hasn't gotten there in the past few decades. They just brought in a new coach, Carlo Ancelotti, who basically wins everywhere he goes. <i>Player to watch: Vinícius (Vini) Jr.</i></p>
    </div>
    <div class="translate">
      <b>Dark horses</b>
      <p><b>Senegal 🇸🇳</b> — Controversial losers of the AFCON Cup (they won, but the win was voided on paper), with plenty of core talent at the end of their prime looking to make a deep run.</p>
      <p><b>Norway 🇳🇴</b> — Some of the best players they've ever had, and they were devastating in qualifying, racking up goals left and right. <i>Player to watch: Erling Haaland.</i></p>
      <p style="margin-bottom:0"><b>Ecuador 🇪🇨</b> — Sneakily one of the best teams in qualifying, having lost only once in their new coach's 19-game tenure (7W, 11D, 1L). They play incredible defense but will need some inspiration on the attacking side.</p>
    </div>
    <div class="translate">
      <b>Mr. Irrelevant</b>
      <p style="margin-bottom:0"><b>Curaçao 🇨🇼</b> — To their country, these players are anything but! Unfortunately, they have the worst odds to win the whole thing, sitting at 2500:1. Feeling lucky?</p>
    </div>
    <p style="margin-top:18px">Of course any team can theoretically win the whole thing, but these are a few to focus on. There are plenty of other contenders to check out (Morocco, Netherlands, Belgium, and more) in the sections below.</p>

    <div class="prediction">
      <span class="pl">// My pick to win it all</span>
      <p class="pbig">It's coming home: <em>England.</em></p>
      <p>The smart money would be on France or Spain, but something tells me it's finally coming home for England. Their best player, Harry Kane, is in the form of his life, and they have the talent and coach to make it happen.</p>
    </div>
  </div>
</section>

<!-- ================= 07 STORYLINES ================= -->
<section id="storylines">
  <div class="wrap">
    <div class="sec-head">
      <span class="eyebrow"><span class="num">// 07</span> &nbsp;Storylines</span>
      <h2>What to follow even with no team</h2>
    </div>
    <div class="translate">
      <b>Old guard vs. new wave</b>
      <p style="margin-bottom:0">The last-dance generation of Messi (38, Argentina) and Ronaldo (41, Portugal) takes on the new wave of Yamal (18, Spain), Mbappé (27, France), and Haaland (25, Norway).</p>
    </div>
    <div class="translate">
      <b>The conditions</b>
      <p style="margin-bottom:0">Heat, altitude, and large travel distances (newsflash: North America is large!) will play a part in this World Cup. Teams who manage that best will have the advantage.</p>
    </div>
    <div class="translate">
      <b>Expect the unexpected</b>
      <p style="margin-bottom:0">You can ALWAYS expect something weird to happen in a World Cup: Saudi Arabia beat Argentina in the last World Cup, Ivory Coast beat France last week, and the last time the World Cup was played on U.S. soil, Sweden and Bulgaria made the semifinals!</p>
    </div>
    <div class="translate">
      <b>The foreign-coach curse</b>
      <p style="margin-bottom:0">Fun fact: no foreign-born coach has ever won a World Cup. Will that change this year with Tuchel (German) leading England, Carlo Ancelotti (Italian) leading Brazil, or even Pochettino (Argentinian) leading the USMNT?!</p>
    </div>
    <div class="translate">
      <b>A USMNT family subplot</b>
      <p style="margin-bottom:0">A few years back, USMNT legend Claudio Reyna publicly spatted with USMNT coach Greg Berhalter because he felt Greg wasn't giving his son, Gio Reyna, enough playing time. Greg — for more reasons than just that — was ultimately fired in 2024. Now Greg's son Sebastian and Gio Reyna both play for the USMNT, and all seems to be fine among them.</p>
    </div>
  </div>
</section>

<!-- ================= 08 SCOUT A TEAM (INTERACTIVE) ================= -->
<section id="scout">
  <div class="wrap">
    <div class="sec-head">
      <span class="eyebrow"><span class="num">// 08</span> &nbsp;Scout any team</span>
      <h2>Pick a team, get the rundown</h2>
      <p class="lede">Tap any badge for a quick scouting report — who they are, how they play, and who to watch.</p>
    </div>
    <div class="teams-grid" id="teams-grid"></div>
    <p class="neutral" style="margin-top:18px;font-size:.84rem">
      <b>All 48 teams, ordered by group (A–L).</b> Tap any badge for its scouting report.
    </p>

    <!-- team picker quiz -->
    <div class="quiz" id="quiz">
      <div class="quiz-head">
        <span class="eyebrow"><span class="num">// bonus</span> &nbsp;Find your team</span>
        <h3>No one to root for? Take the quiz.</h3>
        <p>Answer four quick questions and I'll match you with a team to adopt for the next month.</p>
      </div>
      <div id="quiz-body"></div>
    </div>
  </div>
</section>

<!-- ================= 09 WATCH ================= -->
<section id="watch">
  <div class="wrap">
    <div class="sec-head">
      <span class="eyebrow"><span class="num">// 09</span> &nbsp;Where &amp; when to watch</span>
      <h2>Your USMNT viewing plan</h2>
      <p class="lede">All three group games — times in ET. English on Fox/FS1, Spanish on Telemundo.</p>
    </div>
    <div class="match"><span class="date">Fri Jun 12<br />9:00 PM ET</span><span class="vs">USA vs Paraguay</span><span class="where">SoFi Stadium, LA<br />FOX</span></div>
    <div class="match"><span class="date">Fri Jun 19<br />3:00 PM ET</span><span class="vs">USA vs Australia</span><span class="where">Lumen Field, Seattle</span></div>
    <div class="match"><span class="date">Thu Jun 25<br />10:00 PM ET</span><span class="vs">USA vs Türkiye</span><span class="where">SoFi Stadium, LA<br />FOX</span></div>
    <div class="translate" style="margin-top:20px">
      <b>📺 Neutral games worth your time</b>
      Brazil vs Morocco (Jun 13) · Colombia vs Portugal (Jun 27, Miami) · France vs Senegal (Jun 16) · Uruguay vs Spain (Jun 26).
    </div>
  </div>
</section>

<!-- ================= 10 STARTER PACK ================= -->
<section id="pack" style="border-bottom:none">
  <div class="wrap">
    <div class="sec-head">
      <span class="eyebrow"><span class="num">// 10</span> &nbsp;Your bandwagon starter pack</span>
      <h2>You're ready. Go enjoy it.</h2>
    </div>
    <div class="pack">
      <div class="card"><span class="lbl">One date</span><h3 style="margin-top:6px">Fri, Jun 12</h3><p>USA's opener vs Paraguay, 9pm ET. Circle it.</p></div>
      <div class="card"><span class="lbl">One player</span><h3 style="margin-top:6px">Christian Pulisic</h3><p>The US captain and your easiest name to know.</p></div>
      <div class="card"><span class="lbl">One thing to know</span><h3 style="margin-top:6px">Home-Field Tournament</h3><p> This is our first world cup since 1994, and will likely be our last until many years from now. </p></div>
    </div>
    <div style="margin-top:22px">
      <p>Back in 2023, I <a href="https://medium.com/p/17ba14b415de" target="_blank" rel="noopener">wrote</a> that there hasn't been a better time to be a fan of United States soccer. Here is an excerpt from that piece:</p>
      <div class="translate">
        <b>From that 2023 piece</b>
        <p style="margin-bottom:0;font-style:italic">"Frankly, all this momentum and the surge in US soccer's popularity leads us straight to the big event — the 2026 World Cup on American soil. Hosting the World Cup for the first time since 1994, we have a much stronger team, increased popularity, and higher expectations. While 2026 seems like a while away, nations are already gearing up for the greatest month of sport in three years' time."</p>
      </div>
      <p>Well, the time has come, and I wasn't joking around: it has all led to this. Every practice and every game has led to this event, with this team, on this home soil.</p>
      <p style="margin-bottom:0">Last time we played a World Cup at home, the <a href="https://www.nytimes.com/athletic/7343638/2026/06/09/usmnt-1994-charlie-davies-world-cup/" target="_blank" rel="noopener">1994 team</a> changed how this country viewed this sport. This team can have the same impact. It's time for us as a nation to gather together and support this team for the next month, because who knows — we could be changing the course of soccer in this country forever.</p>
    </div>
  </div>
</section>

<!-- ================= MODAL ================= -->
<div class="modal-bg" id="modal-bg" onclick="if(event.target===this)closeModal()">
  <div class="modal" role="dialog" aria-modal="true" aria-labelledby="m-name">
    <button class="x" onclick="closeModal()" aria-label="Close">✕</button>
    <div class="m-flag" id="m-flag"></div>
    <h3 id="m-name"></h3>
    <div class="m-meta" id="m-meta"></div>
    <div class="m-section"><span class="lbl">The rundown</span><p id="m-blurb"></p></div>
    <div class="m-section"><span class="lbl">How they play</span><p id="m-style"></p></div>
    <div class="m-section"><span class="lbl">Watch</span><p id="m-star"></p></div>
    <span class="ai-tag">⚡ AI-generated scouting report</span>
  </div>
</div>

</div>

<script>
/* ---------- countdown to the first game of the WC (Mexico, Mexico City — Jun 11 2026) ---------- */
(function(){
  var target=new Date('2026-06-11T15:00:00-04:00').getTime();
  var el=document.getElementById('countdown');
  function tick(){
    var d=target-Date.now();
    if(d<0){el.innerHTML='<div class="cd-box"><span class="n">🟢</span><span class="l">Kickoff!</span></div>';return;}
    var days=Math.floor(d/864e5),h=Math.floor(d%864e5/36e5),m=Math.floor(d%36e5/6e4),s=Math.floor(d%6e4/1e3);
    var b=function(n,l){return '<div class="cd-box"><span class="n">'+n+'</span><span class="l">'+l+'</span></div>';};
    el.innerHTML=b(days,'days')+b(h,'hrs')+b(m,'min')+b(s,'sec');
  }
  tick();setInterval(tick,1000);
})();

/* ---------- formation data ---------- */
var SQUAD={
  freese:{name:'Matt Freese',club:'NYCFC',gk:true},
  ream:{name:'Tim Ream',club:'Charlotte FC'},
  richards:{name:'Chris Richards',club:'Crystal Palace'},
  freeman:{name:'Alex Freeman',club:'Orlando City'},
  arobinson:{name:'Antonee Robinson',club:'Fulham'},
  dest:{name:'Sergiño Dest',club:'PSV'},
  adams:{name:'Tyler Adams',club:'Bournemouth'},
  tillman:{name:'Malik Tillman',club:'Bayer Leverkusen'},
  pulisic:{name:'Christian Pulisic',club:'AC Milan'},
  mckennie:{name:'Weston McKennie',club:'Juventus'},
  balogun:{name:'Folarin Balogun',club:'Monaco'}
};
/* x,y are % on the pitch (y: 0=attacking end / opponent goal, 100=own goal) */
var SHAPES={
  attack:{
    title:'Attacking shape',formation:'3-4-2-1',
    desc:"Pochettino's (the manager) side builds out from the back with brave passing - this means we like passing up FROM the back, as compared to something like having a defender boot it up the field and try and get possession from there. From that end, look for defenders to pass short a decent amount, even when we're close to our own goal. Positionally, a defender like Freeman tucks in to make a back three in the center. The wing-backs like Robinson and Dest (two of our fastest players) fly up the sides of the pitch, and Pulisic (our best player) drifts into central pockets to spark quick combinations. Tap or hover any player to see who they are.",
    pos:{
      freese:[50,93,'Goalkeeper'],
      ream:[28,75,'Left center-back'],richards:[50,77,'Center-back'],freeman:[72,75,'Right center-back'],
      arobinson:[12,52,'Left wing-back'],dest:[88,52,'Right wing-back'],
      adams:[40,60,'Deep midfield (anchor)'],tillman:[60,55,'Central midfield'],
      pulisic:[34,33,'Attacking mid (free role)'],mckennie:[66,31,'Attacking mid (late runs)'],
      balogun:[50,14,'Striker']
    }
  },
  defense:{
    title:'Defensive block',formation:'4-4-2',
    desc:"When they lose the ball, the formation is a bit simpler. The USMNT compresses into two tight banks of four and sits deeper, daring you to break them down. Notice the wing-backs drop into the back line and the shape gets narrow. Sometimes, players will occasionally drift out of this position in order to press the opposition and try and regain possession, but generally, this shape is all about being compact and organized to make it hard for opponents to find space in the attacking third.",
    pos:{
      freese:[50,94,'Goalkeeper'],
      arobinson:[16,80,'Left-back'],ream:[39,83,'Center-back'],richards:[61,83,'Center-back'],freeman:[84,80,'Right-back'],
      pulisic:[18,58,'Left midfield'],adams:[40,62,'Central midfield'],tillman:[60,62,'Central midfield'],dest:[82,58,'Right midfield'],
      balogun:[40,34,'Striker'],mckennie:[60,34,'Second striker (counter)']
    }
  }
};

var pitch=document.getElementById('pitch');
/* build player nodes once */
Object.keys(SQUAD).forEach(function(id){
  var p=SQUAD[id];
  var el=document.createElement('div');
  el.className='player'+(p.gk?' gk':'');el.id='pl-'+id;el.tabIndex=0;
  var last=p.name.split(' ').slice(-1)[0];
  el.innerHTML='<div class="ptip"><b>'+p.name+'</b><span class="club">'+p.club+'</span><span class="role" id="role-'+id+'"></span></div><div class="dot"></div><div class="nm">'+last+'</div>';
  pitch.appendChild(el);
});

function setPhase(phase){
  var s=SHAPES[phase];
  Object.keys(s.pos).forEach(function(id){
    var el=document.getElementById('pl-'+id);
    var c=s.pos[id];
    el.style.left=c[0]+'%';el.style.top=c[1]+'%';
    document.getElementById('role-'+id).textContent=c[2];
  });
  document.getElementById('shape-title').textContent=s.title;
  document.getElementById('shape-formation').textContent=s.formation;
  document.getElementById('shape-desc').textContent=s.desc;
  document.getElementById('btn-attack').classList.toggle('on',phase==='attack');
  document.getElementById('btn-defense').classList.toggle('on',phase==='defense');
  document.getElementById('btn-attack').setAttribute('aria-selected',phase==='attack');
  document.getElementById('btn-defense').setAttribute('aria-selected',phase==='defense');
}
setPhase('attack');

/* ---------- spotlight: strength / weakness ---------- */
var SPOT={
  strength:{
    ids:['pulisic','arobinson','dest','mckennie','balogun'],
    html:"<b>Our strength — the attacking core.</b> Pulisic, Robinson, Dest, and McKennie are all very talented players, and Balogun is the best striker we've had in some time."
  },
  weakness:{
    ids:['freese','ream','richards'],
    html:"<b>Our weakness — the spine at the back.</b> Our two center backs and our goalkeeper. Richards is banged-up, and while Ream has served the team well, he is 38, well past a player's prime. Freese is decent, but nothing exceptional (unlike some USMNT keepers of the past, including <a href=\"https://www.reddit.com/r/classicsoccer/comments/1lpknmc/goalkeeper_tim_howards_record_16_saves_for_the/\" target=\"_blank\" rel=\"noopener noreferrer\">Tim Howard's record 16 saves</a>)."
  }
};
var activeSpot=null;
function spotlight(type){
  if(activeSpot===type){clearSpot();return;}
  activeSpot=type;
  var ids=SPOT[type].ids;
  Object.keys(SQUAD).forEach(function(id){
    var el=document.getElementById('pl-'+id);
    el.classList.remove('dim','spot-strength','spot-weakness');
    if(ids.indexOf(id)>=0){el.classList.add('spot-'+type);}
    else{el.classList.add('dim');}
  });
  document.getElementById('sp-strength').classList.toggle('on',type==='strength');
  document.getElementById('sp-weakness').classList.toggle('on',type==='weakness');
  document.getElementById('sp-strength').setAttribute('aria-pressed',type==='strength');
  document.getElementById('sp-weakness').setAttribute('aria-pressed',type==='weakness');
  document.getElementById('sp-excerpt').innerHTML=SPOT[type].html;
}
function clearSpot(){
  activeSpot=null;
  Object.keys(SQUAD).forEach(function(id){
    document.getElementById('pl-'+id).classList.remove('dim','spot-strength','spot-weakness');
  });
  ['sp-strength','sp-weakness'].forEach(function(bid){
    var b=document.getElementById(bid);b.classList.remove('on');b.setAttribute('aria-pressed','false');
  });
  document.getElementById('sp-excerpt').innerHTML='';
}

/* ---------- team explorer data (all 48 teams, grouped A-L) ---------- */
var TEAMS=[
  {id:'mex',name:'Mexico',flag:'🇲🇽',meta:'Group A',
   blurb:"Co-hosts riding huge home crowds across three iconic stadiums. El Tri reach the knockout rounds almost every time, but haven't gotten past the Round of 16 since 1986 — home soil is their best shot to finally break the curse.",
   style:"Technical and possession-minded, lifted by deafening, partisan home support.",
   star:"Striker Santiago Giménez and midfield anchor Edson Álvarez.",
   tags:{play:'balanced',tier:'contender',region:'concacaf',vibe:'winner',star:false}},
  {id:'rsa',name:'South Africa',flag:'🇿🇦',meta:'Group A',
   blurb:"Back at the World Cup for the first time since they hosted in 2010. A young, fearless side that surprised plenty of people to win their qualifying group.",
   style:"Quick, high-energy, and unafraid to push forward.",
   star:"A pacey, youthful core with a few seasoned leaders.",
   tags:{play:'attack',tier:'dark',region:'africa',vibe:'underdog',star:false}},
  {id:'kor',name:'South Korea',flag:'🇰🇷',meta:'Group A',
   blurb:"Asia's most reliable World Cup side, reaching the Round of 16 in 2022. They go as far as their world-class captain can carry them.",
   style:"Disciplined and organized, built to spring their stars on the counter.",
   star:"Son Heung-min, the talismanic captain and one of the game's best.",
   tags:{play:'balanced',tier:'dark',region:'asia',vibe:'mid',star:true}},
  {id:'cze',name:'Czechia',flag:'🇨🇿',meta:'Group A',
   blurb:"A solid, organized European side back on the big stage. Never flashy, always a tough out.",
   style:"Structured and physical, with a real threat from set pieces.",
   star:"Striker Patrik Schick, a clinical finisher when fit.",
   tags:{play:'defense',tier:'dark',region:'europe',vibe:'mid',star:false}},

  {id:'can',name:'Canada',flag:'🇨🇦',meta:'Group B',
   blurb:"Co-hosts and a genuinely exciting young team after announcing themselves in 2022. Real pace, real talent, and — for the first time — real expectations at home.",
   style:"Fast, direct, and athletic, lethal on the counter.",
   star:"Bayern Munich flyer Alphonso Davies and striker Jonathan David.",
   tags:{play:'attack',tier:'dark',region:'concacaf',vibe:'rising',star:true}},
  {id:'bih',name:'Bosnia & Herzegovina',flag:'🇧🇦',meta:'Group B',
   blurb:"Back at the World Cup for the first time since 2014, leaning on grit and a couple of quality attackers.",
   style:"Compact and direct, dangerous from set pieces and quick transitions.",
   star:"Veteran striker Edin Džeko, still leading the line.",
   tags:{play:'balanced',tier:'longshot',region:'europe',vibe:'underdog',star:false}},
  {id:'qat',name:'Qatar',flag:'🇶🇦',meta:'Group B',
   blurb:"The 2022 hosts return, this time qualifying on merit — a sign of how far their program has come. Recent Asian champions.",
   style:"Patient and technical, comfortable keeping the ball.",
   star:"Playmaker Akram Afif, a multiple-time Asian Player of the Year.",
   tags:{play:'balanced',tier:'longshot',region:'asia',vibe:'underdog',star:false}},
  {id:'sui',name:'Switzerland',flag:'🇨🇭',meta:'Group B',
   blurb:"The dependable Swiss are a tournament fixture who quietly reach knockout rounds and trouble giants — they knocked out France in 2021.",
   style:"Organized, balanced, and very hard to beat.",
   star:"Captain Granit Xhaka conducting midfield.",
   tags:{play:'balanced',tier:'contender',region:'europe',vibe:'mid',star:false}},

  {id:'bra',name:'Brazil',flag:'🇧🇷',meta:'Group C',
   blurb:"The most successful nation in World Cup history (five titles) and a real contender, now under serial winner Carlo Ancelotti. Chasing a first crown since 2002 and a return to their joyful best.",
   style:"Flair, pace, and individual brilliance all over the field.",
   star:"Vinícius Júnior, plus a seemingly endless conveyor belt of attackers.",
   tags:{play:'attack',tier:'fav',region:'samerica',vibe:'winner',star:true}},
  {id:'mar',name:'Morocco',flag:'🇲🇦',meta:'Group C',
   blurb:"The team that stunned the world by reaching the 2022 semifinals — the first African nation ever to do so — and it was no fluke. A deep, battle-tested squad.",
   style:"Brilliantly organized at the back, lethal on the counter.",
   star:"Right-back Achraf Hakimi, one of the best in the world at his position.",
   tags:{play:'balanced',tier:'contender',region:'africa',vibe:'rising',star:false}},
  {id:'hai',name:'Haiti',flag:'🇭🇹',meta:'Group C',
   blurb:"A genuine fairy tale: Haiti's first World Cup since 1974, and the first Caribbean nation ever to reach two. They topped a tough group over Costa Rica and Honduras to get here.",
   style:"Sit deep, defend in numbers, and strike on the break.",
   star:"Forward Duckens Nazon supplies the goal threat.",
   tags:{play:'defense',tier:'longshot',region:'concacaf',vibe:'underdog',star:false}},
  {id:'sco',name:'Scotland',flag:'🇬🇧',meta:'Group C',
   blurb:"Back at a World Cup for the first time since 1998, bringing what might be the best traveling fans on earth. Spirited and never easy to play against.",
   style:"Hard-running, physical, and well-drilled.",
   star:"Liverpool's Andy Robertson and midfielder Scott McTominay.",
   tags:{play:'balanced',tier:'dark',region:'europe',vibe:'underdog',star:false}},

  {id:'usa',name:'USA',flag:'🇺🇸',meta:'Group D',
   blurb:"The co-hosts and the story every American will follow. A talented young group under a famous coach, playing at home for the first time since 1994 — a winnable group, sky-high hopes, and one shaky area at the back.",
   style:"Builds from the back and presses high with the ball; drops into a compact 4-4-2 block without it.",
   star:"Captain Christian Pulisic, the talisman (AC Milan).",
   tags:{play:'balanced',tier:'dark',region:'concacaf',vibe:'rising',star:true}},
  {id:'par',name:'Paraguay',flag:'🇵🇾',meta:'Group D',
   blurb:"The group's dark horse. Coach Gustavo Alfaro built a stubborn, disciplined side that beat Argentina, Brazil and Uruguay on the road to qualifying.",
   style:"Defense-first: absorb pressure, then counter fast and direct. Exactly the kind of opponent that can frustrate the US.",
   star:"Julio Enciso, a fearless, shot-happy forward (Strasbourg).",
   tags:{play:'defense',tier:'longshot',region:'samerica',vibe:'underdog',star:false}},
  {id:'aus',name:'Australia',flag:'🇦🇺',meta:'Group D',
   blurb:"Organized, physical, and hard to beat — the Socceroos ground out big results in Asian qualifying and rarely beat themselves.",
   style:"Sit deep in a compact block that springs into a 3-4-3, dangerous via wing-backs and set pieces.",
   star:"A young striker leading the line after some veteran injuries.",
   tags:{play:'defense',tier:'longshot',region:'asia',vibe:'underdog',star:false}},
  {id:'tur',name:'Türkiye',flag:'🇹🇷',meta:'Group D',
   blurb:"Back at a World Cup for the first time since 2002, and genuinely fun to watch — fluid, creative, and loaded with attacking talent. The US's toughest group test.",
   style:"Builds with a back three and rotates creative players freely; no fixed striker.",
   star:"Real Madrid playmaker Arda Güler; Çalhanoğlu is lethal on set pieces.",
   tags:{play:'attack',tier:'dark',region:'europe',vibe:'rising',star:false}},

  {id:'ger',name:'Germany',flag:'🇩🇪',meta:'Group E',
   blurb:"A four-time champion and tournament heavyweight — but with plenty to prove after group-stage exits in both 2018 and 2022.",
   style:"Possession and control, behind a rebuilt, more solid defense.",
   star:"Florian Wirtz and Jamal Musiala pulling the strings.",
   tags:{play:'balanced',tier:'contender',region:'europe',vibe:'winner',star:false}},
  {id:'cur',name:'Curaçao',flag:'🇨🇼',meta:'Group E',
   blurb:"The story of the tournament: a Caribbean island of roughly 185,000 people, the smallest nation ever to reach a World Cup. Their roster is built from Dutch-developed talent and steered by 78-year-old coaching legend Dick Advocaat.",
   style:"Surprisingly tidy — a possession-based 4-3-3 that builds from the back.",
   star:"A squad of Dutch-system pros punching wildly above their weight.",
   tags:{play:'balanced',tier:'longshot',region:'concacaf',vibe:'underdog',star:false}},
  {id:'civ',name:'Ivory Coast',flag:'🇨🇮',meta:'Group E',
   blurb:"Reigning African champions with an athletic, talented squad full of top-European talent. A real dark-horse threat.",
   style:"Powerful and direct, strong through the spine.",
   star:"A deep core of Premier League and European regulars.",
   tags:{play:'balanced',tier:'dark',region:'africa',vibe:'mid',star:false}},
  {id:'ecu',name:'Ecuador',flag:'🇪🇨',meta:'Group E',
   blurb:"Quietly one of the best defensive teams in the field — they conceded almost nothing in South American qualifying. Young, physical, and tough to break down.",
   style:"Rock-solid at the back; they just need a spark up top.",
   star:"Chelsea midfielder Moisés Caicedo anchoring everything.",
   tags:{play:'defense',tier:'dark',region:'samerica',vibe:'mid',star:false}},

  {id:'ned',name:'Netherlands',flag:'🇳🇱',meta:'Group F',
   blurb:"Three-time runners-up and always a contender, the Dutch bring elite talent and a winning pedigree.",
   style:"Technical and structured, comfortable controlling a game.",
   star:"Captain Virgil van Dijk marshalling the defense.",
   tags:{play:'balanced',tier:'contender',region:'europe',vibe:'winner',star:false}},
  {id:'jpn',name:'Japan',flag:'🇯🇵',meta:'Group F',
   blurb:"Asia's standard-bearer and a popular dark-horse pick — they beat Germany and Spain in 2022 and have only improved since.",
   style:"Quick, technical, and superbly coached; they press and pass with real confidence.",
   star:"A deep group of players starring across Europe.",
   tags:{play:'attack',tier:'dark',region:'asia',vibe:'rising',star:false}},
  {id:'swe',name:'Sweden',flag:'🇸🇪',meta:'Group F',
   blurb:"Back at the World Cup with a genuinely frightening attack led by two of Europe's deadliest strikers.",
   style:"Direct and dangerous, built to score in bunches.",
   star:"Alexander Isak and Viktor Gyökeres up top.",
   tags:{play:'attack',tier:'dark',region:'europe',vibe:'mid',star:true}},
  {id:'tun',name:'Tunisia',flag:'🇹🇳',meta:'Group F',
   blurb:"A familiar, well-drilled North African presence at the World Cup, always organized and disciplined.",
   style:"Compact and defensive; tough to break down.",
   star:"A solid collective rather than one headline name.",
   tags:{play:'defense',tier:'longshot',region:'africa',vibe:'underdog',star:false}},

  {id:'bel',name:'Belgium',flag:'🇧🇪',meta:'Group G',
   blurb:"The famed 'Golden Generation' is aging but still dangerous, with world-class quality in midfield and attack.",
   style:"Possession and creativity, built around elite playmakers.",
   star:"Kevin De Bruyne, one of the finest midfielders of his era.",
   tags:{play:'attack',tier:'contender',region:'europe',vibe:'winner',star:true}},
  {id:'egy',name:'Egypt',flag:'🇪🇬',meta:'Group G',
   blurb:"The Pharaohs ride one of the planet's best forwards back to the World Cup — as he goes, so go their hopes.",
   style:"Compact and defensive, built to feed their superstar in transition.",
   star:"Mohamed Salah, Liverpool's talisman.",
   tags:{play:'balanced',tier:'dark',region:'africa',vibe:'mid',star:true}},
  {id:'irn',name:'Iran',flag:'🇮🇷',meta:'Group G',
   blurb:"Asia's most consistent qualifier — experienced, organized, and always a tough group-stage out.",
   style:"A deep defensive block and quick counters.",
   star:"Forward Mehdi Taremi leading the line.",
   tags:{play:'defense',tier:'longshot',region:'asia',vibe:'mid',star:false}},
  {id:'nzl',name:'New Zealand',flag:'🇳🇿',meta:'Group G',
   blurb:"The lone team from Oceania, famous for going unbeaten (three draws) at the 2010 World Cup before going home. Back for more.",
   style:"Big, physical, and organized; very dangerous in the air.",
   star:"Nottingham Forest striker Chris Wood.",
   tags:{play:'defense',tier:'longshot',region:'oceania',vibe:'underdog',star:false}},

  {id:'esp',name:'Spain',flag:'🇪🇸',meta:'Group H',
   blurb:"The favorite and reigning European champions, Spain win by monopolizing the ball and suffocating opponents — now with a generational teenager pulling the strings.",
   style:"Total control: endless possession, quick passing, relentless pressure.",
   star:"Lamine Yamal, already among the world's very best at 18.",
   tags:{play:'attack',tier:'fav',region:'europe',vibe:'winner',star:true}},
  {id:'cpv',name:'Cape Verde',flag:'🇨🇻',meta:'Group H',
   blurb:"A fairy tale: the tiny island nation's first-ever World Cup, sealed by a shock win over Cameroon. Led by beloved hometown coach 'Bubista'.",
   style:"A tidy 4-2-3-1 with a fast, position-swapping attack.",
   star:"Striker Dailon Livramento, scorer of the biggest goals in the country's history.",
   tags:{play:'balanced',tier:'longshot',region:'africa',vibe:'underdog',star:false}},
  {id:'ksa',name:'Saudi Arabia',flag:'🇸🇦',meta:'Group H',
   blurb:"The team that famously shocked eventual champions Argentina in 2022. Never count out the Green Falcons on the big stage.",
   style:"Energetic pressing and quick, vertical attacks.",
   star:"Veteran playmaker Salem Al-Dawsari.",
   tags:{play:'balanced',tier:'longshot',region:'asia',vibe:'underdog',star:false}},
  {id:'uru',name:'Uruguay',flag:'🇺🇾',meta:'Group H',
   blurb:"Two-time champions with a competitive streak far bigger than their size, now blending grizzled veterans with exciting youth under Marcelo Bielsa.",
   style:"Intense, aggressive, and tactically bold under a famously eccentric coach.",
   star:"Darwin Núñez and Federico Valverde headline a strong core.",
   tags:{play:'balanced',tier:'contender',region:'samerica',vibe:'winner',star:false}},

  {id:'fra',name:'France',flag:'🇫🇷',meta:'Group I',
   blurb:"Co-favorites with arguably the deepest, scariest squad in the tournament — 2018 champions and 2022 runners-up, built to go all the way again.",
   style:"Devastating in transition, with pace and finishing everywhere.",
   star:"Kylian Mbappé, one of the best players on the planet.",
   tags:{play:'attack',tier:'fav',region:'europe',vibe:'winner',star:true}},
  {id:'sen',name:'Senegal',flag:'🇸🇳',meta:'Group I',
   blurb:"One of Africa's powerhouses, stacked with Premier League talent and recent continental pedigree. A trendy dark-horse pick to go deep.",
   style:"Athletic, powerful, and quick in transition.",
   star:"A deep, physical squad led by forward Nicolas Jackson.",
   tags:{play:'balanced',tier:'dark',region:'africa',vibe:'rising',star:false}},
  {id:'irq',name:'Iraq',flag:'🇮🇶',meta:'Group I',
   blurb:"Back at the World Cup for the first time since 1986, bringing passion and a hard-working, defensive identity.",
   style:"Disciplined, compact, and combative.",
   star:"A spirited collective rather than a single headliner.",
   tags:{play:'defense',tier:'longshot',region:'asia',vibe:'underdog',star:false}},
  {id:'nor',name:'Norway',flag:'🇳🇴',meta:'Group I',
   blurb:"Back at the World Cup for the first time since 1998 — and worth the wait, with one of the most fearsome attacks in the field after a goal-soaked qualifying run.",
   style:"Direct and ruthless, built to feed two elite attackers.",
   star:"Erling Haaland, plus playmaker Martin Ødegaard.",
   tags:{play:'attack',tier:'dark',region:'europe',vibe:'rising',star:true}},

  {id:'arg',name:'Argentina',flag:'🇦🇷',meta:'Group J',
   blurb:"The reigning champions, blending battle-tested winners with Lionel Messi in what's almost certainly his final World Cup.",
   style:"Experienced, ruthless, and clutch — they know how to win the tight ones.",
   star:"Lionel Messi (38), with Lautaro Martínez and Julián Álvarez.",
   tags:{play:'balanced',tier:'fav',region:'samerica',vibe:'winner',star:true}},
  {id:'alg',name:'Algeria',flag:'🇩🇿',meta:'Group J',
   blurb:"A talented, technical side back among the elite and eager to make up for missing the 2022 tournament.",
   style:"Possession-minded with creative flair in the final third.",
   star:"In-form forward Mohamed Amoura.",
   tags:{play:'attack',tier:'dark',region:'africa',vibe:'mid',star:false}},
  {id:'aut',name:'Austria',flag:'🇦🇹',meta:'Group J',
   blurb:"A well-coached, intense European side back among the contenders and capable of troubling anyone.",
   style:"High-pressing and aggressive, built on energy and structure.",
   star:"Midfield orchestrator Marcel Sabitzer.",
   tags:{play:'balanced',tier:'dark',region:'europe',vibe:'mid',star:false}},
  {id:'jor',name:'Jordan',flag:'🇯🇴',meta:'Group J',
   blurb:"A historic first-ever World Cup for Jordan, riding the momentum of a breakout run to the 2024 Asian Cup final.",
   style:"Organized and counter-attacking, with growing belief.",
   star:"Creative spark Mousa Al-Taamari.",
   tags:{play:'defense',tier:'longshot',region:'asia',vibe:'underdog',star:false}},

  {id:'por',name:'Portugal',flag:'🇵🇹',meta:'Group K',
   blurb:"A genuine contender with maybe the deepest midfield in the tournament — and Cristiano Ronaldo's farewell World Cup at 41.",
   style:"Dangerous and direct, brimming with attacking quality and width.",
   star:"Bruno Fernandes pulls the strings; Ronaldo chases one last fairy tale.",
   tags:{play:'attack',tier:'contender',region:'europe',vibe:'winner',star:true}},
  {id:'cod',name:'DR Congo',flag:'🇨🇩',meta:'Group K',
   blurb:"Back at the World Cup for the first time since 1974 (as Zaire) — one of African football's sleeping giants finally returning to the big stage.",
   style:"Athletic and physical, strong in transition.",
   star:"A deep pool of France-developed talent.",
   tags:{play:'balanced',tier:'longshot',region:'africa',vibe:'underdog',star:false}},
  {id:'uzb',name:'Uzbekistan',flag:'🇺🇿',meta:'Group K',
   blurb:"A first-ever World Cup for the football-mad nation of 36 million after years of near-misses — now coached by 2006 World Cup-winning captain Fabio Cannavaro.",
   style:"Built to be hard to beat: organized, compact, defensively minded.",
   star:"A talented young core finally on the world stage.",
   tags:{play:'defense',tier:'longshot',region:'asia',vibe:'underdog',star:false}},
  {id:'col',name:'Colombia',flag:'🇨🇴',meta:'Group K',
   blurb:"A real dark horse loaded with flair and one of the world's best playmakers; they impressed at recent Copa Américas.",
   style:"Technical, expressive, and dangerous in the final third.",
   star:"James Rodríguez conducting, with pace all around him.",
   tags:{play:'attack',tier:'dark',region:'samerica',vibe:'rising',star:true}},

  {id:'eng',name:'England',flag:'🇬🇧',meta:'Group L',
   blurb:"Perennial contenders carrying decades of 'is this finally the year?' — stacked with talent and now coached by Thomas Tuchel.",
   style:"Deep, athletic, and pragmatic; the question is whether they trust their attackers and loosen up.",
   star:"Captain Harry Kane, one of the game's great goalscorers.",
   tags:{play:'balanced',tier:'fav',region:'europe',vibe:'winner',star:true}},
  {id:'cro',name:'Croatia',flag:'🇭🇷',meta:'Group L',
   blurb:"The great overachievers — a 2018 final and a 2022 semifinal on the back of a golden midfield, even as that generation ages.",
   style:"Masterful midfield control and game management.",
   star:"The evergreen Luka Modrić, still orchestrating.",
   tags:{play:'balanced',tier:'contender',region:'europe',vibe:'winner',star:false}},
  {id:'gha',name:'Ghana',flag:'🇬🇭',meta:'Group L',
   blurb:"One of Africa's most storied sides, back and chasing redemption after a group-stage exit in 2022.",
   style:"Athletic and quick, dangerous on the break.",
   star:"A young, energetic core with Premier League experience.",
   tags:{play:'balanced',tier:'dark',region:'africa',vibe:'mid',star:false}},
  {id:'pan',name:'Panama',flag:'🇵🇦',meta:'Group L',
   blurb:"A plucky CONCACAF side at just their second World Cup, growing fast and unafraid of bigger names.",
   style:"Hard-working, organized, and physical.",
   star:"A tight-knit, experienced regional core.",
   tags:{play:'defense',tier:'longshot',region:'concacaf',vibe:'underdog',star:false}}
];

var grid=document.getElementById('teams-grid');
TEAMS.forEach(function(t,i){
  var b=document.createElement('button');
  b.className='team-chip';b.onclick=function(){openModal(i)};
  b.innerHTML='<div class="flag">'+t.flag+'</div><div class="tn">'+t.name+'</div><div class="meta">'+t.meta+'</div>';
  grid.appendChild(b);
});

function openModal(i){
  var t=TEAMS[i];
  document.getElementById('m-flag').textContent=t.flag;
  document.getElementById('m-name').textContent=t.name;
  document.getElementById('m-meta').textContent=t.meta;
  document.getElementById('m-blurb').textContent=t.blurb;
  document.getElementById('m-style').textContent=t.style;
  document.getElementById('m-star').textContent=t.star;
  document.getElementById('modal-bg').classList.add('open');
}
function closeModal(){document.getElementById('modal-bg').classList.remove('open');}
document.addEventListener('keydown',function(e){if(e.key==='Escape')closeModal();});

/* ---------- find-your-team quiz ---------- */
function openTeamById(id){
  for(var i=0;i<TEAMS.length;i++){ if(TEAMS[i].id===id){ openModal(i); return; } }
}
var QUIZ=[
  {key:'play',q:'What kind of soccer do you want to watch?',opts:[
    {label:'⚡ Attacking fireworks',val:'attack'},
    {label:'🛡️ Rock-solid defense & grit',val:'defense'},
    {label:'⚖️ A bit of both',val:'balanced'}]},
  {key:'vibe',q:'Pick your storyline:',opts:[
    {label:'👑 A heavyweight favorite chasing glory',val:'fav'},
    {label:'📈 A rising team on the up',val:'rising'},
    {label:'🐎 A plucky underdog with nothing to lose',val:'underdog'}]},
  {key:'star',q:'Star power or team effort?',opts:[
    {label:'🌟 One must-watch superstar',val:'star'},
    {label:'🤝 A true collective',val:'team'}]},
  {key:'region',q:'Any part of the world calling your name?',opts:[
    {label:'🇪🇺 Europe',val:'europe'},
    {label:'🌎 South America',val:'samerica'},
    {label:'🌍 Africa',val:'africa'},
    {label:'🌏 Asia / Oceania',val:'asiaoc'},
    {label:'🏟️ North America',val:'concacaf'},
    {label:'🎲 Surprise me',val:'any'}]}
];
var quizStep=0, quizAns={};
function renderQuiz(){
  var body=document.getElementById('quiz-body');
  if(quizStep>=QUIZ.length){ showQuizResult(); return; }
  var qq=QUIZ[quizStep];
  var h='<div class="quiz-progress">Question '+(quizStep+1)+' of '+QUIZ.length+'</div>';
  h+='<div class="quiz-q">'+qq.q+'</div><div class="quiz-opts">';
  for(var i=0;i<qq.opts.length;i++){
    h+='<button class="quiz-opt" onclick="answerQuiz(\''+qq.key+'\',\''+qq.opts[i].val+'\')">'+qq.opts[i].label+'</button>';
  }
  h+='</div>';
  if(quizStep>0){ h+='<button class="quiz-back" onclick="quizBack()">← back</button>'; }
  body.innerHTML=h;
}
function answerQuiz(k,v){ quizAns[k]=v; quizStep++; renderQuiz(); }
function quizBack(){ if(quizStep>0){ quizStep--; } renderQuiz(); }
function restartQuiz(){ quizStep=0; quizAns={}; renderQuiz(); }
function regionMatch(r,ans){ if(ans==='any')return true; if(ans==='asiaoc')return r==='asia'||r==='oceania'; return r===ans; }
function scoreTeam(t){
  var s=0;
  if(quizAns.play && t.tags.play===quizAns.play) s+=3;
  if(quizAns.vibe){
    if(quizAns.vibe==='fav' && (t.tags.tier==='fav'||t.tags.tier==='contender')) s+=3;
    if(quizAns.vibe==='rising' && (t.tags.vibe==='rising'||t.tags.tier==='dark')) s+=3;
    if(quizAns.vibe==='underdog' && (t.tags.vibe==='underdog'||t.tags.tier==='longshot')) s+=3;
  }
  if(quizAns.star){ if(quizAns.star==='star' && t.tags.star) s+=3; if(quizAns.star==='team' && !t.tags.star) s+=2; }
  return s;
}
function showQuizResult(){
  var pool=TEAMS.filter(function(t){return regionMatch(t.tags.region,quizAns.region);});
  if(!pool.length) pool=TEAMS.slice();
  var scored=pool.map(function(t){return {t:t,s:scoreTeam(t)+Math.random()};});
  scored.sort(function(a,b){return b.s-a.s;});
  var pick=scored[0].t, alt=scored[1]?scored[1].t:null;
  var html='<div class="quiz-result">'
    +'<div class="qr-flag">'+pick.flag+'</div>'
    +'<div class="qr-pre">Your team to root for</div>'
    +'<h3>'+pick.name+'</h3>'
    +'<div class="qr-meta">'+pick.meta+'</div>'
    +'<p class="qr-why">'+pick.blurb+'</p>'
    +'<div class="quiz-btns">'
    +'<button class="quiz-btn primary" onclick="openTeamById(\''+pick.id+'\')">See full scouting report</button>'
    +'<button class="quiz-btn ghost" onclick="restartQuiz()">Retake quiz</button>'
    +'</div>';
  if(alt){ html+='<div class="qr-alt">Not feeling it? You also matched well with <button onclick="openTeamById(\''+alt.id+'\')">'+alt.name+'</button>.</div>'; }
  html+='</div>';
  document.getElementById('quiz-body').innerHTML=html;
}
renderQuiz();
</script>]]></content><author><name></name></author><category term="sports" /><category term="sports" /><category term="soccer" /><summary type="html"><![CDATA[Getting you ready for the biggest sporting event in the world]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://jmozden3.github.io/assets/images/USMNT-scaled.jpg" /><media:content medium="image" url="https://jmozden3.github.io/assets/images/USMNT-scaled.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">26 Thoughts on Graduating CBS Class of 2026</title><link href="https://joemozden.com/general/2026/05/20/graduation-thoughts-2026.html" rel="alternate" type="text/html" title="26 Thoughts on Graduating CBS Class of 2026" /><published>2026-05-20T00:00:00+00:00</published><updated>2026-05-20T00:00:00+00:00</updated><id>https://joemozden.com/general/2026/05/20/graduation-thoughts-2026</id><content type="html" xml:base="https://joemozden.com/general/2026/05/20/graduation-thoughts-2026.html"><![CDATA[<p>Last Saturday, I graduated from Columbia Business School. It was a good ride, and I feel very fortunate for the opportunity.</p>

<p>It was also a lot: a lot of events, a lot of work, and a lot of fun. I got the opportunity to live right in Manhattan, the heart of New York City, and see if I could survive in the city that never sleeps. I also got a front-row seat to how the dramatic rise of AI both powered and clashed with today’s classroom.</p>

<p>All in all, grad school looked very different from undergrad — six years after graduating from Indiana, a lot has changed. Below are 26 thoughts on graduating Columbia Business School Class of 2026.</p>

<ol>
  <li>Let’s start with the most important thing: overall, I loved it. In the words of <a href="https://www.youtube.com/watch?v=qQzdAsjWGPg&amp;list=RDqQzdAsjWGPg&amp;start_radio=1&amp;pp=ygUGbXkgd2F5oAcB">Frank Sinatra</a> — “Regrets, I’ve had a few, but then again, too few to mention.” That about sums up my two years at CBS.</li>
  <li>I would encourage anyone to get an MBA <em>if</em>…</li>
  <li>You have some sort of non-loan financial assistance (scholarships, employer assistance, family help, etc.). Even from an M7 school, jobs are never guaranteed, but debt always is.</li>
  <li>The ROI on school seems to pay off more in 5-10 years than it does right out of school. While you might get a good job right away, it’s the network that helps you land the dream job down the road. Additionally, <a href="https://open.substack.com/pub/educatedguesser/p/friction-is-a-feature?r=16gj8&amp;utm_medium=ios">as the world gets more “Ai-ified,”</a> your network will matter more and more, which is an immense benefit of school.</li>
  <li>Doing grad school in a major city was the right choice. Looking back, I was really happy with my order of decisions to do a college-town undergrad (Bloomington) and a major city grad school (NYC). That sequence just made more sense for each stage of my life.</li>
</ol>

<p><img src="/assets/images/the-met.jpeg" alt="The Met" />
<em>I went to the Met a few times which made me feel like a real New Yorker</em></p>

<ol start="6">
  <li>NYC is the best place I have ever lived. It’s expensive as hell but you get what you pay for. I found myself spending more money on doing things just because there’s always something to do - every block has an amazing restaurant, bar, theater, or most likely, all three.</li>
</ol>

<p><img src="/assets/images/new-york-engagement-photo-1.jpeg" alt="Engagement Photo 1" />
<img src="/assets/images/new-york-engagement-photo-2.jpeg" alt="Engagement Photo 2" />
<em>Christina and I got some great engagement photos in the city</em></p>

<ol start="7">
  <li>Also, New Yorkers aren’t mean, they are just direct.</li>
  <li>Contrary to undergrad where everyone is growing up together, most people at grad school are at a different stage of their life. You naturally gravitate towards people in the same ‘life-stage’ as you. This can be a challenge for building friendships but also led to a cool diversity of experience.</li>
  <li>Joining rugby was the best decision I made at school because it brought together all different kinds of people for a common goal. You gain a lot of mutual respect when you put your bodies on the line for one another (especially when you’re closer to 30 than 20), and you cannot manufacture that respect anywhere else in school.</li>
</ol>

<p><img src="/assets/images/rugby-team-photo-2026.jpeg" alt="Rugby Team Photo" />
<em>The Fellas</em></p>

<ol start="10">
  <li>Going to an Ivy league school does not mean I’d work with everyone here. There are a lot of very smart people at the school, but just like anywhere else, you have those you’d choose to work with and those you’d choose not to.</li>
  <li>The clubs at grad school make and grow the community.</li>
  <li>The hardest, but most rewarding, semester of school is the first - new environment, intense classes, and you’re likely recruiting. Doing all this at once is challenging; however, there is a sense of ‘shared trauma’ quality to those 4 months that bring together the students going through it.</li>
  <li>CBS, and many other grad schools, have a policy called Grade Non-Disclosure (GND) which means you don’t report your GPA to recruiters. You still earn grades, they just aren’t reported. Ultimately, I thought this was a good policy. While it was misused by some to put little to no effort into classes, for many it was an invitation to try new or challenging classes without the fear of consequences on a transcript. This also reduced the amount of ‘sharp elbowing’ done during recruiting.</li>
  <li>On a similar point, I found the best use of grad school is to try new things and push yourself out of your comfort zone. I tried a new sport (rugby), became an orientation leader, leaned more into community service (taught at a prison), took and TA’d challenging classes, and even participated in a fashion show. It is a low-stakes environment that encourages you to take risks. I will look back at my time at CBS and think first of doing all these new and interesting things.</li>
</ol>

<p><img src="/assets/images/rlg-fashion-show.jpeg" alt="RLG Fashion Show" />
<em>Struttin’ my stuff in the CBS Retail Luxury Goods Fashion Show</em></p>

<p><img src="/assets/images/rugby-photo-with-harold.jpeg" alt="Rugby Photo" />
<em>More rugby</em></p>

<p><img src="/assets/images/peer-advisor-shirt.jpeg" alt="Orientation" />
<em>My fellow orientation leaders for one of the clusters at CBS</em></p>

<ol start="15">
  <li>Opportunities at grad school aren’t just handed to you on a silver platter, as some people seemed to think at the beginning. However, there are more opportunities available and presented to you than anywhere else I’ve ever seen. Opportunities to do anything and everything, professionally and socially…they just take a lot of effort to get.</li>
  <li>The most engaged classrooms had a no-laptops no-phones policy. We were all provided a locked down iPad for notes, which worked well.</li>
  <li>My biggest classroom pet peeve was when people were on their laptops during guest speakers. It makes them look bad but it also makes everyone else look bad.</li>
  <li>There’s a bit of an (outdated) idea that people get an MBA to find a partner. I didn’t really see this…probably more than 50% of people come into school already with a partner, and I didn’t see that many students get in relationships with each other.</li>
</ol>

<p><img src="/assets/images/karaoke-night-with-friends.jpeg" alt="Karaoke Night" />
<em>One of my favorite nights of NYC - bringing some of our best friends from Chicago out to Karaoke at 3AM</em></p>

<ol start="19">
  <li>I used AI a lot in school - specifically, I used tools like Claude and ChatGPT as private tutors to go deeper on concepts, and NotebookLM to make podcast summaries of cases I read. AI <em>enhanced</em> my learning experience.</li>
  <li>At some point midway through second semester year two (Spring 2026) students started speaking of Claude as their main AI tool instead of ChatGPT, which was the most prevalent tool until then. While I cannot pinpoint why exactly this happened, I think it’s likely some mix of the fact that <a href="https://www.anthropic.com/news/statement-department-of-war">Claude got a lot of popular press for the refusal of the DOD contract</a> (and <a href="https://openai.com/index/our-agreement-with-the-department-of-war/">vice versa</a> for OpenAI) and then people started feeling like it had better models around that same time (mostly for automating powerpoint presentations).</li>
  <li>AI is creating a bifuraction of student effort. For one half, it’s enhancing everything they do - better prep, better analysis, better productivity, and even better creativity. For others, it’s simply a bypass. It’s hallowing out the majority middle and pushing students towards either effort extreme - much more or much less. <a href="https://x.com/Kantrowitz/status/2054246795702943863?s=20">Mark Cuban thinks so too</a>.</li>
  <li>Schools are still trying to figure out how best to integrate AI into the curriculum. At CBS, while not perfect, steps were made during the two years to add more classes and more AI-tools. The question now is if education as a whole can keep up.</li>
  <li>AI made standard problem-set homework almost meaningless. AI has gotten so good that you can upload 20 stats questions and it can solve it almost perfectly. We need to rethink what homework even is.</li>
  <li><a href="https://en.wikipedia.org/wiki/Bloom%27s_taxonomy">Bloom’s Taxonomy</a> describes levels of learning — from the foundational (remembering, understanding) up to the complex (analyzing, evaluating, creating). Historically, a lot of homework lived at the bottom: here are 20 problems, submit them, never discuss them again. AI has made that kind of work trivially easy. The opportunity now is to design learning that lives at the top of the pyramid — live debate, real analysis, building things. That’s where the actual learning is, and it’s also where AI can’t just do it for you.</li>
  <li>Two of the best classes I took had drastically different AI policies. One had a near-zero AI policy, while the other used it every single class. Both classes had the following characteristics in common: cold callilng, plenty of discussion and debate, and live presentations and feedback.</li>
  <li>Two years is exactly the right amount of time. There’s no way I could do another year, but I felt like I was just hitting my stride after year one. And from everyone I’ve talked to - most of them loved their time here. I am definitely one of them.</li>
</ol>

<p>Thanks CBS for an amazing two years!</p>

<p><img src="/assets/images/first-day-of-class.jpeg" alt="First Day of Class" />
<em>First day of class</em></p>

<p><img src="/assets/images/last-day-of-class.jpeg" alt="Last Day of Class" />
<em>Last day of class. Please excuse the cigarette and beer</em></p>

<p><img src="/assets/images/graduation-photo.jpeg" alt="Graduation" />
<em>That’s a wrap!</em></p>]]></content><author><name></name></author><category term="general" /><category term="education" /><summary type="html"><![CDATA[Some final thoughts on my 2 years at school]]></summary></entry><entry><title type="html">Lessons from TAing my favorite class</title><link href="https://joemozden.com/tech/2026/02/18/ta-thoughts.html" rel="alternate" type="text/html" title="Lessons from TAing my favorite class" /><published>2026-02-18T17:00:00+00:00</published><updated>2026-02-18T17:00:00+00:00</updated><id>https://joemozden.com/tech/2026/02/18/ta-thoughts</id><content type="html" xml:base="https://joemozden.com/tech/2026/02/18/ta-thoughts.html"><![CDATA[<p>As someone who self-describes himself as a “liaison between technical and non-technical stakeholders” (OK mr. business man), I recently found a nice little short job for myself. This January, I was a teaching assistant for a class called “Programming Generative AI applications” at Columbia Business School, which I took last spring as a student.</p>

<p>From the syllabus…</p>

<p>“The focus of this course is to give you a working knowledge of what it takes to customize and assemble a customized generative AI application.”</p>

<p>That’s about as good as I could describe it. It’s about building AI applications.</p>

<p>Now, the “AI portion” goes two ways - it’s about integrating AI into applications (using OpenAI’s API) but also using AI to build (Cursor, Claude Code, etc.).</p>

<p>The class was only five days, 8 hours a day, and was broken up between course work and project work. Again, from the syllabus…</p>

<p>“About 50% of the class time will be devoted to a group project where you will, in small groups, build your own customized AI applications.”</p>

<p>My job as a teacher’s assistant wasn’t to teach, but to walk around and help each group during project time. What was cool about this job was that I got to go to each group, understand what they were building, why they were building it, and how they were building it.</p>

<p>Another unique part of this class is that it’s for beginners - you need very little, if any, tech knowledge before taking this class. Essentially, <strong>I got a firsthand look at what beginners build and how they do it.</strong></p>

<p>After five days of watching (mostly) new techies build real AI apps, I came away with a few observations - some expected, and some that genuinely surprised me.</p>

<h2 id="on-the-tools">On The Tools</h2>

<p><a href="https://cursor.com/agents">Cursor</a> was the main coding tool of choice. While I think there are better coding products out there today (<a href="https://code.claude.com/docs/en/overview">Claude Code</a> <em>cough cough</em>) it was relevant for newbies to learn about IDEs (even if they aren’t around forever). Additionally, there are quicker ways to mock up applications using tools like <a href="https://lovable.dev/">Lovable</a> or <a href="https://base44.com/">Base44</a>; however, many of these students want to eventually work in tech firms, and again, it’s good to know how enterprises are shipping code today. If you want to eventually explore your own technical projects (i.e. <a href="https://openclaw.ai/">OpenClaw</a> right now) there is value in knowing the terminal, file stucture, etc.</p>

<p><img src="/assets/images/cursor-agents-interface.png" alt="Cursor Interaction" /></p>
<blockquote>
  <p><em>Mostly all the interaction in the IDE comes from working with the agents, not the code itself</em></p>
</blockquote>

<p><a href="https://platform.openai.com/api-keys">OpenAI API</a> was our token of choice. Most people know and understand OpenAI, and their API documentation is pretty easy to read through. We also make sure to set usage limits just in case something goes wrong.</p>

<p><a href="https://vercel.com/">Vercel</a> blew up this year. Seldom did people use it last year. Ease of deployment, in my mind, has made one of the biggest leaps since last year. I’ve personally used Vercel, and it’s absolutely excellent - simply connect it with a repository and it will create a shareable link for you.</p>

<p><a href="https://supabase.com/">Supabase</a> was the go-to tool for databases. Supabase itself was a great, easy to use option for application databases, but databases created a bit of a hassle for some student groups. More on that below.</p>

<p>If I were to create an application from scratch, as a beginner, I would generally follow this flow, which is what most students did.</p>

<p><img src="/assets/images/deployment-user-flow.jpg" alt="User Flow" /></p>
<blockquote>
  <p><em>Code in cursor. Push to Github. Deploy to Vercel. You have a fully functioning, shareable application</em></p>
</blockquote>

<h2 id="on-getting-stuck">On Getting Stuck</h2>

<p>Troubleshooting is a skill. For beginners, most troubleshooting (primarily in Cursor) consisted of the following prompt - “plz fix.” Not really…but closer to that than an actual, effective troubleshooting message. Truthfully, I believe good troubleshooting comes down to a bit of experience. The best troubleshooting comes from knowing where the error is and what the expected behavior should be, not from immediately knowing <em>what</em> the error is. Most of my time as a TA was troubleshooting with teams during group work, and I didn’t know 80% of the issues upon initial review; however, all were solved because I knew how to troubleshoot. Learn that skill.</p>

<p>Reduce any need for unnecessary connections. For example, one team ran into issues connecting to their supabase database. Other teams had trouble connecting to multiple Google Calendars and Drives. This is a five day class where you showcase your product at the end - in my mind, there is no need to overcomplicate things, especially for demos. This is even true for a production grade application I’m trying to demo to investors - the first focus isn’t auth or connecting different data sources - it is making something functional and that sizzles. Keep it as simple as possible, even if that means using mock data locally.</p>

<p>Github, specifically branching, is really difficult for beginners to wrap their heads around. People worked in teams of 4-5, and for some of the teams that tried to do branches they ran into merge issues pretty much instantly. For this environment, it was better to have one person focus on the code at a time.</p>

<p>Some AI’s went rogue with output, and it takes someone with a bit of experience to see when it goes down weird little rabbit holes. For example, one group’s Cursor agent made a .md file for every single prompt they asked the machine. Know what you want, and if something seems to be taking too long or seems overcomplicated, it probably is. It’s good to prompt Cursor at the beginner discussing what you are trying to build, and request for simplicity over complication.</p>

<h2 id="on-the-class">On The Class</h2>

<p>In some of the theory parts of class, we used <a href="https://colab.research.google.com/">Google Colab</a>. This worked really well since we didn’t run into any dependency issues that you might face with something like Jupyter Notebook. Even with the non-group work, we were getting hands on computer.</p>

<p>Last year, we discussed HTML. This year, we substituted that lesson for teaching deployment. That was a good swap of information, and with technology moving so quickly, I expect more changes to be made next year.</p>

<p>Virtual environments are slightly difficult to explain, especially as to why they are a best practice. That said, it was well worth it to help people quickly set one up for each project to minimize dependency issues, and basically give a one-minute explanation of why they are important, even if people don’t understand them 100%. It’s better for them simply to know that they <em>are</em> a best practice and less on why…at least for this class.</p>

<p>The five-day, intensive curriculum works amazingly well for this type of class. <strong>Lack of momentum is the biggest killer of technology projects</strong> - keeping everyone together for five days, working consistently toward a common goal created the best outputs. Dedication &amp; Momentum &gt; Time</p>

<p>To me, this is what AI education should look like - there is theory, but more than that, there is real world, project based work that pushes people to <em>create</em>. Creation is the top-level cognitive work, and more classes should focus their curriculum on analyzing, evaluating, and creating rather than remembering, understanding, and applying.</p>

<p><img src="/assets/images/blooms-taxonomy.jpg" alt="Bloom's Taxonomy" /></p>
<blockquote>
  <p><em>Bloom’s Taxonomy is a six-level hierarchy used to classify learning objectives by their cognitive complexity, moving from foundational memorization to higher-order critical thinking. Creation is the highest cognitive level because it requires students to synthesize all previous levels to produce original work</em></p>
</blockquote>

<h2 id="on-the-bigger-picture">On the Bigger Picture</h2>

<p>The reason this class is so beneficial is that everyone knows AI can help, but few know how to make it work for them. People need a little push to get from 0 to 1. This class teaches you, through both theory and project based work, how AI can help you build. Many students have taken their group projects and continued to work on them after the class or even created new products on their own time. Continue to learn more and more, just by doing.</p>

<p>The apps built this year were technically better than last year, and next year will be dramatically better than this year’s. That said, I still remember some stand out applications from last year’s class that I would use over some of today’s more recent applications.</p>

<p>Building, deploying, even databasing - that is more accessible than ever. But troubleshooting, knowing what you’re prompting toward, <strong>knowing what to build and why</strong> - that is still on us, and it makes all the difference.</p>

<p>The tools and execution got easier. The thinking did not. And that’s what we should continue to work on every single day.</p>

<p><em>Special thanks to Professor Johar and my trusty TA partners in crime Chitipat and Xilin. Wouldn’t have been as informative (and fun) without you</em></p>]]></content><author><name></name></author><category term="tech" /><category term="education" /><category term="AI" /><summary type="html"><![CDATA[What do newly minted techies build? And how?]]></summary></entry><entry><title type="html">Project Diary: NYT Daily Newsletter</title><link href="https://joemozden.com/tech/2025/12/09/nyt-newsletter-journal.html" rel="alternate" type="text/html" title="Project Diary: NYT Daily Newsletter" /><published>2025-12-09T17:00:00+00:00</published><updated>2025-12-09T17:00:00+00:00</updated><id>https://joemozden.com/tech/2025/12/09/nyt-newsletter-journal</id><content type="html" xml:base="https://joemozden.com/tech/2025/12/09/nyt-newsletter-journal.html"><![CDATA[<p><img src="/assets/images/nyt-newsletter-email.png" alt="Email Inbox" /></p>

<p>One of the great things about living in New York is that the Times is technically your local paper. It’s pretty cool to have one of the most prestigious newspapers in the world to provide you all the neighborhood hot spots, gossip, and restaurants. That said, opening the NYT can sometimes be <em>slightly</em> distracting…national politics, international news, and more flood the homepage when all I’m trying to see is where to get the best bagel in UWS.</p>

<p>I wanted to personalize my reading experience just a bit more - this way, I could still read through the great work of the NYT while focusing on my interests: local NYC food, culture, and news mixed with just a bit of business and tech coverage I need for work.</p>

<p>I decided to build something that did just that. Using the <a href="https://developer.nytimes.com/apis">NYT API</a>, <a href="https://www.pythonanywhere.com/">pythonanywhere</a>, <a href="https://support.google.com/accounts/answer/185833?hl=en">Gmail App Passwords</a>, and trial-and-error debugging, I built a personalized daily newsletter that sends me one NYT article each morning—automatically curated based on the day of the week.</p>

<p>Here is how it all works together:</p>

<p><img src="/assets/images/newsletterarchitecture.png" alt="Architecture" /></p>

<p>And here is the type of article I receive each morning:</p>
<ul>
  <li>Monday: Top national business story</li>
  <li>Tuesday: Top national tech story</li>
  <li>Wednesday: NYC Food and Dining article</li>
  <li>Thursday: NYC Arts and Culture article</li>
  <li>Friday: NYC Metro News Article</li>
  <li>Saturday: Top Op-Ed story</li>
  <li>Sunday: Most viewed article of the week</li>
</ul>

<p>Could I just open the Times and scroll? Sure—and I still do. But I find it beneficial to start the day with one focused article rather than scanning endless headlines - One article, one topic, delivered to my inbox each morning, and maybe I explore the Times further from there. Plus, I wanted to build something I thought I would actually use — and a personalized newsletter seemed like a good excuse to get hands-on.</p>

<p>That is my WHY…I now had to think through the HOW. I could identify three primary pieces that would need to fit together in order to build this out:</p>
<ol>
  <li>I would need to use the <a href="https://developer.nytimes.com/apis">NYT APIs</a> to get the articles I wanted to read</li>
  <li>I would need to work with Gmail to receive those articles in my inbox</li>
  <li>I would need some level of cloud compute to automate this process for me</li>
</ol>

<h2 id="the-nyt-apis">The NYT APIs</h2>

<p>Getting started with the NYT APIs was pretty easy. You sign up for a <a href="https://developer.nytimes.com/apis">nyt developer account</a> and create <a href="https://developer.nytimes.com/my-apps">an app</a>. In my case, the app was the NYT daily newsletter. Your app will provide you your API key, which you can use for any of the numerous APIs the NYT offers.</p>

<p><img src="/assets/images/nyt-apis.png" alt="Email Inbox" /></p>

<p>A few of these APIs are deprecated, and some aren’t super relevant - while every use case is different, the most relevant APIs for most projects are likely the following (which I used for my project):</p>
<ul>
  <li><a href="https://developer.nytimes.com/docs/articlesearch-product/1/overview">Article Search API</a>: By far the most well-documented and robust NYT API. Used for NYC-focused days (Wed/Thu/Fri) since it supports location filtering</li>
  <li><a href="https://developer.nytimes.com/docs/top-stories-product/1/overview">Top Stories API</a>: A very basic API that returns an array of articles currently on a specified section. Used for national news to get current business/tech/opinion pieces</li>
  <li><a href="https://developer.nytimes.com/docs/most-popular-product/1/overview">Most Popular API</a>: Pulls the most popular article on NYT for a specified time period. You can define ‘most popular’ based on most emailed, most shared, or most viewed.</li>
</ul>

<h3 id="article-search">Article Search</h3>

<p>The Article Search API was my choice for NYC-specific content. It’s the most robust of the three, with extensive filtering options for location, desk, and date ranges.</p>

<p>For my Wednesday, Thursday, and Friday articles, the config looks like this:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 7-Day Rotation Schedule
</span>
<span class="n">WEEKLY_SCHEDULE</span> <span class="o">=</span> <span class="p">{</span>
    <span class="mi">2</span><span class="p">:</span> <span class="p">{</span>  <span class="c1"># Wednesday
</span>        <span class="s">"name"</span><span class="p">:</span> <span class="s">"NYC Food &amp; Dining"</span><span class="p">,</span>
        <span class="s">"api"</span><span class="p">:</span> <span class="s">"article_search"</span><span class="p">,</span>
        <span class="s">"filter"</span><span class="p">:</span> <span class="s">'desk:"Dining" AND timesTag.location:"New York City"'</span><span class="p">,</span>
        <span class="s">"description"</span><span class="p">:</span> <span class="s">"NYC restaurant reviews and food scene"</span>
    <span class="p">},</span>
    <span class="mi">3</span><span class="p">:</span> <span class="p">{</span>  <span class="c1"># Thursday
</span>        <span class="s">"name"</span><span class="p">:</span> <span class="s">"NYC Arts &amp; Culture"</span><span class="p">,</span>
        <span class="s">"api"</span><span class="p">:</span> <span class="s">"article_search"</span><span class="p">,</span>
        <span class="s">"filter"</span><span class="p">:</span> <span class="s">'desk:"Culture" AND timesTag.location:"New York City"'</span><span class="p">,</span>
        <span class="s">"description"</span><span class="p">:</span> <span class="s">"Theater, museums, and cultural events"</span>
    <span class="p">},</span>
    <span class="mi">4</span><span class="p">:</span> <span class="p">{</span>  <span class="c1"># Friday
</span>        <span class="s">"name"</span><span class="p">:</span> <span class="s">"NYC Metro News"</span><span class="p">,</span>
        <span class="s">"api"</span><span class="p">:</span> <span class="s">"article_search"</span><span class="p">,</span>
        <span class="s">"filter"</span><span class="p">:</span> <span class="s">'desk:"Metro"'</span><span class="p">,</span>
        <span class="s">"description"</span><span class="p">:</span> <span class="s">"Local NYC news and community stories"</span>
    <span class="p">},</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">filter</code> parameter is crucial—it determines what articles get returned. But first, I had to get it working…</p>

<p>My initial attempt with Claude-generated code returned zero articles. Every single query came back empty. I knew this was wrong — there had to be NYC dining and culture articles. So I went back through my conversation with Claude and noticed something I’d initially overlooked:</p>

<p><img src="/assets/images/nyt-claude-discussion.png" alt="NYT Claude Discussion" /></p>

<p>Claude couldn’t access the actual NYT developer documentation. The site blocked it (likely to prevent AI scraping of their content). Instead, Claude relied on older, incomplete sources. I pulled up the documentation myself and compared it line-by-line with the generated code. There it was:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># What Claude generated (wrong):
</span><span class="s">'fq'</span><span class="p">:</span> <span class="s">'news_desk:"Metro"'</span> <span class="c1"># returns 0 articles
</span>
<span class="c1"># What actually works
</span><span class="s">'fq'</span><span class="p">:</span> <span class="s">'desk:"Metro"'</span> <span class="c1"># Returns 10,000+ articles
</span></code></pre></div></div>
<p>The field name was <code class="language-plaintext highlighter-rouge">desk</code>, not <code class="language-plaintext highlighter-rouge">news_desk</code>. One word. Completely broke the query.</p>

<p>The lesson learned here: AI can generate code quickly and often accurately, but it still hits walls — especially with documentation behind paywalls or anti-scraping protections. You need to understand enough to debug when things don’t work as expected. I only caught this because I knew to check the actual API response structure.</p>

<p>Once that was fixed, the next challenge: filtering for NYC content <em>specifically</em>.</p>

<p>I tried several approaches:</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">section_name:"New York"</code> → 0 results</li>
  <li><code class="language-plaintext highlighter-rouge">glocations:"New York City"</code> → 0 results</li>
  <li><code class="language-plaintext highlighter-rouge">geo_facet:"New York"</code> → 0 results</li>
</ul>

<p>Finally, buried in the filter query examples (not the main field documentation), I found:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">timesTag</span><span class="p">.</span><span class="n">location</span><span class="p">:</span><span class="s">"New York City"</span>
</code></pre></div></div>

<p>That unlocked everything:</p>
<ul>
  <li>Dining + NYC: 1,251 articles ✓</li>
  <li>Culture + NYC: 977 articles ✓</li>
  <li>Metro desk: 10,000+ articles ✓</li>
</ul>

<p>Once those were resolved, it was off to the races. The article search API lets you filter by so much more…I just tailored it to my needs. It would be easy for others to tinker with those parameters to find articles they were interested in.</p>

<h3 id="top-stories">Top Stories</h3>

<p>For all my non-local articles, I just wanted to know what the top stories were for industries I am interested in - in this case, that is business and tech (there are many more options than just that). What I didn’t originally understand, however, was what ‘top story’ meant. The documentation defines it as this…</p>

<p>“The Top Stories API returns an array of articles currently on the specified section (arts, business, …).”</p>

<p>What does that mean? Currently on the specified section of what? And where on that section?</p>

<p>In order to find this out , I tested two things:</p>
<ol>
  <li>Run the API and see what it returns</li>
  <li>Look at that particular section on the nytimes.com and see where those API articles are.</li>
</ol>

<p>To do that, I run the top stories for business:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="s2">"https://api.nytimes.com/svc/topstories/v2/arts.json?api-key=mykey"</span>
</code></pre></div></div>
<p>which returns the following:</p>

<p><img src="/assets/images/business-articles-api-call.png" alt="Business Articles in Pretty Print" /></p>

<p>While there are many more articles listed, the api returned two that we can see without scrolling down:</p>
<ul>
  <li>‘Zootopia 2’ Goes Wild at the Worldwide Box Office</li>
  <li>Two Retail Chiefs Take Stock of a Make-or-Break Holiday Shopping Season</li>
</ul>

<p>So now it was time to find these articles on nytimes.com, which was relatively easy. I went to the business section and found the most recent articles.</p>

<p><img src="/assets/images/business-articles-nyt-page.png" alt="Business Articles in Pretty Print" /></p>

<p>So, by the documentation’s description, it is exactly this - “articles currently on the specified section.” I expected “Top Stories” to mean something more…maybe front-page articles or the most prominent story on the page (like that “Silicon Valley’s Man in the White House” article with the big photo). Instead, it’s just the most recent articles published under “Latest” in that section.</p>

<p>Since I don’t want ALL the articles and just want one, I will simply pull the top story listed for that particular section at 8am, when the task is executed (in the example above, the email article sent to my inbox would be the one about zootopia 2). Does Zootopia 2 really qualify as a ‘top business story’? Not really — it’s no more important than the retail chiefs article below it. But they’re both recent, relevant business coverage. And that’s the key point: this API gives me current, editorially-vetted articles in my chosen topics. It’s not perfect, but it works.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">WEEKLY_SCHEDULE</span> <span class="o">=</span> <span class="p">{</span>
    <span class="mi">0</span><span class="p">:</span> <span class="p">{</span>  <span class="c1"># Monday
</span>        <span class="s">"name"</span><span class="p">:</span> <span class="s">"Business News"</span><span class="p">,</span>
        <span class="s">"api"</span><span class="p">:</span> <span class="s">"top_stories"</span><span class="p">,</span>
        <span class="s">"section"</span><span class="p">:</span> <span class="s">"business"</span><span class="p">,</span>
        <span class="s">"description"</span><span class="p">:</span> <span class="s">"Latest breaking business news"</span>
    <span class="p">},</span>
    <span class="mi">1</span><span class="p">:</span> <span class="p">{</span>  <span class="c1"># Tuesday
</span>        <span class="s">"name"</span><span class="p">:</span> <span class="s">"Technology"</span><span class="p">,</span>
        <span class="s">"api"</span><span class="p">:</span> <span class="s">"top_stories"</span><span class="p">,</span>
        <span class="s">"section"</span><span class="p">:</span> <span class="s">"technology"</span><span class="p">,</span>
        <span class="s">"description"</span><span class="p">:</span> <span class="s">"Latest tech industry news"</span>
    <span class="p">},</span>
    <span class="mi">5</span><span class="p">:</span> <span class="p">{</span>  <span class="c1"># Saturday
</span>        <span class="s">"name"</span><span class="p">:</span> <span class="s">"Opinion"</span><span class="p">,</span>
        <span class="s">"api"</span><span class="p">:</span> <span class="s">"top_stories"</span><span class="p">,</span>
        <span class="s">"section"</span><span class="p">:</span> <span class="s">"opinion"</span><span class="p">,</span>
        <span class="s">"description"</span><span class="p">:</span> <span class="s">"Top opinion and editorial pieces"</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>This API is designed to return an array of stories, not just one. Ideally, I’d use the Most Popular API filtered by section — but that API doesn’t support section filtering. The Top Stories API was my best option for getting current business and tech articles. Good enough beats perfect when you’re trying to ship something that works.</p>

<h3 id="most-popular">Most Popular</h3>

<p>I wanted to add the most popular story in a given week to my reading repetoire just because I want to see what everyone else is reading. This API is, by far, the most straightforward of the bunch - what is the most popular news story within the last 7 days. Since ‘most popular’ can be defined as most shared, most emailed, or most viewed, I had to decide what I wanted for my newsletter. While most shared and most emailed might be better for understanding engagement, I was simply trying to read what everyone else was reading. For that reason, I used the parameter of most viewed for this API call.</p>

<p>In this example call, you can notice how it says ‘viewed’ in the parameters. That could’ve been swapped with ‘shared’ or ‘emailed.’</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="s2">"https://api.nytimes.com/svc/mostpopular/v2/viewed/1.json?api-key=yourkey"</span>
</code></pre></div></div>
<h2 id="connecting-the-apis-to-my-gmail-inbox">Connecting the APIs to my Gmail inbox</h2>

<p>While knowing how to call the NYT APIs and get the articles I want is cool, to make this application actually useful, I want to connect that data to <em>something</em>. I don’t want to just run this code and get the article in my IDE output. In this instance, I want to connect the articles called from the NYT APIs to my Gmail inbox.</p>

<p>In order to allow our API code to connect to my inbox, we need to use the Gmail SMTP, which allows emails to travel through Google’s servers. SMTP stands for standard mail transfer protocol - it’s how all emails travel across the internet. In our case, we want the emails we create (the email with NYT articles) to be sent to our inbox.</p>

<p>We connect our code to Gmail through <a href="https://support.google.com/accounts/answer/185833?hl=en">Gmail App Password</a>. You create a password <em>just for this particular code</em>. You can then plug in that information to the code below, that sets up the SMTP. Think of this like google creates a password just for this project , and then you plug that password into the code.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Connect to Gmail's SMTP server
</span><span class="n">server</span> <span class="o">=</span> <span class="n">smtplib</span><span class="p">.</span><span class="n">SMTP_SSL</span><span class="p">(</span><span class="s">'smtp.gmail.com'</span><span class="p">,</span> <span class="mi">465</span><span class="p">)</span>

<span class="c1"># Log in with your email and app password
</span><span class="n">server</span><span class="p">.</span><span class="n">login</span><span class="p">(</span><span class="n">EMAIL_FROM</span><span class="p">,</span> <span class="n">EMAIL_PASSWORD</span><span class="p">)</span>

<span class="c1"># Send the email
</span><span class="n">server</span><span class="p">.</span><span class="n">send_message</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
</code></pre></div></div>
<p>Since SMTP is how emails travel, Gmail provides an SMTP server you can use, and App Passwords let you connect securely without exposing your real Google password.</p>

<p>This is the same flow shown in the architecture diagram at the beginning of this article — the Python script bridges the NYT APIs and your inbox, formatting article data into readable HTML emails.</p>

<h2 id="deployment">Deployment</h2>

<p>So we have now written code that calls the NYT articles I want, formats it as an email, and set up the connection that allows those emails to be sent to inbox. But we’re not quite done.</p>

<p>If I let this as is, I would need to get on my computer every day, run this script, and then the article will be sent to my email. While that is cool, I don’t want to do this manually every day. I want an automated email sent to my inbox, similar to email newsletters you might sign up for elsewhere.</p>

<p>We are going to do this by deploying our script to the internet. Our code currently runs on our local computer, the one we are literally using. But, if we instead put this script on another computer, perhaps one that was ALWAYS on and one that could run certain things at certain times, that could help us run this script automatically.</p>

<p>This is what deployment does - you upload your code somewhere and another computer runs it. That is how applications are always running - we might code them on our computers, but that code is uploaded to computers (often time hundreds, if not thousands of computers) somewhere else in the world. When you hear of cloud companies like Microsoft , Amazon, and Google, this is a core part of their business - they host your applications in the ‘cloud’ - which really just means they host your stuff on their servers somewhere.</p>

<p>For this application, <a href="https://www.pythonanywhere.com/">pythonanywhere</a> worked really well - pythonanywhere’s free version gets me 512mb of storage, one daily cron job, and enough compute to run my script, which is all I need. I’d recommend pythonanywhere for anyone that has a lightweight application that doesn’t need more than one automated task a day.</p>

<h1 id="what-i-learned">What I Learned</h1>

<p>Could this be built with no-code tools (<a href="https://lovable.dev/">Loveable</a>, <a href="https://replit.com/">Replit</a>) or a different tech stack? Absolutely. But building it myself taught me things I wouldn’t have learned otherwise:</p>

<p><strong>1. AI has blind spots — you still need to know fundamentals to catch them</strong></p>

<p>Claude couldn’t access the NYT documentation and <em>confidently</em> gave me broken code (<code class="language-plaintext highlighter-rouge">news_desk</code> instead of <code class="language-plaintext highlighter-rouge">desk</code>). I only caught it because I understood how to read API documentation and debug when things didn’t work.</p>

<p>Even as AI gets better, this won’t change: you need to understand how systems work. AI can generate code, but if you can’t read documentation or debug when things break, you’re stuck.</p>

<p><strong>2. Architecting solutions is still your job</strong></p>

<p>AI can implement once you tell it what to build. But I still had to decide:</p>
<ul>
  <li>Which of three APIs to use for each day</li>
  <li>That <code class="language-plaintext highlighter-rouge">timesTag.location</code> works when other location fields don’t</li>
  <li>How to connect Gmail SMTP to my script</li>
  <li>Where to deploy and how to automate it</li>
</ul>

<p>Knowing how pieces fit together and making those architectural decisions — that’s what makes you effective with AI. You need to have the strategic vision and decision-making skills, but AI executes. (My old coworker Dan Giannone has a really good post about this thought you can find <a href="https://www.linkedin.com/pulse/from-coding-thinking-future-software-development-dan-giannone-eipoe">here</a>)</p>

<p><strong>3. Hands-on keeps you sharp and up-to-date</strong></p>

<p>Being hands-on keeps you on top of the latest tech stack, which helps with the point above. I learned PythonAnywhere is perfect for lightweight automation. I learned about API rate limits the hard way. I learned the quirks of each NYT API. Each project teaches you new tools and patterns that transfer to the next one.</p>

<p>The best way to learn is to build. Even if it’s “just” a daily email newsletter, you’ll learn something valuable in the process.</p>]]></content><author><name></name></author><category term="tech" /><category term="API" /><category term="deployment" /><summary type="html"><![CDATA[My process for building a tool that sends me a daily personalized NYT article]]></summary></entry><entry><title type="html">Vibecoding 101</title><link href="https://joemozden.com/tech/2025/09/30/vibecoding.html" rel="alternate" type="text/html" title="Vibecoding 101" /><published>2025-09-30T17:00:00+00:00</published><updated>2025-09-30T17:00:00+00:00</updated><id>https://joemozden.com/tech/2025/09/30/vibecoding</id><content type="html" xml:base="https://joemozden.com/tech/2025/09/30/vibecoding.html"><![CDATA[<p>On a beautiful sunny day in Upper West Side, I was walking and talking about AI with my school buddy, as all business students seem to do 24/7/365. In the midst of our discussion he mentioned to me…</p>

<p>“I understand that ChatGPT is good for coding but I don’t actually get how people do anything with it”
That stuck with me - it was a good reminder that even among those involved in business and tech, the real power of ChatGPT, Claude, Gemini, and others isn’t always obvious. Besides making ghiblis or <a href="https://www.edweek.org/technology/new-data-reveal-how-many-students-are-using-ai-to-cheat/2024/04">doing your homework</a>, there’s one benefit I find extraordinary - lowering the barrier to code creation. In its simplest form, vibecoding is just a way that AI makes coding accessible to everyone. Vibing opens the door for everyone to <em>build stuff</em>. And that’s the beauty of it. It lets anyone with an idea simply vibe with AI and end up with something real.</p>

<p><img src="/assets/images/PINOCCHIO.jpg" alt="Pinnocchio" /></p>
<blockquote>
  <p><em>“I’m a real SAAS business application!”</em></p>
</blockquote>

<h2 id="vibing-origins">Vibing Origins</h2>

<p><img src="/assets/images/vibecoding-tweet.png" alt="original vibecoding tweet" /></p>

<p>Back in early 2025, Andrej Karpathy coined the term “vibecoding” in this tweet. I think this is pretty much correct definition, although people have their unique spin on it. The way I see it, vibecoding is simply using AI to help you code. No Computer Science degree required. No bootcamp. No months of learning syntax. Just you, your idea, and an AI tool.</p>

<p>AI tools like ChatGPT, Claude, and Gemini have gotten so good at writing code that they can build entire things for you. A game. A website. A tool that solves your specific problem. You describe what you want in plain English, and it codes it. That’s the whole magic trick.</p>

<p><img src="/assets/images/talking-about-ai-dalle.png" alt="Business students discussing AI" /></p>
<blockquote>
  <p><em>DALL-E generated image of “Two businesss school students discussing AI on a sunny day in New York City’s Upper West Side, using a cartoon art style”</em></p>
</blockquote>

<h2 id="a-general-walkthrough-of-vibecoding">A general walkthrough of vibecoding</h2>

<p>I am not a programmer by nature myself, but vibecoding has helped me build more than I ever imagined I could have. It helped me build <a href="https://topfive-h7dtbccrgmd8gye8.eastus2-01.azurewebsites.net/">this game</a>, or even this very website. It helped my non-technical friend <a href="https://duncanheidkamp.com/">build his website</a>, and helped countless others build to their hearts’ desires.</p>

<p>It’s not only the simple stuff either. I’ve seen my friend, a former educator, build an application that helps teachers build out entire lesson plans and associated slides. I’ve seen another friend use vibecoding to help him build smart home applications. None of these are earth-shattering, but that doesn’t matter. What matters is that people ideas and they made them real.</p>

<p>If you haven’t tried vibecoding yet, here’s the basic flow:</p>
<ol>
  <li>You pick an idea for something to build. It can truly be anything, but the recommendation is to always start small (build a tic tac toe game if you don’t have any better ideas)</li>
  <li>You open an AI tool like ChatGPT or Claude and describe what you want - “build me a tic tac toe game” or “create a tool that converts temperatures.”</li>
  <li>The AI gives you code. I typically like to ask the tool to explain what it’s building so you can learn as you go.</li>
  <li>You paste that code into files on your computer using a tool called an IDE (like <a href="https://code.visualstudio.com/download">VS Code</a> or <a href="https://cursor.com/download">Cursor</a> – these are just apps where you write and organize code…for example, you’re not pasting code into Microsoft Word, you make or paste it in an IDE).</li>
  <li>Then you run it and see what you made. If something doesn’t work or you want to change it, you just tell the AI and it fixes it.</li>
  <li>If you want others to use what you built, you can deploy it online with tools like Netlify or Vercel or any cloud service like Azure or AWS – this can be complicated sometimes, but the AI walks you through this.</li>
</ol>

<p>That’s it. The AI handles the technical complexity and you handle the strategy and vision. Vibecoding empowers those with drive and vision to create.</p>

<p><img src="/assets/images/creating-an-application.png" alt="Sharing a virtual game with others" /></p>
<blockquote>
  <p><em>DALL-E generated image of “someone vibecoding and creating a game that they are sharing with the world, using a fun and vibrant art style</em></p>
</blockquote>

<p>To get started, I’d literally recommend opening ChatGPT or Claude and typing:</p>

<p><em>“I’ve never coded before and want to build something simple to get started - maybe a tic tac toe game or [your idea here]. Walk me through the entire process step by step: what tools I need, how to write and organize the code, and how to actually run it on my computer so I can see it work. I want to learn as we go, not just copy and paste. And let me know that I can ask you to change things once it’s working.”</em></p>

<p>Then just follow along. It seems like a lot the first time, but once you do it once, you’ll realize how straightforward it actually is. And like anything else, the more you do, the more you learn.</p>

<h2 id="the-broader-point">The broader point</h2>

<p>Does this mean we should vibecode everything? Definitely not. AI still is not as good as our best programmers at producing code. It may produce a lot of it, but it doesn’t mean it’s always right. AI often overcomplicates really simple tasks and that can lead to a plethora of issues. I absolutely do not want AI (at least right now) coding critical software that people’s lives might depend on.  AI models are nothing more than a prediction tool and sometimes those predictions can go horribly wrong. For now, and possibly forever, there is always a place for programmers.</p>

<p>However, as you might’ve been able to decipher from this post, I think vibecoding is incredible. It helped me create so much more than I ever could have imagined. It can help you do the same. And I believe creation - building things - is a net positive for society as a whole.</p>

<p>We should <em>build</em> more things. Vibecoding is democratizing that ability like never before. Before, if you had an idea for a simple game or a productivity tool, you had two options: spend months or years learning to code or pay someone else to do it for you. Now, you can sit down on a Saturday afternoon, vibe along with an AI tool, and walk away with something real you created.</p>

<p>This, to me, is more than just individual empowerment, although that is incredible as well. It’s about unleashing human creativity at scale. When more people can build things, we get more solutions to problems we didn’t even know we had before. We get more tools, more games, more experiments, more applications. We get someone who’s sat on a business idea for years finally bringing it to life. We get someone making their first app and having the same incredible feeling of seeing a finished built product as they did when they used to build legos (oh wait that’s me).</p>

<p>Not everyone needs to vibecode nor does everyone need to build anything. But the fact that we <em>can</em> is pretty remarkable. It’s turned this exclusive club into an open sandbox, and everyone is invited to start building sandcastles.</p>

<p><img src="/assets/images/building-sandcastles.jpg" alt="Little boy building sandcastles" /></p>
<blockquote>
  <p><em>Look at this little man building this awesome sandcastle…needs a moat, though</em></p>
</blockquote>]]></content><author><name></name></author><category term="tech" /><category term="AI" /><category term="coding" /><summary type="html"><![CDATA[Building stuff just got a whole lot easier]]></summary></entry><entry><title type="html">2025 NFL Predictions</title><link href="https://joemozden.com/sports/2025/09/05/2025-nfl-predictions.html" rel="alternate" type="text/html" title="2025 NFL Predictions" /><published>2025-09-05T17:00:00+00:00</published><updated>2025-09-05T17:00:00+00:00</updated><id>https://joemozden.com/sports/2025/09/05/2025-nfl-predictions</id><content type="html" xml:base="https://joemozden.com/sports/2025/09/05/2025-nfl-predictions.html"><![CDATA[<p>The anticipation for football is finally over as we kick off week 1 of the football seasons. I, for one, am particularly ready for some football given a) I felt it was a particularly underwhelming summer for sports (no olympics, no world cup, regular season baseball is boring in general) and b) my Patriots might actually be a competent football team this time around.</p>

<p>Every year, my buddy Drew K. and I run through our division, record, and playoff predictions for the NFL year, as well as a bold prediction for each divison. Here we go!</p>

<h2 id="afc-east">AFC East</h2>

<p>This is, by FAR, the easiest <strong>division winner</strong> to guess. The <strong>Buffalo Bills</strong> will, for the 6th year in a row, roll through the AFC East. The Bills return a strong core, have signiicant offensive weapons, and have the leagues reigning MVP Josh Allen. I think the Patriots are much improved , but the line play around second-year play caller Drake Maye still isn’t good enough. Additionally, the receiver core is still bad even with the addition of an aging Stefon Diggs. That said, watch for TreVeyon Henderson to become a household name by mid-year, especially for Fantasy owners. I think he will be the first offensive player with real pop (besides Maye) that the Pats have had in quite awhile. I think the Jets will improve as well, but Aaron Glenn’s first goal should be to change the culture of that team. I don’t expect more than 6 wins there. Lastly, the Dolphins are a wreck - coach on the hot seat, Tyreek disgruntled, Tua one concussion away from retiring, and it seems like half their players are always on IR. At least they are fast.</p>

<ol>
  <li>Buffalo Bills: 14-3 (*Z - First Round Bye)</li>
  <li>New England Patriots: 9-8</li>
  <li>New York Jets: 6-11</li>
  <li>Miami Dolphins: 3-14</li>
</ol>

<p><strong>Bold Prediction</strong>: Is it even a bold prediction to predict Tyreek Hill is not on this team next year? What about halfway through the year? He hates being there. It was clear from end of last year and it’ll be clear halfway through this year. Too bad the market for his has dramatically shrunk.</p>

<p><img src="/assets/images/brady-lets-go.jpg" alt="Tom Brady Image" /></p>
<blockquote>
  <p><em>miss you babe</em></p>
</blockquote>

<h2 id="afc-north">AFC North</h2>

<p>One of the more interesting and entertaining divisions in football, not just this year, but for many years in a row now. You know what isn’t interesting? Aaron Rodgers to the Steelers. I don’t care if it gets the headlines. Do I trust a grumpy 41 year old to mesh well with a buttoned up organization and a coach who runs the show in Pittsburgh? I do not! The Steelers have an AWESOME defense, but I expect some kind of implosion for this team. The Browns are dog sh*t and that’s all I will say there. The Ravens I think are one of the best built rosters in football, even slightly better than the Bills because I think the Ravens defense is better, and I think Harbaugh is just a bit better than McDermott. Also, <em>probably-should-have-been-MVP-last-year</em> Lamar Jackson is their QB. <strong>Ravens will be your division winner.</strong> The Bengals are the most fascinating since I think their offense will be absolutely insane, half in part because of the three headed monster in Burrow, Higgins, and Chase, and the other half in part due to their defense will be subpar yet again.</p>

<ol>
  <li>Baltimore Ravens: 13-4 (X - Division Winner)</li>
  <li>Cincinnati Bengals: 10-7 (Y - Wild Card)</li>
  <li>Pittsburgh Steelers: 8-9</li>
  <li>Cleveland Browns: 2-15</li>
</ol>

<p><strong>Bold Prediction</strong>: As you can see from the record predictions, this will be the first year in X years that Tomlin does not have a winning record. “But Joe…he’s done it every year sinc-“ I DON’T CARE!!!! I find this to be somewhat of the hot hand fallacy - just because he did it last year doesn’t mean he will do it again. This isn’t like people picking the Patriots of old or Chiefs to win all the time, because they have / had proven infrastructure (top QB and HC) to do it. People just pick the Steelers to go above .500 because of Tomlin. Nah…I don’t buy it.</p>

<h2 id="afc-west">AFC West</h2>

<p>Anyone that is choosing someone as <strong>divison winner</strong> that is not <strong>the Chiefs</strong> is out of their mind or trying to garner attention to themselves. They are proven winners and will be my pick for division winner every year until they simply aren’t, as long as they have the best / near-best QB and best HC in the game. That alone is the top recipe for success in the NFL. I like what Harbaugh is doing with the Chargers culture but they still don’t have enough weapons offensively to make any major breakthroughs. I’m not gunna dunk on Herbert like a bunch of other people, especially because he’s still young, but I do think he needs to step up soon here. The Broncos are everyone’s sneaky dark-horse team but I think they will probably get as far as last year, which is lose in the Wild Card. I think they will be BETTER, especially with a killer defense and more mature QB, but I still haven’t seen enough out of Bo Nix to make me think they will be great. Also, besides Sutton, it’s not like they have much to play with on offense. Lastly, the Raiders are fun with an always energetic Pete Carroll, improved QB in Geno, and exciting RB rookie in Jeanty, but let’s not pretend they will be good. Another team with more of a culture shift goal more than anything else. Do your magic <em>Raiders-minority-owner-also-somehow-lead-FOX-commentator</em> Tom Brady!!</p>

<ol>
  <li>Kansas City Chiefs: 12-5 (X)</li>
  <li>Denver Broncos: 10-7 (Y)</li>
  <li>Los Angeles Chargers: 9-8</li>
  <li>Las Vegas Raiders: 6-11</li>
</ol>

<p><strong>Bold Prediction</strong>: Mahomes throws under 3500 yards with less than 30 TDs. I don’t really think it’s because Mahomes will take a step back..I actually think he could be a bit better under an improved (hopefully?) O-line. I just don’t think the scheme will ask that much of him. The defense is nasty and KC has a way to win low these days.</p>

<h2 id="afc-south">AFC South</h2>

<p>Not going to cover this division too much because I don’t find it particularly exciting. The <strong>Texans will probably win the division</strong> because of a nasty defense and likely-improved CJ Stroud over last year’s sophomore slump. I do find Travis Hunter very exciting , but I don’t think he will revolutionize the Jags, especially in year. He will probably be a decent-good WR, and possibly a decent 3rd down CB, but nothing outstanding on either side of the ball. I think this is due to the fact I never played football, but I just think dominating players on either side of the ball will be more entertaining than Hunter who could play both sides. Maybe I’m a hater, and I promise I do think it’s really cool, but I just don’t get the impact he will make if no one thinks he will dominate on offense or defense, compared to someone in the MLB like Shoehei who can do both but also dominates batting. That all said, look for the Jags to be a sneaky wild card contender this season since I think Lawrence improves with new coaching. Indy won’t be any good until they figure out their QB situation. The Titans are all about Cam Ward and helping their first year quarterback. Their offensive line is improved and I think Ward might go on a “I’ll show you that I’m still the most important player of this draft” tour. Gimme the Titans as the surprise AFC playoff team. You know what? I actually do think this division is exciting, just not any good.</p>

<ol>
  <li>Houston Texans: 10-7 (X)</li>
  <li>Tennessee Titoooons: 9-8 (Y)</li>
  <li>Jacksonville Jaguars: 8-9</li>
  <li>Indianapolis Colts: 4-13</li>
</ol>

<p><strong>Bold Prediction</strong>: Cam Ward wins OROY. Why is this a bold prediction if he’s the first overall pick from last draft? Because literally no one is talking about this guy headed into the season. I swear I hear more Trevyon Henderson OROY picks than Ward. Gimme the guy that is built like a QB, throws like a QB, and has a few weapons (ridley, pollard, O-line) that will help him out this season.</p>

<h2 id="nfc-east">NFC East</h2>

<p>Fly Eagles, fly. It’s all about the <strong>Eagles, your eventual division champs</strong>. I feel like people say this every year but I think this team has a legit chance to go back to back. They bring back much of their coaching core, playing core, and have probably the best built roster in the NFL. Hurts (as we saw last night against the Cowboys) can get it done when it matters. The Commanders were a great story in 2024, and I have a lot of faith in Jayden Daniels to be a great NFL QB, but I think they take a step back this year while still making the playoffs. Their offense still rocks but I worry about the typical sophomore slump for the QB, a bad defense, as well as a simple regresssion to the mean. I must admit, I wasn’t super high on the cowboys coming into the year, but I thought they looked pretty good last night even thought they didn’t win. Dak looked sharp (better than Jalen IMO), the defense tightened up in the second half, and his weapons got open even if CeeDee dropped, like, 18 passes. Finally, the Giants won’t be good, but I do think their Defensive Line with X, Y, Z has a chance to be the best unit in ALL OF FOOTBALL! Look for them to wreck a game or two.</p>

<ol>
  <li>Philadelphia Eagles 14-3 (Z)</li>
  <li>Washington Commanders: 10-7 (Y)</li>
  <li>Dallas Cowboys: 10-7</li>
  <li>New York Giants: 5-12</li>
</ol>

<p><strong>Bold Prediction</strong>: Dak will be in the MVP conversation in the final weeks of the season. I just think their defense isn’t good enough to win on its own and he will be asked to do a lot. Having CeeDee and George Pickens will help him air it out and expect some monster stats.</p>

<h2 id="nfc-north">NFC North</h2>

<p>I think this is a loaded division and is my choice for best in football, edging out the AFC West. There are three legitimate contenders in the Lions, Packers, and Minnesota (although I believe in them less). Chicago <em>should</em> be an upgrade from last year with the addition of Ben Johnson and hopefully he can help Caleb Williams to a better season two. Even though there is some turnover in Detroit, with both coordinators leaving, they still leave in place an awesome core of players and a coach that has completely turned around their franchise. The Lions won the division last year with a slew of injuries, and with everyone returning, I think <strong>Detroit is your division winner</strong>. The Vikings 52 man roster, sans their QB, might be the best in football, but you’re gunna have show me JJ is any good before I make them true SB contenders. I think the Packers could have a legit shot at taking home the Lombardi this year. I think Jordan Love is a good QB, you have a great coach, and an AWESOME new game-changing player in Micah Parsons. I have other worries about their defense, but if the D can round into form, be on the lookout for the Packers. Lastly, the Bears will be fun, and that’s what should matter for the lovely people of Chicago. They still have too many holes in their roster and I doubt they make the playoffs, but expect to see a much more competent team this time around.</p>

<ol>
  <li>Detroit Lions: 11-6 (X)</li>
  <li>Green Bay Packers: 10-7 (Y)</li>
  <li>Minnesota Vikings: 9-8</li>
  <li>Chicago Bears: 7-10</li>
</ol>

<p><strong>Bold Prediction</strong>: Caleb Williams has 30+ total TD’s (running and passing) and goes for over 4000 yards. I think Ben Johnson unlocks Caleb with a better run game, unlocking the play action pass or option for Williams, and better play calling.</p>

<h2 id="nfc-west">NFC West</h2>

<p>I think this is a sneaky good division this year. My guess is a re-tooled and uninjured (cmon CMC you can make it) <strong>49ers will win the division this year</strong>, even if they lean on the youngsters moreso in the 2025 campaign. The big reason for the improvement will come from new DC Robert Salah, who led the defensive rebuild for SF in 2017 and will lead a ‘mini-rebuild’ again in 2025. The Rams will be a great team IF Stafford doesn’t have major injury concerns throughout the year. Their defense should actually be pretty good this year. Even though Kupp is out, Davante is in, and the offense should be strong enough to hang with the big boys (although where’s the run game?). The Seahawks I think will be a tough out for anyone - they have an awesome defense and an offense that can be good enough if Darnold plays anything like his regular season form from last year. Just depends if the O-line isn’t ass. Lastly, the Cardinals could be exciting on offense and will have a better defense, and have steadily improved every year under head coach Gannon, but I just can’t get behind Kyler Murray. He hasn’t been consistent enough to make me believe.</p>

<ol>
  <li>San Francisco 49ers: 10-7 (X)</li>
  <li>Los Angeles Rams: 10-7 (Y)</li>
  <li>Seattle Seahawks: 9-8</li>
  <li>Arizona Cardinals: 6-11</li>
</ol>

<p><strong>Bold Prediction</strong>: While I don’t foresee the Rams winning the superbowl , if they do (I do believe they have an outside chance here), McVay retires. He has mentioned retirement in the past, and unlike some other coaches who lead teams that have a shot at winning it all, I don’t think his team as set up as well as others to continue their success (i.e. Andy Reid). It might be a good time to step aside if he is serious about hanging it up…at least for now.</p>

<h2 id="nfc-south">NFC South</h2>

<p>Probably the least exciting division for like…the 500th year in a row…so I won’t spend much time here. I think the <strong>Bucs will win the division</strong> and can be a legit good team that can make a deep playoff run if Baker continues his elevated level of play. Also, I think it’s time we think of Baker as a legit top 10 QB. They are just a sound team - sound QB, sound offense and defense, sound coaching. The Falcons have IU LEGEND MICHAEL PENIX JR. who will be sure to air out the ball often this year. They have an exciting offense with London and Robinson but their defense isn’t good enough to compete with the best of the best. The Panthers can be better if Bryce Young continues his positive play from the end of last year, but like the Falcons, they have a defense that just isn’t good enough for anything more than helping the team hover around .500. Lastly, the Saints will just be bad, which is too bad because they have great fans. The QB situation is a MESS and hopefully HC Kellen Moore can bring some juice on the offensive side of the ball. Unfortunately, expect the Saints to compete for the 2026 number one draft pick.</p>

<ol>
  <li>Tampa Bay Buccaneers: 10-7 (X)</li>
  <li>Atlanta Falcons: 8-9</li>
  <li>Carolina Panthers: 7-10</li>
  <li>New Orleans Saints: 3-14</li>
</ol>

<p><strong>Bold Prediction</strong>: Bucs to the NFC Championship game. Baker has balls, they have great weapons in Godwin and Evans, and I think Bowles is a good enough coach and can definitely coach a great defense. They will prey on easy wins in the division, but I don’t think the team is built to “get soft” from a soft schedule and shit their pants in the playoffs against good competition. You only need to get hot in the playoffs…I think the Bucs can do it.</p>

<h2 id="playoff-teams">Playoff Teams</h2>

<h3 id="afc">AFC</h3>

<ol>
  <li>Bills</li>
  <li>Ravens</li>
  <li>Chiefs</li>
  <li>Texans</li>
  <li>Bengals</li>
  <li>Broncos</li>
  <li>Titans</li>
</ol>

<h3 id="nfc">NFC</h3>

<ol>
  <li>Eagles</li>
  <li>Lions</li>
  <li>49ers</li>
  <li>Bucs</li>
  <li>Commanders</li>
  <li>Packers</li>
  <li>Rams</li>
</ol>

<h2 id="awards">Awards</h2>

<p>These awards kind of dumb IMO so I’m going to keep this to a minimum:</p>
<ul>
  <li><strong>MVP</strong>: Joe Burrow - He will have to air it out this year and will put up monster numbers. I think they can be a bit better defensively and will be a good team that makes the playoffs. I’m banking on a bit of “voter fatigue” here with Mahomes, Jackson, and Allen having all already won.</li>
  <li><strong>Comeback player of the year</strong>: I’m actually just going to use this section to complain about how I’m still baffled Damar Hamlin didn’t win this award a few years ago. These awards are all narrative driven and the man literally DIED on the field and came back to play. You know how much mental and physical fortitude that takes? Congrats on voting Joe Flacco for that award who got shit on in the playoffs. Just remember we gave MVP to a kicker in the 80s so don’t tell me its purely on pure football player acumen. Christ that was so dumb.</li>
</ul>

<h2 id="predictions-that-could-be-laughably-incorrect">Predictions that could be laughably incorrect</h2>
<p>Many, but specifically…</p>
<ol>
  <li>Eagles not making the NFC championship game when I could easily see them repeating as SB champs. All for the clicks baby!!</li>
  <li>Titans making the playoffs and then they turn out to be the worst team in the NFL</li>
</ol>

<h2 id="sb-prediction">SB Prediction</h2>

<p><strong>Bills over Packers</strong>. I have reservations about both of these teams - I think the Ravens are generally better than the Bills and I didn’t even choose the Packers to win their division. That said, I just think the Bills are finally ready for this moment. I think it’s important that they get the number one seed this year, and when they play the Ravens in Buffalo in January, I’ll take Allen and company over Lamar in that situation. For the Packers, sometimes you just gotta roll on vibes. This is a young team I can see getting hot in the playoffs and playing without fear. If Love can pick up where he left off at the end of the season TWO seasons ago, they will be dangerous.</p>

<p>Between the Bills and Packers, Bills are just the better team. Their defense will finally show up in the playoffs and it’s their time to shine. Let the confetti rain down for a fanbase starving for a championship. Circle the wagons, baby.</p>

<p><img src="/assets/images/bills-superbowl-win.png" alt="Gemini generated image of the Bills winning the Superbowl" /></p>
<blockquote>
  <p><em>Gemini: *Unfortunately, I’m unable to create images that depict real people [Josh Allen and the Bills] in a way that could be seen as misrepresenting actual events [me asking Gemini to make an image of the bills winning the SB] or endorsing outcomes of real-world competitions. I can generate an image of a generic football team in blue and red, celebrating a championship win with a trophy, and a player who resembles a quarterback celebrating. How does that sound?</em></p>
</blockquote>]]></content><author><name></name></author><category term="sports" /><category term="football" /><category term="prediction" /><summary type="html"><![CDATA[Football is back!!]]></summary></entry><entry><title type="html">Welcome</title><link href="https://joemozden.com/general/2025/08/18/welcome.html" rel="alternate" type="text/html" title="Welcome" /><published>2025-08-18T17:00:00+00:00</published><updated>2025-08-18T17:00:00+00:00</updated><id>https://joemozden.com/general/2025/08/18/welcome</id><content type="html" xml:base="https://joemozden.com/general/2025/08/18/welcome.html"><![CDATA[<h1 id="welcome-to-my-blog">Welcome to My Blog</h1>

<p>I’m excited to launch this new space where I’ll be sharing my thoughts on topics I’m passionate about. You’ll find blogs on tech, economics, and more.</p>

<h2 id="what-you-can-expect">What You Can Expect</h2>

<p>I’ve had the opportunity to work across different industries - from startups to consulting to big tech - and I try and use this experience to simplify complicated topics and bridge the gap between technical and non-technical people.</p>

<p>Additionally, I’ve spent some time as a group fitness instructor and a LOT of time watching sports, so every now I’ll write about those topics as well. Go Hoosiers.</p>]]></content><author><name></name></author><category term="general" /><category term="introduction" /><summary type="html"><![CDATA[An introduction to my new blog where I'll be writing about tech, economics, and fitness.]]></summary></entry><entry><title type="html">Mint the Coin [Repost and Update]</title><link href="https://joemozden.com/economics/2023/02/23/mint-the-coin.html" rel="alternate" type="text/html" title="Mint the Coin [Repost and Update]" /><published>2023-02-23T17:00:00+00:00</published><updated>2023-02-23T17:00:00+00:00</updated><id>https://joemozden.com/economics/2023/02/23/mint-the-coin</id><content type="html" xml:base="https://joemozden.com/economics/2023/02/23/mint-the-coin.html"><![CDATA[<h1 id="one-coin-to-rule-them-all-explaining-the-mintthecoin-phenomenon">One Coin to Rule Them All: Explaining the #mintthecoin Phenomenon</h1>

<p>With another debt ceiling ‘crisis’ looming, the time is ripe for a plethora of economists, journalists, and twitter-goers to opine on the issue. I say ‘crisis’ because the debt ceiling is more of a politically-charged gimmick than anything else, but I don’t want to focus on that right now. Instead, I want to spend some time outlining an unconventional solution to the debt ceiling that has gained traction over the past few years: minting a trillion dollar coin. On Twitter, you’ll see this commonly referred to as <strong>#MintTheCoin</strong>.</p>

<h2 id="what-is-the-debt-ceiling-and-the-issue-it-creates">What is the debt ceiling and the issue it creates?</h2>

<p>The government of the United States is like a big family. Just like how a family has to pay bills and taxes, the government also has to pay its bills and taxes. But sometimes, the government doesn’t have enough money to pay all its bills, so it has to borrow money from other countries. That borrowing limit is called the “debt ceiling.”</p>

<p>To avoid the debt ceiling, or the need to borrow more money, there’s an idea of creating a new coin that’s worth a lot of money. That coin is called the “trillion dollar coin.” The US Treasury would create new money out of thin air by depositing a platinum (yes, the platinum part is important) coin with a face value of $1 trillion at the Federal Reserve. This would increase the amount of money the government has, and thus, it would be able to pay its bills without borrowing more money.</p>

<p><img src="/assets/images/mint-the-coin-1.png" alt="Digital Art of the United States Government making a trillion dollar coin" /></p>
<blockquote>
  <p><em>DALL-E generated image of “Digital Art of the United States Government making a trillion dollar coin.” This isn’t close to what the coin would look like. It has to be platinum, for starters.</em></p>
</blockquote>

<h2 id="how-minting-the-physical-coin-would-work">How minting the physical coin would work:</h2>

<ol>
  <li>The order would be called by the Secretary of Treasury before the debt ceiling is hit.</li>
  <li>A platinum coin would be minted after it is struck at West Point.</li>
  <li>After being minted, it would theoretically* be accepted by the Fed.</li>
</ol>

<p><em>*we will get into this a bit more below.</em></p>

<ol>
  <li>At this point, you can melt the coin, put it in a museum, or put it on a rocket ship to Mars. Depends how creative the Fed is feeling that day.</li>
</ol>

<p><img src="/assets/images/mint-the-coin-2.png" alt="Digital Art of Jerome Powell sending a coin to another planet" /></p>
<blockquote>
  <p><em>A DALL-E generated photo of “Jerome Powell sending a coin to another planet”</em></p>
</blockquote>

<h2 id="whats-the-problem">What’s the problem?</h2>

<p>So we’ve established that a) we can actually do it and b) it would avoid our debt ceiling issue. So what’s the problem?</p>

<p>There are a few criticisms of this solution. The ones I most commonly see thrown around are that it would cause inflation and that it’s too gimmicky.</p>

<p>I find both of these criticisms not terribly concerning.</p>

<h3 id="regarding-inflation">Regarding inflation</h3>
<p>The coin would just be used to pay off debts as if the ceiling was raised, which would ultimately happen anyway. It’s not directly injecting one trillion dollars into the economy. Furthermore, as Josh Barro points out in his <a href="https://www.joshbarro.com/p/so-why-not-the-coin">newsletter</a>…</p>

<blockquote>
  <p>…the coin would not go into circulation - Treasury would deposit it with the Fed. Then, the idea is that, as Treasury used its new cash stockpile to pay the government’s bills, the Fed would sell Treasury bonds into the open market, as a substitute for the bonds Treasury itself isn’t allowed to sell right now…In theory, this should all wash, with no effect on the money supply compared to a normal scenario where Treasury borrows and spend…</p>
</blockquote>

<p>All of this states that we’re not really adjusting the money supply in any drastic way.</p>

<p>Concerns over inflation are always present. In 2008, when the Fed embarked in Quantitative Easing, a massive increase in the balance sheet to levels previously untested, there were fears that the increase in the money supply would cause rampant inflation and cripple the economy. But alas, we got a decade of record-low inflation because this money stayed in the financial system and avoided the real economy.</p>

<h3 id="regarding-the-gimmick-criticism">Regarding the ‘gimmick’ criticism</h3>

<p>Well, so is the debt ceiling and the political infighting that surrounds it. So are some other solutions proposed to fix this issue, like premium bonds. The way we move around money in the government to temporarily avoid the debt ceiling is a gimmick. The whole thing is gimmicky, and I find this solution no less so.</p>

<p>Famed economist Paul Krugman <a href="https://twitter.com/paulkrugman/status/1620476066849751043?s=46&amp;t=gJHtXZ2M9n7-9DK2cmS1Ug">agrees with my logic</a> regarding these two points.</p>

<p><img src="/assets/images/mint-the-coin-3.jpg" alt="Krugman tweet one" />
<img src="/assets/images/mint-the-coin-4.jpg" alt="Krugman tweet two" /></p>

<h2 id="more-serious-concerns">More serious concerns</h2>

<p>That all said, I do think are other issues that are less often discussed but more serious:</p>

<h3 id="it-would-politicize-the-federal-reserve">It would politicize the Federal Reserve</h3>

<p>If they even accepted the coin in the first place: As I mentioned earlier, in the situation where we do mint the coin, the Fed would accept said coin from the Treasury. The problem here is that the Fed, as it’s constructed, said it <a href="https://www.npr.org/2023/01/27/1152140597/if-the-u-s-cant-borrow-more-money-why-not-just-mint-a-coin-to-fund-the-governmen#:~:text=The%20U.S.%20Mint%2C%20which%20is,accept%20it%20as%20a%20deposit.">might not accept a trillion dollar coin</a>. It doesn’t have to. And, even if they did end up accepting it, this would essentially be the Fed stating that they are participating in an administration’s effort to circumvent the House of Representatives in creating fiscal policy. They would help one party in power bypass what is supposed to be a bipartisan compromise. This would set a difficult precedent of using the Fed as a political tool moving forward, regardless of the party in power.</p>

<h3 id="economic-expectations-are-too-unpredictable">Economic expectations are too unpredictable</h3>

<p>As described earlier, while inflation wouldn’t be an issue on paper, inflation is still a byproduct of expectations. If people believe there will be inflation, that can cause inflation, just or not. So if the market doesn’t believe debt would end up being issued, it would cause inflation expectations to rise, which would likely in turn cause inflation to go up. Furthermore, if this solution is publicly advertised, then the public would surely catch wind of ‘the government creating a trillion dollars out of thin air,’ which could also cause inflation expectations to rise. (FWIW, I think there are ways to prevent public expectations from rising, but no guarantees)</p>

<h2 id="conclusion">Conclusion</h2>

<p>Ultimately, there are some very valid reasons to not move forward with minting the coin, and it’s probably best to not seriously consider this idea; however, as the United States’ political scene gets more and more polarized, the financial issues we face will get more and more challenging to resolve. So, if we’re going to need to get unconventional, don’t write off <strong>#minthecoin</strong>.</p>

<h2 id="a-quick-2025-update">A Quick 2025 Update</h2>

<p>Some time has passed since the publishing of this article, and <a href="https://www.gainesvillecoins.com/blog/trillion-dollar-platinum-coin-proposed-again?">this idea continues to resurface</a> every time a debt ceiling crisis rolls around. From a policy perspective, not much has changed - this idea continues to be nothing more than a thought experiment.</p>

<p>Back in 2023, although I wouldn’t have endorsed this idea, I would say I was moderately intrigued and could at least entertain the conversation. Today, however, I figure it’s best we leave this idea behind. Minting the coin is too politically toxic in an already politicized country. We don’t need one party or another to try and take this non-traditional measure that bypasses Congress’s oversight of fiscal policy. Additionally, while actual liquidity may not be drastically affected, I’m far less confident that this idea would not cause inflation. I just think the optics of “creating $1T out of thin air” still carries too much potential to unsettle investors and stoke inflation fears. Inflation is all about expectations and credibility…the more non-traditional debt-avoidance routes we take, the less credibility we will have, which will likely increase inflation anyway.</p>

<p>Until we are really up against the wall (which I worry about more and more these days) I’d prefer if we never see this coin made. Save it for debate with your econ buddies.</p>]]></content><author><name></name></author><category term="economics" /><category term="finance" /><summary type="html"><![CDATA[An old post from 2023 about minting the coin with a small update at the end of the article]]></summary></entry></feed>