<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="https://purl.org/dc/elements/1.1/"
     xmlns:dcterms="http://purl.org/dc/terms/"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:cf="https://www.futureplc.com/rss/content-flags"
>
    <channel>
                    <atom:link href="https://www.tomsguide.com/feeds/tag/apple-tv" rel="self" type="application/rss+xml" />
                            <title><![CDATA[ Latest from Tom's Guide in Apple-tv ]]></title>
                <link>https://www.tomsguide.com/entertainment/streaming/apple-tv</link>
        <description><![CDATA[ All the latest apple-tv content from the Tom's Guide team ]]></description>
                                    <lastBuildDate>Wed, 29 Jul 2026 11:00:00 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ Everything new on Apple TV in August 2026: 'Ted Lasso' season 4 and much more ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-august-2026-ted-lasso-season-4-and-much-more</link>
                                                                            <description>
                            <![CDATA[ Our guide to the new movies and shows coming to Apple TV in August 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">N8Eq7Jc6WuXS4F9ChupPvd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/w6PgefqSJRbxhHgjgwtd8b-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 29 Jul 2026 11:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Brittany Vincent ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/JDgb6vqXHys3nrFJpkRCub.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/w6PgefqSJRbxhHgjgwtd8b-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Ted Lasso season 4 poster]]></media:description>                                                            <media:text><![CDATA[Ted Lasso season 4 poster]]></media:text>
                                <media:title type="plain"><![CDATA[Ted Lasso season 4 poster]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/w6PgefqSJRbxhHgjgwtd8b-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Summer’s in its final stretch, but Apple TV is giving you plenty of reasons to stay parked on the couch all through August. Leading the charge on Aug. 5 is season 4 of "Ted Lasso," which pulls Ted right back to Richmond to coach a second-division women’s team.</p><p>Mid-month shifts gears with the return of "Women in Blue" on Aug. 12, featuring María’s promotion to lieutenant as the Azules chase a sprawling 1970s Mexico City case tied to the 1968 student massacre. Double-feature energy arrives Aug. 21 with "The Dynasty: UConn Huskies, a three-part documentary on Geno Auriemma’s legendary program, alongside five delightfully cozy new episodes of "Stillwater."</p><p>Closing out the month on Aug. 28 is season 2 of "Dark Matter," reopening Blake Crouch’s mind-bending multiverse with Joel Edgerton and Jennifer Connelly back to explore the road not taken. With a slate this stacked, beating the late-summer heat from the comfort of your living room isn't just tempting — it’s practically mandatory. Here's everything coming to Apple TV in August 2026.</p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="ted-lasso-season-4">'Ted Lasso' season 4</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="high" data-lazy-src="https://www.youtube-nocookie.com/embed/GACU1N9hg5o" allowfullscreen></iframe></div></div><p>Season 3 sent Ted home to Kansas for good... or so it seemed. Season 4 pulls him back across the Atlantic to Richmond and hands him a challenge he's arguably even less equipped for than managing a Premier League side: coaching a second-division women's football team. The men's players are out of the picture now, so Ted is starting close to zero, learning a new roster and, in his own bumbling way, the sport itself all over again. Rebecca (Hannah Waddingham), Keeley (Juno Temple), Roy Kent (Brett Goldstein), Coach Beard (Brendan Hunt) and Higgins (Jeremy Swift) all return, with Tanya Reynolds and Faye Marsay among some of the newcomers filling out the squad.</p><p><a href="https://www.apple.com/tv-pr/originals/ted-lasso/" target="_blank" rel="nofollow"><em><strong>Watch "Ted Lasso" season 4 on Apple TV starting August 5</strong></em></a></p><h2 id="women-in-blue-las-azules-season-2">'Women in Blue (Las Azules)' season 2</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/KqHDHnGq2O0" allowfullscreen></iframe></div></div><p>Season 1 followed the first women admitted to the Mexico City police force in the 1970s as they hunted a serial killer nobody else would take seriously. Season 2 gives María (Bárbara Mori) a promotion to lieutenant and a case that runs straight into the country's recent history. When the body of a student activist turns up, the Azules are pulled into an investigation that leads back to the 1968 student massacre, the day government forces killed protesters in the capital. Then a second body surfaces, this one belonging to someone connected to that same chapter, and it becomes clear that a killer is hunting down people tied to the massacre and leaving them at the police's door.</p><p><a href="https://www.apple.com/tv-pr/originals/women-in-blue-las-azules/" target="_blank" rel="nofollow"><em><strong>Watch "'Women in Blue (Las Azules)" season 2 on Apple TV starting August 12</strong></em></a></p><h2 id="the-dynasty-uconn-huskies">'The Dynasty: UConn Huskies' </h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/qygK7CQUe_o" allowfullscreen></iframe></div></div><p>Geno Auriemma took over a UConn program with a single winning season to its name and turned it into the closest thing American college sports has to a permanent dynasty: 12 national championships across four decades. This three-part documentary tells that story. Players from across generations keep circling the same admission: that Auriemma was brutally demanding and that a championship, once you have one, mostly leaves you wanting the next. The 2025 title team anchors the present-day thread through Paige Bueckers, Azzi Fudd and Sarah Strong, while Sue Bird, Diana Taurasi, Maya Moore, Breanna Stewart and Rebecca Lobo trace the program back to the start. </p><p><a href="https://www.apple.com/tv-pr/originals/the-dynasty-uconn-huskies/" target="_blank" rel="nofollow"><em><strong>Watch "The Dynasty: UConn Huskies" on Apple TV starting August 21</strong></em></a></p><h2 id="stillwater-season-5">'Stillwater' season 5</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/zz1GkcvkT1g" allowfullscreen></iframe></div></div><p>The animated series, based on Jon J Muth's "Zen" picture book series, follows three young siblings, Karl, Addy and Michael, and the wise panda who happens to live next door. When the everyday problems that come along with being a kid start to feel like too much, Stillwater (voiced by James Sie) tells them a story or walks them through a few breaths, and the kids learn a gentle lesson. It's a show that's made for young kids, but adults could also learn a thing or two. People aren't perfect, after all. </p><p><a href="https://www.apple.com/tv-pr/originals/the-dynasty-uconn-huskies/" target="_blank" rel="nofollow"><em><strong>Watch "Stillwater" on Apple TV starting August 21</strong></em></a></p><h2 id="dark-matter-season-2">'Dark Matter' season 2</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/zhB6_1UbR7s" allowfullscreen></iframe></div></div><p>"Dark Matter" centers on a device called the Box, a device that opens a door onto every other version of the life you could have lived. Season 1 followed physicist Jason Dessen (Joel Edgerton) as he clawed his way back to his own wife and son through a maze of parallel worlds, only to end the season fleeing into yet another unfamiliar universe with Daniela (Jennifer Connelly) and Charlie (Oakes Fegley) in tow. Season 2 finds the three of them trying to build a new life in that new world, right up until something drives them to run again. Jason can't leave the Box alone, and Daniela's paranoia starts ruining any stability they've managed to build. Blake Crouch, who wrote the novel and never followed it with a sequel, runs the show himself, so this season is genuinely uncharted territory, so who knows where it'll end up?</p><p><a href="https://www.apple.com/tv-pr/originals/dark-matter/" target="_blank" rel="nofollow"><em><strong>Watch "Dark Matter" on Apple TV starting August 28</strong></em></a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/tvs/5-hidden-apple-tv-remote-features-youre-probably-not-using">Control your Apple TV like a pro with these 5 hidden remote features</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 best new movies to watch this weekend on Netflix, Apple TV, Prime Video and more (July 25-26) ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/5-best-new-movies-to-watch-this-weekend-on-netflix-apple-tv-prime-video-and-more-july-25-26</link>
                                                                            <description>
                            <![CDATA[ Not sure what to watch this weekend? 'The Dink,' a new grown-up 'Avatar: The Last Airbender,' 'The Mandalorian and Grogu,' and more must-watch movies just landed on streaming ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Dv5AKotaReD37BBDNPYhbh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/oihLGY39YxCiPDArVwFnbi-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 25 Jul 2026 04:01:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alyse Stanley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/BxNnQuBWRHqkv5xWZsjrjc.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Alyse Stanley is a news editor at Tom’s Guide, overseeing weekend coverage and writing about the latest in tech, gaming, and entertainment. Before Tom’s Guide, Alyse worked as an editor for the Washington Post’s sunsetted video game section, Launcher, where she also wrote about indie games you shouldn’t miss, how to tackle your gaming backlog, and all things Nintendo. She previously led Gizmodo’s weekend news desk covering breaking tech news and has written game reviews and features for outlets like Polygon, Unwinnable, and Rock, Paper, Shotgun. A recent Chicago-area transplant born and raised in Virginia, Alyse is a big fan of horror movies, cartoons, and roller skating. She&#039;s also a puzzle fan and can often be found contributing to the NYT Connections coverage on Tom&#039;s Guide &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/oihLGY39YxCiPDArVwFnbi-1280-80.jpg">
                                                            <media:credit><![CDATA[Avatar Studios/Paramount+; Apple TV; FlixPix (Alamy)]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[(From L to R) Aang (voiced by Eric Nam) in Avatar Aang: The Last Airbender on Paramount+; Jake Johnson as Dusty Boyd in The Dink on Apple TV; Pedro Pascal as Din Djarin in The Mandalroain and Grogu. ]]></media:description>                                                            <media:text><![CDATA[(From L to R) Aang (voiced by Eric Nam) in Avatar Aang: The Last Airbender on Paramount+; Jake Johnson as Dusty Boyd in The Dink on Apple TV; Pedro Pascal as Din Djarin in The Mandalroain and Grogu. ]]></media:text>
                                <media:title type="plain"><![CDATA[(From L to R) Aang (voiced by Eric Nam) in Avatar Aang: The Last Airbender on Paramount+; Jake Johnson as Dusty Boyd in The Dink on Apple TV; Pedro Pascal as Din Djarin in The Mandalroain and Grogu. ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/oihLGY39YxCiPDArVwFnbi-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Another weekend is here, which means the question of what to watch is fresh on our minds. It's slim pickings this week among the new releases across <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">the best streaming services</a>, especially on Netflix, where a godawful Kevin Hart comedy is the main headliner this weekend. </p><p>Instead, I'd urge you to check out the much funnier sports comedy on Apple TV, "The Dink." It's got pickleball and "New Girl" star Jake Johnson's thirsting after an older woman; what's not to love? Over on paid video-on-demand platforms, you can catch "Star Wars: The Mandalorian and Grogu" for more of the Pedro Pascal and baby Yoda dynamic duo fans fell in love with from the show. Paramount+ has a new Avatar movie, "Avatar Aang: The Last Airbender," that I'm not convinced needed to exist, but if it means more Toph kicking ass in my life, then yes, please. </p><p>Over on Prime Video, you can catch the darling animated adventure "The Wild Robot" from the same creator of "Lilo & Stitch" and "How to Train Your Dragon" series. Finally, Netflix just got the second part of "Wicked" if you're looking to get our sing-along on this weekend. So without further ado, let's dive into the best new movies to watch this weekend. </p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="the-dink-apple-tv">'The Dink' (Apple TV)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/YyVNFzx5Pl8" allowfullscreen></iframe></div></div><p>One of the few original movies debuting on streaming this week is "The Dink," a new Apple TV sports comedy from director Josh Greenbaum ("Strays" and "Barb and Star Go to Vista Del Mar"). My boy Jake Johnson stars as a washed-up tennis pro named Dusty Boyd who finds a shot at redemption in the unlikeliest of places: on the pickleball court. </p><p>Through a bizarre twist of fate, Dusty ends up joining a pickleball quartet made up of older women, where he quickly develops a crush on their charismatic leader (Mary Steenburgen). But his newfound passion for the sport comes with high stakes, as he’s forced to face off against his longtime nemesis with the future of his father's country club hanging in the balance. The film also features Chloe Fineman, Patton Oswalt, Fortune Feimster, Chris Parnell, Ben Stiller, and a scene-stealing Aaron Chen as Dusty’s trusty sidekick.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/movie/the-dink/umc.cmc.5tugaz9vt498ajn7q64ypaqxn" target="_blank" rel="nofollow"><em><strong>"The Dink" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="star-wars-the-mandalorian-and-grogu-pvod">'Star Wars: The Mandalorian and Grogu' (PVOD)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/IHWlvwu8t1w" allowfullscreen></iframe></div></div><p>The lowest-grossing Star Wars movie in history made its way to paid-video-on-demand platforms this week. You're better off waiting for it to arrive on Disney+ in a few months, but if you need your Baby Yoda fix now, have at it. "Star Wars: The Mandalorian and Grogu" never quite justifies its full-length movie treatment, feeling instead like a mini "Mandalorian" marathon retrofitted to the big screen, which might explain the poor theatrical performance.  </p><p>The galaxy's dreamiest bounty hunter and his pint-sized companion return for a new adventure. Din Djarin (Pedro Pascal) and Grogu take on a mission for the New Republic to rescue Rotta the Hutt (voiced by "The Bear's" Jeremy Allen White), Jabba's heir, from a rival crime syndicate to get some juicy intel on an Imperial warlord. Their assignment spirals into a galaxy-spanning adventure filled with all the blaster fights and Force magic you'd expect of a Star Wars outing. </p><p><em><strong>Buy or rent "Star Wars: The Mandalorian and Grogu" on </strong></em><a href="https://tv.apple.com/us/movie/star-wars-the-mandalorian-and-grogu/umc.cmc.31m58rsmdk9f165zgt7vawkxk" target="_blank" rel="nofollow"><em><strong>Apple</strong></em></a><em><strong> or </strong></em><a href="https://tv.apple.com/us/movie/star-wars-the-mandalorian-and-grogu/umc.cmc.31m58rsmdk9f165zgt7vawkxk" target="_blank" rel="nofollow"><em><strong>Amazon</strong></em></a><em><strong> now</strong></em></p><h2 id="avatar-aang-the-last-airbender-paramount">'Avatar Aang: The Last Airbender' (Paramount+)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/RrYIrktLthc" allowfullscreen></iframe></div></div><p>Did we really need more of Team Avatar? Eh. Debatable. Will I be sat down to watch this weekend? Absolutely. If only to see Toph (voiced by Dionee Quan) get the epic fight scenes we all hoped for in "The Legend of Korra." Directed by Lauren Montgomery, the film takes place after the events of the original animated series and follows an older Avatar Aang (voiced by Eric Nam), now grown up and setting out with his friends on a mission to rebuild the long-lost Air Nation. </p><p>To do that, he'll need an ancient power that could save his culture from extinction, but if it falls into the wrong hands first, it spells doom for the Air Nation's future. Expanding the world of “Avatar” with a new chapter in Aang’s journey, this has all the makings of an essential watch for longtime fans.</p><p><em><strong>Watch </strong></em><a href="https://www.paramountplus.com/movies/video/ALVE01KRF3YJMCEJB92T78193MJ4HP/" target="_blank" rel="nofollow"><em><strong>"Avatar Aang: The Last Airbender" on Paramount+</strong></em></a><em><strong> now</strong></em></p><h2 id="wicked-for-good-netflix">'Wicked: For Good' (Netflix)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/vt98AlBDI9Y" allowfullscreen></iframe></div></div><p>John M. Chu’s 2025 movie adaptation of the Broadway musical, <a href="https://www.tomsguide.com/entertainment/movies/wicked-for-good-review">"Wicked: For Good,"</a> just landed on Netflix — though if you ask me, there are <a href="https://www.tomsguide.com/entertainment/netflix/wicked-for-good-just-landed-on-netflix-but-these-3-musicals-are-even-better">much better musicals on Netflix</a> that are more worth your time. Let's be real, all the best "Wicked" songs are in the first act, so "For Good" was never going to stack up, but it was still a satisfying conclusion for the story of Elphaba (Cynthia Erivo) and Glinda (Ariana Grande) with plenty of earworms and big-budget set pieces to dazzle you into a stupor. </p><p>"For Good" picks up right after "Wicked's" dramatic conclusion, with Elphaba now in her Wicked Witch of the West era on the run from the Wizard (Jeff Goldblum). Many of her old pals from Shiz now lead the mob calling for her head, though others lead the search only to find her before they do. Glinda and Elphaba clash over the Wizard's true intentions and what's best for Oz, but when a mysterious storm sends a young girl from Kansas (and her little dog too) crashing into their world, it puts their already strained relationship to the ultimate test. </p><p><em><strong>Watch </strong></em><a href="https://www.netflix.com/title/83077841" target="_blank" rel="nofollow"><em><strong>"Wicked: For Good" on Netflix</strong></em></a><em><strong> now</strong></em></p><h2 id="the-wild-robot-prime-video">'The Wild Robot' (Prime Video)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/67vbA5ZJdKQ" allowfullscreen></iframe></div></div><p>"The Wild Robot" is one of several animated movies I refuse to shut up about, so when I saw it landed on Prime Video this week, I knew I had to give it a shout-out. With Chris Sanders, the same creative tour de force behind "Lilo & Stitch" and "How to Train Your Dragon," at the wheel, you know you're in for a treat. This DreamWorks treasure had me full-on ugly crying in the theater when it came out, thanks in large part to Lupita Nyong’o’s deeply moving performance as Roz, a lost robot turned reluctant parent to an orphaned gosling (Kit Conner). </p><p>Also along for the ride is everyone's favorite zaddy, Pedro Pascal, as a fox that could give Nick Wilde a run for money. Oh, and Matt Berry makes a cameo as a beaver — I'm letting y'all know so you don't get jump scared like I was. It's your standard fish out of water tale, beautifully told with gorgeous animation that easily rivals the "Spider-Verse" films in both style and ambition. </p><p><em><strong>Watch </strong></em><a href="https://www.amazon.com/dp/B0DBZCXSVS" target="_blank" rel="nofollow"><em><strong>"The Wild Robot" on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X7A1vW"></div>                            </div>                            <script src="https://kwizly.com/embed/X7A1vW.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-best-new-to-prime-video-movies-you-should-stream-this-weekend-july-24-26">3 best new to Prime Video movies you should stream this weekend (July 24-26)</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/i-ranked-all-the-new-movies-and-shows-to-watch-this-weekend-on-netflix-prime-video-and-more-july-24-26">8 new movies and shows to watch this weekend on Netflix, Prime Video and more (July 24-26)</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/3-best-new-to-netflix-movies-you-should-stream-this-weekend-july-24-26">3 best new to Netflix movies you should stream this weekend (July 24-26)</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 10 top new movies to stream this week on Netflix, HBO Max, Prime Video, Hulu and more (July 21-27) ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/movies/10-top-new-movies-to-stream-this-week-on-netflix-hbo-max-prime-video-hulu-and-more-july-21-27</link>
                                                                            <description>
                            <![CDATA[ This week's top new movies across the best streaming services include "The Mandalorian" movie, the new "Scary Movie," and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">fnMHBj6ZCUQV5F5ohfgA3M</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/2BBxi4XKw9kzPB8ePSZPYZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Jul 2026 04:01:00 +0000</pubDate>                                                                                                                                <updated>Tue, 21 Jul 2026 12:13:27 +0000</updated>
                                                                                                                                            <category><![CDATA[Movies]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/2BBxi4XKw9kzPB8ePSZPYZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Universal Pictures; Lucasfilm; Amazon MGM Studios]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Disclosure Day; The Mandalorian and Grogu; Masters of the Universe]]></media:description>                                                            <media:text><![CDATA[Disclosure Day; The Mandalorian and Grogu; Masters of the Universe]]></media:text>
                                <media:title type="plain"><![CDATA[Disclosure Day; The Mandalorian and Grogu; Masters of the Universe]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/2BBxi4XKw9kzPB8ePSZPYZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>This week’s crop of new movies across the biggest <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> is one of the most packed of the year to date. There are new arrivals on popular platforms like Netflix, HBO Max, Hulu, Apple TV and Peacock. There's also a handful of buzzy newcomers on premium streaming.</p><p>With so much choice, picking a highlight is no easy feat. Star Wars fans will likely flock to the PVOD debut of “The Mandalorian and Grogu,” while anybody looking for a different kind of sci-fi should consider Spielberg’s “Disclosure Day.” Alternatively, Netflix has a new Kevin Hart comedy, HBO Max has a fantasy action sequel, and Hulu has a feature film based on a cult web series that is one of the funniest movies I’ve watched in 2026.   </p><p>You’re really spoilt for choice, so I’ve combed through all the most noteworthy new movies on streaming this week and picked out the ones you need to know about. For more recommendations, check out the <a href="https://www.tomsguide.com/entertainment/prime-video/3-new-to-prime-video-thriller-movies-to-stream-this-week-including-a-usd150-million-disaster-movie-about-the-moon-falling-out-of-orbit-july-21-27">3 new to Prime Video thriller movies to stream this week</a>.<strong> </strong>And if binge-watching is more your speed, here’s a guide to all the <a href="https://www.tomsguide.com/entertainment/streaming/4-biggest-new-shows-to-stream-this-week-july-20-26">top new TV shows this week.</a> </p><h2 id="star-wars-the-mandalorian-and-grogu-pvod-2">‘Star Wars: The Mandalorian and Grogu’ (PVOD)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/IHWlvwu8t1w" allowfullscreen></iframe></div></div><p>The first theatrical-released Star Wars movie in seven years swaps the big screen for streaming this week, and it feels particularly appropriate in the case of “The Mandalorian and Grogu.” This feature-length continuation of Disney+’s “The Mandalorian” was criticized for failing to go beyond its TV roots. Instead, the movie feels a whole lot like a handful of episodes stitched together, so if you skipped it in cinemas, it’ll feel right at home on digital.</p><p>Set between the original and sequel trilogies, “The Mandalorian and Grogu” focuses on the eponymous pair, bounty hunter Din Djarin (Pedro Pascal) and his young ward, Grogu (aka Baby Yoda). The New Republic enlists the duo to rescue Rotta (Jeremy Allen White), the son of former crime boss Jabba the Hutt. While it might not feel grand enough to justify its big-screen release, Grogu’s adorability factor is ramped up to a new level.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/Star-Wars-Mandalorian-Jon-Favreau/dp/B0H4C719BN/" target="_blank" rel="nofollow"><em><strong>Prime Video (Buy/rent)</strong></em></a><em><strong> starting July 21</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Oomqve"></div>                            </div>                            <script src="https://kwizly.com/embed/Oomqve.js" async></script><h2 id="disclosure-day-pvod">‘Disclosure Day’ (PVOD)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/SCYT8vb2siQ" allowfullscreen></iframe></div></div><p>Steven Spielberg made his return to the sci-fi genre with “Disclosure Day.” It’s not quite vintage Spielberg, but it tackles some interesting themes and boasts a career-highlight performance from Emily Blunt. I suspect some viewers will find the rushed conclusion disappointing, and there are some contrived narrative decisions, but it’s still a Spielberg movie, full of wonder and unspooling mystery. And it’s great to see him back in the sci-fi genre. </p><p>Blunt plays Margaret Fairchild, a television meteorologist who discovers she possesses psychic abilities. This leads her to link up with Dr. Daniel Kellner (Josh O’Connor), a cybersecurity expert who has turned whistleblower against his employer, the Wardex Corporation. As the duo is hunted by the shadowy organization (led by Colin Firth’s Noah Scanlon), they discover a government-led cover-up of classified extraterrestrial activity, which all links back to a forgotten event in Margaret and Daniel’s childhood. </p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0H3QRLYCN" target="_blank" rel="nofollow"><em><strong>Prime Video (Buy/rent)</strong></em></a><em><strong> starting July 21</strong></em></p><h2 id="scary-movie-pvod">‘Scary Movie’ (PVOD)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/0fZ58S-7QP0" allowfullscreen></iframe></div></div><p>In this era of horror remakes, reboots and legacy sequels, it was only a matter of time before “Scary Movie” was revived to lampoon the current genre trends. This sixth installment in the parody series (named “Scary Movie” as a nod to horror sequels often removing the numeral) marks the return of the Wayans, who originally exited the franchise after 2001’s “Scary Movie 2.” It also sees original stars Anna Faris and Regina Hall return, too.</p><p>Mocking everything from “Weapons,” “The Substance,” and “Sinners,” to the series’ favorite punching bag, “Scream," 2026's “Scary Movie” hasn’t matured with age. It trades in the same slapstick, juvenile, incredibly low-brow humor it built its reputation on. Long-time fans might enjoy this revival, but the jokes feel tired, and the attempts at parody lazy. The comedic intellect doesn’t extend beyond the gags found in your average “Family Guy” skit.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GXSXHLFV" target="_blank" rel="nofollow"><em><strong>Prime Video (Buy/rent)</strong></em></a><em><strong> starting July 21</strong></em></p><h2 id="masters-of-the-universe-prime-video">‘Masters of the Universe’ (Prime Video)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/X21JsHLHnY8" allowfullscreen></iframe></div></div><p>The new “Masters of the Universe” movie appears to be skipping the typical digital release window. Instead, this He-Man blockbuster is dropping straight onto Prime Video this week. Maybe that’s because it struggled in theaters, grossing a mere $113 million against a production budget reportedly close to $200 million. It would seem Amazon is hoping the MGM Studios-distributed movie can score a larger audience via its own streaming service. </p><p>Based on the ‘80s franchise of the same name, which Mattel launched to compete with rival Kenner’s range of Star Wars toys, “Masters of the Universe” is set in the land of Eternia. When the capital city is besieged by the evil Skeletor (Jared Leto), young Prince Adam (Nicholas Galitzine) is sent to Earth for his protection. Years later, and now an adult, he must return to his fantasy home and embrace his destiny as He-Man to save the kingdom. </p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0GZHXDRBN" target="_blank" rel="nofollow"><em><strong>Prime Video</strong></em></a><em><strong> starting July 22</strong></em></p><h2 id="72-hours-netflix">‘72 Hours’ (Netflix)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/N-J-HR3quc4" allowfullscreen></iframe></div></div><p>Netflix is dropping a steady stream of original movies throughout the summer to keep you entertained and indoors. Its latest offering comes in the form of “72 Hours,” a Kevin Hart vehicle that sees the veteran comic actor play a 40-something executive trying (and seemingly failing) to hang with a younger crowd. Questions of its quality remain, but I have an inkling that it’s going to make a major play for the top spot in Netflix’s top 10 list.</p><p>Joe (Hart) is a middle-aged executive desperately hoping to save his flailing career when he’s accidentally added to the group chat of a group of 20-year-olds (Marcello Hernández, Mason Gooding, Kam Patterson, Ben Marshall). Soon he finds himself joining them on a wild multi-day bachelor party. As things get crazy, Joe might just rediscover his youthful spirit.</p><p><em><strong>Watch on </strong></em><a href="https://www.netflix.com/title/81715790" target="_blank" rel="nofollow"><em><strong>Netflix</strong></em></a><em><strong> starting July 24</strong></em></p><h2 id="the-dink-apple-tv-2">‘The Dink’ (Apple TV)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/YyVNFzx5Pl8" allowfullscreen></iframe></div></div><p>Sports comedies seem to be on trend right now. Last week Netflix dropped “The Hawk” with Will Ferrell, a series about a washed-up golfer trying to revive his career, and now it’s Apple TV’s turn to release a sports-themed comedy about a washed-up pro trying to savage his reputation and claw back the respect of his peers. Only in “The Dink,” Jake Johnson’s Dusty Boyd isn’t returning to the tennis court, but instead is picking up pickleball. </p><p>After aggravating an old injury, former prodigy Dusty swaps tennis for pickleball, and along the way rediscovers his competitive spark while rising in the ranks of a sport he never took seriously. Dusty hopes to earn his father’s (Ed Harris) respect, prevent the local country club from closing, and best his old childhood rival, Andy Roddick. Also starring Mary Steenburgen, Patton Oswalt and Ben Stiller, “The Dink” is for the underdog in all of us.</p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/movie/the-dink/umc.cmc.5tugaz9vt498ajn7q64ypaqxn" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting July 24</strong></em></p><h2 id="mortal-kombat-ii-hbo-max">‘Mortal Kombat II’ (HBO Max)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ZdC5mFHPldg" allowfullscreen></iframe></div></div><p>This fantasy action sequel based on the video series of the same name has its fair share of flaws. Its screenplay is muddled, the characters thinly sketched, and despite an $80 million budget, the extensive use of green screens is all too obvious. However, it gets the most essential component right: the gloriously gory fights. “Mortal Kombat II” delivers when it comes to well-choreographed showdowns between its roster of fan-favorite characters, and that makes several of its more egregious filmmaking sins a whole lot easier to forgive. </p><p>Ahead of the 10th Mortal Kombat tournament, in which the merciless Shao Kahn (Martyn Ford) is hoping to capture and take control of Earthrealm, the defenders of our planet recruit washed-up actor Johnny Cage (Karl Urban) to join their plucky ranks. What follows is a series of death matches in which the fate of our world is at stake. Stuffed with fan-favorite characters and references to Mortal Kombat lore, this sequel delivers when it matters most.</p><p><em><strong>Watch on </strong></em><a href="https://www.hbomax.com/movies/mortal-kombat-ii/c6b2cd04-09b3-4e4c-b3aa-36569ea18289" target="_blank" rel="nofollow"><em><strong>HBO Max</strong></em></a><em><strong> starting July 24</strong></em></p><h2 id="nirvanna-the-band-the-show-the-movie-hulu">‘Nirvanna the Band the Show the Movie’ (Hulu)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/kuEZYJ7qfb4" allowfullscreen></iframe></div></div><p>I went into “Nirvanna the Band the Show the Movie” without having seen even a clip from the original web series and television mockumentary on which this feature film is based. The fact that I still found it an absolute hoot speaks to its comedic quality. I can only imagine long-time fans of irreverent hijinks of leads Matt (Matt Johnson) and Jay (Jay McCarrol) will be even more impressed by this big-screen translation. </p><p>Quickly getting newcomers up to speed, “Nirvanna the Band the Show the Movie” follows Matt and Jay’s ongoing quest to play a show at the Rivoli bar in Toronto. Their madcap plans to book a slot always seem to backfire, but when their latest hare-brained scheme results in them accidentally traveling back to the year 2008, they discover what their lives would have been like if they’d gone their separate ways. This film is gloriously silly.</p><p><em><strong>Watch on </strong></em><a href="https://www.hulu.com/welcome" target="_blank" rel="nofollow"><em><strong>Hulu</strong></em></a><em><strong> starting July 24</strong></em></p><h2 id="pressure-peacock">‘Pressure’ (Peacock)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/zdM4tdLQBg0" allowfullscreen></iframe></div></div><p>Finding an original angle on World War II is tough. The historical conflict has been chronicled across movies and TV shows for decades, but “Pressure” finds an area of the war that hasn’t received significant attention until now. While it’s yet to be released in theaters in several European countries (including the U.K.), it made its Stateside bow back in May. During its theatrical run, “Pressure” scored 95% from viewers on <a href="https://www.rottentomatoes.com/m/pressure_2026" target="_blank">Rotten Tomatoes</a>. </p><p>Set 72 hours before the D-Day landings, which would ultimately turn the tide of the war, the fate of the free world hangs in the balance. It’s up to General Dwight D. Eisenhower (Brendan Fraser) and meteorologist James Stagg (Andrew Scott) to plan the invasion and determine if the weather conditions are favorable on the day in question. If Stagg’s forecast is inaccurate, it could spell disaster and cost the Allied forces dearly.</p><p><em><strong>Watch on </strong></em><a href="https://www.peacocktv.com/watch/asset/movies/pressure/19fcabe2-adf1-3484-bfa2-8a29dacb2972" target="_blank" rel="nofollow"><em><strong>Peacock</strong></em></a><em><strong> starting July 24</strong></em></p><h2 id="chum-amc">‘Chum’ (AMC+)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/oZWDFelquX4" allowfullscreen></iframe></div></div><p>It’s the summer season, which means shark movies aplenty. We’ve already had a couple this year, and the next up is “Chum.” It appears to be another shark-themed horror-thriller that isn’t content with just forcing its cast to face the ocean’s most feared predator, adding the extra element of a human hunter to increase the tension. How successful is “Chum”? If you put stock in <a href="https://www.rottentomatoes.com/m/chum_2026" target="_blank">Rotten Tomatoes</a> ratings, the 15% score might scare you off.</p><p>Set in Malta, members of a wedding party have their celebration cut short when they encounter a bloodthirsty shark, and things only get worse when a sinister fisherman named Roy (Jim Klock) arrives on the scene with plans to use the survivors as bait (or <em>chum</em>) to capture the shark. What follows is a battle for survival against predators both in the water and on dry land. Soon secrets come to light, and loyalties are tested. It's all very standard stuff.</p><p><em><strong>Watch on </strong></em><a href="https://www.amcplus.com/movies/chum--1075277" target="_blank" rel="nofollow"><em><strong>AMC+</strong></em></a><em><strong> starting July 24</strong></em></p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">The best streaming services in 2026 to subscribe to right now</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/new-on-netflix-in-july-2026-5-best-movies-and-shows-to-stream-plus-full-release-list">New on Netflix in July 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/star-wars-movies-and-shows-how-many-can-you-name-quiz">Can you name every 'Star Wars' movie and TV show?</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple TV's new crime thriller show features two of my favorite actors but not much else ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/apple-tvs-new-crime-thriller-show-features-two-of-my-favorite-actors-but-not-much-else</link>
                                                                            <description>
                            <![CDATA[ Starring Anya Taylor-Joy, Annette Bening and Timothy Olyphant, "Lucky" features an incredible cast. Unfortunately, the Apple TV crime thriller series offers little else in its two-episode premiere. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">TzvuonUo6DwbCZpiad6i2J</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Gogm98dvmmskTSRVUtKW6T-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Wed, 15 Jul 2026 07:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ malcolm.mcmillan@futurenet.com (Malcolm McMillan) ]]></author>                    <dc:creator><![CDATA[ Malcolm McMillan ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sSDLEbNEgBXf86HpujaWZ6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Malcolm McMillan is a Streaming Editor for Tom&#039;s Guide, covering all the latest in streaming TV shows and movies. That means news, analysis, recommendations, reviews and more for just about anything you can watch, including sports! If it can be seen on a screen, he can write about it. &lt;/p&gt;&lt;p&gt;Malcolm has been with Tom&#039;s Guide since June 2022, starting as a staff writer covering breaking news. Since then, he&#039;s transitioned to cover artificial intelligence (AI), A/V tech and VR headsets. Since late 2023 he has almost exclusively covered streaming and entertainment for Tom&#039;s Guide.&lt;/p&gt;&lt;p&gt;Before writing for Tom&#039;s Guide, Malcolm worked as a fantasy football analyst writing for several sites and also had a brief stint working for Microsoft selling laptops, Xbox products and even the ill-fated Windows phone. He is passionate about video games and sports, though both cause him to yell at the TV frequently. He proudly sports many tattoos, including an Arsenal tattoo, in honor of the team that causes him to yell at the TV the most.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/Gogm98dvmmskTSRVUtKW6T-1280-80.png">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Anya Taylor-Joy as Lucky in &quot;Lucky&quot; episode 2 on Apple TV]]></media:description>                                                            <media:text><![CDATA[Anya Taylor-Joy as Lucky in &quot;Lucky&quot; episode 2 on Apple TV]]></media:text>
                                <media:title type="plain"><![CDATA[Anya Taylor-Joy as Lucky in &quot;Lucky&quot; episode 2 on Apple TV]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Gogm98dvmmskTSRVUtKW6T-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: "Lucky" episodes 1-2</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><strong>Rating: 2/5 Stars</strong></li><li><strong>Verdict: </strong>"Lucky" promises a crime thriller centered on Anya Taylor-Joy's titular character. But its two-episode premiere is often a trope-laden copy of better crime thrillers. Worst of all, it fails to engage the viewer, though the climax of episode 2 offers some promise.</li><li><strong>Premiere date/time:</strong> Episodes 1-2 streaming now</li><li><strong>Streaming service/channel:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Streaming on Apple TV</a></li></ul></p></div></div><p>"<strong>Lucky</strong>" felt like an easy win for <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a>. It's a crime thriller miniseries starring Anya Taylor-Joy, Annette Bening, and Timothy Olyphant. As evidenced by the <a href="https://www.tomsguide.com/entertainment/streaming/i-watch-dozens-of-new-shows-every-year-and-these-are-the-5-emmy-nominees-you-need-to-stream-right-now">2026 Emmy nominations</a>, Apple has done more with less. I was eager to see how this tense thriller would play out.</p><p>Unfortunately, a little under two hours later, I turned off the TV, underwhelmed and uninterested in watching more. While it has a promising premise, this series feels like one crime thriller trope after another. Aunjanue Ellis-Taylor's Agent Billie Rand is almost criminally uninspired. It brings nothing new to the archetype of a "hardass" cop that has a score to settle.</p><p>In this case, the score to settle is with Priscilla Matheson (Annette Bening). Though upon further prodding from Rand's boss, it seems the FBI agent really wants to take down Wayne Whittaker (William Fitchner). </p><p>Through the nearly 100 minutes we watch between the two episodes in this series premiere, Whittaker is perhaps the only intriguing character we're introduced to. We only get a brief scene with him, but he seems to have an evil within him that the others in this show don't possess. Which is saying something, given that even our protagonist, the titular Lucky (Taylor-Joy), is a con woman who stole millions of dollars and kills a man with a screwdriver in the first episode. There are no good guys here, and only a few good characters.</p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><p><em><strong>Spoilers ahead for "Lucky" series premiere (episodes 1-2)</strong></em></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:14.80%;"><img id="4qkPkyt7YheYgpg43NfzSY" name="TG_Spoiler_Warning_2.jpg" alt="An image indicating spoilers are ahead." src="https://cdn.mos.cms.futurecdn.net/4qkPkyt7YheYgpg43NfzSY.jpg" mos="" align="middle" fullscreen="" width="2000" height="296" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><h2 id="lucky-feels-like-a-book-adaptation">'Lucky' feels like a book adaptation</h2><p>Something really popular in Hollywood right now is to adapt popular novels. I probably don't even need to tell you this. Whether it's "Big Little Lies," "Little Fires Everywhere" or "Tiny Beautiful Things," adapting novels into movies and shows is more prolific than ever. </p><p>And I picked those three examples because they're all produced by Reese Witherspoon's Hello Sunshine company, which also produced "Lucky."</p><p>Now, I'm not here to say that this show is bad because it's produced by Hello Sunshine. Witherspoon's company also produced "Gone Girl," a certified critical and commercial hit. But this show feels like it's a book adaptation, and I don't mean that as a compliment.</p><p>The premise for "Lucky" is relatively simple. Lucky Armstrong and her partner/husband, Cary (Drew Starkey), have robbed someone of a suitcase full of cash. They have to leave the country the next morning or risk being caught. The next morning, Lucky wakes up late to discover Cary has left with the cash, leaving her to the wolves. </p><p>The wolves aren't just the police (or, more accurately, the FBI). There's Priscilla (Bening), who is not just the person Lucky and Cary robbed, but also Cary's mother. She has a past with two men: Wayne Whittaker, whose money was really stolen, and John Armstrong, Lucky's dad, who is also a conman and currently in prison.</p><p>Those are the bones of a compelling crime thriller. But for most of the two episodes released so far, we're mostly just following Lucky as she runs from the FBI and Priscilla. There are some scenes with other POV characters, but not many. Especially in the first episode, which is almost just one extended chase.</p><p>This felt like a case of the script following the book too closely. I wish the show had spent far more time with the other players in this game of cat and mouse, instead of an extended scene of Lucky playing pretend big sister for some girls out in the desert. It got to the point where I wrote in my notes, "Is this a book adaptation?" Sure enough, it is.</p><h2 id="verdict-this-crime-thriller-s-luck-has-run-out">Verdict: This crime thriller's luck has run out</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/GAbT5qCTXR8" allowfullscreen></iframe></div></div><p>Maybe you'll have had a better time with "Lucky" than I did. Maybe I'm too harsh on it for bringing nothing new to the table. But ultimately, I not only don't want to watch another episode, but I'd much rather just watch something else. </p><p>Which is a shame, because there are a few scenes that show some promise. The final climactic scene of episode 2 is probably the most engaging of the entire series to date. So there is part of me that wonders if I shouldn't stick with it to see if things get better.</p><p>But a larger part of me senses that this crime thriller is afraid to break away from its source material. It's unwilling to be too different, even if it ultimately produces more engaging TV. </p><p>So, for the first time, I'm recommending you don't watch something that has Timothy Olyphant in it. And for those who know me, that's about as damning an indictment of a show that I can possibly give.</p><p><strong></strong><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em><strong>Stream "Lucky" on Apple TV</strong></em></a></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ey6xaW"></div>                            </div>                            <script src="https://kwizly.com/embed/ey6xaW.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/streaming/i-watch-dozens-of-new-shows-every-year-and-these-are-the-5-emmy-nominees-you-need-to-stream-right-now">I watch dozens of new shows every year and these are the 5 Emmy nominees you need to stream right now</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/gail-daughtry-and-the-celebrity-sex-pass-review">‘Gail Daughtry and the Celebrity Sex Pass’ review: Not even a ‘Mad Men’ reunion can save this movie</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/silo-season-3-everything-we-know-so-far">'Silo' season 3: release date confirmed, first trailer, cast, plot speculation and more</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple TV just gave 4K upgrades to nearly 50 TV shows: here's the full list ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/apple-just-gave-4k-upgrades-to-nearly-50-tv-shows-heres-the-full-list</link>
                                                                            <description>
                            <![CDATA[ Nearly 50 shows on Apple TV are getting 4K upgrades for free including Mad Men. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">35UPg3wfKFMxx5zi3dAmKV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/hrTBe4yDuQUeE7F6eLMCvS-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 06 Jul 2026 18:05:34 +0000</pubDate>                                                                                                                                <updated>Mon, 06 Jul 2026 18:14:48 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/hrTBe4yDuQUeE7F6eLMCvS-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV on a sunset background]]></media:description>                                                            <media:text><![CDATA[Apple TV on a sunset background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV on a sunset background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/hrTBe4yDuQUeE7F6eLMCvS-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>TV shows on Apple TV are finally catching up with the movies as Apple is reportedly rolling out free 4K upgrades for purchases. At least 49 shows have been upgraded to 4K SDR in the Apple TV app.</p><p>The news comes from Apple TV enthusiast <a href="https://x.com/sigjudge/status/2073017542738579919?s=12" target="_blank">Sigmund Judge on X,</a> who first spotted the update. The current list includes 49 TV shows, including popular shows like "Mad Men," "Star Trek: Strange New Worlds" and "RuPaul's Drag Race UK." </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WVo9JO"></div>                            </div>                            <script src="https://kwizly.com/embed/WVo9JO.js" async></script><p>The upgraded shows have been upgraded in the US, UK and maybe other regions, you'll need to check your library. </p><p>Apple has been offering 4K upgrades for movies purchased in Apple TV since at least 2017 when the first Apple TV 4K streaming box launched. The upgrades pushed movies to 4K and HDR for free. Later the company added Dolby Atmos, HDR10+ and 3D 4K. </p><p>Here's the current list:</p><ul><li>Aerial Australia</li><li>Aftertaste S1</li><li>American Magik S1</li><li>Auto Exotica S2</li><li>The Basement Talks S1</li><li>Black, Brilliant, and Bold S1</li><li>Blossoms Shanghai S1</li><li>Bong Zombies S1</li><li>Building Nations S1</li><li>Car & Country Quest S1</li><li>Changing of the Gods S1</li><li>Chasing the Tide S1</li><li>Claire-ity S1</li><li>Clash of Dynasties: St. Edward vs Walsh Jesuit</li><li>The Coroner's Assistant S1</li><li>Drink: A Look Inside the Glass S1</li><li>The Envoy, Pilot</li><li>The Eternal White S1</li><li>Extreme Airport Africa S2</li><li>Founder S1</li><li>Gatherings S1</li><li>Gentle and Lowly Video Study S1</li><li>Guerrera S1</li><li>Gus Plus Us S1</li><li>Heated Rivalry S1</li><li>Honor Guard S1</li><li>Hunting to Save the Rhinos S1</li><li>The Hunting Wives S1</li><li>Ice Airport Alaska S5</li><li>Killer Whales S2</li><li>Legacy Makers S1</li><li>Mad Men S1-7</li><li>Missionary: Obeying the Great Commission S1</li><li>My Name is Anxiety S1</li><li>Office Joe S1</li><li>Perfect Sweat S1</li><li>Q: Into the Storm</li><li>The Religion Business and the Nonprofit Goliath S1</li><li>Rich Africans S1</li><li>RuPaul's Drag Race UK S5</li><li>The RVers S3, 4</li><li>Selling Superman S1</li><li>Sexpectations S1</li><li>Star Trek: Strange New Worlds S1</li><li>That’s Wine S1</li><li>Third Shift</li><li>Tractor Ted S3</li><li>The Twilight Zone (Reboot) S1</li><li>The Wingfeather Saga S2</li></ul><p>As a reminder, these are for purchased shows in the Apple TV app/iTunes Store. </p><p>Have you noticed any other shows upgraded to 4K in your Apple Account? Let us know in the comments.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-might-beat-iphone-ultra-at-its-own-game-heres-how">Samsung Galaxy Z Fold 8 might beat iPhone Ultra at its own game — here's how</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apples-foldable-iphone-ultra-may-not-be-released-at-the-same-time-as-the-iphone-18-pro-heres-why">Kuo: iPhone Ultra will ship after iPhone 18 Pro and still 'sell out immediately' with $2,300 - $2,500 price</a></li><li><a href="https://www.tomsguide.com/audio/airpods/airpods-ultra-almost-certainly-hinted-at-in-ios-27-code-and-they-could-be-a-huge-audio-and-camera-upgrade">AirPods Ultra 'almost certainly' hinted at in iOS 27 code — and they could be a huge audio (and camera) upgrade</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ ‘Silo’ season 3 premiere review: I dreaded this sci-fi cliché but somehow it absolutely works ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/silo-season-3-premiere-review-i-dreaded-this-sci-fi-cliche-but-somehow-it-absolutely-works</link>
                                                                            <description>
                            <![CDATA[ Our guide on the new movies and shows coming to Apple TV Plus in June 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">MfuuqoQAAtfxMSFjffMsRb</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/C3pJhEQLRrRGfumVBJomDM-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 03 Jul 2026 05:31:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ kelly.woo@futurenet.com (Kelly Woo) ]]></author>                    <dc:creator><![CDATA[ Kelly Woo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jpnR8RZd8njtxaHRHimzsi.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Kelly is the managing editor of streaming for Tom’s Guide, so basically, she watches TV for a living. She writes news, features and reviews about the streaming realm — hardware, software and content. In a given week, she might test a new Roku stick, check out an interface update on HBO Max, sound off on the trailer for a new Netflix show and provide info on how to watch a fan-favorite series. &lt;/p&gt;&lt;p&gt;In addition to streaming coverage, she also occasionally contributes to the fitness and home sections.&lt;/p&gt;&lt;p&gt;Before joining Tom&#039;s Guide, she was a freelance entertainment writer for Yahoo, Vulture, TV Guide and other outlets and a content creator for HBO, Apple and DotDash. Prior to that, she was a senior editor at AOL Television and Moviefone. She graduated from Duke University with a degree in English literature.&lt;/p&gt;&lt;p&gt;When she’s not watching TV and movies for work, she’s watching them for fun, plus seeing live music, writing songs, knitting and gardening.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/C3pJhEQLRrRGfumVBJomDM-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Rebecca Ferguson and Common Silo season 3]]></media:description>                                                            <media:text><![CDATA[Rebecca Ferguson and Common Silo season 3]]></media:text>
                                <media:title type="plain"><![CDATA[Rebecca Ferguson and Common Silo season 3]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/C3pJhEQLRrRGfumVBJomDM-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>After a year and a half away, "Silo" returns with a challenge that every prestige streaming drama eventually faces: How do you pick up the pieces after a finale that left viewers with 100 unanswered questions? If you're anything like me, you'll probably want to watch a recap before diving back in. Season 2 ended in a flurry of revelations and plot movements, and the details might feel a bit fuzzy.</p><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'Silo' season 3</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Rating: </strong>4.5/5 stars</p><p class="fancy-box__body-text"><strong>Verdict:</strong> "Silo" returns with a smart, intriguing premiere that confidently resets the board and ups the momentum with flashbacks to the past. If the rest of the season delivers on the mysteries set up here, the road to the series finale is looking very promising.</p><p class="fancy-box__body-text"><strong>Release schedule: </strong>Episode 1 now streaming</p><p class="fancy-box__body-text"><strong>Where to watch: </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/silo/umc.cmc.3yksgc857px0k0rqe5zd4jice" target="_blank" rel="nofollow">Apple TV</a></p></div></div><p>Fortunately, season 3 doesn't expect you to remember everything. Instead, it takes an unexpectedly clever approach by dropping us into Silo 18 in a way that makes it feel just as unfamiliar to us as it does to Juliette Nichols (Rebecca Ferguson).</p><p>After watching the premiere episode, I'm already convinced the Apple TV sci-fi drama hasn't lost its touch. If anything, it feels like a show that's finally shifting from asking questions to answer them — and setting the pieces in place for the endgame. <br><em><strong>Very light spoilers for "Silo" season 3 episode 1 ahead.</strong></em></p><h2 id="juliette-digs-into-a-new-mystery-and-so-do-we">Juliette digs into a new mystery — and so do we</h2><p>Picking up three months after last season's explosive finale, Silo 18 has reorganized itself in ways that are new to us. Juliette doesn’t recognize it either, because she has amnesia after surviving the fire. She’s now the mayor, apparently, and the rebellion seems to be over.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/BLBvbMtjyAQ" allowfullscreen></iframe></div></div><p>Amnesia is hardly the freshest storytelling device. I’ve seen enough “who am I?” storylines to last several lifetimes underground. But it actually works here because it isn’t just a gimmick meant to tread water; Juliette’s confusion becomes our own and we’re invited to play detective alongside her. </p><p>Every interaction hints that something is off. Camille (Alexandria Riley) is the new head of IT and a much more powerful player, with direct access to the Algorithm and the savviness to manipulate Juliette. Then there’s Camille’s husband and new Judge, Sims (Common), who is still as menacing as ever. Even Juliette’s friends, like Shirley (Remmie Milner) and Knox (Shane McRae), behave strangely around her. She may be back home, but Juliette once again must figure out who has key information and who can actually be trusted.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dBdcAdYubsvmpBvCUv7gB6" name="silo-s3" alt="Ashley Zukerman and Jessica Henwick in Silo season 3" src="https://cdn.mos.cms.futurecdn.net/dBdcAdYubsvmpBvCUv7gB6.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>And then there’s the Before Times storyline, which I didn’t expect to be this intrigued by so quickly. For two seasons, the biggest question hanging over the series hasn't just been what's outside the silo, but why humanity ended up underground in the first place.</p><p>Finally beginning to explore that history adds fresh energy, especially in key figures like Congressman Daniel (Ashley Zukerman) and journalist Helen (Jessica Henwick), who stumble upon an unfolding conspiracy. Their storyline, alongside glimpses of political and military actions, hints at how decisions made in the Before Times ripple forward into the silos, making the past feel just as relevant as the present.</p><h2 id="verdict-silo-season-3-hits-the-accelerator">Verdict: ‘Silo’ season 3 hits the accelerator</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2816px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kTSuBRqe3XxDFXmLrgygZL" name="SIlo_Photo_030105" alt="Rebecca Ferguson in "Silo," premiering July 3, 2026 on Apple TV." src="https://cdn.mos.cms.futurecdn.net/kTSuBRqe3XxDFXmLrgygZL.png" mos="" align="middle" fullscreen="" width="2816" height="1584" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>I’ve never read Hugh Howey’s books, so I have no expectations of fidelity to the page. But as a viewer, I can feel the show shifting from “what’s happening in the silo?” to “why has all of this happened?” and that’s a much more compelling direction than just stacking new mysteries on old ones. There's real momentum here.</p><p>Rebecca Ferguson remains the show's not-so-secret weapon. Even with Juliette stripped of her memories, Ferguson grounds every scene with the same stubborn determination she’s had from the beginning. Watching Juliette slowly realize that something about her new reality doesn't add up is every bit as gripping as seeing her go outside to “clean.”</p><p>Of course, one episode isn't enough to judge an entire season, but as premieres go, this is an excellent one. It smartly avoids the temptation to tell, not show, and lets us into the mysteries as if this is an RPG. If the rest of season 3 can build on the intrigue established here, I’m excited to keep watching. </p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I'm finding ways around Apple's devastating price hikes — grab MacBooks, iPads and more at pre-RAMageddon costs ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/computing/im-finding-ways-around-apples-devastating-price-hikes-grab-macbooks-ipads-and-more-at-pre-ramageddon-costs</link>
                                                                            <description>
                            <![CDATA[ Apple just dramatically increased Mac and iPad prices globally due to RAMageddon. This Prime Day is your last chance to secure pre-hike discounts on Amazon. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">EDu2JNVqBov9TLuzw8UAJg</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/UXEEXQJLR9k5HVLT7yGztS-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 26 Jun 2026 10:04:34 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Computing]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/UXEEXQJLR9k5HVLT7yGztS-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple live blog]]></media:description>                                                            <media:text><![CDATA[Apple live blog]]></media:text>
                                <media:title type="plain"><![CDATA[Apple live blog]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/UXEEXQJLR9k5HVLT7yGztS-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>RAMageddon just claimed another victim, as <a href="https://www.tomsguide.com/computing/macbooks/apple-price-hikes-are-official-heres-how-much-more-youll-pay-for-macbooks-and-ipads-now">Apple raised the prices of Macs, iPads, Apple TVs and HomePods by up to $1,300/£1,300</a>. iPhones have not been hit, but it seems pretty damning that we can expect the iPhone 18 family to get a hike.</p><p>CEO Tim Cook <a href="https://www.tomsguide.com/phones/iphones/apple-ceo-tim-cook-confirmed-price-hikes-are-unavoidable-so-get-ready-to-pay-more">did warn us</a> that soaring memory costs had made increases “unavoidable,” and it’s finally happened. That makes this Prime Day the most important of the past decade, because while the prices are higher on Apple’s own website, all the discounts on these products are still available on Amazon and elsewhere.</p><p>So I cannot overstate it enough — this is the last chance to buy Apple tech at normal prices before things go out of control. If you’ve been on the fence about it, now’s the time to buy.</p><h2 class="article-body__section" id="section-ipad-savings"><span>iPad savings</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="P2onUe3S65XPF97vszhBNX" name="iPad Air M4 held in portrait mode" alt="iPad Air M4 held in portrait mode" src="https://cdn.mos.cms.futurecdn.net/P2onUe3S65XPF97vszhBNX.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Stock is drying up fast on iPads, as everybody is rushing to buy one at these lower prices before they sell out.</p><h2 id="u-s-prices">U.S. prices 🇺🇸</h2><ul><li><strong>iPad (A16): </strong><a href="https://www.bestbuy.com/product/apple-11-inch-ipad-a16-chip-with-wi-fi-128gb-silver/JJGCQG39VG" target="_blank" rel="nofollow"><strong>was $449 now $349 @ Best Buy</strong></a><strong></strong></li><li><strong>iPad Air M4 (11-inch): </strong><a href="https://www.walmart.com/ip/11-inch-iPad-Air-Wi-Fi-128GB-Blue/19616916251" target="_blank" rel="nofollow"><strong>was $749 now $559 @ Walmart</strong></a><strong></strong></li><li><strong>iPad Pro M5 (11-inch): </strong><a href="https://www.amazon.com/Apple-iPad-Pro-11-inch-Landscape/dp/B0FWCXJVHN" target="_blank" rel="nofollow"><strong>was $1,199 now $899 @ Amazon</strong></a><strong></strong></li><li><strong>iPad Pro M5 (13-inch): </strong><a href="https://www.amazon.com/dp/B0FWD1MT5D" target="_blank" rel="nofollow"><strong>was $1,499 now $1,199 @ Amazon</strong></a><strong></strong></li></ul><h2 id="u-k-prices">U.K. prices 🇬🇧</h2><ul><li><strong>iPad (A16): </strong><a href="https://www.amazon.co.uk/Apple-iPad-11-inch-Display-All-Day/dp/B0DZ76CW2K" target="_blank" rel="nofollow"><strong>was £429 now £314 @ Amazon</strong></a><strong></strong></li><li><strong>iPad mini (A17 Pro): </strong><a href="https://www.amazon.co.uk/dp/B0DK3Z3S7T" target="_blank" rel="nofollow"><strong>was £599 now £475 @ Amazon</strong></a><strong></strong></li><li><strong>iPad Air M4 (11-inch): </strong><a href="https://www.currys.co.uk/products/apple-11-ipad-air-2026-128-gb-space-grey-10292850.html" target="_blank" rel="nofollow"><strong>was £749 now £599 @ Currys</strong></a><strong></strong></li><li><strong>iPad Air M4 (13-inch): </strong><a href="https://www.currys.co.uk/products/apple-13-ipad-air-2026-128-gb-space-grey-10292866.html" target="_blank" rel="nofollow"><strong>was £949 now £799 @ Currys</strong></a><strong></strong></li><li><strong>iPad Pro M5 (11-inch): </strong><a href="https://www.johnlewis.com/2025-apple-ipad-pro-11-inch-m5-processor-ipados-wi-fi-256gb/silver/p114464896" target="_blank" rel="nofollow"><strong>was £1,199 now £999 @ John Lewis</strong></a><strong></strong></li><li><strong>iPad Pro M5 (13-inch): </strong><a href="https://www.johnlewis.com/2025-apple-ipad-pro-13-inch-m5-processor-ipados-wi-fi-256gb/space-black/p114464913" target="_blank" rel="nofollow"><strong>was £1,499 now £1,299 @ John Lewis</strong></a><strong></strong></li></ul><h2 class="article-body__section" id="section-macbook-savings"><span>MacBook savings</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3678px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PVynuTDwCUjjRjzbvrwEuU" name="MacBook Neo A18 review-LIST2" alt="MacBook Neo shown on desk" src="https://cdn.mos.cms.futurecdn.net/PVynuTDwCUjjRjzbvrwEuU.jpg" mos="" align="middle" fullscreen="" width="3678" height="2069" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It looks like everything is still in stock at either original prices or slightly discounted from the new prices at the moment. Don’t expect that to last much longer.</p><h2 id="u-s-prices-2">U.S. prices 🇺🇸</h2><ul><li><strong>MacBook Neo (256GB SSD): </strong><a href="https://www.amazon.com/Apple-2026-MacBook-13-inch-Laptop/dp/B0GR6BVYS5" target="_blank" rel="nofollow"><strong>was $699 now $589 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Air M5 (13-inch): </strong><a href="https://www.bestbuy.com/product/apple-macbook-air-13-inch-laptop-m5-chip-with-10-core-cpu-and-8-core-gpu-16gb-memory-512gb-ssd-midnight/JJGCQLKXL7" target="_blank" rel="nofollow"><strong>was $1,299 now $1,099 @ Best Buy</strong></a><strong></strong></li><li><strong>MacBook Air M5 (15-inch): </strong><a href="https://www.bestbuy.com/product/apple-macbook-air-15-inch-laptop-m5-chip-with-10-core-cpu-and-10-core-gpu-16gb-memory-512gb-ssd-midnight/JJGCQLKQL9" target="_blank" rel="nofollow"><strong>was $1,499 now $1,299 @ Best Buy</strong></a><strong></strong></li><li><strong>MacBook Pro M5 (14-inch): </strong><a href="https://www.amazon.com/dp/B0FWD623D1" target="_blank" rel="nofollow"><strong>was $1,999 now $1,549 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Pro M5 Pro (14-inch): </strong><a href="https://www.amazon.com/dp/B0GR1JK9W3" target="_blank" rel="nofollow"><strong>was $2,499 now $2,049 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Pro M5 Max (14-inch): </strong><a href="https://www.amazon.com/dp/B0GR1C4TVV" target="_blank" rel="nofollow"><strong>was $4,099 now $3,299 @ Amazon</strong></a><strong></strong></li></ul><h2 id="u-k-prices-2">U.K. prices 🇬🇧</h2><ul><li><strong>MacBook Neo (256GB SSD): </strong><a href="https://www.amazon.co.uk/Apple-MacBook-13-inch-Laptop-chip/dp/B0GR6N7H39" target="_blank" rel="nofollow"><strong>was £699 now £649 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Air M5 (13-inch): </strong><a href="https://www.amazon.co.uk/dp/B0GR1B3ZRR" target="_blank" rel="nofollow"><strong>was £1,299 now £988 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Air M5 (15-inch): </strong><a href="https://www.amazon.co.uk/dp/B0GR1JFN8Y" target="_blank" rel="nofollow"><strong>was £1,499 now £1,299 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Pro M5 (14-inch): </strong><a href="https://www.johnlewis.com/2025-apple-macbook-pro-14-m5-processor-16gb-ram-512gb-ssd/space-black/p114464817" target="_blank" rel="nofollow"><strong>was £1,999 now £1,279 @ John Lewis</strong></a><strong></strong></li><li><strong>MacBook Pro M5 Pro (14-inch): </strong><a href="https://www.amazon.co.uk/dp/B0GR1RWT8S" target="_blank" rel="nofollow"><strong>was £2,499 now £2,013 @ Amazon</strong></a><strong></strong></li><li><strong>MacBook Pro M5 Max (14-inch): </strong><a href="https://www.amazon.co.uk/dp/B0GR1JVT2J" target="_blank" rel="nofollow"><strong>was £4,099 now £3,278 @ Amazon</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-mac-desktop-savings"><span>Mac desktop savings</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2940px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="ZxYXBjdFjKnfViyQJc56ib" name="iMac-2023_M3-7.jpg" alt="Apple iMac M4" src="https://cdn.mos.cms.futurecdn.net/ZxYXBjdFjKnfViyQJc56ib.jpg" mos="" align="middle" fullscreen="" width="2940" height="1654" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This is where things get tricky. After the big OpenClaw haul, Mac mini is just out of stock pretty much everywhere. Not only that, but the Mac Studios are now virtually impossible to come across at the lower rates. Fortunately, the iMac is still going strong.</p><h2 id="u-s-prices-3">U.S. prices 🇺🇸</h2><ul><li><strong>iMac M4: </strong><a href="https://www.bestbuy.com/product/apple-imac-24-inch-all-in-one-m4-chip-built-for-apple-intelligence-8-core-cpu-8-core-gpu-16gb-memory-256gb-ssd-silver/JJGCQ3F4SG" target="_blank" rel="nofollow"><strong>was $1,499 now $1,149 @ Best Buy</strong></a><strong></strong></li></ul><h2 id="u-k-prices-3">U.K. prices 🇬🇧</h2><ul><li><strong>iMac M4: </strong><a href="https://www.amazon.co.uk/dp/B0DL6JM9X1?th=1" target="_blank" rel="nofollow"><strong>was £1,499 now £1,199 @ Amazon</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-apple-tv-and-homepod-savings"><span>Apple TV and HomePod savings</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DW7Cb7YncewfSAxQJZPQfi" name="TG_Apple-TV-4K_2021-10.jpg" alt="Apple TV 4K (2021) review" src="https://cdn.mos.cms.futurecdn.net/DW7Cb7YncewfSAxQJZPQfi.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>How much RAM does a HomePod need!? Anyway, my gripes aside, luckily, Apple TVs and HomePods are still available at the original prices elsewhere — except for HomePod mini.</p><h2 id="u-s-prices-4">U.S. prices 🇺🇸</h2><ul><li><strong>Apple TV 4K: </strong><a href="https://www.walmart.com/ip/Apple-TV-4K-64GB-3rd-gen-Wi-Fi-MN873LL-A-2022/1529556266" target="_blank" rel="nofollow"><strong>was $199 now $129 @ Walmart</strong></a><strong></strong></li><li><strong>Apple HomePod: </strong><a href="https://www.walmart.com/ip/Apple-Homepod-Midnight-2025-MDEW4LL-A/17036967854" target="_blank" rel="nofollow"><strong>was $349 now $299 @ Walmart</strong></a><strong></strong></li></ul><h2 id="u-k-prices-4">U.K. prices 🇬🇧</h2><ul><li><strong>Apple TV 4K: </strong><a href="https://www.amazon.co.uk/Apple-2022-Apple-Wi%E2%80%91Fi-64GB-storage-generation/dp/B0BJMNZTCK" target="_blank" rel="nofollow"><strong>was £199 now £139 @ Amazon</strong></a><strong></strong></li><li><strong>Apple HomePod: </strong><a href="https://www.argos.co.uk/product/7698044" target="_blank" rel="nofollow"><strong>was £349 now £299 @ Argos</strong></a><strong></strong></li><li><strong>Apple HomePod mini: </strong><a href="https://www.argos.co.uk/product/7698161" target="_blank" rel="nofollow"><strong>was £129 now £99 @ Argos</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-deals"><span>We're tracking all the best Prime Day deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&min_discount_ratio=0.95&offer_type=all&view_mode=carousel&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=light_blue" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right {      right: 0;      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>\n        \x3C/div>\n      \x3C/div>\n    \x3C/div>          \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                if(!r) return;                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const encodedTag = encodeURIComponent(this.activeDealTag.toLowerCase().replace(/\s+/g, '-'));             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map(v => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              return `                \x3Ca href="${this.escapeHTML(linkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item">                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let existingChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             if (this.getViewMode() === 'carousel') {                 if (!existingChevron) {                     gridWrapper.insertAdjacentHTML('beforeend', '\n                 \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: \'smooth\'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>');                 }             } else {                 if (existingChevron) {                     existingChevron.remove();                 }             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple's price hikes finally made me pick up the Apple TV 4K I've been eyeing for weeks — and you can still grab one at the old price ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/apples-price-hikes-finally-made-me-pick-up-the-apple-tv-4k-ive-been-eyeing-for-weeks-and-you-can-still-grab-one-at-the-old-price</link>
                                                                            <description>
                            <![CDATA[ Apple may have raised the price of the Apple TV 4K by $70, but these retailers didn't get the memo — and you should follow my lead and take advantage while you can. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">UzdiYQy8En7hQdmA6aBhAa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sUdfVRZtkLBMGZRXSxmHp7-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 26 Jun 2026 09:51:37 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/sUdfVRZtkLBMGZRXSxmHp7-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[apple tv 4k with prime dasy sticker]]></media:description>                                                            <media:text><![CDATA[apple tv 4k with prime dasy sticker]]></media:text>
                                <media:title type="plain"><![CDATA[apple tv 4k with prime dasy sticker]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sUdfVRZtkLBMGZRXSxmHp7-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I've always been a big fan of Roku streamers, but recently I've been mulling over the idea of swapping for an <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV 4K</a>. Not only am I getting tired of Roku's advertising, but the <a href="https://www.tomsguide.com/reviews/roku-streambar">Roku Streambar</a> that's been <a href="https://www.tomsguide.com/opinion/i-switched-from-roku-to-a-fire-tv-stick-for-two-weeks-heres-what-happened">powering my TV for five and a half years</a> seems to be glitching a lot more than usual. Yesterday saw me finally take the plunge and make that purchase.</p><p>Discounts on Apple products are quite rare, and the Apple TV 4K was not fortunate enough to be discounted in Amazon's Prime Day sale — or at any rival retailers. But considering Apple has just announced a series of price hikes, including a $70 increase on the Apple TV 4K, I realized it was now or never.</p><p>It seems that a lot of other people had the same idea, and it's actually become quite hard to find an Apple TV 4K at the old $129 price tag. Apple has a plentiful supply <a href="https://www.apple.com/shop/buy-tv/apple-tv-4k" target="_blank" rel="nofollow">if you're willing to pay $199</a>, but there's something about being asked to pay so much money for a 4-year-old device that rubs me the wrong way. </p><p>So here are the retailers that still have stock at the old price.</p><div class="product"><a data-dimension112="09f9f981-be52-4e8a-8313-ca983f557b15" data-action="Deal Block" data-label="Walmart has sold a lot of Apple TV 4Ks over the past 25 hours, and it looks like stock is starting to run low. So grab this while you can, complete with free shipping or same-day pickup, and a bunch of extended trials for Apple Services, including streaming and music." data-dimension48="Walmart has sold a lot of Apple TV 4Ks over the past 25 hours, and it looks like stock is starting to run low. So grab this while you can, complete with free shipping or same-day pickup, and a bunch of extended trials for Apple Services, including streaming and music." data-dimension25="$129" href="https://www.walmart.com/ip/Apple-TV-4K-64GB-3rd-gen-Wi-Fi-MN873LL-A-2022/1529556266" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:454px;"><p class="vanilla-image-block" style="padding-top:93.61%;"><img id="vSoq2aA9FjoCQRdmuv3tuM" name="Screen Shot 2021-06-18 at 11.17.49 AM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vSoq2aA9FjoCQRdmuv3tuM.png" mos="" align="middle" fullscreen="" width="454" height="425" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Walmart has sold a lot of Apple TV 4Ks over the past 25 hours, and it looks like stock is starting to run low. So grab this while you can, complete with free shipping or same-day pickup, and a bunch of extended trials for Apple Services, including streaming and music.<a class="view-deal button" href="https://www.walmart.com/ip/Apple-TV-4K-64GB-3rd-gen-Wi-Fi-MN873LL-A-2022/1529556266" target="_blank" rel="nofollow" data-dimension112="09f9f981-be52-4e8a-8313-ca983f557b15" data-action="Deal Block" data-label="Walmart has sold a lot of Apple TV 4Ks over the past 25 hours, and it looks like stock is starting to run low. So grab this while you can, complete with free shipping or same-day pickup, and a bunch of extended trials for Apple Services, including streaming and music." data-dimension48="Walmart has sold a lot of Apple TV 4Ks over the past 25 hours, and it looks like stock is starting to run low. So grab this while you can, complete with free shipping or same-day pickup, and a bunch of extended trials for Apple Services, including streaming and music." data-dimension25="$129">View Deal</a></p></div><div class="product"><a data-dimension112="5f334e6d-f5c0-4a50-b8c7-e9160489c248" data-action="Deal Block" data-label="Target also has the Apple TV 4K in stock at the old price, but you will need to wait for it to arrive. Deliveries are estimated to arrive by Tuesday June 30. There are no extras with this purchase, but you're still getting the same Apple TV 4K for $70 less than what Apple is now asking for." data-dimension48="Target also has the Apple TV 4K in stock at the old price, but you will need to wait for it to arrive. Deliveries are estimated to arrive by Tuesday June 30. There are no extras with this purchase, but you're still getting the same Apple TV 4K for $70 less than what Apple is now asking for." data-dimension25="$129" href="https://www.target.com/p/apple-tv-4k-3rd-generation/-/A-87877456" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:454px;"><p class="vanilla-image-block" style="padding-top:93.61%;"><img id="vSoq2aA9FjoCQRdmuv3tuM" name="Screen Shot 2021-06-18 at 11.17.49 AM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vSoq2aA9FjoCQRdmuv3tuM.png" mos="" align="middle" fullscreen="" width="454" height="425" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Target also has the Apple TV 4K in stock at the old price, but you will need to wait for it to arrive. Deliveries are estimated to arrive by Tuesday June 30. There are no extras with this purchase, but you're still getting the same Apple TV 4K for $70 less than what Apple is now asking for.<a class="view-deal button" href="https://www.target.com/p/apple-tv-4k-3rd-generation/-/A-87877456" target="_blank" rel="nofollow" data-dimension112="5f334e6d-f5c0-4a50-b8c7-e9160489c248" data-action="Deal Block" data-label="Target also has the Apple TV 4K in stock at the old price, but you will need to wait for it to arrive. Deliveries are estimated to arrive by Tuesday June 30. There are no extras with this purchase, but you're still getting the same Apple TV 4K for $70 less than what Apple is now asking for." data-dimension48="Target also has the Apple TV 4K in stock at the old price, but you will need to wait for it to arrive. Deliveries are estimated to arrive by Tuesday June 30. There are no extras with this purchase, but you're still getting the same Apple TV 4K for $70 less than what Apple is now asking for." data-dimension25="$129">View Deal</a></p></div><h2 id="why-choose-the-apple-tv-4k">Why choose the Apple TV 4K?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ryFasSGzkXnmei2KeYT9ZU" name="TG_AppleTV-4k_2022.jpg" alt="The Apple TV 4K (2022), with the Siri remote propped on its right side." src="https://cdn.mos.cms.futurecdn.net/ryFasSGzkXnmei2KeYT9ZU.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Henry T. Casey / Tom's Guide)</span></figcaption></figure><p>One of the main benefits of buying an Apple TV 4K is that it's got the cleanest interface of any streaming device around. Unlike some rivals it's not constantly pushing you towards Apple services, or showcasing ads that you may or may not be interested in. That also means that there are no random branded buttons on the remote, a feature that has always bugged me.</p><div><blockquote><p>There are no random branded buttons on the remote, a feature that has always bugged me.</p></blockquote></div><p>You also have support for Apple smart home devices, Dolby Atmos and HDR10+, an ethernet port on the more expensive 128GB option and the ability to play games from the App Store. </p><p>Performance was also excellent at the time of release, thanks to the A15 Bionic chipset. And while old, I'm not sure whether you need iPhone or MacBook-tier performance on a streaming box. As long as it loads quickly and plays the content I want without issue, it's good with me.</p><p>There's also access to Siri, but due to the Apple TV's age, the current model isn't able to run Siri AI — even with the tvOS 27 beta installed. If you're desperate for Apple's AI on your TV, you might want to wait for the upgraded model that's <a href="https://www.tomsguide.com/entertainment/streaming-devices/tvos-27-cuts-off-two-apple-tv-devices-does-this-mean-a-new-box-is-coming">rumored to be in development</a>. But who knows whether that will arrive this year, or some unspecified point in the future. You certainly won't be getting it for a low price.</p><p>Me? I'm picking it up for the interface and the lack of advertising. There are too many ads on the internet, especially on streaming services, and I've grown tired of seeing ads on my home screen as well.</p><h2 id="where-you-can-actually-buy-apple-tv-4k-for-the-old-price">Where you can actually buy Apple TV 4K for the old price</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2DcyGhafTmkZYicS43Xj8j" name="2.jpg" alt="The Apple TV 4K (2022) with remote" src="https://cdn.mos.cms.futurecdn.net/2DcyGhafTmkZYicS43Xj8j.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>It looks as though the Apple TV 4K has proven very popular over the last 24 hours. Walmart claims that it has sold over 500 of the things since yesterday, while Amazon and Best Buy have both run out of stock.</p><div><blockquote><p>Walmart has flagged the Apple TV 4K for low stock, which means there's a good chance they will also run out soon.</p></blockquote></div><p><a href="https://www.walmart.com/ip/Apple-TV-4K-64GB-3rd-gen-Wi-Fi-MN873LL-A-2022/1529556266" target="_blank" rel="nofollow">Walmart is arguably the best option</a> if you want your streaming box as soon as possible, offering next day same-day delivery and in-store pickup for those of you willing to drive to your nearest location. You can also get free shipping, as well as the usual slew of extended trials for Apple services — including Apple TV and Apple Music.</p><p>However Walmart has flagged the Apple TV 4K for low stock, which means there's a good chance they will also run out soon. You can guarantee that the next batch they receive is going to be priced on par with Apple.</p><p>Target isn't offering pickup or same-day delivery, but it <a href="https://www.target.com/p/apple-tv-4k-3rd-generation/-/A-87877456" target="_blank" rel="nofollow">will still ship you a 64GB Apple TV 4K</a> with the promise that it will arrive by June 30. That shipping is also free, but there's no mention of the extended free trials that Walmart is offering.</p><p>If both those retailers run out of stock, then it's always worth checking out <a href="https://www.ebay.com/sch/i.html?_nkw=Apple+tv+4k+64GB&_sacat=0&_from=R40&_trksid=p2334524.m570.l1313&_odkw=Apple+tv+4k&_osacat=0" target="_blank" rel="nofollow">sites like eBay</a> to see if you can pick up a used model. Some of the prices have started going up already, and I saw one open box Apple TV <a href="https://www.ebay.com/itm/364121975277?_skw=Apple+tv+4k+64GB&epid=27057122057&itmmeta=01KW1GAB2BTHZE8ATCT9MB7HR3&hash=item54c75c69ed:g:2cAAAOSw~bxj0Fda&itmprp=enc%3AAQALAAAA8GfYFPkwiKCW4ZNSs2u11xCWtM2BqFB4U1EDryhAwpB4f%2FC8ofzVuSol7XrzXw4MSamiPN9UfcvzYODVvNta%2FinEq0RpuVsryW2EAkOqYXVp1ZGGGDFz6VAwg6WAawjCXVaRNrVJNPB1%2F0YzLFsrVAT%2FTg1x8eaeo%2FrIrhSKZ87%2BPn%2BKGJA0n%2BFBxEQHDCx7k8175j64qm1gqqyFD5NL4QBhmUT6dThQ8yCMRljjleInItY4R391xXGkOHp6CewjgUq8oXeAtsA7UanTjgNKksc1%2BVuv%2FW90MNLy6WAomHCU%2F10MVtUSD%2FtiXPDvLgOQjw%3D%3D%7Ctkp%3ABFBMuLGpsOBn" target="_blank" rel="nofollow">with a $189 asking price</a>, so it seems some sellers are already catching on and trying to take advantage of the price hike.</p><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=tablets&brands=Amazon%2CApple%2CGoogle%2CLenovo%2CSamsung%2CTCL&price=165_&min_discount_ratio=0.95&sort=best_match&retailer=Amazon&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            if (!this.processArticleFired) {                  this.processArticleFired = true;                  document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));               }            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Everything new on Apple TV in July 2026 — 'Silo' season 3 and much more ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-july-2026</link>
                                                                            <description>
                            <![CDATA[ Our guide on the new movies and shows coming to Apple TV Plus in June 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">FUiENQx2LWXurwoSoeQjP7</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4VdQw8T8Xz9Cct4TixYkfc-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 25 Jun 2026 05:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ kelly.woo@futurenet.com (Kelly Woo) ]]></author>                    <dc:creator><![CDATA[ Kelly Woo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jpnR8RZd8njtxaHRHimzsi.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Kelly is the managing editor of streaming for Tom’s Guide, so basically, she watches TV for a living. She writes news, features and reviews about the streaming realm — hardware, software and content. In a given week, she might test a new Roku stick, check out an interface update on HBO Max, sound off on the trailer for a new Netflix show and provide info on how to watch a fan-favorite series. &lt;/p&gt;&lt;p&gt;In addition to streaming coverage, she also occasionally contributes to the fitness and home sections.&lt;/p&gt;&lt;p&gt;Before joining Tom&#039;s Guide, she was a freelance entertainment writer for Yahoo, Vulture, TV Guide and other outlets and a content creator for HBO, Apple and DotDash. Prior to that, she was a senior editor at AOL Television and Moviefone. She graduated from Duke University with a degree in English literature.&lt;/p&gt;&lt;p&gt;When she’s not watching TV and movies for work, she’s watching them for fun, plus seeing live music, writing songs, knitting and gardening.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/4VdQw8T8Xz9Cct4TixYkfc-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV logo on a yellow rays background]]></media:description>                                                            <media:text><![CDATA[Apple TV logo on a yellow rays background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV logo on a yellow rays background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4VdQw8T8Xz9Cct4TixYkfc-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Summer is hitting full stride, but <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> is making a strong case for spending time on the couch. The streamer’s July 2026 lineup mixes prestige sci-fi, returning favorites and feel-good movies that could easily fill a weekend watchlist. </p><p>Leading the charge is season 3 of "Silo," which continues peeling back the mysteries of its underground world while diving deeper into the story's distant past. Also returning is "Trying" for season 5, which once again proves that few shows do warmth and charm quite like this one. The crime thriller "Lucky" debuts with Anya Taylor-Joy as a con artist on the run. Plus, there's a pickleball comedy "The Dink" and the animated special "Snoopy Presents: There's No Place Like Home, Snoopy."</p><div class="product"><a data-dimension112="618499db-d0bc-4cb4-9fe3-5afc8bcedaf8" data-action="Deal Block" data-label="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension48="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension25="$" href="https://www.amazon.com/gp/video/storefront/subscription/appletvus/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Apple TV add-on subscription via Prime Video (2 months): </strong><a href="https://www.amazon.com/gp/video/storefront/subscription/appletvus/" target="_blank" rel="nofollow" data-dimension112="618499db-d0bc-4cb4-9fe3-5afc8bcedaf8" data-action="Deal Block" data-label="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension48="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension25="$"><del>was $12.99/month</del><strong> now $5.99/month @ Amazon</strong></a> <br>This Apple TV deal lets you add the channel to your existing Prime Video subscription for just $5.99/month for the first two months, down from the usual $12.99. It’s the perfect chance to binge Apple TV’s biggest hits.<a class="view-deal button" href="https://www.amazon.com/gp/video/storefront/subscription/appletvus/" target="_blank" rel="nofollow" data-dimension112="618499db-d0bc-4cb4-9fe3-5afc8bcedaf8" data-action="Deal Block" data-label="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension48="Apple TV add-on subscription via Prime Video (2 months): was $12.99/month" data-dimension25="$">View Deal</a></p></div><p>Here's everything coming to Apple TV in July 2026.</p><h2 id="silo-season-3">'Silo' season 3</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/BLBvbMtjyAQ" allowfullscreen></iframe></div></div><p><strong>After two seasons of rationing answers like they're contraband, "Silo" is finally ready to crack open some of its biggest mysteries</strong>. Season 3 picks up with Juliette (Rebecca Ferguson) alive but suffering from amnesia, which is about as inconvenient as it sounds when you're trying to save a society built on secrets. The new season also travels back to the Before Times, chronicling the events that sent humanity underground in the first place. At long last, the bunker origin story is coming into focus.</p><p><a href="https://tv.apple.com/us/show/silo/umc.cmc.3yksgc857px0k0rqe5zd4jice" target="_blank" rel="nofollow"><em><strong>Watch "Silo" season 3 on Apple TV starting July 3</strong></em></a></p><h2 id="trying-season-5">'Trying' season 5</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/8-_Oxuozsw4" allowfullscreen></iframe></div></div><p>One of TV’s most reliable comfort watches returns, but don’t expect Nikki( Esther Smith) and Jason's (Rafe Spall) hard-won domestic bliss to stay blissful for long. Season 5 picks up after Kat, the biological mother of Princess and Tyler, lands on their doorstep, bringing a fresh wave of complications to the family they’ve worked so hard to build. Equal parts funny, messy and genuinely moving, <strong>"Trying" is proof that feel-good doesn’t have to mean conflict-free.</strong></p><p><a href="https://tv.apple.com/us/show/trying/umc.cmc.6muy4la7lj1omu5nci4bt2m66" target="_blank" rel="nofollow"><em><strong>Watch "Trying" season 5 on Apple TV starting July 8</strong></em></a></p><h2 id="lucky">'Lucky'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/GAbT5qCTXR8" allowfullscreen></iframe></div></div><p>Anya Taylor-Joy trades dunes and mushroom kingdoms for cons and family trauma in this <strong>sleek crime thriller miniseries based on Marissa Stapley’s bestselling novel</strong>. She plays a reformed grifter forced back into the criminal life when a multimillion-dollar heist goes wrong. Timothy Olyphant is her outlaw father, Annette Bening wields danger as a mob leader, and there are enough double-crosses to fill a getaway car.</p><p><a href="https://tv.apple.com/us/show/lucky/umc.cmc.5qo7t3nngb2vj0m9dxkwebw1o" target="_blank" rel="nofollow"><em><strong>Watch "Lucky" on Apple TV starting July 15</strong></em></a></p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="the-dink">'The Dink'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/YyVNFzx5Pl8" allowfullscreen></iframe></div></div><p>For most people, pickleball is a fun, not-too-strenuous activity. For washed-up tennis prodigy Dusty Boyd (Jake Johnson), it's a humiliating detour. In this sports comedy movie, he’s stuck coaching unruly kids at his father Chuck’s (Ed Harris) country club, where approval is harder to earn than a trophy. An injury sidelines him, forcing him into pickleball rehab against his will ... until he starts to enjoy it alongside doubles partner Candace (Mary Steenburgen). With Andy Roddick, Dusty’s identity crisis gets competitive.</p><p><a href="https://tv.apple.com/us/movie/the-dink/umc.cmc.5tugaz9vt498ajn7q64ypaqxn" target="_blank" rel="nofollow"><em><strong>Watch "The Dink" on Apple TV starting July 24</strong></em></a></p><h2 id="snoopy-presents-there-s-no-place-like-home-snoopy">'Snoopy Presents: There’s No Place Like Home, Snoopy'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/4Okng09fWvo" allowfullscreen></iframe></div></div><p>In the 53rd Peanuts special, Snoopy’s iconic doghouse gets accidentally sold at a yard sale, and the world’s most imaginative beagle is understandably devastated. After all, it’s his creative HQ, his memory palace, his everything. Snoopy (voiced by Terry McGurrin) sets out to cope with the loss, with help from a new slate of kids.</p><p><a href="https://tv.apple.com/mx/movie/snoopy-presents-theres-no-place-like-home-snoopy/umc.cmc.52sgmi3vdpedurrbtz6louqqo?l=en" target="_blank" rel="nofollow"><em><strong>Watch "There's No Place Like Home, Snoopy" on Apple TV starting July 31</strong></em></a></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ey6xaW"></div>                            </div>                            <script src="https://kwizly.com/embed/ey6xaW.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/tvs/5-hidden-apple-tv-remote-features-youre-probably-not-using">Control your Apple TV like a pro with these 5 hidden remote features</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Control your Apple TV like a pro with these 5 hidden remote features ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tvs/5-hidden-apple-tv-remote-features-youre-probably-not-using</link>
                                                                            <description>
                            <![CDATA[ Your Apple TV remote has hidden powers that make everyday tasks faster. Here are the five most useful ones. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JkDXY7NcEtKGRkjfekq48c</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/o2MW6Vb44S6zJKTvTxfGXZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 22 Jun 2026 08:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[TVs]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/o2MW6Vb44S6zJKTvTxfGXZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Henry T. Casey / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Apple TV 4K (2022) remote in front of a TV with the tvOS home screen.]]></media:description>                                                            <media:text><![CDATA[The Apple TV 4K (2022) remote in front of a TV with the tvOS home screen.]]></media:text>
                                <media:title type="plain"><![CDATA[The Apple TV 4K (2022) remote in front of a TV with the tvOS home screen.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/o2MW6Vb44S6zJKTvTxfGXZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>On the surface, the Apple TV remote looks almost too simple. It has the obvious buttons you expect: play, pause, back, and volume control. But behind that minimalist design, Apple buried several powerful shortcuts inside tvOS that most users never discover.</p><p>Some of these hidden features solve genuinely frustrating problems like fixing a mid-episode freeze without having to pull the plug on your entire device. Others unlock accessibility tools or hand you advanced settings.</p><p>If you want to stop wrestling with menus and start streaming smarter, here are the five hidden Apple TV remote features worth learning.</p><section class="howto-block">                    <h3>1. Force-close apps without restarting</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/NdnVgdeifRzHh7irWTs9Xd.jpg"                                        alt="Apple TV 4K"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/NdnVgdeifRzHh7irWTs9Xd.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Apple)</div></figure>                    <p><p>When an Apple TV app misbehaves, most people unplug the entire device and wait for a restart. There's a faster way. </p><p>If you <strong>double-press the Home button</strong> your remote pulls up a carousel of currently running apps. Each open app appears as a card you can navigate through. <strong>Once you've selected the problematic app, swipe upward to force-close it</strong>. The app shuts down immediately without affecting anything else running on your Apple TV.</p><p>Closing them periodically keeps your streaming device responsive and prevents the creeping slowdown that happens over weeks of continuous use. It's especially useful if you're switching between multiple services and notice performance dropping.</p></p>                </section><section class="howto-block">                    <h3>2. Scrub through video with precision</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="http://cdn.mos.cms.futurecdn.net/Emrxy4ez8BVqVvadVHSdsE.jpg"                                        alt="Elago R5 apple tv remote case with Siri Remote"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="http://cdn.mos.cms.futurecdn.net/Emrxy4ez8BVqVvadVHSdsE.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>The clickpad on your remote isn't just for navigation, it's a timeline controller. <strong>Press the play/pause button, then slide your finger left or right on the clickpad to rewind or fast-forward </strong>through a show or movie. </p><p>You can also draw circles on the clickpad in either direction to scrub, which some users might find more intuitive than sliding.</p><p>For older Siri Remotes without the clickpad, <strong>use the touch surface instead</strong>. The advantage of scrubbing over using verbal commands is precision — you can land exactly where you want in a scene without overshooting by 15 seconds. </p><p>It's particularly useful when you're trying to find a specific moment or skip past credits without jumping too far ahead.</p></p>                </section><section class="howto-block">                    <h3>3. Switch audio outputs instantly</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="http://cdn.mos.cms.futurecdn.net/nx6RAmzfASJBNhrcoVSq66.jpg"                                        alt="Apple TV 4K interface"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="http://cdn.mos.cms.futurecdn.net/nx6RAmzfASJBNhrcoVSq66.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>If you have external speakers connected to your Apple TV — whether that's a pair of <a href="https://www.tomsguide.com/reviews/apple-homepod-mini">HomePod minis</a> or a soundbar — you can change audio routing without diving into settings menus. </p><p>To open the audio dashboard without interrupting playback, simply <strong>long-press the TV/Control Center button</strong> (the rectangular button with the TV icon) on your Remote. The Control Center panel will slide into view, allowing you to click the <strong>Audio Controls icon</strong> and quickly select your desired speakers. </p><p>This is invaluable when you want to switch from TV speakers to a better sound system, temporarily route audio to your headphones for quiet listening, or even select multiple AirPlay 2 speakers at once to send perfectly synced audio to different rooms.</p></p>                </section><section class="howto-block">                    <h3>4. Enable accessibility features with one gesture</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/FtxGRgCuBZph8BQFSbxttP.jpg"                                        alt="Apple TV 4K settings"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/FtxGRgCuBZph8BQFSbxttP.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>VoiceOver is Apple's audio description system that reads menus, text, and interface elements aloud as you navigate. It's designed for users with vision impairments but benefits anyone who wants spoken feedback from their device. </p><p>You can set up a quick toggle in Accessibility settings — <strong>triple-press the Menu or Back button </strong>to activate it instantly.</p><p>Once enabled, standard navigation is done entirely with a single finger: <strong>simply drag your finger across the clickpad</strong> to explore and hear what is currently beneath it, or <strong>flick left or right with one finger</strong> to move sequentially to the next item. </p><p>The more advanced two-finger gestures are saved for controlling the speech itself —such as <strong>a single two-finger tap to instantly pause or resume the voice, or a two-finger flick up or down </strong>to have VoiceOver read the entire screen aloud.</p></p>                </section><section class="howto-block">                    <h3>5. Unlock advanced settings and demo mode</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="http://cdn.mos.cms.futurecdn.net/KGmEv9xmrE3iitmKSPiZt6.jpg"                                        alt="The Apple TV 4K (2022) remote in hand, tilted to the side"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="http://cdn.mos.cms.futurecdn.net/KGmEv9xmrE3iitmKSPiZt6.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Apple hides specialized menus in tvOS to prevent accidental system changes. To access the hidden Advanced Settings developer menu, go to <strong>Settings, System, Software Update</strong>,<strong> highlight the update field, and press Play/Pause four times</strong>. This menu safely disappears the next time you restart your Apple TV.</p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Odk92W"></div>                            </div>                            <script src="https://kwizly.com/embed/Odk92W.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/tvs/i-found-5-hidden-shortcuts-for-my-apple-tv-4k-that-make-it-so-much-easier-to-use-heres-how-to-use-them">5 features that make my Apple TV 4K so much easier to use</a></li><li><a href="https://www.tomsguide.com/tvs/your-tv-is-watching-you-how-to-turn-off-data-collection-on-lg-samsung-roku-and-more">Your TV is watching you — how to turn off data collection on LG, Samsung, Roku and more</a></li><li><a href="https://www.tomsguide.com/how-to/how-to-fix-an-apple-tv-thats-not-working">How to fix an Apple TV that's not working — and fix Apple TV remote issues too</a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Sugar' season 2 online – stream the Colin Farrell neo-noir mystery series from anywhere ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/how-to-watch-sugar-season-2</link>
                                                                            <description>
                            <![CDATA[ See Colin Farrell in action as private detective John Sugar once more — here's how to watch "Sugar" season 2 online and from anywhere. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">YbpL4UzXciLDaNGmGKjWGd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Ajpj866amyS5YTw6HqmctQ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jakob Barnes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sdLQVVidVk65LYsn3p76nL.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Ajpj866amyS5YTw6HqmctQ-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Colin Farrell in &quot;Sugar&quot;]]></media:description>                                                            <media:text><![CDATA[Colin Farrell in &quot;Sugar&quot;]]></media:text>
                                <media:title type="plain"><![CDATA[Colin Farrell in &quot;Sugar&quot;]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Ajpj866amyS5YTw6HqmctQ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>"Sugar" put Colin Farrell back on TV screens in a slick, neo-noir detective series with a stunning twist. Now he’s back for more with a second season.</p><p>Below, we’ll show you how to watch "Sugar" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere in the world with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Sugar' S2 release date and streaming options</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Sugar" season 2 premieres globally on Apple TV on <strong>Friday, June 19, 2026</strong>. New episodes then arrive weekly every Friday until the finale on August 7, 2026.<br><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/gb/show/sugar/umc.cmc.4r6q7tdquewehwvb3rzl0k3dt" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br><strong>• Watch anywhere </strong>— <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>Try NordVPN for 30 days risk-free</strong></a></p></div></div><p>When "Sugar" first started, we all thought we were getting a fairly standard, albeit very stylish, detective show. Tracking missing person Olivia Siegel, Farrell's eponymous private eye dug deep into family dramas, dark secrets, and a kidnapping plot.</p><p>Then, it all took a crazy twist right at the end, with the character revealed to not only be a great detective but also an alien! Now, in season 2, we'll see him take on a new missing persons case with the brother of a talented boxer going off the grid, while also continuing to search for his own sister. And, of course, we'll get more answers about his extraterrestrial origins.</p><p>You won't need to chase any clues to keep up with the latest episodes, as we show you how to <strong>watch "Sugar"</strong> season 2 from wherever you are — and potentially even catch a couple of episodes for FREE.</p><h2 class="article-body__section" id="section-how-to-watch-sugar-season-2-for-free-on-apple-tv"><span>How to watch 'Sugar' season 2 for FREE on Apple TV+</span></h2><div class="product"><a data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>"Sugar" premieres on <a href="https://tv.apple.com/gb/show/sugar/umc.cmc.4r6q7tdquewehwvb3rzl0k3dt" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> globally on <strong>Friday, June 19, 2026. </strong>New episodes will land on the streamer each Friday from there onwards.</p><p>New Apple TV customers get a <a href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>7-day free trial</strong></a>, so if you time it right you can catch a couple of episodes before deciding whether to carry on with the series.</p><p>After the trial ends, you'll pay:<br><br><strong>U.S. — $12.99/month</strong><br><strong>U.K. — £9.99/month</strong><br><strong>CAN — CA$14.99/month</strong><br><strong>AUS — AU$15.99/month</strong><a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-sugar-season-2-from-anywhere"><span>Watch 'Sugar' season 2 from anywhere</span></h2><p>Traveling and locked out of your Apple TV account or your usual apps? A <a href="https://www.tomsguide.com/news/what-is-a-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best VPN out there..</p><div class="product editors-choice"><div class="editors-choice__title">Editors Choice</div><a data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months FREE</strong></a><br><br>Boasting lightning fast speeds, great features, streaming power, and class-leading security, <strong>NordVPN</strong> is our #1 VPN.<br><br><strong>✅  3 months extra FREE!</strong><br><strong>✅  75% off usual price</strong><br><br>Use Nord to unblock services like <a href="https://tv.apple.com/gb/show/sugar/umc.cmc.4r6q7tdquewehwvb3rzl0k3dt" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Sugar" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-sugar-season-2-trailer"><span>'Sugar' season 2 trailer</span></h3><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/WJMbHySi5eQ" allowfullscreen></iframe></div></div><h2 class="article-body__section" id="section-sugar-season-2-cast"><span>'Sugar' season 2 cast</span></h2><ul><li><strong>Colin Farrell</strong> as John Sugar</li><li><strong>Jin Ha</strong> as the missing boxer</li><li><strong>Raymond Lee</strong></li><li><strong>Tony Dalton</strong> as a lieutenant in the LA County Sheriff's Department</li><li><strong>Laura Donnelly</strong></li><li><strong>Sasha Calle</strong> as a hustler working for Sugar</li><li><strong>Shea Whigham</strong> as a government agency employee</li></ul><h2 class="article-body__section" id="section-sugar-season-2-episodes"><span>'Sugar' season 2 episodes</span></h2><ul><li><strong>Episode 1 - Home Away from Home</strong>: June 19, 2026 </li><li><strong>Episode 2 - Downer Town</strong>: June 26, 2026 </li><li><strong>Episode 3 - Watch Face</strong>: July 3, 2026 </li><li><strong>Episode 4 - Off 15</strong>: July 10, 2026 </li><li><strong>Episode 5 - TBA</strong>: July 17, 2026 </li><li><strong>Episode 6 - TBA</strong>: July 24, 2026 </li><li><strong>Episode 7 - TBA</strong>: July 31, 2026 </li><li><strong>Episode 8 - TBA</strong>: August 7, 2026 </li></ul><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/watch-cape-fear">How to watch 'Cape Fear' — stream classic psychological thriller mini-series from anywhere</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv-plus/watch-pluribus-stream-new-sci-fi-drama">How to watch 'Pluribus' online</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'Widow's Bay' season 2: Everything we know so far ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/widows-bay-season-2-everything-we-know-so-far</link>
                                                                            <description>
                            <![CDATA[ Apple TV's comedy-horror hit 'Widow's Bay is coming back for a second season—here's what we know so far about release schedules, cast details and more ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">vK62fLDLffgETFnu6mYFsM</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jk8d7efAdpyGCLhvP6ziCZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 18 Jun 2026 18:08:48 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Christina Izzo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/LMncQCRNbbLXxxjbfZJvWE.jpeg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/jk8d7efAdpyGCLhvP6ziCZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Matthew Rhys in &#039;Widow&#039;s Bay&#039;]]></media:description>                                                            <media:text><![CDATA[Matthew Rhys in &#039;Widow&#039;s Bay&#039;]]></media:text>
                                <media:title type="plain"><![CDATA[Matthew Rhys in &#039;Widow&#039;s Bay&#039;]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jk8d7efAdpyGCLhvP6ziCZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We're halfway through 2026 already, and the list of <a href="https://www.tomsguide.com/entertainment/netflix/we-asked-our-readers-for-the-best-netflix-original-show-or-movie-of-2026-so-far-and-there-was-a-clear-winner">best shows of the year</a> (so far) is steadily growing. <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv"><strong>Apple TV's</strong></a><strong> "Widow's Bay"</strong> is certainly among that illustrious group. If you haven't tuned in to the comedy-horror hit just yet, the Katie Dippold-created mystery is set in the fictional New England town of Widow's Bay, a scenic but sinister spot that is seemingly afflicted with a centuries-old curse that, much to the chagrin of the local mayor (Matthew Rhys) and his tourism efforts, has flooded the island with evil supernatural forces. </p><p>The 10-episode first season was acclaimed by both pro critics and casual viewers alike. Over on <a href="https://www.rottentomatoes.com/tv/widows_bay" target="_blank">Rotten Tomatoes</a>, the show has an excellent 97% approval rating, with the critics' consensus praising: "Katie Dippold successfully continues to invest in eccentricity with this outlandish horror-comedy that stokes the genre's well-worn tropes to winning effect, bringing scares, laughs, and a game cast.")</p><p>So it's not a surprise that, though season 1 has only just wrapped up on June 17, folks are already buzzing about a potential second season of the Apple TV comedy. Here's everything we know so far about "Widow's Bay" season 2. </p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="will-there-be-a-widow-s-bay-season-2">Will there be a 'Widow's Bay' season 2?</h2><p>Good news: "Widow's Bay" is officially coming back for a second season. Apple TV+ renewed the comedy-horror series for a season 2 on June 11 ahead of its season-one finale, with Kate Dippold back as showrunner and Matthew Rhys returning as main character Tom Loftis.</p><p>“From the moment audiences arrived in Widow’s Bay, they’ve been hooked on every eerie mystery, unexpected laughs, and cursed secret that Katie, Hiro, Matthew, and the entire team have created,” said Matt Cherniss, head of programming, Apple TV, in a statement. “It’s become one of those shows everyone’s talking about, and we’re thrilled to see audiences continue to embrace it. We can’t wait to return for another season.”</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Nmc2RYm6PUE" allowfullscreen></iframe></div></div><h2 id="when-will-widow-s-bay-season-2-be-released">When will 'Widow's Bay' season 2 be released?</h2><p>The streaming service hasn't officially announced when fans will be able to return to Widow's Bay for the show's second installment. </p><p>A writers room is still to be assembled, so we'll have some time before scripts are finished. And given that it took about 10 months from production (filming took place in Massachusetts in June 2025) to release (the first episode dropped on Apple TV on Wednesday, April 29), it's unlikely that a second season will premiere before late 2027 or early 2028. </p><h2 id="who-will-be-in-the-cast-of-widow-s-bay-season-2">Who will be in the cast of 'Widow's Bay' season 2?</h2><p>Of course, you can't have "Widow's Bay" without its beleaguered mayor Tom Loftis, so series lead <strong>Matthew Rhys </strong>will be reprising his role. He'll likely be joined by fellow show regulars <strong>Kate O'Flynn</strong> as Patricia Moyer, <strong>Stephen Root</strong> as Wyck Crawford, <strong>Kevin Carroll</strong> as Sheriff Bechir Clemmons, <strong>Kingston Rumi Southwick</strong> as Evan Loftis and <strong>Dale Dickey</strong> as Rosemary.</p><p>Fans can also expect to see much of the supporting cast return for season two, such as Emmy winner <strong>Jeff Hiller</strong> as Dale, <strong>K Callan</strong> as Ruth Livingston, <strong>Nancy Lenehan</strong> as Gerrie Doyle, <strong>Neil Casey</strong> as Kurt, and <strong>Sipiwe Moyo</strong> as Chelle. It will also be interesting to see which guest stars the series pulls in for the second season; as you no doubt remember, the show featured the likes of <strong>Hamish Linklater</strong> and <strong>Betty Gilpin</strong> in guest-star roles in its first edition. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oarrwybiJUFgXoWUuR3eDZ" name="Matthew Rhys in 'Widow's Bay'" alt="Matthew Rhys in 'Widow's Bay'" src="https://cdn.mos.cms.futurecdn.net/oarrwybiJUFgXoWUuR3eDZ.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><h2 id="what-will-widow-s-bay-season-2-be-about">What will 'Widow's Bay' season 2 be about?</h2><p>As mentioned, scripts haven't been completed just yet for "Widow's Bay" season 2, but showrunner Katie Dippold did give a bit of a teaser on what fans can expect in the upcoming eps: "Season 2 is about how everything is great on the island and there’s nothing to worry about," she included in the renewal announcement. Okay, so when we said tease, we really meant <em>tease</em>. </p><p>There aren't concrete plot details yet, but at least it sounds like star Matthew Rhys is just as desperate for intel as we are. "I’ve been asked, 'What do you think?' And I said, 'I have no idea how this is going to unfold!'" the actor told <a href="https://variety.com/2026/tv/news/widows-bay-finale-recap-matthew-rhys-interview-1236783271/" target="_blank">Variety</a> in a recent interview. </p><p>"This is why I don’t write, because I’m like, 'What are they gonna do?' Not just me — Kevin Carroll’s character with his child. Everyone! What they’ve done is loaded the bases, to use an American analogy I know nothing of. Everyone has a high-stakes cliffhanger. I don’t know how they’re gonna deal with their food, let alone Tom! It’s gonna be crazy."</p><p>Tom's Guide will keep you up to date on all things related to "Widow's Bay," including release dates, casting news, plot details, teaser trailers and more.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-june-2026">Everything new on Apple TV in June 2026</a></li><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">31 best Apple TV Plus shows to watch now</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ tvOS 27 cuts off two Apple TV devices — does this mean a new box is coming? ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming-devices/tvos-27-cuts-off-two-apple-tv-devices-does-this-mean-a-new-box-is-coming</link>
                                                                            <description>
                            <![CDATA[ When tvOS 27 releases later this year, two Apple TV devices will lose support. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">33mXMidF4YS4ZBUDKEeMpd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/35tUhk2U4oNYnKewrYtsxJ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 11 Jun 2026 19:17:28 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming Devices]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/35tUhk2U4oNYnKewrYtsxJ-1280-80.jpg">
                                                            <media:credit><![CDATA[Lebedev Yury/Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV]]></media:description>                                                            <media:text><![CDATA[Apple TV]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/35tUhk2U4oNYnKewrYtsxJ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple spent most of <a href="https://www.tomsguide.com/news/live/wwdc-2026-live-news-updates">WWDC 2026</a> revealing the <a href="https://www.tomsguide.com/ai/apple-intelligence/i-just-saw-the-new-siri-ai-in-action-at-wwdc-heres-what-i-like-and-what-still-needs-work">upgraded Siri AI</a>, which left several Apple platforms, including tvOS, seemingly ignored. But there is an update coming, and it may indicate that new hardware is finally coming.</p><p>The new tvOS 27 is the first update in years that actually ends support for some older Apple TV streaming boxes. Specifically, the <a href="https://www.tomsguide.com/us/apple-tv-2015,review-3166.html">Apple TV HD</a>, launched in 2015, and the <a href="https://www.tomsguide.com/us/apple-tv-4k,review-4693.html">first-generation Apple TV 4K</a>, released in 2017, will not be compatible with the update. </p><p>That ends a decade and eight years of support, respectively. To be fair, the Apple TV HD <a href="https://www.tomsguide.com/news/apple-just-killed-the-apple-tv-hd">hasn't been available for the last four years</a>.</p><p>Instead, the update will only be eligible for the <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2021">second-generation Apple TV 4K</a>, from 2021, and the <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">third-generation models</a> released in 2022.  </p><p>Since at least 2024, <a href="https://www.tomsguide.com/entertainment/streaming-devices/is-a-new-apple-tv-in-the-works-heres-how-john-ternus-tenure-as-apple-ceo-could-benefit-apples-streaming-device">rumors have continuously suggested</a> that Apple was on the precipice of releasing a new Apple TV streaming device. </p><p>Clearly, that has not happened. And yet, here we are.</p><h2 id="apple-s-push-into-smart-home">Apple's push into smart home</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="G6Xjctbki6NWtxvCEaExDj" name="smart speaker.jpg" alt="Voice commands - A Google Home smart speaker on a desk" src="https://cdn.mos.cms.futurecdn.net/G6Xjctbki6NWtxvCEaExDj.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Getty Images)</span></figcaption></figure><p>As long as rumors about a new Apple TV device have surfaced, it's also been expected that Apple will release a<a href="https://www.tomsguide.com/home/smart-home/apple-could-launch-7-new-smart-home-devices-this-year-but-theres-a-catch"> suite of smart home devices </a>centered around an AI-powered rebuilt Siri. Apple TV devices are supposed to be part of that program.</p><p>That new Siri is finally arriving with iOS 27, which could power how a new Apple TV connects to your smart home.</p><p>It's been suggested that Siri and Thread connectivity would allow you to use the new Apple TV as a sort of hub for smart devices. This connects with rumors that Apple might release a <a href="https://www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmnahttps://www.bloomberg.com/news/newsletters/2024-04-07/apple-aapl-future-products-could-include-robots-and-smart-home-push-lupinmna" target="_blank">set-top box with a camera</a> that would allow for FaceTime calls and gesture-based controls. As far back as 2022, it was rumored that <a href="https://www.tomsguide.com/news/the-next-apple-tv-might-combine-homepad-and-facetime-camera">Apple might combine the streaming device</a> with a HomePod.</p><p>Unlike the rumored HomePod, it's never been clear if Apple is delaying a refresh because of Siri or for some other reason, despite the growing gap between updates.</p><h2 id="what-is-coming-with-tvos-27">What is coming with tvOS 27?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3P7D3ScniwLhWUtZseV6tP" name="TG Apple OLED LIST" alt="The tvOS platform on a TV." src="https://cdn.mos.cms.futurecdn.net/3P7D3ScniwLhWUtZseV6tP.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Credit: Apple / Tom's Guide)</span></figcaption></figure><p>The tvOS 27 update isn't bereft of new features. Here's what we know is coming. </p><ul><li>More responsive Control Center</li><li>Faster AirPlay connectivity</li><li>Improved app launches, animations</li><li>Smarter downloads</li><li>New, larger text accessibility options</li><li>Apple Care details in the Settings app</li></ul><p>It is minimal, and Apple hasn't even put up a <a href="https://www.apple.com/os/" target="_blank">preview page</a> as it's done with the other 27 OS updates. Even the <a href="https://developer.apple.com/documentation/tvos-release-notes/tvos-27-release-notes" target="_blank">tvOS 27 release notes</a> that I found on the Apple Developer site mostly feature fixes that Apple is applying to tvOS.</p><p>The notes do mention the new HomeKit video recordings, which should improve Apple's just-announced<a href="https://www.tomsguide.com/home/smart-home/apple-intelligence-security-camera-features-just-seriously-undercut-ring-and-google" target="_blank"> smart home security camera capabilities</a>.</p><p>The first tvOS 27 developer beta is available now, and the public beta will launch in July. The full update will most likely be released later this year, in September.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/apple-intelligence/some-ai-features-arent-available-on-older-iphones-but-are-you-actually-missing-that-much">Some AI features aren't available on older iPhones, but are you actually missing that much?</a></li><li><a href="https://www.tomsguide.com/phones/i-tried-ios-27-clean-up-vs-galaxy-ai-photo-assist-in-a-7-round-test-and-i-was-surprised-with-how-close-it-was">I pitted iOS 27 Clean Up vs Galaxy AI in a 7-round eraser showdown — Apple makes it close, but here's where it stumbles</a></li><li><a href="https://www.tomsguide.com/ai/apple-spent-years-rebuilding-siri-but-chatgpt-changed-what-people-want-from-ai">Apple spent years fixing Siri — only for ChatGPT to make it irrelevant</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Cape Fear' — stream classic psychological thriller mini-series from anywhere ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/watch-cape-fear</link>
                                                                            <description>
                            <![CDATA[ Ex-convict Max Cady, on a revenge mission, just won't quit. Here's how to watch Javier Bardem thriller "Cape Fear" on Apple TV from anywhere in the world. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">3oMHK4UHawzgLJxQASJAmc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sVBrnHJySTbX6bS4ySGZ9k-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 04 Jun 2026 23:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Bill Borrows ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xeK7rkjq8eWYnEFsoB9rka.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Bill Borrows is a leading journalist, feature writer and columnist. His work appears in most U.K. national newspapers from the &lt;a href=&quot;https://www.mirror.co.uk/sport/boxing/ricky-hatton-documentary-mental-health-30827644 )&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Daily Mirror&lt;/a&gt; to the &lt;a href=&quot;https://www.telegraph.co.uk/authors/b/bf-bj/bill-borrows/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Daily Telegraph&lt;/a&gt; but also in publications such as the &lt;a href=&quot;https://www.thetimes.co.uk/article/owen-farrell-on-england-the-six-nations-father-andy-and-the-art-of-leadership-dtt5t8vvw&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Times Magazine&lt;/a&gt; where he has produced exclusive interviews with rugby legend Owen Farrell and heavyweight World champion boxer &lt;a href=&quot;https://www.thetimes.co.uk/article/tyson-fury-after-depression-and-deontay-wilder-the-comeback-continues-&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Tyson Fury&lt;/a&gt;. He has been a regular contributor to the prestigious &lt;a href=&quot;https://www.radiotimes.com/author/billborrows/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Radio Times&lt;/a&gt; magazine (and online) for over 10 years and during that time, alongside cover interviews with major TV personalities, has covered programmes on everything from the Paralympics to poltergeists and the Qatar World Cup to the Iraq War. Work has also appeared in many other magazines, including Cosmopolitan, &lt;a href=&quot;https://www.marieclaire.co.uk/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Marie Clare&lt;/a&gt;, Grazia, Vogue Hommes International and TimeOut. &lt;/p&gt;&lt;p&gt;In a previous life he was Editor-at-Large at Loaded and &lt;a href=&quot;https://www.independent.co.uk/news/media/my-mentor-bill-borrows-on-hunter-s-thompson-6230842.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;interviewed his mentor&lt;/a&gt;, Hunter S. Thompson. He was also Editor-at-Large at Maxim magazine and Contributing Editor at Esquire and launch editor of both TimeOut Manchester and talkSPORT digital magazine. He is the author of the best-selling &lt;a href=&quot;https://www.amazon.co.uk/Hurricane-Turbulent-Life-Times-Higgins/dp/184354069X&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;The Hurricane&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: The Turbulent Life and Times of Alex Higgins&lt;/em&gt; - Sports Books of the Year The Times &amp; Sunday Telegraph, Books of the Year New Statesman - and also editor for several sport-related books including the &lt;a href=&quot;https://www.simonandschuster.com/books/The-talkSPORT-Book-of-Premier-League-Legends/Bill-Borrows/9781849839419&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;talkSPORT Book of Premier League Legends&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;and co-wrote the &lt;a href=&quot;https://www.amazon.co.uk/Talksport-Greatest-British-Sporting-Legends/dp/0857200933&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;talkSPORT 100 Greatest British Sporting Legends&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;with a lot of help from fellow journalist &lt;a href=&quot;https://www.tomsguide.com/author/tom-bailey&quot;&gt;Tom Bailey&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;On television he conceived and developed the &lt;a href=&quot;https://www.youtube.com/watch?v=IPDtcESrFWE )&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;Posh Pawn&lt;/em&gt;&lt;/a&gt; TV series for Channel 4 and was Associate Producer on the award-winning &lt;em&gt;Murder in the Outback&lt;/em&gt; for Channel Seven in Australia and &lt;a href=&quot;https://www.channel4.com/programmes/murder-in-the-outback&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Channel 4&lt;/a&gt; in the U.K.. A frequent contributor for BBC Radio 5, talkSPORT and talkRADIO, his areas of specialisation include sport, history, politics, TV and film. He is currently writing a biography of the greatest detective of the Victorian period and doesn’t get much free time but does admit to an addiction to true crime podcasts, following Manchester City football team and a weakness for Spanish food.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/sVBrnHJySTbX6bS4ySGZ9k-1280-80.png">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                        <media:description><![CDATA[Max Cady (played by Javier Bardem) calls a meeting with his former legal team - Anna (Amy Adams) and Tom Bowden (Patrick Wilson) - in &quot;Cape Fear&quot;]]></media:description>                                                            <media:text><![CDATA[A menacing Max Cady appears]]></media:text>
                                <media:title type="plain"><![CDATA[A menacing Max Cady appears]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sVBrnHJySTbX6bS4ySGZ9k-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The original 1962 "Cape Fear" remains a timeless classic but that did not stop it being remade in 1991 with Robert De Niro as Max Cady and now, as a mini-series, with Javier Bardem playing the terrifying ex-convict on a mission...<br><br>Here’s how to <strong>watch "Cape Fear" online </strong><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with this VPN</strong></a> <strong>– and potentially for free!</strong></p><div  class="fancy-box"><div class="fancy_box-title">'Cape Fear' - Release Dates & Streams</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Cape Fear" premieres with a double episode drop on <strong>Friday, June 5</strong> worldwide. New episodes then arrive weekly every Friday until the finale on July 31, 2026.<br><strong>• Global – </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br><strong>• Watch from anywhere – </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN (Try risk-free; 75% Off)</strong></a></p></div></div><p>With 10 episodes to play with, showrunner Nick Antosca (see below for bio), can stretch out the psychological drama and torture for the Bowden family that has always been at the dark heart of the story since John D. MacDonald wrote the source novel, "The Executioners", almost 70 years ago. </p><p>This time, however, it has been updated to incorporate 21st-century concerns with gaslighting, AI fakes, false accusation and public shaming all called upon in the name of psychological overload - and that's just for the viewer, not the Bowden family.</p><p>Amy Adams delivers a star turn as Bowden matriarch, Anna, while Martin Scorsese and Steven Spielberg are among the executive producers.</p><p>Read on to find out all you need to watch <strong>"Cape Fear" </strong>online from anywhere.</p><h2 class="article-body__section" id="section-watch-cape-fear-on-apple-tv"><span>Watch 'Cape Fear' on Apple TV</span></h2><div class="product"><a data-dimension112="accf868b-5d88-4bef-bbb9-b3c6a7fd84a3" data-action="Deal Block" data-label=""Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)" data-dimension48=""Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>"Cape Fear" premieres globally on </strong><a href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="accf868b-5d88-4bef-bbb9-b3c6a7fd84a3" data-action="Deal Block" data-label='"Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)' data-dimension48='"Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)' data-dimension25=""><strong>Apple TV (7-day FREE trial for new subscribers)</strong></a><strong> on Friday, June 5.</strong></p><p>You will not need to rent or buy it as it will come as part of your Apple TV subscription.<br><br>Prices for the streaming platforms are as follows:</p><p><strong>🇺🇸 U.S. — $12.99/month</strong><br><strong>🇨🇦 CAN — CA$14.99/month</strong><br><strong>🇬🇧 U.K. — £9.99/month</strong><br><strong>🇦🇺 AUS — AU$15.99/month</strong><a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="accf868b-5d88-4bef-bbb9-b3c6a7fd84a3" data-action="Deal Block" data-label=""Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)" data-dimension48=""Cape Fear" premieres globally on Apple TV (7-day FREE trial for new subscribers)" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-cape-fear-anywhere"><span>Watch 'Cape Fear' anywhere</span></h2><p>Traveling and locked out of your Apple TV account or your usual apps? A <a href="https://www.tomsguide.com/news/what-is-a-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best VPN out there.</p><div class="product"><a data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months FREE</strong></a><br><br>Boasting lightning fast speeds, great features, streaming power, and class-leading security, <strong>NordVPN</strong> is our #1 VPN.<br><br><strong>✅  3 months extra FREE!</strong><br><strong>✅  75% off usual price</strong><br><br>Use Nord to unblock services like <a href="https://tv.apple.com/us/show/cape-fear/umc.cmc.377zdzwefgtzkvykexeca9qrc" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Cape Fear" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">View Deal</a></p></div><p>It's really easy to use a VPN to watch "Cape Fear".</p><p><strong>1. Install the VPN of your choice</strong>. As we've said, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our favorite.</p><p><strong>2. Choose the location you wish to connect to in the VPN app. </strong>For instance, if you want to watch it on your U.S. version of Apple TV, choose 'United States' from the list.</p><p><strong>3. Sit back and binge. </strong>Head to Apple TV, sign in, and watch "Cape Fear" from any location.</p><h2 class="article-body__section" id="section-what-you-need-to-know-about-cape-fear"><span>What you need to know about 'Cape Fear'</span></h2><h2 id="cape-fear-trailer">'Cape Fear' trailer</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/FZ3sN5E-mBU" allowfullscreen></iframe></div></div><h2 id="cape-fear-cast">'Cape Fear' - Cast</h2><ul><li>Javier Bardem as Max Cady</li><li>Amy Adams as Anna Bowden</li><li>Patrick Wilson as Tom Bowden</li><li>Lily Collias as Natalie Bowden</li><li>Samantha Clifford as Hope</li><li>Amanda Dunn as Melissa</li><li>Gem Marc Collins as Kyle</li><li>Miles Mussenden as Carson</li><li>Gabriel Byndloss as Paloma</li><li>CCH Pounder as Noa Toussaint</li><li>Jullian Dulce Vida as Byron French</li><li>Joe Anders as Zack Bowden</li><li>Malia Pyles as Nevaeh Valentine</li><li>Brandon Hirsch as Jared</li><li>Jamie Hector</li><li>Margarita Levieva</li><li>Ron Perlman</li><li>Ted Levine</li><li>Patrick Fischler</li></ul><h3 class="article-body__section" id="section-cape-fear-episode-guide"><span>'Cape Fear' - Episode guide</span></h3><ul><li><strong>Episode 1 - Fingers & Toes</strong>: Friday, June 5</li><li><strong>Episode 2 - Why Would I Want to Hurt You?</strong>: Friday, June 5</li><li><strong>Episode 3 - Phantom Sensations</strong>: Friday, June 12</li><li><strong>Episode 4 - Pierced</strong>: Friday, June 19</li><li><strong>Episode 5 - Faith</strong>: Friday, June 26</li><li><strong>Episode 6 - Possum</strong>: Friday, July 3</li><li><strong>Episode 7 - Mongrel</strong>: Friday, July 10</li><li><strong>Episode 8 - Los tiempos de Dios son Perfectos</strong>: Friday, July 17</li><li><strong>Episode 9 - The Scar</strong> : Friday, July 24</li><li><strong>Episode 10 - TBA</strong> : Friday, July 31</li></ul><section class="article__schema-question"><h3>What has creator, writer, exec producer and showrunner Nick Antosca done on TV before?</h3><article class="article__schema-answer"><p>Also a novelist, Antosca was writer/creator/co-creator of <strong>Hannibal </strong>(2015), <strong>Channel Zero</strong> (2016–2018), <strong>The Act </strong>(2019), <strong>Brand New Cherry Flavor</strong> (2021) and <strong>A Friend of the Family</strong> (2022).</p></article></section><h2 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h2><ul><li><a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-june-2026">Everything new on Apple TV in June 2026</a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn">Best streaming VPN</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-naked-and-afraid-global-showdown">How to watch 'Naked and Afraid: Global Showdown' — stream the survival reality TV show from anywhere</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ ‘Star City’ review: Apple TV’s new ‘For All Mankind’ spinoff is a gripping Soviet spy thriller that I’m (mostly) here for ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/star-city-review-apple-tvs-new-for-all-mankind-spinoff-is-a-gripping-soviet-spy-thriller-that-im-mostly-here-for</link>
                                                                            <description>
                            <![CDATA[ This "Star City" review explores how Apple TV Plus’s new "For All Mankind" spinoff trades NASA optimism for a darker, paranoid Soviet spy thriller that mostly pulls it off. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ynEgt7FhZcvj7HWyVQXAGe</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aRKRgqM7xNbwDBAyogp7WW-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 29 May 2026 11:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ kelly.woo@futurenet.com (Kelly Woo) ]]></author>                    <dc:creator><![CDATA[ Kelly Woo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jpnR8RZd8njtxaHRHimzsi.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Kelly is the managing editor of streaming for Tom’s Guide, so basically, she watches TV for a living. She writes news, features and reviews about the streaming realm — hardware, software and content. In a given week, she might test a new Roku stick, check out an interface update on HBO Max, sound off on the trailer for a new Netflix show and provide info on how to watch a fan-favorite series. &lt;/p&gt;&lt;p&gt;In addition to streaming coverage, she also occasionally contributes to the fitness and home sections.&lt;/p&gt;&lt;p&gt;Before joining Tom&#039;s Guide, she was a freelance entertainment writer for Yahoo, Vulture, TV Guide and other outlets and a content creator for HBO, Apple and DotDash. Prior to that, she was a senior editor at AOL Television and Moviefone. She graduated from Duke University with a degree in English literature.&lt;/p&gt;&lt;p&gt;When she’s not watching TV and movies for work, she’s watching them for fun, plus seeing live music, writing songs, knitting and gardening.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/aRKRgqM7xNbwDBAyogp7WW-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Agnes O’Casey in Star City]]></media:description>                                                            <media:text><![CDATA[Agnes O’Casey in Star City]]></media:text>
                                <media:title type="plain"><![CDATA[Agnes O’Casey in Star City]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aRKRgqM7xNbwDBAyogp7WW-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'Star City'</div><div class="fancy_box_body"><p class="fancy-box__body-text"><strong>Rating: </strong>3.5 stars (out of 5)</p><p class="fancy-box__body-text"><strong>Verdict:</strong> “Star City” trades the soaring optimism of early “For All Mankind” for a darker, more paranoid Cold War spy-thriller vibe. It doesn’t hit the same emotional highs as its predecessor (at least not yet), but the tense atmosphere and strong performances make it an intriguing addition to the franchise.</p><p class="fancy-box__body-text"><strong>Release schedule: </strong>Episodes 1-2 now streaming</p><p class="fancy-box__body-text"><strong>Where to watch: </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/star-city/umc.cmc.2l8p785osmtmiyk64bh6tfde1" target="_blank" rel="nofollow">Apple TV</a></p></div></div><p>Apple TV has spent the last few years quietly building one of the strongest sci-fi libraries among the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a>, but as the longest-running, “For All Mankind” remains the crown jewel. Ronald D. Moore’s alternate-history drama turned the space race into prestige television, blending Cold War politics, family melodrama and stressful engineering disasters into one improbably addictive package.</p><p>Over time, though, the series drifted further away from its grounded roots and deeper into sprawling sci-fi spectacle. So there’s something immediately appealing about “Star City,” a spinoff that rewinds the clock back to the late ’60s and asks: What if “For All Mankind” was less inspirational NASA drama and more paranoid Soviet spy thriller?</p><p>After watching the premiere's first two episodes, I’m cautiously on board. “Star City” doesn’t hit with quite the same emotional force as early “For All Mankind” as the premise naturally loses some impact the second time around. But shifting the story behind the Iron Curtain gives the franchise a fresh, darker energy. </p><h2 id="star-city-trades-optimism-for-paranoia">‘Star City’ trades optimism for paranoia</h2><p>Like the early seasons of "For All Mankind," “Star City” is set in the ’60s and early ’70s, taking us inside the Soviet space program following the USSR’s victory over the United States in the moon race. </p><p>At the center of it all is the mysterious, unnamed Chief Designer (Rhys Ifans), the architect behind the Soviet Union’s space dominance and a man treated with equal parts reverence and suspicion by the state. Around him orbits a sprawling ensemble of cosmonauts, engineers, KGB operatives and deeply unhappy spouses, because apparently emotional repression is just part of the Soviet identity.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/V-yAMs307W4" allowfullscreen></iframe></div></div><p>The biggest tonal difference between this and “For All Mankind” becomes obvious immediately. The parent series, especially early on, had a sense of optimism and adventure underneath all the Cold War tension. “Star City,” meanwhile, feels actively allergic to hope. The sets are gray. The lighting is gray. The clothing is gray. </p><p> The grainy cinematography and drab Soviet aesthetic make the show feel oppressive, as likely intended. At times, it’s almost comically bleak — I half expected someone to announce that joy had officially been outlawed — but that makes the atmosphere all the more immersive.</p><p>The strongest part of the show involves Irina Morozova (Agnes O’Casey), a young KGB surveillance recruit tasked with listening in on cosmonauts and their families. Her storyline is the show's essence: a claustrophobic world where everybody is spying on everybody else and even minor personal failures can become state-level catastrophes.</p><p>"Star City" is smart to lean harder into espionage-thriller territory instead of simply recreating “For All Mankind” beat for beat. Yes, there are still nail-biting space sequences and last-minute engineering fixes that will trigger nostalgia for the original show’s early seasons. But the focus here is much more internal: secrets, betrayals and the psychological toll of life inside such a tightly-controlled society.</p><h2 id="verdict-star-city-is-an-intriguing-if-emotionally-chilly-pivot-for-the-franchise">Verdict: ‘Star City’ is an intriguing, if emotionally chilly, pivot for the franchise</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="j9zLsRxedWS8KhVnC59ubF" name="starcity-ifans" alt="Rhys Ifans in Star City" src="https://cdn.mos.cms.futurecdn.net/j9zLsRxedWS8KhVnC59ubF.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>The biggest issue with “Star City,” at least based on the first two episodes, is that the characters haven’t fully come alive yet. There are compelling dynamics throughout the ensemble, particularly involving cosmonauts Sasha (Solly McLeod), Valya (Adam Nagaitis) and Anastasia Belikova (Alice Englert). But for now, the show currently feels more invested in mood than emotional depth.</p><p>That’s where comparisons to early “For All Mankind” get tricky. The characters were what made me so obsessed with the show early on. "Star City” hasn’t quite gotten there with its ensemble.</p><p>Still, there’s enough here to keep me watching. The performances are strong, particularly O’Casey and Ifans, and the darker spy thriller vibe gives the franchise a welcome change of pace instead of feeling like a tired retread. </p><p>No, “Star City” doesn’t feel as fresh or emotionally devastating as “For All Mankind” did when it first launched. But as a moodier, more paranoid companion piece to the original series, it’s a compelling mission so far.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eyqpbe"></div>                            </div>                            <script src="https://kwizly.com/embed/eyqpbe.js" async></script><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-the-other-bennet-sister">How to watch The Other Bennet Sister online</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/ive-watched-a-lot-of-shows-in-2026-so-far-heres-the-5-best">I watch TV for a living and these are the 5 shows for 2026 I’d actually recommend</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/xo-kitty-season-3-review-the-netflix-teen-dramedy-returns-with-a-charming-new-season-and-a-welcome-guest-star">'XO, Kitty' season 3 review: The Netflix teen dramedy returns with a charming new season — and a welcome guest star</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Star City' online – stream the Apple TV sci-fi spinoff from anywhere in the world ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/watch-star-city-online</link>
                                                                            <description>
                            <![CDATA[ Find out how to watch "Star City" online from anywhere and potentially for free as a new "For All Mankind" spinoff show prepares for take-off. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">SSCEXhQcqj7UT5BSffnDVc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/84kWSdzwUsnZAcdjxRZRp7-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 28 May 2026 23:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jakob Barnes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sdLQVVidVk65LYsn3p76nL.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/84kWSdzwUsnZAcdjxRZRp7-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Promotional artwork for &quot;Star City&quot; TV show]]></media:description>                                                            <media:text><![CDATA[Promotional artwork for &quot;Star City&quot; TV show]]></media:text>
                                <media:title type="plain"><![CDATA[Promotional artwork for &quot;Star City&quot; TV show]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/84kWSdzwUsnZAcdjxRZRp7-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>"Star City" is the new chapter in space-race drama from Apple TV, and stars Rhys Ifans and Anna Maxwell Martin in an alt-history retelling of the story of the Soviet Union's space program. Fans of "For All Mankind" will be delighted to know that the universe is growing...</p><p>Below, we’ll show you how to watch "Star City" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere in the world with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'For All Mankind' release date and streaming options</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Star City" premieres globally on Apple TV on <strong>Friday, May 29, 2026</strong>, with the first two episodes. New episodes then arrive weekly every Friday until the finale on July 10, 2026.<br><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/gb/show/star-city/umc.cmc.2l8p785osmtmiyk64bh6tfde1?ctx_brand=tvs.sbd.4000" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br><strong>• Watch anywhere </strong>— <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>Try NordVPN for 30 days risk-free</strong></a></p></div></div><p><a href="https://www.tomsguide.com/entertainment/streaming/how-to-watch-for-all-mankind-season-5-online">"For All Mankind" season 5</a> is approaching its end right now, but the show creators Ben Nedivi, Matt Wolpert, and Ronald D. Moore are wasting no time in delivering more space-age content to keep us all engrossed over the next few weeks.</p><p>"Star City" will turn the focus away from the U.S. and onto their rivals in the space race, the Soviets and the lives of the cosmonauts, engineers, and intelligence officers. With a cast led by the stellar Ifans, more high-concept alternate-history storylines, and the usual slick, eye-catching visuals, this is definitely a sci-fi series to get straight on your watchlist.</p><p>If you've been hooked on "For All Mankind", this is a natural next step. So, keep reading to find the full rollout and the simplest way to <strong>watch "Star City"</strong> from wherever you are — and potentially even catch a couple of episodes for FREE.</p><h2 class="article-body__section" id="section-how-to-watch-star-city-for-free-on-apple-tv"><span>How to watch 'Star City' for FREE on Apple TV+</span></h2><div class="product"><a data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>"Star City" premieres on <a href="https://tv.apple.com/gb/show/star-city/umc.cmc.2l8p785osmtmiyk64bh6tfde1?ctx_brand=tvs.sbd.4000" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> globally on <strong>Friday, May 29, 2026</strong> with two new episodes.</p><p>New Apple TV customers get a <a href="https://tv.apple.com/gb/show/maximum-pleasure-guaranteed/umc.cmc.10k6tes7rmc2ti0ho1ozgwezc" target="_blank" rel="nofollow"><strong>7-day free trial</strong></a>, so you can get a taste of the debut episodes before deciding whether to carry on your journey.</p><p>After the trial ends, you'll pay:<br><br><strong>U.S. — $12.99/month</strong><br><strong>U.K. — £9.99/month</strong><br><strong>CAN — CA$14.99/month</strong><br><strong>AUS — AU$15.99/month</strong><a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-star-city-from-anywhere"><span>Watch 'Star City' from anywhere</span></h2><p>Traveling and locked out of your Apple TV account or your usual apps? A <a href="https://www.tomsguide.com/news/what-is-a-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming services</a> you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best VPN out there..</p><div class="product editors-choice"><div class="editors-choice__title">Editors Choice</div><a data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months FREE</strong></a><br><br>Boasting lightning fast speeds, great features, streaming power, and class-leading security, <strong>NordVPN</strong> is our #1 VPN.<br><br><strong>✅  3 months extra FREE!</strong><br><strong>✅  75% off usual price</strong><br><br>Use Nord to unblock services like <a href="https://tv.apple.com/gb/show/star-city/umc.cmc.2l8p785osmtmiyk64bh6tfde1?ctx_brand=tvs.sbd.4000" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Star City" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-star-city-trailer"><span>'Star City' trailer</span></h3><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/V-yAMs307W4" allowfullscreen></iframe></div></div><h2 class="article-body__section" id="section-star-city-cast"><span>'Star City' cast</span></h2><ul><li><strong>Rhys Ifans</strong> as the Chief Designer</li><li><strong>Anna Maxwell Martin</strong> as Lyudmilla Raskova</li><li><strong>Agnes O'Casey</strong> as Irina Morozova</li><li><strong>Alice Englert</strong> as Anastasia Belikova</li><li><strong>Solly McLeod</strong> as Sasha Polivanov</li><li><strong>Adam Nagaitis</strong> as Valya Markelova</li><li><strong>Ruby Ashbourne Serkis</strong> as Tanya Markelova</li><li><strong>Josef Davies</strong> as Sergei Nikilov</li><li><strong>Priya Kansara</strong> as Lakshmi</li></ul><h2 class="article-body__section" id="section-star-city-episodes"><span>'Star City' episodes</span></h2><ul><li><strong>Episode 1 - Pilot</strong>: May 29, 2026 </li><li><strong>Episode 2 - A Bear On A Chain</strong>: May 29, 2026 </li><li><strong>Episode 3 - Bad Dancer</strong>: June 5, 2026 </li><li><strong>Episode 4 - Dark Forest</strong>: June 12, 2026 </li><li><strong>Episode 5 - Bite Your Elbow</strong>: June 19, 2026 </li><li><strong>Episode 6 - TBA</strong>: June 26, 2026 </li><li><strong>Episode 7 - TBA</strong>: July 3, 2026 </li><li><strong>Episode 8 - TBA</strong>: July 10, 2026 </li></ul><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now" target="_blank">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/after-watching-the-for-all-mankind-season-5-premiere-im-glad-one-of-my-favorite-shows-is-back-even-if-its-a-bit-of-a-mess">After watching the 'For All Mankind' season 5 premiere, I’m glad one of my favorite shows is back — even if it’s a bit of a mess</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv-plus/watch-pluribus-stream-new-sci-fi-drama">How to watch 'Pluribus' online</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Everything new on Apple TV in June 2026 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-june-2026</link>
                                                                            <description>
                            <![CDATA[ Our guide on the new movies and shows coming to Apple TV Plus in June 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">22oKAFRwgKEoxPxAcudoCD</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4BKdqTz5ocHypHjtJQRVHX-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 26 May 2026 05:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ kelly.woo@futurenet.com (Kelly Woo) ]]></author>                    <dc:creator><![CDATA[ Kelly Woo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jpnR8RZd8njtxaHRHimzsi.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Kelly is the managing editor of streaming for Tom’s Guide, so basically, she watches TV for a living. She writes news, features and reviews about the streaming realm — hardware, software and content. In a given week, she might test a new Roku stick, check out an interface update on HBO Max, sound off on the trailer for a new Netflix show and provide info on how to watch a fan-favorite series. &lt;/p&gt;&lt;p&gt;In addition to streaming coverage, she also occasionally contributes to the fitness and home sections.&lt;/p&gt;&lt;p&gt;Before joining Tom&#039;s Guide, she was a freelance entertainment writer for Yahoo, Vulture, TV Guide and other outlets and a content creator for HBO, Apple and DotDash. Prior to that, she was a senior editor at AOL Television and Moviefone. She graduated from Duke University with a degree in English literature.&lt;/p&gt;&lt;p&gt;When she’s not watching TV and movies for work, she’s watching them for fun, plus seeing live music, writing songs, knitting and gardening.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/4BKdqTz5ocHypHjtJQRVHX-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV logo on a purple, blue, and pink background]]></media:description>                                                            <media:text><![CDATA[Apple TV logo on a purple, blue, and pink background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV logo on a purple, blue, and pink background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4BKdqTz5ocHypHjtJQRVHX-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Summer TV season is here, and with the heat rising, <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> is giving us the perfect excuse to stay inside with the AC on full blast. The lineup for June 2026 is small but buzzy, with two high-profile releases arriving just in time for long weekends and late-night binges.</p><p>First up is "Cape Fear," a new series take on the classic thriller that already terrified audiences in both the original film and Martin Scorsese's remake. Expanding the story into a full series means even more paranoia and tension.</p><p>Then there’s season 2 of "Sugar," which returns with more noir mystery, alien weirdness and Colin Farrell giving cool guy energy. If you’re looking for your next watchlist additions, here's everything new on Apple TV in June 2026.</p><h2 id="cape-fear">'Cape Fear'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/FZ3sN5E-mBU" allowfullscreen></iframe></div></div><p>This series adaptation of "Cape Fear" takes the 1991 classic by Martin Scorsese and drags it into doomscroll era with gaslightin, AI fakes and public shaming. Javier Bardem inherits the Robert De Niro role as Max Cady, a newly freed ex-con who decides the married lawyers who put him away owe him far more than an apology. Amy Adams and Patrick Wilson play the increasingly rattled Bowdens, stuck watching everyone around them fall for a man they know is dangerous. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/show/cape-fear/umc.cmc.377zdzwefgtzkvykexeca9qrc" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting June 5</strong></em></p><h2 id="sugar-season-2">'Sugar' season 2</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:662px;"><p class="vanilla-image-block" style="padding-top:56.19%;"><img id="znDbT8dfBS5RCqAqP5ht4W" name="Screen Shot 2024-04-03 at 11.47.36 PM Cropped.png" alt="Colin Farrell as detective John Sugar, wearing a suit and sitting in a car whilst looking pensive in new show "Sugar"" src="https://cdn.mos.cms.futurecdn.net/znDbT8dfBS5RCqAqP5ht4W.png" mos="" align="middle" fullscreen="" width="662" height="372" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>After spending season 1 masquerading as a stylish neo-noir detective series before detonating into full-on sci-fi weirdness, “Sugar” returns with Colin Farrell back in trench-coat mode as Los Angeles private eye John Sugar. This time, he’s investigating the disappearance of a troubled boxer’s older brother while continuing the search for his own missing sister, all against the backdrop of a sprawling conspiracy that may be bigger than Earth itself. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/show/sugar/umc.cmc.4r6q7tdquewehwvb3rzl0k3dt" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting June 19</strong></em></p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">31 best Apple TV Plus shows to watch now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tv-just-landed-its-own-major-fantasy-franchise-and-it-could-be-even-better-than-peak-game-of-thrones">Apple TV just landed its own major fantasy franchise — and it could be even better than peak 'Game of Thrones'</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Maximum Pleasure Guaranteed' online – stream dark comedy now with Apple TV free trial ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/how-to-watch-maximum-pleasure-guaranteed</link>
                                                                            <description>
                            <![CDATA[ Find out how to watch "Maximum Pleasure Guaranteed" online from anywhere and potentially for free as Tatiana Maslany stars in the new dark comedy series. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">d6QKHTWA4V5ZXBKSGkoCDf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DhoCQgMUuirmdyFCyzthp5-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 20 May 2026 09:18:14 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jakob Barnes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sdLQVVidVk65LYsn3p76nL.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/DhoCQgMUuirmdyFCyzthp5-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Tatiana Maslany in Maximum Pleasure Guaranteed]]></media:description>                                                            <media:text><![CDATA[Tatiana Maslany in Maximum Pleasure Guaranteed]]></media:text>
                                <media:title type="plain"><![CDATA[Tatiana Maslany in Maximum Pleasure Guaranteed]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DhoCQgMUuirmdyFCyzthp5-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you like your comedy shows to take a ride on the wild side and offer up mysteries and secrets, you'll love getting stuck into "Maximum Pleasure Guaranteed".</p><p>Below, we’ll show you how to watch "Maximum Pleasure Guaranteed" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere in the world with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Maximum Pleasure Guaranteed' release date and time</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Maximum Pleasure Guaranteed" premieres globally on Apple TV on <strong>Wednesday, May 20, 2026</strong>, with the first two episodes. New episodes then arrive weekly every Wednesday until the finale on July 15, 2026.<br><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/gb/show/maximum-pleasure-guaranteed/umc.cmc.10k6tes7rmc2ti0ho1ozgwezc" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br><strong>• Watch anywhere </strong>— <a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>Try NordVPN for 30 days risk-free</strong></a></p></div></div><p>What would you do if you witnessed a murder? Call the police, get help, and hope the whole thing gets resolved without too much trouble for yourself, probably. But what if no one else even believes the crime took place?</p><p>That's the mess Tatiana Maslany finds herself in with this exciting new dark comedy. She plays a divorced soccer mom dealing with your standard suburban drama, before the apparent murder turns her life upside down and inside out.</p><p>If this show sounds like it's right up your street, keep reading to find the full rollout and the simplest way to <strong>watch "Maximum Pleasure Guaranteed"</strong> from wherever you are — and potentially for FREE.</p><h2 class="article-body__section" id="section-how-to-watch-maximum-pleasure-guaranteed-for-free-on-apple-tv"><span>How to watch 'Maximum Pleasure Guaranteed' for FREE on Apple TV+</span></h2><div class="product"><a data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>"Maximum Pleasure Guaranteed" premieres on <a href="https://tv.apple.com/gb/show/maximum-pleasure-guaranteed/umc.cmc.10k6tes7rmc2ti0ho1ozgwezc" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> in the U.S., U.K., Australia, and Canada on <strong>Wednesday, May 20, 2026</strong>.</p><p>New customers get a <a href="https://tv.apple.com/gb/show/maximum-pleasure-guaranteed/umc.cmc.10k6tes7rmc2ti0ho1ozgwezc" target="_blank" rel="nofollow"><strong>7-day free trial</strong></a>.</p><p>After the trial ends, you'll pay:<br><br><strong>U.S. — $12.99/month</strong><br><strong>U.K. — £9.99/month</strong><br><strong>CAN — CA$14.99/month</strong><br><strong>AUS — AU$15.99/month</strong><a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-maximum-pleasure-guaranteed-from-anywhere"><span>Watch 'Maximum Pleasure Guaranteed' from anywhere</span></h2><p>Traveling and locked out of your Apple TV or your usual apps? A <a href="https://www.tomsguide.com/news/what-is-a-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the streaming services you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best VPN out there..</p><div class="product editors-choice"><div class="editors-choice__title">Editors Choice</div><a data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months FREE</strong></a><br><br>Boasting lightning fast speeds, great features, streaming power, and class-leading security, <strong>NordVPN</strong> is our #1 VPN.<br><br><strong>✅  3 months extra FREE!</strong><br><strong>✅  75% off usual price</strong><br><br>Use Nord to unblock services like <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> and watch "Maximum Pleasure Guaranteed" online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-maximum-pleasure-guaranteed-trailer"><span>'Maximum Pleasure Guaranteed' trailer</span></h3><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/I28gOWOUpp8" allowfullscreen></iframe></div></div><h2 class="article-body__section" id="section-maximum-pleasure-guaranteed-cast"><span>'Maximum Pleasure Guaranteed' cast</span></h2><ul><li><strong>Tatiana Maslany</strong> as Paula</li><li><strong>Jake Johnson</strong> as Karl</li><li><strong>Jessy Hodges</strong> as Mallory</li><li><strong>Charlie Hall</strong> as Rudy</li><li><strong>John Michael Hall</strong> as Detectivee Baxter</li><li><strong>Jianna and Jeena Platon</strong> as Pd</li><li><strong>Kiarra Hamagami Goldberg</strong> as Geri</li><li><strong>Nola Wallace</strong> as Hazel</li><li><strong>Jennifer Ferrin</strong> as Joyce</li><li><strong>Tara Summers</strong> as Suzie</li><li><strong>Daniel Dale</strong> as Sky</li><li><strong>David Garelick</strong> as Caleb</li></ul><h2 class="article-body__section" id="section-maximum-pleasure-guaranteed-episodes"><span>'Maximum Pleasure Guaranteed' episodes</span></h2><ul><li><strong>Episode 1</strong>: May 20, 2026 </li><li><strong>Episode 2</strong>: May 20, 2026 </li><li><strong>Episode 3</strong>: May 27, 2026 </li><li><strong>Episode 4</strong>: June 3, 2026 </li><li><strong>Episode 5</strong>: June 10, 2026 </li><li><strong>Episode 6</strong>: June 17, 2026 </li><li><strong>Episode 7</strong>: June 24, 2026 </li><li><strong>Episode 8</strong>: July 1, 2026 </li><li><strong>Episode 9</strong>: July 8, 2026 </li><li><strong>Episode 10</strong>: July 15, 2026 </li></ul><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now" target="_blank">3 best Apple TV shows you (probably) haven't watched but should stream now</a></li><li><a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html" target="_blank">The best streaming services to subscribe to right now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv-plus/watch-pluribus-stream-new-sci-fi-drama">How to watch 'Pluribus' online</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ For All Mankind is one of my favorite Apple TV shows, and the design of its alt-universe iPhones is indicative of why I love it so much ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/for-all-mankind-is-one-of-my-favorite-apple-tv-shows-and-the-design-of-its-alt-universe-iphones-is-indicative-of-why-i-love-it-so-much</link>
                                                                            <description>
                            <![CDATA[ iPhones may not technically exist in For All Mankind, but the alternate universe has something just as good — and it's a sight to behold. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gUL787yHwkoxfds4AYKPk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/qeHMNPmZXJaZxaBuAtRSTk-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 14 May 2026 05:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/qeHMNPmZXJaZxaBuAtRSTk-1280-80.png">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[for all mankind season 5]]></media:description>                                                            <media:text><![CDATA[for all mankind season 5]]></media:text>
                                <media:title type="plain"><![CDATA[for all mankind season 5]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/qeHMNPmZXJaZxaBuAtRSTk-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/entertainment/apple-tv/after-watching-the-for-all-mankind-season-5-premiere-im-glad-one-of-my-favorite-shows-is-back-even-if-its-a-bit-of-a-mess">For All Mankind</a> is easily one of the best shows to hit streaming over the past few years, and <a href="https://www.tomsguide.com/opinion/i-finally-gave-this-apple-tv-plus-show-a-shot-and-its-the-best-thing-ive-seen-in-years">easily a highlight</a> of Apple TV's already-exceptional library of original TV shows. The concept of "What If" has always appealed to me, especially with science fiction, and it is fascinating to see a version of our world where the space race never ended.</p><p>One thing I particularly like seeing is how technology has advanced differently in the show, in part due to the alternate timeline's increased push into the great beyond throughout the '80s and '90s. The show acknowledges those changes in a bunch of different ways, and I've been taking great pleasure in trying to spot as many as I can. </p><p>As a result, I've become a little bit obsessed with For All Mankind's take on the iPhone, which has been showing up throughout the fifth season.</p><h2 id="for-all-mankind-is-pushing-ahead-in-weird-and-wonderful-ways">For All Mankind is pushing ahead in weird and wonderful ways</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2476px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="PZDoLnLhRyvsBcMDeRxMSk" name="Screenshot 2026-05-13 170825" alt="for all mankind season 5" src="https://cdn.mos.cms.futurecdn.net/PZDoLnLhRyvsBcMDeRxMSk.png" mos="" align="middle" fullscreen="" width="2476" height="1393" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>As we've seen in our universe, space travel has played a crucial role in developing technology that has important applications back here on Earth. NASA has a <a href="https://www.jpl.nasa.gov/infographics/20-inventions-we-wouldnt-have-without-space-travel/" target="_blank">whole list</a>, including LED lights, memory foam, wireless headsets and even the computer mouse.</p><p>For All Mankind's increased investment in space travel means that manifests in a lot of different ways on the show. Lunar rover technology led to electric cars gaining prominence in the 1980s, as did video conferencing technology, while the need for nuclear power on the moon meant technology existed to prevent the Three Mile Island disaster. </p><p>Eagle-eyed viewers <a href="https://www.imore.com/ipod-isnt-dead-least-all-mankind-season-3" target="_blank">even spotted an iPod</a> during season 3's 1994 Mars mission — a whole seven years before the iPod would go on sale in the real world. How? It's never explained, but it goes to show that even consumer technology is somehow more advanced in this space-fueled timeline.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2517px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="iXpoW46FJFRS5zdbLqHoRk" name="Screenshot 2026-05-13 171356" alt="for all mankind season 5" src="https://cdn.mos.cms.futurecdn.net/iXpoW46FJFRS5zdbLqHoRk.png" mos="" align="middle" fullscreen="" width="2517" height="1416" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>Season 5 kicks off in 2012, and needless to say, that means smartphones make an appearance. Seeing as this is an Apple TV show, we don't get to see alternate takes on the Google Nexus or Samsung Galaxy. But these aren't exactly iPhones either. They sure look like iPhones, but the show makes it very clear that these things are actually called Newtons.</p><p>Frankly, I think that's a very cool easter egg to have in this show. Anyone who knows <a href="https://www.tomsguide.com/tech/apple-50th-anniversary-quiz-how-well-do-you-remember-these-controversial-moments-and-tech-innovations">Apple's product history</a> will know that the Newton was Apple's failed attempt to enter the PDA market back in 1993. The mini-computer was marred with issues and delays that turned it into something of a joke. </p><p>Despite this widespread mockery and lackluster sales, the Newton stayed in production until 1998, when it was killed at the behest of returning CEO Steve Jobs.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2139px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="fXguULGeS8EseMNZDr6eMk" name="Screenshot 2026-05-13 171348" alt="for all mankind season 5" src="https://cdn.mos.cms.futurecdn.net/fXguULGeS8EseMNZDr6eMk.png" mos="" align="middle" fullscreen="" width="2139" height="1203" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>This wouldn't be the first time an Apple Newton showed up in " For All Mankind, either. Season 3 featured the "Newton Message Pad", which was a compact home video phone, while a larger model appeared in season 4  with a more tablet-inspired design.</p><h2 id="for-all-mankind-s-newton-phones-are-a-sight-to-behold">For All Mankind's Newton Phones are a sight to behold</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2240px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hwW7cyCTzTkfKSQwBRD2Ck" name="Screenshot 2026-05-13 155015" alt="for all mankind season 5" src="https://cdn.mos.cms.futurecdn.net/hwW7cyCTzTkfKSQwBRD2Ck.png" mos="" align="middle" fullscreen="" width="2240" height="1260" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>The 2012 Newton models featured in For All Mankind season 5 are so clearly based on the iPhone. But, unlike the iPod, it's clear that these devices are distinct from any kind of Apple device we've seen in the real world. The show could have taken a relatively modern iPhone and slapped it into the show as a form of product placement. Instead, they seem to have put in a lot of effort to make them stand out.</p><p>A lot of things are still the same as you'd expect with an iPhone. The devices are touchscreen-based, suggesting that the world still decided to give the stylus the boot at some point, and the software looks remarkably like iOS did before iOS 7's controversial 2014 redesign. But the actual hardware is quite something.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1378px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="5Jphhy2BTftCQgNZN4mezj" name="Screenshot 2026-05-13 160830" alt="for all mankind season 5" src="https://cdn.mos.cms.futurecdn.net/5Jphhy2BTftCQgNZN4mezj.png" mos="" align="middle" fullscreen="" width="1378" height="775" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>The Newton is almost like a mashup between a bunch of different Apple devices. The chunky metal frame is reminiscent of the metal iPod Classics, while the back panel has the vertically-stacked dual camera lenses that first appeared on the iPhone X. That said, it doesn't feature the same full-screen design as the tenth anniversary iPhone. </p><p>This device retains the chunky bezels and notch-free design that hasn't been seen on a flagship iPhone since the release of iPhone 8, but there's no physical home button to be seen. Instead, there's the same white pill that's present on modern iPhones, and what I can only assume is a fingerprint scanner on the top right side of the phone</p><p>There also appears to be a charging port that looks fairly similar to USB-C, which didn't appear on iPhones until 2023, and a headphone jack. That suggests that even in this more advanced timeline, Apple hasn't felt "brave" enough to strip that port out of its phones just yet.</p><h2 id="bottom-line-product-placement-done-well">Bottom line: Product placement done well</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2074px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="CzXiL7fvSkkcMeXS4rmKzE" name="Screenshot 2026-05-13 170703" alt="for all mankind newton design" src="https://cdn.mos.cms.futurecdn.net/CzXiL7fvSkkcMeXS4rmKzE.png" mos="" align="middle" fullscreen="" width="2074" height="1167" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>There is no shortage of Apple-centric product placement on TV these days, even in shows that aren't made for the Apple TV streaming service. Keep your eyes open, and you'll see iPhones, MacBooks, AirPods and countless other devices appearing on screen. It's rarely in your face the way some product placement is, but it's the kind of thing that you can't unsee.</p><p>For All Mankind has reached the point in its timeline where the set designers could have done something similar. Slap some iPhones into the actors' hands, and dress up some desks with an iMac and be done with it. In fact, there are office scenes that prominently feature the Magic Mouse and what looks like a 2009 iMac. Which, while hardly inventive, is at least period-appropriate.</p><p>It's still very cool to see the amount of effort that's gone into creating an alternate version of the iPhone, for a world where travelling to the moon and Mars is seen as fairly routine. For All Mankind's Newton is eye-catching, and obviously an iPhone analogue to anyone who looks at it, but looking closer reveals a bunch of cool details that phone nerds like myself can appreciate.</p><p>At the very least, it's a reminder that this is an alternate version of our world, and a way of pointing out how different things could have been if history had unfolded just a little bit differently.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-fold-tipped-for-only-two-colors-and-after-the-joy-of-the-macbook-neo-i-cant-help-but-feel-disappointed">iPhone Fold tipped for only two colors — and after the joy of the MacBook Neo, I can't help but feel disappointed</a></li><li><a href="https://www.tomsguide.com/phones/iphones/the-iphone-camera-may-finally-catch-up-to-android-in-a-big-way-and-its-great-news-for-pros">The iPhone camera may finally catch up to Android in a big way with iOS 27 — here's how</a></li><li><a href="https://www.tomsguide.com/phones/iphones/9-iphone-accessories-for-under-usd20-we-cant-live-without">9 iPhone accessories for under $20 we can't live without</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I almost gave up on Apple TV’s No. 1 show — then ChatGPT convinced me to keep watching ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/ai/i-almost-gave-up-on-apple-tv-s-no-1-show-then-chatgpt-convinced-me-to-keep-watching</link>
                                                                            <description>
                            <![CDATA[ I was ready to quit Your Friends & Neighbors after season 2 started dragging, so I asked ChatGPT if Apple TV’s No. 1 show was still worth watching. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">2qDUvAYLzVeXEUsMQZCS3f</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mPujTeACHxcJaNUMHU5CMY-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 14 May 2026 05:01:00 +0000</pubDate>                                                                                                                                <updated>Thu, 14 May 2026 20:49:51 +0000</updated>
                                                                                                                                            <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                <author><![CDATA[ amanda.caswell@futurenet.com (Amanda Caswell) ]]></author>                    <dc:creator><![CDATA[ Amanda Caswell ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/zYjevim2q7FjQiefqpjZRB.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/mPujTeACHxcJaNUMHU5CMY-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV app on iPhone]]></media:description>                                                            <media:text><![CDATA[Apple TV app on iPhone]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV app on iPhone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mPujTeACHxcJaNUMHU5CMY-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I hate giving up on a show. This is especially true if I've raved about it to my friends and already invested several hours into the story. I want to believe there's a payoff coming. </p><p>I know that not every episode can be exciting and a weird detour is often intentional. And sometimes the character that I suddenly find annoying is essential to a more satisfying arc. <br><br>But, that's exactly where I found myself recently with "Your Friends & Neighbors " on <a href="https://www.tomsguide.com/opinion/i-cancelled-apple-tv-plus-heres-why-i-just-changed-my-mind">Apple TV</a>. The Jon Hamm-led drama has been one of Apple TV’s biggest shows recently. Not only is it ranked No. 1 on Apple TV in the U.S. (at time of writing), it has also topped Apple TV+’s worldwide TV chart.</p><p>So this wasn’t some random show I had stumbled into. This was Apple TV’s current hit. But after forcing myself to finish episode 6 of season 2, after already getting bored with episode 5, I had one thought: <em>Is this show starting to drag?</em></p><p>So instead of rage-quitting, I did what I increasingly do when I’m stuck between entertainment guilt and sunk-cost fallacy: I asked <a href="https://www.tomsguide.com/news/chatgpt">ChatGPT</a> whether I should keep watching.</p><h2 id="why-i-almost-gave-up">Why I almost gave up</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9oX4FwxTTQLShWqRDdkcTc" name="yourfriendsandneighbors" alt="Jon Hamm in Your Friends and Neighbors" src="https://cdn.mos.cms.futurecdn.net/9oX4FwxTTQLShWqRDdkcTc.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>The first season of "<a href="https://www.tomsguide.com/entertainment/streaming/watch-your-friends-and-neighbors-season-2">Your Friends & Neighbors</a>" had a killer premise. Jon Hamm plays Andrew “Coop” Cooper, a disgraced hedge fund manager who starts stealing from the wealthy people around him after his life falls apart. It had the sharp, almost addictive quality of watching terrible rich people make terrible decisions in extremely nice kitchens.</p><div><blockquote><p>I felt that very familiar streaming-era panic: Am I watching a great show deepen, or am I watching a good show lose momentum?</p></blockquote></div><p>Season 2 keeps a lot of that appeal. James Marsden joins as Owen Ashe, a new neighbor whose arrival threatens to expose Coop’s secrets and pull his family deeper into danger. <a href="https://www.tomsguide.com/news/new-tv-shows">Season 2 premiered April 3, 2026</a> and is rolling out weekly through June 5, with 10 episodes total.</p><p>On paper, that should be enough to keep things moving. But around episodes 5 and 6, the show seemed to shift gears. The crime-thriller energy slowed down. The pacing became more emotional and more interior. Instead of feeling like the walls were closing in on Coop, it started to feel like the show was wandering through grief, family drama and relationship fallout. I found myself scrolling during episodes or even fast forwarding to skip the "boring" parts. </p><p>I realize some of the best shows slow down before they get better. But as a viewer, I felt that very familiar streaming-era panic: <em>Am I watching a great show deepen, or am I watching a good show lose momentum?</em></p><h2 id="the-chatgpt-prompt-i-used-when-the-show-got-boring">The ChatGPT prompt I used when the show got 'boring'</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AUstGAF7cNZ8uQAxKzTX6M" name="8 - 2026-05-13T141259.508" alt="screenshot" src="https://cdn.mos.cms.futurecdn.net/AUstGAF7cNZ8uQAxKzTX6M.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Here’s what I asked ChatGPT: <em>“I just finished episode 6 in season 2 of Your Friends & Neighbors. The show seems to be dragging since the last two episodes. Is it worth continuing?”</em></p><p>What I liked about the answer was that it didn’t just say, “Yes, keep watching.” It reframed the question. ChatGPT pointed out that episode 6 might not be filler as much as a pivot. The show seems to be moving away from pure burglary tension and into the emotional consequences of Coop’s choices. In other words, the slower pacing may be intentional.</p><p>That made me think about the show differently. I had been judging it by the energy of its premise: rich man steals from rich neighbors, chaos follows. But season 2 may be asking a slightly different question: what happens when someone builds a second life out of lies and starts believing he can actually survive it?</p><p>That’s a better reason to keep watching than “I’ve already come this far.”</p><h2 id="chatgpt-was-right-about-one-thing">ChatGPT was right about one thing</h2><p>After thinking about it, I realized my frustration wasn’t that "Your Friends & Neighbors" had become bad. It was that it had become less instantly satisfying. That’s different.</p><p>The first season gave viewers a clean engine: Coop needs money, Coop steals, Coop gets pulled deeper into a mess of his own making. Season 2 is messier. It’s more about consequences, grief and whether Coop is still the smartest person in the room or just the most delusional.</p><p><a href="https://www.rottentomatoes.com/tv/your_friends_and_neighbors/s02" target="_blank">Rotten Tomatoes</a>’ critic consensus for season 2 makes a similar point, saying the show “digs itself into a deeper and richer character hole” while praising Hamm, Olivia Munn and Marsden.</p><p>That doesn’t mean every slower episode works. But it does suggest the show is trying to become something more textured than a glossy crime caper.</p><p>And honestly, that’s where ChatGPT was useful. It didn’t tell me whether the show was objectively good. It helped me separate two different questions: <em>Am I bored because the show is failing? Or am I impatient because the show is changing?</em></p><h2 id="the-takeaway">The takeaway</h2><p>My verdict: I’m giving it one more episode. I’m not fully sold yet. Episode 6 still felt slower than I wanted, especially after the sharpness that made the show so easy to binge in the first place. But I’m not quitting either, thanks to ChatGPT's advice to help change my perspective.</p><p>At this point, "Your Friends & Neighbors" has earned at least one more episode from me. Jon Hamm remains the show’s biggest reason to keep watching, and James Marsden’s Owen Ashe gives season 2 a new kind of threat that could still pay off in a big way.</p><p>My hope is that episode 7 reconnects the emotional fallout to the central tension between Coop, Owen and the secrets piling up around them. If that happens, I’m back in. If it keeps drifting, this may become the kind of show I finish later, not one I rush to watch every week.</p><p>And that may be the real lesson here. ChatGPT didn’t tell me (or even know) whether the show would stick the landing, but it did help me figure out what I was actually reacting to. For now, I’m sticking with Apple TV’s No. 1 show. But episode 7 has work to do.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/ai/i-used-gary-vees-attention-is-currency-mindset-with-chatgpt-and-it-saved-my-weakest-idea">I used Gary Vee’s ‘attention is currency’ mindset with ChatGPT — and it saved my weakest idea</a></li><li><a href="https://www.tomsguide.com/ai/i-asked-chatgpt-to-apply-lewis-howes-greatness-mindset-to-my-life-and-it-completely-changed-how-i-approach-work">I asked ChatGPT to apply Lewis Howes’ ‘Greatness’ mindset to my life — and it completely changed how I approach work</a></li><li><a href="https://www.tomsguide.com/ai/i-gave-chatgpt-permission-to-disagree-with-me-with-this-prompt-and-its-responses-became-dramatically-better">I gave ChatGPT permission to disagree with me with this prompt — and its responses became dramatically better</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I cut my streaming bill to under $20 a month — here's my 3-step plan to fight the streaming price hikes ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/tired-of-streaming-price-hikes-heres-the-exact-3-step-strategy-i-used-to-cut-my-streaming-bill-to-under-usd20-a-month</link>
                                                                            <description>
                            <![CDATA[ If your monthly streaming bill has grown out of control with rising price hikes, here's the strategies I use to cut it back to under $20. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">xoqZfJYdozaNybsoiVpvW4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ayvSAvcdaXGoXCNs4LshUX-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 11 May 2026 08:30:00 +0000</pubDate>                                                                                                                                <updated>Tue, 12 May 2026 10:30:10 +0000</updated>
                                                                                                                                            <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alyse Stanley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/BxNnQuBWRHqkv5xWZsjrjc.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Alyse Stanley is a news editor at Tom’s Guide, overseeing weekend coverage and writing about the latest in tech, gaming, and entertainment. Before Tom’s Guide, Alyse worked as an editor for the Washington Post’s sunsetted video game section, Launcher, where she also wrote about indie games you shouldn’t miss, how to tackle your gaming backlog, and all things Nintendo. She previously led Gizmodo’s weekend news desk covering breaking tech news and has written game reviews and features for outlets like Polygon, Unwinnable, and Rock, Paper, Shotgun. A recent Chicago-area transplant born and raised in Virginia, Alyse is a big fan of horror movies, cartoons, and roller skating. She&#039;s also a puzzle fan and can often be found contributing to the NYT Connections coverage on Tom&#039;s Guide &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ayvSAvcdaXGoXCNs4LshUX-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[woman using remote control on smart tv]]></media:description>                                                            <media:text><![CDATA[woman using remote control on smart tv]]></media:text>
                                <media:title type="plain"><![CDATA[woman using remote control on smart tv]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ayvSAvcdaXGoXCNs4LshUX-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With my monthly streaming bill creeping higher and higher with all these price hikes, I finally said: "Enough is enough." The days of streaming as a cheaper alternative to cable are long gone. All those streaming subscriptions add up quickly, especially when my favorite movies and shows are scattered across a growing number of platforms with intrusive ads that make me want to rip my hair out. </p><p>The good news is that you don’t have to cancel everything to lower your monthly bill — though a regular audit of which streaming services you actually use is the best place to start. That's the first step in how I cut my monthly streaming bill down to under $20 a month. After going over everything I was subscribed to (including a few I'd forgotten I'd ever signed up for), I realized I was paying over $70 a month for services I only used once in a blue moon. </p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/r4gCu1d-etc" allowfullscreen></iframe></div></div><p>There are plenty of ways to save on your monthly streaming bill, from cycling between services depending on release schedules to exploring free or lower-cost streaming alternatives. Below, I’ve outlined the best strategies I've found for cutting costs without sacrificing the shows and movies I want to watch every day. </p><h2 id="1-audit-and-axe">1. Audit and axe</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mDNSZm5ah4asJu6kEVFqh7" name="Netflix.jpg" alt="A TV with the Netflix logo sits behind a hand holding a remote" src="https://cdn.mos.cms.futurecdn.net/mDNSZm5ah4asJu6kEVFqh7.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Once I rounded up everything I was paying for in one place, it became a lot easier to figure out which of <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">the best streaming services</a> I needed to keep and those I needed to ditch. I laid out all my subscriptions in a Google Sheet along with the movies and shows I primarily used them for, like Prime Video for "Fallout" or HBO Max for "The Last of Us." I reckoned that until a new season drops, I could do without. </p><p>Now, I have a strict rule to keep my monthly streaming bill under control: If I haven't watched a single exclusive in the last month, the platform gets the axe. That way, I'm only paying for what I actually watch. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OozpqW"></div>                            </div>                            <script src="https://kwizly.com/embed/OozpqW.js" async></script><h2 id="2-subscription-cycling">2. Subscription cycling</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zrcB59XrtDzYpDhiT75YT7" name="shutterstock_1154935312.jpg" alt="best netflix alternatives" src="https://cdn.mos.cms.futurecdn.net/zrcB59XrtDzYpDhiT75YT7.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Manuel Esteban / Shutterstock)</span></figcaption></figure><p>Remembering to add and drop subscriptions each month can be tedious, but it's worth the time and effort to save a few bucks. Here's how it works: I pick one service like Netflix for a month, binge the latest movies and shows I want to watch like "Lord of the Flies" or "Remarkably Bright Creatures," and then cancel it once I'm done. </p><p>It helps to set a calendar reminder a couple of days before the billing cycle, because anything that isn't in my calendar is a gamble whether I'll remember it. Then, the next month, I sign up for another platform with new releases I want to watch. That way, I always have something new to watch, but my bill stays under $20. </p><h2 id="3-leverage-free-streaming-services">3. Leverage free streaming services</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BK6zoJUDSej6PX2Vns5dwh" name="tubi-tablet.jpg" alt="Tubi on a tablet with headphones and popcorn nearby" src="https://cdn.mos.cms.futurecdn.net/BK6zoJUDSej6PX2Vns5dwh.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock; Tubi)</span></figcaption></figure><p>I tell just about anyone who will listen to check out <a href="https://www.tomsguide.com/best-picks/best-free-streaming-services">free streaming services</a> before adding more subscriptions to their monthly bill. FAST platforms like Tubi, <a href="https://www.tomsguide.com/tag/pluto-tv">Pluto TV</a>, the <a href="https://www.tomsguide.com/tag/roku">Roku</a> Channel have built impressive libraries over the years with thousands of movies and shows, not to mention hundreds of live channels that look and feel like cable. Sure, you'll have to sit through some ads, but you'd have to do that anyway unless you're shelling out for premium tiers. </p><p>With over 200,000 movies and TV shows, Tubi is my top choice. Its library of movies includes recently released blockbusters and Hollywood classics from the likes of Paramount, Lionsgate and MGM. You also don't have to sign up for an account to use it, though you'll need one for access to features like parental controls and viewing history. Pluto TV is also an excellent option for live TV streaming, with plenty of live channels you can tune into like MTV, BET, CNN, Fox Sports and more. </p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 best Apple TV shows you (probably) haven't watched but should stream now ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/3-best-apple-tv-shows-you-probably-havent-watched-but-should-stream-now</link>
                                                                            <description>
                            <![CDATA[ From a Colin Farrell-led neo-noir to a Rose Byrne-starring '80s comedy, here are three overlooked Apple TV shows that deserved more buzz ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">hf5qTrpHpJJC6Q9RQJMCpa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/hrTBe4yDuQUeE7F6eLMCvS-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 10 May 2026 09:45:00 +0000</pubDate>                                                                                                                                <updated>Sun, 10 May 2026 12:33:43 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Christina Izzo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/LMncQCRNbbLXxxjbfZJvWE.jpeg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/hrTBe4yDuQUeE7F6eLMCvS-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV on a sunset background]]></media:description>                                                            <media:text><![CDATA[Apple TV on a sunset background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV on a sunset background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/hrTBe4yDuQUeE7F6eLMCvS-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you haven't added <a href="https://www.tomsguide.com/reviews/apple-tv-plus">Apple TV</a> to your trusty bank of top streaming services, you're missing out. The Apple-owned platform is home to some of the most popular and critically acclaimed shows around, including hit comedies like "<a href="https://www.tomsguide.com/entertainment/apple-tv/huge-ted-lasso-season-4-update-including-summer-release-window-first-look-images-and-new-characters">Ted Lasso</a>" and "<a href="https://www.tomsguide.com/opinion/apple-tv-plus-shrinking-is-the-best-new-show-youre-not-watching">Shrinking</a>," mind-bending sci-fi series like "<a href="https://www.tomsguide.com/entertainment/apple-tv-plus/severance-showrunner-reveals-the-end-is-in-sight-as-apple-sci-fi-sensation-racks-up-8-more-emmy-wins">Severance</a>" and "<a href="https://www.tomsguide.com/news/apples-new-post-apocalyptic-tv-show-is-a-certified-hit-with-both-critics-and-fans">Silo</a>," and buzzy new dramas like "<a href="https://www.tomsguide.com/entertainment/streaming/watch-your-friends-and-neighbors-season-2">Your Friends and Neighbors</a>" and "<a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tvs-new-comedy-drama-with-elle-fanning-is-one-of-the-best-new-shows-ive-streamed-so-far-this-year">Margo's Got Money Troubles</a>."</p><p>But the sheer sprawl of that streaming selection means that you might have accidentally missed out on some seriously great but not-as-popular shows over the years. That's where Tom's Guide comes in: We've sorted through the options and come up with a rec list of originally overlooked but high-quality Apple TV series that deserved way more buzz than they got. </p><p>Here are three overlooked Apple TV shows to add to your watch list ASAP.</p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h2 id="sugar">'Sugar'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/twvPGxuEOEA" allowfullscreen></iframe></div></div><p>Created by Mark Protosevich ("The Cell," "Oldboy"), this Apple TV neo-noir mystery stars Colin Farrell as the eponymous John Sugar, a private investigator recruited by a wealthy and powerful movie producer (James Cromwell) to examine the sudden disappearance of his granddaughter in Los Angeles. However, Sugar's investigation into the missing persons case leads him to not only uncover deep-seated secrets in the City of Angels but also his own personal demons.<strong> </strong></p><p>Smartly written and stylishly wrought, the addictive eight-episode mystery was renewed for a second season back in October 2024; new episodes are set to premiere on the Apple streamer on June 19, 2026. While the first season also featured Amy Ryan, Dennis Boutsikaris, Nate Corddry and Alex Hernandez, season two will star a new cast, with Jin Ha, Raymond Lee, Tony Dalton, Laura Donnelly, Sasha Calle, and Shea Whigham joining Farrell. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/es/show/servant/umc.cmc.4y25wuby7pck9o6vaubbbk7gb" target="_blank" rel="nofollow"><em><strong>"Sugar" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="physical">'Physical'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/PQTFdslwJYo" allowfullscreen></iframe></div></div><p>You might already know Rose Byrne's Apple TV+ comedy series "Platonic," which unromantically pairs her up with real-life buddy Seth Rogen. But the Oscar-nominated star actually has <em>another </em>top-notch (albeit lesser-known) show on the Apple platform: "Physical". </p><p>It's a half-hour dark comedy starring Byrne as Sheila Rubin, a quietly tortured housewife living in 1980s San Diego and supporting her hyper-liberal husband’s bid for state assembly. Sheila is unhappy in her marriage and low on self-esteem after a lifelong battle with bulimia, but finds much-needed relief in an unexpected place: the world of aerobics. Created by Annie Weisman, the sweatband satire ran for three seasons on Apple TV.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/physical/umc.cmc.6gdc6v4vwyaab7klocftv2s10" target="_blank" rel="nofollow"><em><strong>"Physical" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="servant">'Servant'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/N1cOR0sRRIw" allowfullscreen></iframe></div></div><p>If you want your next Apple TV series with a side of chills and thrills, "Servant" might be the one for you. Created by Tony Basgallop ("To the Ends of the Earth"), with M. Night Shyamalan acting as both showrunner and executive producer, the psychological horror thriller focuses on wealthy Philadelphia couple Dorothy and Sean Turner — played by Lauren Ambrose and Toby Kebbell, respectively — whose marriage is crumbling under their own grief following the death of their thirteen-week-old son, Jericho. </p><p>Unable to accept the loss, the couple introduces a lifelike newborn doll and a young nanny (Nell Tiger Free) into their daily lives, not realizing that in doing so they've also opened the door to mysterious, supernatural forces. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/es/show/servant/umc.cmc.4y25wuby7pck9o6vaubbbk7gb" target="_blank" rel="nofollow"><em><strong>"Servant" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-may-2026">Everything new on Apple TV in May 2026</a></li><li><a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">31 best Apple TV shows to watch now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tvs-new-comedy-drama-with-elle-fanning-is-one-of-the-best-new-shows-ive-streamed-so-far-this-year">Apple TV has another hit on its hands with this must-watch new comedy-drama</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Is a new Apple TV in the works? Here's how John Ternus' appointment as Apple CEO could benefit Apple's streaming device ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming-devices/is-a-new-apple-tv-in-the-works-heres-how-john-ternus-tenure-as-apple-ceo-could-benefit-apples-streaming-device</link>
                                                                            <description>
                            <![CDATA[ With John Ternus set to replace Tim Cook as Apple CEO, what does the future of Apple streaming devices (like the Apple TV 4K) look like? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">aUoSU34kfGMnnzbzmLaQo4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DjjhaBb7iQzCMYs3zYHm23-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 08 May 2026 08:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming Devices]]></category>
                                                    <category><![CDATA[TVs]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Christian de Looper ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/cyHuThvGLCKTfcMnWJiY4Y.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Christian de Looper is a freelance writer who has covered every facet of consumer tech, including mobile, audio, home theater, computing, gaming, and even car tech. At Tom’s Guide, Christian covers TV and home theater tech, and has reviewed dozens of TVs, soundbars, and A/V receivers, including those from the likes of Samsung, Hisense, TCL, and Vizio. Christian has also covered numerous industry events, from CES to F8, and is an expert at writing reviews, buying guides, and news. Outside of Tom’s Guide, Christian’s byline can be seen at TechRadar, Forbes, Digital Trends, Business Insider, and more. Follow Christian on Twitter to keep up with all his tech coverage.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/DjjhaBb7iQzCMYs3zYHm23-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A side-by-side composite: John Ternus sitting on a chair during an interview alongside an Apple TV 4K streaming device.]]></media:description>                                                            <media:text><![CDATA[A side-by-side composite: John Ternus sitting on a chair during an interview alongside an Apple TV 4K streaming device.]]></media:text>
                                <media:title type="plain"><![CDATA[A side-by-side composite: John Ternus sitting on a chair during an interview alongside an Apple TV 4K streaming device.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DjjhaBb7iQzCMYs3zYHm23-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With Tim Cook moving on after what's arguably one of the most impressive runs any tech CEO has ever had, Apple is about to get a new leader in the form of <a href="https://www.tomsguide.com/phones/iphones/massive-changes-at-apple-john-ternus-takes-over-as-ceo-sept-1-while-tim-cook-moves-to-executive-chairman">John Ternus</a>. Ternus has been at the company for 25 years, spending most of that time deep in Apple's hardware engineering.</p><p>So where does that leave <a href="https://www.tomsguide.com/reviews/apple-tv-4k-2022">Apple TV</a>? Despite being one of the <a href="https://www.tomsguide.com/entertainment/streaming-devices/best-streaming-devices">best streaming boxes</a> out there, it's a product that's always felt forgotten. Meanwhile, iPhones, Macs and iPads get all the attention.</p><p>With a hardware-first CEO running things and Apple seemingly rethinking its approach to the home, there are genuine reasons to believe the Apple TV might finally get some love. But there are also reasons not to get too excited. </p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/kkBudtxgor0" allowfullscreen></iframe></div></div><h2 id="john-ternus-hardware-nerd">John Ternus: hardware nerd</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XK7W9gHWEgHPdh5kir8n9" name="Ternus and Cook" alt="John Ternus and Tim Cook" src="https://cdn.mos.cms.futurecdn.net/XK7W9gHWEgHPdh5kir8n9.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Ternus isn't someone who's climbed the ladder through finance, marketing or operations. On the contrary, he's a hardware person through and through. In fact, his entire Apple career has been about getting involved with the engineering and manufacturing of physical products. </p><p>It's easy to look at streaming devices and think they're simple compared to something like an iPhone. In actuality, building these devices means navigating a surprisingly tangled set of decisions around chips, thermal management, connectivity and manufacturing.</p><div class="product"><a data-dimension112="48ffb912-e897-42c9-bcfa-78362ca4090b" data-action="Deal Block" data-label="The Apple TV 4K streaming box is our top choice for Apple users. The A15 Bionic chip allows for blisteringly fast load times, and its support for both Dolby Vision and HDR10+ makes it a top choice for A/V enthusiasts, too." data-dimension48="The Apple TV 4K streaming box is our top choice for Apple users. The A15 Bionic chip allows for blisteringly fast load times, and its support for both Dolby Vision and HDR10+ makes it a top choice for A/V enthusiasts, too." data-dimension25="$149" href="https://www.bestbuy.com/product/apple-tv-4k-128gb-streaming-device-3rd-generation-wi-fi-ethernet-black/JJ8ZH9F3Z4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1076px;"><p class="vanilla-image-block" style="padding-top:99.44%;"><img id="CyXUvbZpgvpfgbo68N3S9R" name="1714492717.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CyXUvbZpgvpfgbo68N3S9R.jpg" mos="" align="middle" fullscreen="" width="1076" height="1070" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Apple TV 4K streaming box is our top choice for Apple users. The A15 Bionic chip allows for blisteringly fast load times, and its support for both Dolby Vision and HDR10+ makes it a top choice for A/V enthusiasts, too.<a class="view-deal button" href="https://www.bestbuy.com/product/apple-tv-4k-128gb-streaming-device-3rd-generation-wi-fi-ethernet-black/JJ8ZH9F3Z4" target="_blank" rel="nofollow" data-dimension112="48ffb912-e897-42c9-bcfa-78362ca4090b" data-action="Deal Block" data-label="The Apple TV 4K streaming box is our top choice for Apple users. The A15 Bionic chip allows for blisteringly fast load times, and its support for both Dolby Vision and HDR10+ makes it a top choice for A/V enthusiasts, too." data-dimension48="The Apple TV 4K streaming box is our top choice for Apple users. The A15 Bionic chip allows for blisteringly fast load times, and its support for both Dolby Vision and HDR10+ makes it a top choice for A/V enthusiasts, too." data-dimension25="$149">View Deal</a></p></div><p>Ternus has been dealing with exactly those kinds of challenges across Apple's full product line for more than two decades. He knows the tradeoffs inside and out, and he’s made this trades for previous Apple TV boxes — arguably the <a href="https://www.tomsguide.com/entertainment/streaming-devices/best-streaming-devices">best streaming devices</a> out there.</p><p>To be clear, having a hardware-focused CEO doesn't automatically make every product better. However, it could certainly make the <em>process</em> of hardware decision-making more efficient. Whether those decisions actually result in a more compelling Apple TV, though, is a separate conversation.</p><h2 id="apple-is-already-leaning-into-the-smart-home-space">Apple is already leaning into the smart home space</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="B95DcAauGWFAAyYtQsqPQ4" name="Apple Home.jpg" alt="A photo of an iPad running Apple Home alongside an Apple HomePod mini and an Apple TV" src="https://cdn.mos.cms.futurecdn.net/B95DcAauGWFAAyYtQsqPQ4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>In recent years, Apple has extended its reach into the smart home through products like the HomePod and the <a href="https://www.tomsguide.com/reviews/apple-homepod-2nd-generation">HomePod 2</a>. But both the HomePod and the Apple TV seem to get forgotten — at least compared to other Apple products that get annual refreshes. Sure, you could argue that the Apple TV doesn't <em>need</em> a chip bump, but regardless, rumors indicate Apple is planning a renewed push into the smart home.</p><p>Now, that doesn't automatically mean that the Apple TV itself will get more attention. Most of the rumors surround things like a HomePod with a display and potentially even a smart doorbell, but if Apple is indeed pushing deeper into the home, perhaps we'll see other kinds of new products, like an Apple TV soundbar, or even a cheaper Apple TV dongle.</p><p>Apple's been down this road before with HomeKit and the HomePod, and the results were mixed at best, of course. But there's a real difference between the smart home being a pet project for some mid-level team and having the CEO personally invested in making it work. Conviction at the top changes things.</p><h2 id="the-apple-tv-has-a-great-track-record">The Apple TV has a great track record</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4xH2sCvXbZjeneNd7vBnfc" name="IMG_7777.jpg" alt="The Apple TV 4K seen from above" src="https://cdn.mos.cms.futurecdn.net/4xH2sCvXbZjeneNd7vBnfc.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Despite a relative lack of upgrades, Apple TV has long been considered the best consumer streamer, and for good reason. Yes, it's more expensive than others from the likes of Roku, and you could argue that streamers in general are on the way out given the fact that most TVs have smart platforms built right into them. That said, if you want a powerful, smart TV platform that integrates with your Apple account, the Apple TV is still the way to go.</p><p>It's also technologically advanced. The A15 chip makes the Apple TV 4K feel <em>much</em> faster and more responsive than most other platforms, and the tvOS operating system feels a far more polished than most of the competition.</p><p>That's before even mentioning how well it works with things like the HomePod or AirPods. I often use AirPods with the Apple TV to avoid waking up others in my home. When it comes to high-end streaming devices, there's arguably no competition to the Apple TV.</p><div><blockquote><p>When it comes to high-end streaming devices, there's arguably no competition to the Apple TV.</p></blockquote></div><p>That raises an important question: Why update a product that's head and shoulders above the competition? For this reason, I can easily envision Apple <em>expanding</em> the Apple TV lineup rather than simply updating it.</p><p>Perhaps the key to all of this is Siri. Yes, Apple has lagged others when it comes to using generative AI for its smart assistant, but that's seemingly going to change soon, with a Google <a href="https://www.tomsguide.com/ai/google-promises-siri-powered-by-gemini-is-coming-later-this-year">Gemini-powered version of Siri</a>.</p><p>If Apple is able to finally deliver an all-new, powerful Siri, why wouldn't it want that Siri to be more present in the home, too? That could come through new HomePods, sure, but other kinds of speakers, too — the sort that companies like Sonos currently make. The <a href="https://www.tomsguide.com/audio/soundbars/sonos-arc-ultra-review">Sonos Arc Ultra</a> is consistently rated one of the <a href="https://www.tomsguide.com/audio/soundbars/best-soundbars">best soundbars</a> you can get. I could see Apple wanting to take a shot at that.</p><h2 id="nothing-is-certain">Nothing is certain</h2><p>It's probably worth tempering expectations, of course. Rumors of Apple's push into the smart home aside, Ternus himself is unlikely to change things overnight. After all, anything released in the next two years or so would have already been under development since before Ternus took over. </p><p>Plus, as head of one of the largest companies in the world, he'll have <em>plenty</em> on his plate already. If Ternus is spending his days wrestling with AI strategy, managing iPhone margins and charting a course for the <a href="https://www.tomsguide.com/computing/vr-ar/apple-has-reportedly-stopped-work-on-the-vision-pro-heres-what-we-know">future of the Vision Pro</a>, the Apple TV could still wind up further down the priority list than its fans would hope. </p><p>The fact is, we have no idea if a next-gen Apple TV is in active development, or if Apple plans home theater-related products other than the Apple TV in the future. But the pieces are in place for the Apple TV to get a meaningful lift under Ternus.</p><p>Apple TV fans have more reason for hope right now than they've had in a long time — but keeping expectations in check until we see what actually ships is the smart move.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W2Yb2e"></div>                            </div>                            <script src="https://kwizly.com/embed/W2Yb2e.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/computing/macbooks/i-interviewed-john-ternus-right-before-he-was-named-apple-ceo-heres-the-5-quotes-that-stand-out-to-me">I interviewed John Ternus right before he was named Apple’s next CEO — here’s the 5 quotes that stuck with me</a></li><li><a href="https://www.tomsguide.com/tvs/apple-tv-4k-is-still-the-best-streaming-box-when-it-comes-to-privacy">Apple TV 4K is still the best streaming box when it comes to privacy</a></li><li><a href="https://www.tomsguide.com/computing/vr-ar/apple-has-reportedly-stopped-work-on-the-vision-pro-heres-what-we-know">Apple has reportedly 'stopped work on the Vision Pro' — here's what we know</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Everything new on Apple TV in May 2026 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-may-2026</link>
                                                                            <description>
                            <![CDATA[ Our guide on the new movies and shows coming to Apple TV Plus in May 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">UUWGFN6szdUfxbwEaUfqpa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HF6MiZSEiQqKsfxnrwLtoE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 25 Apr 2026 09:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Christina Izzo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/LMncQCRNbbLXxxjbfZJvWE.jpeg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/HF6MiZSEiQqKsfxnrwLtoE-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV logo on a orange yellow background]]></media:description>                                                            <media:text><![CDATA[Apple TV logo on a orange yellow background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV logo on a orange yellow background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HF6MiZSEiQqKsfxnrwLtoE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We're finally in the thick of spring, folks, with flowers blooming, birds chirping and plenty of great TV coming to a screen near you. And yes, that includes a fresh month of new selections from <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a>, one of the top streaming services around: As you already know, every month, the Apple platform does a sweep through its sprawling selection of movies and TV series, bringing in new titillating titles for you to add to your watch list. And May 2026 will be no exception, with a quartet of buzzy new releases joining the service.  </p><p>Kicking off this month is "Unconditional," a new mother-daughter thriller from the team behind "Homeland."<em> </em>Then we've got the premiere of the dark comedy "Maximum Pleasure Guaranteed," starring Emmy winner Tatiana Maslany as a burnt-out mom who finds herself roped into a cam-boy conspiracy. </p><p>Later in the month, we get the family-adventure film "Propeller One-Way Night Coach," which is the directorial debut of John Travolta, as well as "Star City," an equally high-flying sci-fi spinoff of the popular Apple series "<a href="https://www.tomsguide.com/entertainment/streaming/how-to-watch-for-all-mankind-season-5-online">For All Mankind</a>." Looking for what to queue up next? Keep scrolling for a closer look at what’s new on Apple TV this May. </p><h2 id="unconditional">'Unconditional'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/j99ypz4OuEk" allowfullscreen></iframe></div></div><p>From the producers of "Homeland" comes this new thriller series, which follows twentysomething Gali (Talia Lynne Ronn) and her mom, Orna (Liraz Chamami), whose mother-daughter vacation turns into a nightmare when the former is arrested for drug smuggling in Moscow. Refusing to accept the charges, Orna desperately sets off to prove her daughter's innocence, a fight for freedom that pulls her into a deadly web of crime and corruption.</p><p>Joining those leading ladies, the 'Unconditional" ensemble will also feature Amir Haddad (“La Belle et Le Boulanger”), Yossi Marshek (“Yellow Peppers,” "Manpower"), Evgenia Dodina (“Invisible,” “Virgins”) and Vladimir Friedman (“Bad Boy”).  The eight-part series is written by Adam Bizanski and directed by Johnathan Gurfinkel.</p><p><em><strong>Watch on </strong></em><a href="https://apple.co/Unconditional" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting May 8</strong></em></p><h2 id="maximum-pleasure-guaranteed">'Maximum Pleasure Guaranteed'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/_8KOzyMYgiw" allowfullscreen></iframe></div></div><p>"Orphan Black" great Tatiana Maslany leads Apple TV's new dark comedy-thriller show "Maximum Pleasure Guaranteed" as newly divorced mom Paula who, when not struggling through an identity crisis and a custody battle with her now ex-husband Karl (played by Jake Johnson), is busy being infatuated with a young cam-boy named Trevor (Brandon Flynn). </p><p>Soon, though, it becomes clear that Trevor's attentions aren't entirely sincere and he's simply trying to scam Paula, a disappointment that turned dangerous when the mom seemingly witnesses the sex worker committing a murder. Paula begins her own crime investigations, which sees her falling down "a rabbit hole of blackmail, murder and youth soccer," per the show's official logline. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/show/maximum-pleasure-guaranteed/umc.cmc.10k6tes7rmc2ti0ho1ozgwezc" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting May 20</strong></em></p><h2 id="propeller-one-way-night-coach">'Propeller One-Way Night Coach'</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AX47q2E9uZYL6ZQ4q6icsW" name="Propeller One-Way Night Coach" alt="Propeller One-Way Night Coach" src="https://cdn.mos.cms.futurecdn.net/AX47q2E9uZYL6ZQ4q6icsW.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>Hollywood legend and flying enthusiast John Travolta brings together both of his famous hobbies with the film adaptation of "Propeller One-Way Night Coach," which will serve as the actor's directorial debut. Based on his own 1997 children's novel of the same name, the family-adventure flick is set in the golden age of aviation and follows young aerophile Jeff (Clark Shotwell) and his mother (Kelly Eviston-Quinnett) as they embark on a one-way, cross-country flight to California. </p><p>"Between airline meals, charming flight attendants (played by Ella Bleu Travolta and Olga Hoffmann), unexpected stopovers, larger-than-life passengers and a thrilling glimpse at first class, the journey unfolds in moments both magical and unexpected, charting the course for the boy’s future," reads the official film synopsis. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> from May 29</strong></em></p><h2 id="star-city">‘Star City'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Uh-8EUCJHx8" allowfullscreen></iframe></div></div><p>A spinoff of the long-running Apple drama "For All Mankind," sci-fi newcomer "Star City" shifts the focus of the global space race to the Soviet Union's perspective.</p><p> Starring Rhys Ifans, Anna Maxwell Martin, Agnes O'Casey, Adam Nagaitis, Alice Englert and Josef Davies, among others, the series introduces you to the Soviet cosmonauts, engineers, and intelligence officers who are risking everything for the USSR to be the first to reach the moon. </p><p>However, as you peek behind the Iron Curtain and see both the personal hardships and political pressures required of such a feat, you'll soon discover that what's on the ground is far more dangerous than what's up in the stars. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/nz/show/star-city/umc.cmc.2l8p785osmtmiyk64bh6tfde1" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting May 29</strong></em></p><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="gdR2W4" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">31 best Apple TV Plus shows to watch now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tv-just-landed-its-own-major-fantasy-franchise-and-it-could-be-even-better-than-peak-game-of-thrones">Apple TV just landed its own major fantasy franchise — and it could be even better than peak 'Game of Thrones'</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Jessica Chastain's Apple TV crime thriller is back on after being postponed following Charlie Kirk's assassination ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/jessica-chastains-apple-tv-crime-thriller-is-back-on-after-being-postponed-following-charlie-kirks-assassination</link>
                                                                            <description>
                            <![CDATA[ Jessica Chastain has revealed her Apple TV crime thriller series, "The Savant," will finally be released this year after an indefinite hold. Here's when it is tipped to be released. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">e7mGbAZ4ic5bBHMd9jQwon</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mjVo8qX2haQq9KFg5KtfWG-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Apr 2026 17:01:51 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ malcolm.mcmillan@futurenet.com (Malcolm McMillan) ]]></author>                    <dc:creator><![CDATA[ Malcolm McMillan ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sSDLEbNEgBXf86HpujaWZ6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Malcolm McMillan is a Streaming Editor for Tom&#039;s Guide, covering all the latest in streaming TV shows and movies. That means news, analysis, recommendations, reviews and more for just about anything you can watch, including sports! If it can be seen on a screen, he can write about it. &lt;/p&gt;&lt;p&gt;Malcolm has been with Tom&#039;s Guide since June 2022, starting as a staff writer covering breaking news. Since then, he&#039;s transitioned to cover artificial intelligence (AI), A/V tech and VR headsets. Since late 2023 he has almost exclusively covered streaming and entertainment for Tom&#039;s Guide.&lt;/p&gt;&lt;p&gt;Before writing for Tom&#039;s Guide, Malcolm worked as a fantasy football analyst writing for several sites and also had a brief stint working for Microsoft selling laptops, Xbox products and even the ill-fated Windows phone. He is passionate about video games and sports, though both cause him to yell at the TV frequently. He proudly sports many tattoos, including an Arsenal tattoo, in honor of the team that causes him to yell at the TV the most.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/mjVo8qX2haQq9KFg5KtfWG-1280-80.png">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Episode 1. Jessica Chastain in &quot;The Savant,&quot; coming soon to Apple TV.]]></media:description>                                                            <media:text><![CDATA[Episode 1. Jessica Chastain in &quot;The Savant,&quot; coming soon to Apple TV.]]></media:text>
                                <media:title type="plain"><![CDATA[Episode 1. Jessica Chastain in &quot;The Savant,&quot; coming soon to Apple TV.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mjVo8qX2haQq9KFg5KtfWG-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>"The Savant" is finally coming to <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a>. At least, that's what its star, Jessica Chastain, is telling people.</p><p>At the 2026 Breakthrough Prize ceremony in Santa Monica, the actress revealed to <a href="https://variety.com/2026/tv/columns/jessica-chastain-apple-tv-finally-release-the-savant-after-postponement-charlie-kirk-assassination-1236725384/" target="_blank">Variety</a>'s Marc Malkin that her shelved thriller miniseries is finally going to see the light of day. "Before it was like, ‘I don’t know if we’re going to see it,'" she told Malkin. "But now I can say, 'We’re going to see it.'"</p><p>There's a good chance you heard about this show being put on ice, even if you didn't remember the name. We first got <a href="https://www.tomsguide.com/entertainment/streaming/new-apple-tv-plus-thriller-starring-jessica-chastain-gets-release-date">a look at "The Savant"</a> back in July 2025, which is loosely based on a 2019 Cosmopolitan story, "Is It Possible to Stop a Mass Shooting Before It Happens?" It stars Chastain as a woman who works as an undercover investigator to infiltrate online hate groups and stop domestic extremists. It was slated for a Sept. 26, 2025, release date, but just three days prior to that, Apple announced that the series was being postponed.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JWZKjN8AfozxGpHzD4jVjd" name="The_Savant_Photo_010103" alt="Episode 1. Dagmara Dominczyk and Jessica Chastain in "The Savant," coming soon to Apple TV." src="https://cdn.mos.cms.futurecdn.net/JWZKjN8AfozxGpHzD4jVjd.png" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>While Apple didn't explain why the series was shelved, most people (myself included) concluded it was due to the assassination of Charlie Kirk on September 10. </p><p>As to why Apple took nearly two weeks to delay a series, then put it on hold for a further several months, who's to say? Could it be Apple was worried about blowback? Most likely, though, unless there's something I'm missing, the show centering around politically motivated hate groups and Kirk being killed in an act of political violence is the only connective tissue here. There doesn't appear to be any character resembling even a facsimile of Kirk.</p><p>Maybe this project secretly needed more work, and Apple took a chance to shelve something it wasn't confident in? Far less likely, but it is surprising that suddenly, Apple has determined that 10 months is the exact right amount of time it needed to wait to release this show. </p><p>Of course, that's only if rumors of a July 2026 release window are correct. There's still no guarantee the show premieres at all. While Chastain is telling people on the red carpet that "The Savant" is coming and Variety reports the thriller series is coming in July, Apple has yet to say anything official. Until the tech giant's <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html" target="_blank">streaming service</a> says anything, this show could remain in the dark indefinitely.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X8pDgX"></div>                            </div>                            <script src="https://kwizly.com/embed/X8pDgX.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/netflix/netflix-new-releases-7-shows-and-movies-you-need-to-stream-this-week-april-20-26-2026">Netflix new releases: 7 shows and movies you need to stream this week (April 20-26)</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/lorne-is-an-snl-documentary-far-more-hilarious-than-most-comedy-movies-and-i-had-a-blast">'Lorne' is an 'SNL' documentary far more hilarious than most comedy movies, and I had a blast</a></li><li><a href="https://www.tomsguide.com/entertainment/movies/i-just-watched-philadelphia-and-i-cant-believe-this-was-the-only-time-tom-hanks-and-denzel-teamed-up-for-a-movie">I just watched 'Philadelphia' and I can't believe this was the only time Tom Hanks and Denzel teamed up for a movie</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple TV has another hit on its hands with this must-watch new comedy-drama ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/apple-tvs-new-comedy-drama-with-elle-fanning-is-one-of-the-best-new-shows-ive-streamed-so-far-this-year</link>
                                                                            <description>
                            <![CDATA[ "Margo's Got Money Troubles" is now streaming on Apple TV, and this new dramedy with Elle Fanning is one of the best new shows of 2026 (so far). ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">beKesBVJAyb5cjFGwiB4fM</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Dbdg2YmUbAbPzYRkAhNvFZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 15 Apr 2026 09:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 16 Apr 2026 15:46:18 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Martin Shore ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/a5UrfxWQGQmYiGZ9sXbKja.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Dbdg2YmUbAbPzYRkAhNvFZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Margo (Elle Fanning) lying on her side in a scene from Apple TV&#039;s &quot;Margo&#039;s Got Money Troubles&quot;]]></media:description>                                                            <media:text><![CDATA[Margo (Elle Fanning) lying on her side in a scene from Apple TV&#039;s &quot;Margo&#039;s Got Money Troubles&quot;]]></media:text>
                                <media:title type="plain"><![CDATA[Margo (Elle Fanning) lying on her side in a scene from Apple TV&#039;s &quot;Margo&#039;s Got Money Troubles&quot;]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Dbdg2YmUbAbPzYRkAhNvFZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> is home to a slew of top TV shows, and the streamer has just bolstered its winning roster of exclusives with a new comedy-drama that I'd rank as one of the best new shows I've streamed so far in 2026. </p><div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: Margo's Got Money Troubles</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><strong>Rating: </strong>4/5 stars</li><li><strong>Verdict: </strong>"Margo's Got Money Troubles" is a warm, funny comedy/drama boasting emotion, heart, real stakes, and a great set of characters (and an ensemble to match).</li><li><strong>Premiere date/time: </strong>Three episodes available to stream now, new episodes premiere Wednesdays</li><li><strong>Where to watch:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/margos-got-money-troubles/umc.cmc.6wgw0u6vuwydp6obbzzccup3w" target="_blank" rel="nofollow">Apple TV</a></li></ul></p></div></div><p>This is "Margo's Got Money Troubles," a brand-new family dramedy from David E. Kelley ("Big Little Lies," "<a href="https://www.tomsguide.com/entertainment/apple-tv-plus/watch-presumed-innocent-online">Presumed Innocent</a>"). Based on <a href="https://www.amazon.com/Margos-Got-Money-Troubles-Novel/dp/0063356597/" target="_blank" rel="nofollow">Rufi Thorpe's novel of the same name,</a> this is an emotional, very funny, and layered comedy-drama that approaches its many topics and themes with real warmth. </p><p>As of publication (April 15), the series just had its three-episode premiere on Apple TV, and having had the chance to stream the season in full ahead of release, I'd definitely recommend it. You can find a little more info about the show alongside my full "Margo's Got Money Troubles" review below, to help you decide whether to add it to your watchlist or not. </p><h2 id="what-is-margo-s-got-money-troubles-about">What is 'Margo's Got Money Troubles' about?</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/AjI52haEerU" allowfullscreen></iframe></div></div><p>Pitched as a "bold, heartwarming and comedic family drama" by Apple TV, the series follows Margo (Elle Fanning), a recent college dropout and aspiring writer, the daughter of ex-Hooters waitress Shyanne (Michelle Pfeiffer) and former professional wrestler Jinx (Nick Offerman). When she finds herself with a new baby, a mounting pile of bills, and dwindling amounts of ways to pay for them, Margo decides to strike out on a new career path as an OnlyFans content creator. </p><p>In addition to Fanning, Pfeiffer, and Offerman, "Margo's Got Money Troubles" also stars Marcia Gay Harden, Greg Kinnear, Michael Angarano, Rico Nasty, and Lindsey Normington.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Odvvme"></div>                            </div>                            <script src="https://kwizly.com/embed/Odvvme.js" async></script><h2 id="margo-s-got-money-troubles-is-layered-and-laugh-out-loud-funny">'Margo's Got Money Troubles' is layered and laugh-out-loud funny</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5246px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CjbsGvDH3dtVckQRagoaY5" name="Margos_Got_Money_Trouble_Photo_0101" alt="Margo (Elle Fanning) lies with her head in Shyanne's (Michelle Pfeiffer) lap on the couch in a scene from Apple TV's "Margo's Got Money Troubles"" src="https://cdn.mos.cms.futurecdn.net/CjbsGvDH3dtVckQRagoaY5.jpg" mos="" align="middle" fullscreen="" width="5246" height="2951" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>Whether you're looking for a funny or feel-good show, "Margo's Got Money Troubles" will fit the bill. I've not read the original novel, but left the full season feeling thoroughly satisfied; this quirky, eight-part series touches on a range of topics sensitively, and it juggles its emotional depth, ideas, antics, and plot well.  It's also frequently <em>hilarious.</em></p><p>I wouldn't want to spoil the ups and downs of Margo's journey, but this is a story of (among other things) survival, motherhood, respect, family, creative liberation, and yes, it does get raunchy, but it nevertheless feels sex-positive and open-minded about Margo's decision and the path it takes her down.</p><p>Fresh off her "Sentimental Value" Oscar nomination, Elle Fanning impresses here. Margo goes through a <em>lot </em>in this show, and she meets every setback, every emotion, and every one of her wins with aplomb. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2679px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="87bextqiGtfgncF6eoK2Dm" name="Margos_Got_Money_Troubles_Photo_010102" alt="L-R: Shyanne (Michelle Pfeiffer) and Margo (Elle Fanning) in a car park in a scene from Apple TV's "Margo's Got Money Troubles"" src="https://cdn.mos.cms.futurecdn.net/87bextqiGtfgncF6eoK2Dm.jpg" mos="" align="middle" fullscreen="" width="2679" height="1507" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>The wider cast all deliver, too. Michelle Pfeiffer and Elle Fanning make for a great mother-daughter pairing as Shyanne and Margo, while Nick Offerman's absent but now-supportive father is a welcome presence, too, offering stoicism, advice, and featuring in some downright <em>adorable</em> scenes with the baby at the heart of this story. All three are flawed and unconventional in their own way, and were all great characters to get to know.</p><p>Simply put, "Margo's Got Money Troubles" is a dramedy with real heart. It's off-beat and surprising, sure, but it never feels removed from the reality and stakes of the situation, either. It is comfortably one of the best new series I've streamed in 2026, and one that I'm more than happy to recommend. </p><p><a href="https://tv.apple.com/us/show/margos-got-money-troubles/umc.cmc.6wgw0u6vuwydp6obbzzccup3w" target="_blank" rel="nofollow"><em><strong>Stream "Margo's Got Money Troubles" on Apple TV now</strong></em></a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-april-2026">Everything new on Apple TV in April 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/beef-season-2-is-a-recipe-for-disaster-served-hotter-messier-and-more-unhinged-than-before">"BEEF" season 2 is hotter, messier, and more unhinged</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/best-prime-video-top-10-shows-heres-the-top-3-series-to-binge-watch-this-week-april-15-21">Best Prime Video top 10 shows: here's the top 3 series to binge-watch this week</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Margo’s Got Money Troubles' online — stream hit novel adaptation from anywhere ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/how-to-watch-margos-got-money-troubles-online</link>
                                                                            <description>
                            <![CDATA[ Here's how to watch 'Margo’s Got Money Troubles' episodes online no matter where you are, with Elle Fanning, Michelle Pfeiffer and Nicole Kidman starring. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4zRarzdUQNNHhaLqLxLCdK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/3s7uwUgTUFnk8rjbFDWhLG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 14 Apr 2026 22:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Adam Marshall ]]></dc:creator>                                                                                                        <dc:description><![CDATA[ &lt;p&gt;Adam was the Content Director of Subscriptions and Services at Future, meaning that he oversaw many of the articles the publisher produces about antivirus software, VPN, TV streaming, broadband and mobile phone contracts - from buying guides and deals news, to industry interest pieces and reviews.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Having graduated with a degree in Law, Adam started his life as a communicator with five years as a lawyer before retraining as a writer. He completed his NCTJ Diploma at the London School of Journalism in 2012 and hasn&#039;t looked back since.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Adam quickly established his authority around the safeguarding and championing of his readers&#039; interests, after starting his career at consumer watchdog Which?. There he developed an expertise in cybersecurity and promoting safe use of the internet, before heading to Future in 2016 and applying his editorial nous to the dizzying world of virtual private networks. From there, he helped establish TechRadar as a leading voice in consumer and business VPNs, helping to demystify their uses and help his audience make the best &amp;nbsp;buying decisions they can.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Adam can still be dusting his keyboard off to write articles for the likes of TechRadar, T3 and Tom&#039;s Guide.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/3s7uwUgTUFnk8rjbFDWhLG-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A close up of Elle Fanning wearing bright red lipstick in a scene from Apple TV&#039;s &#039;Margo’s Got Money Trouble&#039;.]]></media:description>                                                            <media:text><![CDATA[A close up of Elle Fanning wearing bright red lipstick in a scene from Apple TV&#039;s &#039;Margo’s Got Money Trouble&#039;.]]></media:text>
                                <media:title type="plain"><![CDATA[A close up of Elle Fanning wearing bright red lipstick in a scene from Apple TV&#039;s &#039;Margo’s Got Money Trouble&#039;.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/3s7uwUgTUFnk8rjbFDWhLG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With nominations for Academy Awards ("Sentimental Value") and Emmys ("The Great"), Elle Fanning now leads Apple TV's latest original show, adapted from a popular Rufi Thorpe novel of the same name. Below is all the information you need to watch “Margo’s Got Money Troubles" online <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with a VPN</strong></a><strong> — and potentially for free.</strong> </p><div  class="fancy-box"><div class="fancy_box-title">'Margo’s Got Money Troubles' streaming details, release date</div><div class="fancy_box_body"><p class="fancy-box__body-text">Episodes 1-3 of "Margo’s Got Money Troubles" premiere <strong>on Wednesday, April 15</strong>.<br><strong>• Global streams </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Apple TV (7-day free trial)</a><br><strong>• Watch anywhere — try </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN 100% risk-free</strong></a></p></div></div><p>She's got brains. She's got beauty. And she's got a baby. The one thing she doesn't have is money in the bank. Fortunately, there are ways that resourceful young women like Margo (Fanning) can do 'some work on the internet' these days. Let's just say it rhymes with LonelyPlans...</p><p>The other things Margo has are friends and family who are around to support her. Enter a starry cast with Michelle Pfeiffer ("<a href="https://www.tomsguide.com/entertainment/streaming/how-to-watch-the-madison-stream-taylor-sheridan-drama-online-from-anywhere" target="_blank">The Madison</a>") perfectly pitched as her former Hooters-hostess mom and Nick Offerman ("<a href="https://www.tomsguide.com/news/parks-and-rec-reunion-episode-2020-how-to-watch-live-stream-and-start-time" target="_blank">Parks and Recreation</a>") as her pro wrestler dad, among an ensemble that also includes Greg Kinnear and Oscar winners Nicole Kidman and Marcia Gay Harden.</p><p>Brought to the screen by David E. Kelley — the man behind the likes of "Chicago Hope", "Ally McBeal" and "Big Little Lies" — read on to discover how to watch "Margo’s Got Money Troubles" online and from anywhere.</p><h2 class="article-body__section" id="section-how-to-watch-margo-s-got-money-troubles-online-for-free"><span>How to watch 'Margo’s Got Money Troubles' online for free</span></h2><p>“Margo’s Got Money Troubles" is an Apple TV original series. If you're new to the platform, you can take advantage of the platform's <a href="https://tv.apple.com/" target="_blank" rel="nofollow">FREE 7-day trial</a>. Time it right and that will let you <strong>watch all episodes absolutely free</strong>.</p><p><strong>Traveling overseas?</strong> Access your usual services (or even sign up to their free trials) with <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN (save 75%)</strong></a>.</p><h2 class="article-body__section" id="section-how-to-watch-margo-s-got-money-troubles-around-the-world"><span>How to watch 'Margo’s Got Money Troubles' around the world</span></h2><div class="product"><a data-dimension112="736a6dd4-cac9-488c-a480-d5763f82c290" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>"Margo’s Got Money Troubles" premieres globally on <a href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="736a6dd4-cac9-488c-a480-d5763f82c290" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> on <strong>Wednesday, April 15</strong> with its first three episodes. The remaining five instalments will then drop weekly each Wednesday.</p><p>There's an <a href="https://tv.apple.com" target="_blank" rel="nofollow"><strong>Apple TV 7-day free trial</strong></a> for new customers in most territories, and new Apple purchases often come with 1-3 months of Apple TV for free.</p><p>After that, prices for the streaming platform is as follows:</p><p>🇺🇸 In the U.S. prices start at $12.99/month.<br>🇨🇦 In Canada prices start at CA$14.99/month.<br>🇬🇧 In the U.K. prices start at £9.99/month.<br>🇦🇺 In Australia prices start at AU$15.99/month.</p><p>If Apple TV is blocked where you are, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> will help you to access your streams as if you were back home.<a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="736a6dd4-cac9-488c-a480-d5763f82c290" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-margo-s-got-money-troubles-from-anywhere-in-the-world"><span>Watch 'Margo’s Got Money Troubles' from anywhere in the world</span></h2><p>Away from home at the moment and blocked from watching "Margo’s Got Money Troubles" on your Apple TV subscription?</p><p>You can still watch the show thanks to the wonders of a VPN (Virtual Private Network). The software allows your devices to appear to be back in your home country regardless of where in the world you are. So ideal for viewers away on vacation or on business. Our favorite is <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow">NordVPN</a>. It's the <a href="https://www.tomsguide.com/best-picks/best-vpn">best VPN</a> on the market:</p><div class="product"><a data-dimension112="77fe3a54-f6c0-41f2-aa6f-2ebd77b6d186" data-action="Deal Block" data-label="NordVPN deal: 3 months extra FREE" data-dimension48="NordVPN deal: 3 months extra FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="77fe3a54-f6c0-41f2-aa6f-2ebd77b6d186" data-action="Deal Block" data-label="NordVPN deal: 3 months extra FREE" data-dimension48="NordVPN deal: 3 months extra FREE" data-dimension25=""><strong>NordVPN deal: 3 months extra FREE</strong></a></p><p>Boasting super fast speeds, great features, streaming power and industry-leading security, <a href="https://www.tomsguide.com/reviews/nordvpn-review" target="_blank"><strong>NordVPN</strong> is our #1 VPN</a>.<br><br><strong>✅ 30-day money-back guarantee</strong><br><strong>✅ Get 3 months extra free</strong><br><strong>✅ 75% off the usual price</strong></p><p>Use NordVPN to unblock your usual streaming service and watch "Margo’s Got Money Troubles" now with this <em>exclusive </em>deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="77fe3a54-f6c0-41f2-aa6f-2ebd77b6d186" data-action="Deal Block" data-label="NordVPN deal: 3 months extra FREE" data-dimension48="NordVPN deal: 3 months extra FREE" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-margo-s-got-money-troubles-episodes-schedule"><span>'Margo’s Got Money Troubles' episodes & schedule</span></h3><p>"Margo’s Got Money Troubles" will run for eight episodes, with the confirmed premiere dates below:<em> </em></p><ul><li><strong>Episode 1</strong> — Wednesday, April 15</li><li><strong>Episode 2</strong> — Wednesday, April 15</li><li><strong>Episode 3</strong> — Wednesday, April 15</li><li><strong>Episode 4</strong> — Wednesday, April 22</li><li><strong>Episode 5</strong> — <strong> </strong>Wednesday, April 29</li><li><strong>Episode 6</strong> — Wednesday, May 6</li><li><strong>Episode 7</strong> — Wednesday, May 13</li><li><strong>Episode 8</strong> — Wednesday, May 20</li></ul><h3 class="article-body__section" id="section-margo-s-got-money-troubles-trailer"><span>'Margo’s Got Money Troubles' trailer</span></h3><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/AjI52haEerU" allowfullscreen></iframe></div></div><h3 class="article-body__section" id="section-margo-s-got-money-troubles-cast"><span>'Margo’s Got Money Troubles' cast</span></h3><ul><li><strong>Elle Fanning</strong> as Margo Millet</li><li><strong>Michelle Pfeiffer</strong> as Shyanne Millet</li><li><strong>Nick Offerman</strong> as Jinx Millet</li><li><strong>Nicole Kidman</strong> as Lace</li><li><strong>Thaddea Graham</strong> as Susie</li><li><strong>Marcia Gay Harden</strong> as Elizabeth</li><li><strong>Michael Angarano</strong> as Mark</li><li><strong>Greg Kinnear</strong> as Kenny</li><li><strong>Bagus Susilo</strong> as Morgan</li></ul><h2 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h2><ul><li><a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-april-2026" target="_blank">Everything new on Apple TV in April 2026</a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn" target="_blank">The best streaming VPNs</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-the-boys-season-5" target="_blank">How to watch ‘The Boys’ season 5 online — stream comic superhero series from anywhere</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 Apple TV shows trending this weekend — including a sleek, slow-burn mystery everyone is obsessed with (April 11-12) ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/3-apple-tv-shows-trending-this-weekend-including-a-sleek-slow-burn-mystery-everyone-is-obsessed-with-april-11-12</link>
                                                                            <description>
                            <![CDATA[ Looking for what to watch this weekend? These Apple TV shows are the perfect bite-sized binge-watch to wind down with. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7jURNUbtpJR4x9z2RcY3RV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4VdQw8T8Xz9Cct4TixYkfc-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 11 Apr 2026 18:53:45 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alyse Stanley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/BxNnQuBWRHqkv5xWZsjrjc.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Alyse Stanley is a news editor at Tom’s Guide, overseeing weekend coverage and writing about the latest in tech, gaming, and entertainment. Before Tom’s Guide, Alyse worked as an editor for the Washington Post’s sunsetted video game section, Launcher, where she also wrote about indie games you shouldn’t miss, how to tackle your gaming backlog, and all things Nintendo. She previously led Gizmodo’s weekend news desk covering breaking tech news and has written game reviews and features for outlets like Polygon, Unwinnable, and Rock, Paper, Shotgun. A recent Chicago-area transplant born and raised in Virginia, Alyse is a big fan of horror movies, cartoons, and roller skating. She&#039;s also a puzzle fan and can often be found contributing to the NYT Connections coverage on Tom&#039;s Guide &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/4VdQw8T8Xz9Cct4TixYkfc-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV logo on a yellow rays background]]></media:description>                                                            <media:text><![CDATA[Apple TV logo on a yellow rays background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV logo on a yellow rays background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4VdQw8T8Xz9Cct4TixYkfc-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Sure, Apple TV lacks the variety of some of <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">the best streaming services</a> like <a href="https://www.tomsguide.com/reviews/netflix">Netflix</a> or <a href="https://www.tomsguide.com/reviews/prime-video">Prime Video</a>, but what its library lacks in depth it more than makes up for in quality. Apple TV's catalogue is packed with a solid lineup of movies and shows that deserve a spot on any watchlist, though there are three trending shows that everyone's talking about (including one that just kicked of its highly anticipated second season) that you should check out first. </p><p>To save you from endless scrolling through Apple TV, I've put together a list of must-see shows that'll hook you from the first episode but are short enough to binge over a weekend. That includes a darkly funny crime caper led by Jon Hamm, a multigenerational family drama that unfolds over decades, and a black comedy that's one of my personal favorites for it's satisfying twists and turns. So without further ado, here are the best Apple TV shows to binge-watch this weekend.</p><h2 id="your-friends-neighbors">'Your Friends & Neighbors'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/iVRFMd6dEOE" allowfullscreen></iframe></div></div><p>Apple's so confident in "Your Friends & Neighbors," its Jon Hamm-led dark comedy crime drama, that it's already renewed the series for a third season after season 2 wraps up in June. Hamm stars as Andrew “Coop” Cooper, a disgraced hedge fund manager who finds himself divorced and jobless and resorts to stealing from his neighbors' homes in Westmont Village to maintain the glitzy lifestyle he's become accustomed to. In season two, which kicked off earlier this month with a two-episode premiere, he doubles down on pilfering his social circle, and it puts him in the crosshairs of a dangerous new neighbor, played by James Marsden. His arrival throws another wrench into Coop's plan, upsetting the delicate Westport ecosystem just as middle-age malaise catches up with the neighborhood's smoothest criminal. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><em><strong>"Your Friends & Neighbors" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="pachinko">'Pachinko'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/O1r5XXJOYNA" allowfullscreen></iframe></div></div><p>"Pachinko" isn’t just aone of the <a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">best Apple TV shows</a>—it ranks as one of the finest television dramas ever made. Celebrated by both critics and viewers, its first season earned a remarkable 97% on Rotten Tomatoes, while the second earned an even rarer perfect 100%. This adaptation of Min Jin Lee's bestselling novel is a sweeping, multi-generational saga of a Korean family led by matriarch Kim Sunja (Yuh-Jung Youn). A fling with wealthy businessman Koh Hansu (Lee Min-ho) upends her life when she becomes pregnant with his child, forcing her to make difficult choices to keep her family safe. The storyline jumps between decades as the family moves to Japan and navigates living as second-class citizens during and after World War II. Sunja's sons manage to carve out a place for themselves in the heavily stigmatized pachinko business, but remain shackled by deep-rooted prejudice surrounding their heritage even as their work pulls their family out of poverty.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/pachinko/umc.cmc.17vf6g68dy89kk1l1nnb6min4" target="_blank" rel="nofollow"><em><strong>"Pachinko" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="bad-sisters">'Bad Sisters'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/IZUrhfCl0Xc" allowfullscreen></iframe></div></div><p>I'll admit, I'm biased when it comes to "Bad Sisters," as one of three sisters myself. It's by far the Apple TV show I recommend the most to people, both because its pitch black comedy is a riot and because its central mystery keeps you guessing until the very end who, if anyone, is going to come out of this mess unscathed. It follows the tight-knit Garvey sisters—Grace (Anne-Marie Duff), Eva (Sharon Horgan), Ursula (Eva Birthistle), Bibi (Sarah Greene), and Becka (Eve Hewson)—who vowed to always look out for one another after losing their parents young. However, when Grace’s husband, John Paul (Claes Bang), turns out to be far from the nice guy he pretends to be, their bond is put to the test. His funeral kicks off the show, but the real mystery is how he died, and dodgy insurance agent Tom Claffin (Brian Gleeson) is determined to find out which Garvey sister is the culprit. </p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/bad-sisters/umc.cmc.14kr4vv65unannh7doqgvlh20" target="_blank" rel="nofollow"><em><strong>"Bad Sisters" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-april-2026">Everything new on Apple TV in April 2026</a></li><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV for free</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/after-watching-the-for-all-mankind-season-5-premiere-im-glad-one-of-my-favorite-shows-is-back-even-if-its-a-bit-of-a-mess">After watching the 'For All Mankind' season 5 premiere, I’m glad one of my favorite shows is back — even if it’s a bit of a mess</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ ‘The Testaments’ review: ‘The Handmaid’s Tale’ sequel is still timely and chilling, but feels a bit tired ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/the-testaments-review-the-handmaids-tale-sequel-is-still-timely-and-chilling-but-feels-a-bit-tired</link>
                                                                            <description>
                            <![CDATA[ Our "The Testaments" review explores why "The Handmaid's Tale" sequel is a chillingly timely mirror of our current political climate, yet struggles to find a fresh narrative voice beyond the shadow of the original show. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">44TcdEyaSA2QKiipJsFnQN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mja65pQWyUvjN8mzpC7X73-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 08 Apr 2026 05:45:00 +0000</pubDate>                                                                                                                                <updated>Wed, 08 Apr 2026 18:37:05 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ kelly.woo@futurenet.com (Kelly Woo) ]]></author>                    <dc:creator><![CDATA[ Kelly Woo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jpnR8RZd8njtxaHRHimzsi.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Kelly is the managing editor of streaming for Tom’s Guide, so basically, she watches TV for a living. She writes news, features and reviews about the streaming realm — hardware, software and content. In a given week, she might test a new Roku stick, check out an interface update on HBO Max, sound off on the trailer for a new Netflix show and provide info on how to watch a fan-favorite series. &lt;/p&gt;&lt;p&gt;In addition to streaming coverage, she also occasionally contributes to the fitness and home sections.&lt;/p&gt;&lt;p&gt;Before joining Tom&#039;s Guide, she was a freelance entertainment writer for Yahoo, Vulture, TV Guide and other outlets and a content creator for HBO, Apple and DotDash. Prior to that, she was a senior editor at AOL Television and Moviefone. She graduated from Duke University with a degree in English literature.&lt;/p&gt;&lt;p&gt;When she’s not watching TV and movies for work, she’s watching them for fun, plus seeing live music, writing songs, knitting and gardening.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/mja65pQWyUvjN8mzpC7X73-1280-80.jpg">
                                                            <media:credit><![CDATA[Hulu]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Lucy Halliday and Chase Infiniti in The Testaments]]></media:description>                                                            <media:text><![CDATA[Lucy Halliday and Chase Infiniti in The Testaments]]></media:text>
                                <media:title type="plain"><![CDATA[Lucy Halliday and Chase Infiniti in The Testaments]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mja65pQWyUvjN8mzpC7X73-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'The Testaments'</div><div class="fancy_box_body"><p class="fancy-box__body-text"><em><strong>Rating: </strong></em>3/5<strong> </strong>stars</p><p class="fancy-box__body-text"><em><strong>Verdict:</strong></em> "The Testaments" is polished, well-acted and still uncomfortably relevant, given today’s political climate. But for all its timely themes, it struggles to break free from "The Handmaid’s Tale’s" shadow, often feeling like a rehash rather than a reinvention. Worth watching for the performances, especially Chase Infiniti, but not exactly essential viewing.</p><p class="fancy-box__body-text"><em><strong>Release schedule: </strong></em>Episodes 1-3 streaming now, then once weekly every Wednesday at 12 a.m. ET.</p><p class="fancy-box__body-text"><em><strong>Where to watch: </strong></em><a data-analytics-id="inline-link" href="https://click.linksynergy.com/fs-bin/click?id=kXQk6%2aivFEQ&offerid=1589248.206&type=3&subid=0&u1=hawk-custom-tracking" target="_blank" data-rewrite="keep">Hulu</a></p></div></div><p>To be honest, I wasn’t exactly clamoring to go back to Gilead.</p><p>By the time "The Handmaid’s Tale" wrapped, it already felt like a show that had said what it needed to say — and then kept saying it, again and again, just in case we missed it the first five times. The biggest problem facing the next chapter in Margaret Atwood’s dystopian universe might not be anything "The Testaments" does, but that its predecessor simply went on too long.</p><p>After watching the first three episodes, my reaction is less excitement and more exhaustion. This is a well-made show. It’s timely, polished and full of strong performances. But it also feels like slipping back into a story that’s running on muscle memory.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguideentertainment/video/7626444020192922893" data-video-id="7626444020192922893" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@tomsguideentertainment" href="https://www.tiktok.com/@tomsguideentertainment">@tomsguideentertainment</a>                            <p></p><a target="_blank" title="♬ original sound - Jwlpiano_🎹 - 🎹Jwlpiano_🕊️" href="https://www.tiktok.com/music/original-sound-Jwlpiano🎹-7293178723644230401">♬ original sound - Jwlpiano_🎹 - 🎹Jwlpiano_🕊️</a></section>                    </blockquote></div>                <h2 id="what-is-the-testaments-about">What is 'The Testaments' about?</h2><p>"The Testaments" shifts the focus to a younger generation — girls who didn’t just survive Gilead, but were raised in it. That’s a smart pivot on paper. Instead of June’s outsider perspective, we get Agnes (Chase Infiniti), the daughter of a high-ranking Commander, who’s grown up believing this is just how the world works.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/KpWyxrPqkeA" allowfullscreen></iframe></div></div><p>Agnes is a “Plum,” which basically means she’s being prepped for marriage like it’s a debutante ball from hell. She wears purple, attends a finishing school run by Aunt Lydia (Ann Dowd, still unsettling), and is taught — explicitly and implicitly — that her entire purpose is to become someone’s wife and, ideally, a mother.</p><p>Then there’s Daisy (Lucy Halliday), a newcomer from Canada who’s been recruited into Gilead and doesn’t quite buy what they’re selling. When she’s paired with Agnes, you can see the show lining up its central dynamic: believer meets skeptic, system meets disruption, etc.</p><p>The problem is you already know where all of this is going. That slow unraveling of belief? The creeping realization that Gilead is rotten to its core? The small acts of rebellion that build toward something bigger? We've seen it. "The Handmaid’s Tale" already spent six seasons circling the same themes. Even when "The Testaments" tries to reframe things through a coming-of-age lens — friendships, crushes, giggles, mean-girl dynamics — it still lands in very familiar territory.</p><h2 id="verdict-still-relevant-maybe-too-much-but-frustratingly-familiar">Verdict: Still relevant (maybe too much) but frustratingly familiar</h2><p>If there’s a reason to stick with "The Testaments," it’s Chase Infiniti. She’s excellent here, proving that her star-making turn in "One Battle After Another" was not a one-hit wonder. </p><p>Agnes is a tricky character because so much of her arc is internal at this point. She’s not rebelling (yet), not breaking rules in any major way. She’s just starting to question, starting to feel that something is off. Infiniti plays that beautifully. It’s all in the eyes, the bit of hesitation, the tiny changes in how Agnes carries herself and approaches others. You can see the gears turning, even when she can’t say any of it out loud.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9xBmxfhVgLguEHpYBuneU4" name="testaments-infiniti" alt="Chase Infiniti in The Testaments" src="https://cdn.mos.cms.futurecdn.net/9xBmxfhVgLguEHpYBuneU4.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Hulu)</span></figcaption></figure><p>The rest of the cast is great, too. Lucy Halliday brings edge and spark to Daisy, and Ann Dowd slips back into Aunt Lydia mode like she never left. And on a technical level, the show is exactly what you’d expect: It looks great, the production design is meticulous, everything is very presti­ge TV.</p><p>And to be clear, the story this show is telling still matters. Maybe more than ever. The themes of control, bodily autonomy, indoctrination — none of that has lost its bite, especially given the current political climate in the U.S. If anything, "The Testaments" feels a little too real at times.</p><p>But that’s also what makes its sense of repetition more frustrating. Because when a show is this relevant, I want it to push forward and say something sharper and dig deeper. I want it to be an "Andor." Instead, "The Testaments" often feels like it’s rehashing the same ideas "The Handmaid’s Tale" already explored, just from a slightly different vantage point. </p><p>I’ll keep watching. For Infiniti, mostly, and for the hope that it finds a fresher angle as it goes. But three episodes in, "The Testaments" feels less like a bold new chapter and more like a story we already know, told one more time.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/streaming/ive-watched-a-lot-of-shows-in-2026-so-far-heres-the-5-best">I watch TV for a living and these are the 5 shows for 2026 I’d actually recommend</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/xo-kitty-season-3-review-the-netflix-teen-dramedy-returns-with-a-charming-new-season-and-a-welcome-guest-star">'XO, Kitty' season 3 review: The Netflix teen dramedy returns with a charming new season — and a welcome guest star</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/im-not-a-binge-watcher-but-i-finished-all-3-seasons-of-this-mystery-thriller-on-prime-video-in-just-2-nights">I'm not a binge-watcher, but I finished all 3 seasons of 'Departure' on Prime Video in just 2 nights</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Your Friends & Neighbors' season 2 online from anywhere  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/watch-your-friends-and-neighbors-season-2</link>
                                                                            <description>
                            <![CDATA[ Here's how to watch 'Your Friends & Neighbors' season 2 from anywhere, including the release schedule, regional streaming details. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">nJJg4UpSCFoMymtsVacnyQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/cpmKnLRXaVNELUE4TrdLkB-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 03 Apr 2026 04:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Caroline Preece ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/s3Tee49LANgRMebYz2MZnF.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Caroline is a freelance writer and product tester for Tom’s Guide, translating hands-on testing into clear reviews, buying advice, and how-tos. Previously a writer and smart home editor across Future titles including Livingetc, Homes &amp; Gardens, and TechRadar, she brings 15 years’ experience covering consumer tech, appliances, and home gadgets. Her focus is real-world performance, usability, and value, with an eye for the details that matter in everyday life. Based in a cozy Suffolk apartment, Caroline tests products where they’re used most, at home, and helps readers cut through the noise to choose the right gear with confidence for their homes.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/cpmKnLRXaVNELUE4TrdLkB-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Your Friends and Neighbors S2 on Apple TV]]></media:description>                                                            <media:text><![CDATA[Your Friends and Neighbors S2 on Apple TV]]></media:text>
                                <media:title type="plain"><![CDATA[Your Friends and Neighbors S2 on Apple TV]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/cpmKnLRXaVNELUE4TrdLkB-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple clearly has confidence in "Your Friends & Neighbors". Season 2 premieres on Friday, April 3, 2026, and the series has already been renewed for a third season.</p><p>Below, we’ll show you how to watch "Your Friends & Neighbors" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere in the world with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Your Friends & Neighbors' season 2 release date and time</div><div class="fancy_box_body"><p class="fancy-box__body-text">'Your Friends & Neighbors' season 2 premieres globally on Apple TV on <strong>Friday, April 3, 2026</strong>, with episode 1. New episodes then arrive weekly every Friday until the finale on June 5, 2026.<br><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br><strong>• Watch from </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>anywhere with NordVPN</strong></a></p></div></div><p>The dark comedy crime drama follows disgraced hedge fund manager Andrew "Coop" Cooper, who turned to robbing his wealthy neighbors after his life fell apart. In the new season, he doubles down on that choice, only to find himself dealing with a dangerous new neighbor played by James Marsden.</p><p>If you missed season 1, this is a good moment to catch up. All nine episodes are already streaming on Apple TV, and season 2 will run for 10 episodes through June 5.</p><p>Below, you'll find the full rollout and the simplest way to watch "Your Friends & Neighbors" wherever you are.</p><h2 class="article-body__section" id="section-how-to-watch-your-friends-neighbors-season-2-on-apple-tv"><span>How to watch 'Your Friends & Neighbors' season 2 on Apple TV+</span></h2><div class="product"><a data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>"Your Friends & Neighbors" premieres on <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> in the U.S., U.K., Australia, and Canada on <strong>Friday, March 13, 2026</strong>.</p><p>An Apple TV+ subscription is what you will need with the cheapest available prices in each country listed below:<br><br><strong>U.S. — $12.99/month</strong><br><strong>U.K. — £9.99/month</strong><br><strong>CAN — CA$14.99/month</strong><br><strong>AUS — AU$15.99/month</strong><a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-your-friends-neighbors-season-2-from-anywhere"><span>Watch 'Your Friends & Neighbors' season 2 from anywhere</span></h2><p>Traveling and locked out of your usual apps? A <a href="https://www.tomsguide.com/best-picks/best-vpn">VPN</a> can make your device appear to be back in your home country, so you can securely access the streaming services you already pay for while abroad.</p><p>We have tested plenty of options, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is still the best fit for most people. It offers fast, reliable connections, broad device support and a 30-day money-back guarantee, which makes it a practical choice if you just need something that works.</p><div class="product editors-choice"><div class="editors-choice__title">Editors Choice</div><a data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 70% Off + 3 Months FREE" data-dimension48="NordVPN deal: 70% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 70% Off + 3 Months FREE" data-dimension48="NordVPN deal: 70% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 70% Off + 3 Months FREE</strong></a><br><br>Boasting lightning fast speeds, great features, streaming power, and class-leading security, <strong>NordVPN</strong> is our #1 VPN.<br><br><strong>✅  3 months extra FREE!</strong><br><strong>✅  70% off usual price</strong><br><br>Use Nord to unblock your preferred coverage and watch <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 70% Off + 3 Months FREE" data-dimension48="NordVPN deal: 70% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-your-friends-neighbors-season-2-trailer"><span>'Your Friends & Neighbors' season 2 trailer</span></h3><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Eo0StesaFNY" allowfullscreen></iframe></div></div><h2 class="article-body__section" id="section-your-friends-neighbors-season-2-cast"><span>'Your Friends & Neighbors' season 2 cast</span></h2><ul><li>Anna Osceola as Maggie Haber</li><li>Jon Hamm as Andrew "Coop" Cooper</li><li>James Marsden as Owen Ashe </li><li>Amanda Peet as Mel Cooper </li><li>Olivia Munn as Samantha "Sam" Levitt </li><li>Aimee Carrero as Elena </li><li>Hoon Lee as Barney Choi </li></ul><h2 class="article-body__section" id="section-your-friends-neighbors-season-2-episode-guide"><span>'Your Friends & Neighbors' season 2 episode guide</span></h2><ul><li>Episode 1: April 3, 2026 </li><li>Episode 2: April 10, 2026 </li><li>Episode 3: April 17, 2026 </li><li>Episode 4: April 24, 2026 </li><li>Episode 5: May 1, 2026 </li><li>Episode 6: May 8, 2026 </li><li>Episode 7: May 15, 2026 </li><li>Episode 8: May 22, 2026 </li><li>Episode 9: May 29, 2026 </li><li>Episode 10: June 5, 2026 </li></ul><section class="article__schema-question"><h3>Is 'Your Friends & Neighbors' season 2 on Netflix?</h3><article class="article__schema-answer"><p>No. "Your Friends & Neighbors" season 2 is an <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> exclusive.</p></article></section><section class="article__schema-question"><h3>Can I binge 'Your Friends & Neighbors' season 2 on day one?</h3><article class="article__schema-answer"><p>No. <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> is releasing the season weekly, starting with episode 1 on April 3 and ending with episode 10 on June 5.</p></article></section><section class="article__schema-question"><h3>Do I need to watch season 1 first?</h3><article class="article__schema-answer"><p>You do not have to, but it will help. Season 1 sets up Coop's fall, the murder accusation he escaped, and the decision that pushes him further into crime at the end of the finale. All nine season 1 episodes are already on <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a>.</p></article></section><section class="article__schema-question"><h3>Where can I watch 'Your Friends & Neighbors' season 2?</h3><article class="article__schema-answer"><p>You can watch "Your Friends & Neighbors" season 2 in the <a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> app on Apple devices, smart TVs, streaming sticks, games consoles and online at tv.apple.com.</p></article></section><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/round-up/best-apple-tv-apps">Best Apple TV apps and games</a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn">The best streaming VPN</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv-plus/watch-pluribus-stream-new-sci-fi-drama">How to watch 'Pluribus' online</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Your Friends and Neighbors' season 2 — stream John Hamm Apple TV drama from anywhere ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/watch-your-friends-and-neighbors-season-2</link>
                                                                            <description>
                            <![CDATA[ Here's how to watch "Your Friends and Neighbors" season 2 on Apple TV from anywhere in the world as the 10 episode sophomore season promises too turn up the tension. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4aAjnKs9FDcQG8anhugtSY</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/s2pn6Dww3nL5mSPzi4mTFN-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 02 Apr 2026 22:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Bill Borrows ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xeK7rkjq8eWYnEFsoB9rka.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Bill Borrows is a leading journalist, feature writer and columnist. His work appears in most U.K. national newspapers from the &lt;a href=&quot;https://www.mirror.co.uk/sport/boxing/ricky-hatton-documentary-mental-health-30827644 )&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Daily Mirror&lt;/a&gt; to the &lt;a href=&quot;https://www.telegraph.co.uk/authors/b/bf-bj/bill-borrows/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Daily Telegraph&lt;/a&gt; but also in publications such as the &lt;a href=&quot;https://www.thetimes.co.uk/article/owen-farrell-on-england-the-six-nations-father-andy-and-the-art-of-leadership-dtt5t8vvw&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Times Magazine&lt;/a&gt; where he has produced exclusive interviews with rugby legend Owen Farrell and heavyweight World champion boxer &lt;a href=&quot;https://www.thetimes.co.uk/article/tyson-fury-after-depression-and-deontay-wilder-the-comeback-continues-&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Tyson Fury&lt;/a&gt;. He has been a regular contributor to the prestigious &lt;a href=&quot;https://www.radiotimes.com/author/billborrows/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Radio Times&lt;/a&gt; magazine (and online) for over 10 years and during that time, alongside cover interviews with major TV personalities, has covered programmes on everything from the Paralympics to poltergeists and the Qatar World Cup to the Iraq War. Work has also appeared in many other magazines, including Cosmopolitan, &lt;a href=&quot;https://www.marieclaire.co.uk/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Marie Clare&lt;/a&gt;, Grazia, Vogue Hommes International and TimeOut. &lt;/p&gt;&lt;p&gt;In a previous life he was Editor-at-Large at Loaded and &lt;a href=&quot;https://www.independent.co.uk/news/media/my-mentor-bill-borrows-on-hunter-s-thompson-6230842.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;interviewed his mentor&lt;/a&gt;, Hunter S. Thompson. He was also Editor-at-Large at Maxim magazine and Contributing Editor at Esquire and launch editor of both TimeOut Manchester and talkSPORT digital magazine. He is the author of the best-selling &lt;a href=&quot;https://www.amazon.co.uk/Hurricane-Turbulent-Life-Times-Higgins/dp/184354069X&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;The Hurricane&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: The Turbulent Life and Times of Alex Higgins&lt;/em&gt; - Sports Books of the Year The Times &amp; Sunday Telegraph, Books of the Year New Statesman - and also editor for several sport-related books including the &lt;a href=&quot;https://www.simonandschuster.com/books/The-talkSPORT-Book-of-Premier-League-Legends/Bill-Borrows/9781849839419&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;talkSPORT Book of Premier League Legends&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;and co-wrote the &lt;a href=&quot;https://www.amazon.co.uk/Talksport-Greatest-British-Sporting-Legends/dp/0857200933&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;talkSPORT 100 Greatest British Sporting Legends&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;with a lot of help from fellow journalist &lt;a href=&quot;https://www.tomsguide.com/author/tom-bailey&quot;&gt;Tom Bailey&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;On television he conceived and developed the &lt;a href=&quot;https://www.youtube.com/watch?v=IPDtcESrFWE )&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;Posh Pawn&lt;/em&gt;&lt;/a&gt; TV series for Channel 4 and was Associate Producer on the award-winning &lt;em&gt;Murder in the Outback&lt;/em&gt; for Channel Seven in Australia and &lt;a href=&quot;https://www.channel4.com/programmes/murder-in-the-outback&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Channel 4&lt;/a&gt; in the U.K.. A frequent contributor for BBC Radio 5, talkSPORT and talkRADIO, his areas of specialisation include sport, history, politics, TV and film. He is currently writing a biography of the greatest detective of the Victorian period and doesn’t get much free time but does admit to an addiction to true crime podcasts, following Manchester City football team and a weakness for Spanish food.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/s2pn6Dww3nL5mSPzi4mTFN-1280-80.png">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Sam Levitt (played by) Olivia Munn, Owen Ashe (James Marsden), Andrew &quot;Coop&quot; Cooper (Jon Hamm) and Grace Porter ( Heather Lind) are the... ahem... some of the &quot;Friends and Neighbors&quot; in season 2 of the hit show]]></media:description>                                                            <media:text><![CDATA[Sam Levitt (played by) Olivia Munn, Owen Ashe (James Marsden), Andrew &quot;Coop&quot; Cooper (Jon Hamm) and Grace Porter ( Heather Lind) are the... ahem... some of the &quot;Friends and Neighbors&quot; in season 2 of the hit show]]></media:text>
                                <media:title type="plain"><![CDATA[Sam Levitt (played by) Olivia Munn, Owen Ashe (James Marsden), Andrew &quot;Coop&quot; Cooper (Jon Hamm) and Grace Porter ( Heather Lind) are the... ahem... some of the &quot;Friends and Neighbors&quot; in season 2 of the hit show]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/s2pn6Dww3nL5mSPzi4mTFN-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>"Your Friends and Neighbors" season 2 is the highly anticipated sophomore season following the life and crimes of Andrew "Coop" Cooper (played by Jon Hamm), an ex-financial titan who now has more than a cash flow problem and a twisted way of solving it...<br><br>Here’s how to <strong>watch "Your Friends and Neighbors" season 2 online </strong><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with this VPN</strong></a> <strong>– and potentially for free!</strong></p><div  class="fancy-box"><div class="fancy_box-title">'Your Friends and Neighbors' - Release Dates & Streams</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Your Friends and Neighbors" premieres on <strong>Friday, April 3</strong> worldwide.<br><strong>• Global – </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br><strong>• Watch from anywhere – </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN (Try risk-free; 75% Off)</strong></a></p></div></div><p>He is a disgraced hedge fund manager (of course he is) and his decision to deal with his immediate lack of finances is to simply steal off those around him. The associated moral issues do not trouble him unduly and, in fact, seem to give him some kind of perverse thrill. Until a new billionaire arrives.</p><p>Owen Ashe (James Marsden) is an agent of chaos and his arrival immediately threatens Cooper's schemes, promises to expose him and poses a danger to everything he holds dear, including his family. How does he react? He doubles down of course. Buckle up.</p><p>Read on to find out all you need to watch <strong>"Your Friends and Neighbors" season 2 </strong>online from anywhere.</p><h2 class="article-body__section" id="section-watch-your-friends-and-neighbors-s2-on-apple-tv"><span>Watch 'Your Friends and Neighbors' S2 on Apple TV</span></h2><div class="product"><a data-dimension112="accf868b-5d88-4bef-bbb9-b3c6a7fd84a3" data-action="Deal Block" data-label=""Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)" data-dimension48=""Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>"Your Friends and Neighbors" season 2 premieres globally on </strong><a href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="accf868b-5d88-4bef-bbb9-b3c6a7fd84a3" data-action="Deal Block" data-label='"Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)' data-dimension48='"Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)' data-dimension25=""><strong>Apple TV (7-day FREE trial)</strong></a><strong> on Friday, April 3.</strong></p><p>You will not need to rent or buy it as it will come as part of your Apple TV subscription.<br><br>Prices for the streaming platforms are as follows:</p><p>🇺🇸 In the U.S. prices start at $12.99/month.<br>🇨🇦 In Canada prices start at CA$14.99/month.<br>🇬🇧 In the U.K. prices start at £9.99/month.<br>🇦🇺 In Australia prices start at AU$15.99/month.</p><p><strong>In many countries – such as the U.K – you can get Apple TV free for one week.</strong><a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="accf868b-5d88-4bef-bbb9-b3c6a7fd84a3" data-action="Deal Block" data-label=""Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)" data-dimension48=""Your Friends and Neighbors" season 2 premieres globally on Apple TV (7-day FREE trial)" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-watch-your-friends-and-neighbors-s2-anywhere"><span>Watch 'Your Friends and Neighbors' S2 anywhere</span></h2><p>Away from home at the moment and blocked from watching "Your Friends and Neighbors" season 2 (April 3) on your usual subscription?</p><p>Don't worry, you can still watch thanks to the wonders of a <a href="https://www.tomsguide.com/best-picks/best-vpn" target="_blank">VPN</a> (Virtual Private Network). The software allows your devices to appear to be back in your home country regardless of where in the world you are. So ideal for viewers away on vacation or on business. Our favorite is <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a>. It's the best on the market:</p><div class="product"><a data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN Deal: 75% Off + 3 Extra Months Free" data-dimension48="NordVPN Deal: 75% Off + 3 Extra Months Free" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN Deal: 75% Off + 3 Extra Months Free" data-dimension48="NordVPN Deal: 75% Off + 3 Extra Months Free" data-dimension25=""><strong>NordVPN Deal: 75% Off + 3 Extra Months Free</strong></a><br><br>Boasting lightning fast speeds, great features, streaming power, and class-leading security, <strong>NordVPN</strong> is our #1 VPN.<br><br><strong>✅ 3 months extra FREE!</strong><br><strong>✅ 70% off usual price</strong><br><strong>✅ Unblocks streaming services</strong><br><strong>✅ Secure & Private</strong></p><p>Use Nord to unblock Apple TV and watch "Your Friends and Neighbors" season 2 online with our <em><strong>exclusive</strong></em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="4a3cdc54-2872-42f2-b2c0-9c605bf70a88" data-action="Deal Block" data-label="NordVPN Deal: 75% Off + 3 Extra Months Free" data-dimension48="NordVPN Deal: 75% Off + 3 Extra Months Free" data-dimension25="">View Deal</a></p></div><p>It's really easy to use a VPN to watch "Your Friends and Neighbors" season 2.</p><p><strong>1. Install the VPN of your choice</strong>. As we've said, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our favorite.</p><p><strong>2. Choose the location you wish to connect to in the VPN app. </strong>For instance, if you want to watch it on your U.S. version of Apple TV, choose 'United States' from the list.</p><p><strong>3. Sit back and binge. </strong>Head to Apple TV, sign in, and watch "Your Friends and Neighbors" season 2 from any location.</p><h2 class="article-body__section" id="section-what-to-know-about-your-friends-and-neighbors-s2"><span>What to know about 'Your Friends and Neighbors' S2</span></h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Eo0StesaFNY" allowfullscreen></iframe></div></div><h2 id="your-friends-and-neighbors-season-2-cast">'Your Friends and Neighbors' season 2 - Cast</h2><ul><li><strong>Jon Hamm</strong> as Andrew "Coop" Cooper</li><li><strong>James Marsden</strong> as Owen Ashe</li><li><strong>Amanda Peet</strong> as Mel Cooper</li><li><strong>Olivia Munn</strong> as Samantha Levitt</li><li><strong>Heather Lind</strong> as Grace Porter</li><li><strong>Hoon Lee</strong> as Barney Choi</li><li><strong>Mark Tallman</strong> as Nick Brandes</li><li><strong>Lena Hall</strong> as Alison "Ali" Cooper</li><li><strong>Aimee Carrero</strong> as Elena</li><li><strong>Isabel Gravitt</strong> as Tori Cooper</li><li><strong>Donovan Colan</strong> as Hunter Cooper</li></ul><h3 class="article-body__section" id="section-your-friends-and-neighbors-season-2-episode-guide"><span>'Your Friends and Neighbors' season 2 - Episode guide</span></h3><ul><li><strong>Season 02 Episode 01</strong> - Friday, April 3</li><li><strong>S02 E02 </strong>-<strong> </strong>Fri, Apr 10</li><li><strong>S02 E03 </strong>- Fri, Apr 17</li><li><strong>S02 E04 </strong>- Fri, Apr 24</li><li><strong>S02 E05 </strong>- Fri, May 1</li><li><strong>S02 E06 </strong>- Fri, May 8</li><li><strong>S02 E07 </strong>- Fri, May 15</li><li><strong>S02 E08 </strong>- Fri, May 22</li><li><strong>S02 E09</strong> - Fri, May 29</li><li><strong>S02 E10</strong> - Fri, June 5</li></ul><section class="article__schema-question"><h3>Where is 'Your Friends and Neighbors' s2 filmed?</h3><article class="article__schema-answer"><p>The bulk of filming takes place in the <strong>Hudson Valley region</strong>, which doubles as the show’s fictional <strong>Westmont Village</strong> — a wealthy suburban enclave inspired by Westchester County. Several real places are used on screen, including: <a href="https://sleepyhollowcc.org/" target="_blank" rel="nofollow"><strong>Sleepy Hollow Country Club </strong></a><strong>(Briarcliff Manor)</strong> for golf and social scenes and <strong>Rye, New York</strong> for coastal suburban backdrops.</p></article></section><h2 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h2><ul><li><a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-april-2026"><strong>Everything new on Apple TV in April 2026</strong></a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn"><strong>Best streaming VPN</strong></a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-the-other-bennet-sister"><strong>How to watch The Other Bennet Sister</strong></a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I would definitely cancel Netflix for April 2026 —here's why ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/i-would-definitely-cancel-netflix-for-april-2026-heres-why</link>
                                                                            <description>
                            <![CDATA[ Here's why you should consider canceling Netflix in April 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">tSneM89xyrteDCxtQTHqeY</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mDNSZm5ah4asJu6kEVFqh7-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 31 Mar 2026 06:00:00 +0000</pubDate>                                                                                                                                <updated>Tue, 31 Mar 2026 13:56:30 +0000</updated>
                                                                                                                                            <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                <author><![CDATA[ kelly.woo@futurenet.com (Kelly Woo) ]]></author>                    <dc:creator><![CDATA[ Kelly Woo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jpnR8RZd8njtxaHRHimzsi.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Kelly is the managing editor of streaming for Tom’s Guide, so basically, she watches TV for a living. She writes news, features and reviews about the streaming realm — hardware, software and content. In a given week, she might test a new Roku stick, check out an interface update on HBO Max, sound off on the trailer for a new Netflix show and provide info on how to watch a fan-favorite series. &lt;/p&gt;&lt;p&gt;In addition to streaming coverage, she also occasionally contributes to the fitness and home sections.&lt;/p&gt;&lt;p&gt;Before joining Tom&#039;s Guide, she was a freelance entertainment writer for Yahoo, Vulture, TV Guide and other outlets and a content creator for HBO, Apple and DotDash. Prior to that, she was a senior editor at AOL Television and Moviefone. She graduated from Duke University with a degree in English literature.&lt;/p&gt;&lt;p&gt;When she’s not watching TV and movies for work, she’s watching them for fun, plus seeing live music, writing songs, knitting and gardening.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/mDNSZm5ah4asJu6kEVFqh7-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A TV with the Netflix logo sits behind a hand holding a remote]]></media:description>                                                            <media:text><![CDATA[A TV with the Netflix logo sits behind a hand holding a remote]]></media:text>
                                <media:title type="plain"><![CDATA[A TV with the Netflix logo sits behind a hand holding a remote]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mDNSZm5ah4asJu6kEVFqh7-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As the weather warms up and the urge to declutter kicks in, it’s a natural moment to give your streaming subscriptions a little cleanup. Streaming services, with their ever-increasing prices, are often the easiest place to trim without feeling too much of a loss.</p><p>Americans now spend an average of $84 a month on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a>, according to <a href="https://www.depositaccounts.com/blog/digital-subscription-inflation-study.html" target="_blank">Lending Tree</a>,  and with so many platforms in the mix, staying subscribed to all of them year-round doesn't make a lot of sense. A smarter approach is to rotate — keep what you’re actually watching and pause the rest until something really worth your time arrives.</p><p>For April 2026, I recommend canceling Netflix. Even the biggest streamer isn’t immune to a quieter stretch, and right now it’s an easy one to drop from your lineup, at least temporarily. Here’s why Netflix is the service to skip this month.</p><h2 id="why-i-d-cancel-netflix">Why I'd cancel Netflix</h2><p>Netflix feels like a staple, but after <a href="https://www.tomsguide.com/entertainment/netflix/netflix-quietly-rolls-out-yet-another-price-hike-heres-how-much-more-youll-have-to-pay">yet another price hike</a>, it’s been harder to justify the cost. </p><p>That’s not to say there isn’t plenty to watch. The library is massive, and you could easily spend hours just browsing. But for me, a streaming service earns its keep with can’t-miss originals — and this month, Netflix is coming up a little short. April's lineup has just a handful of major releases, most of which are stacked up toward the end of the month.</p><p>The exception to that is the third and final season of "XO, Kitty," which drops April 3. Kitty's journey to attend school in Korea is coming to an end. As senior year throws all sorts of big questions at her, Kitty can at least turn to her big sister for advice. Yep, Lara Jean Covey is heading to Seoul!</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/vPMcEabBQEU" allowfullscreen></iframe></div></div><p>The back half of the month has more to offer. "Beef" returns on April 16 with a new tale of anger, bitterness and revenge. Oscar Isaac and Carey Mulligan star as a country club manager and his wife, who have an argument that could end their marriage — one that's witnessed by an employee (Cailee Spaeny) and her fiancé (Charles Melton).</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/weZ2ZAcvXrU" allowfullscreen></iframe></div></div><p>Then there's the first "Stranger Things" spinoff, the animated "Tales From '85" on April 23. It takes place between the events of the second and third seasons of the OG series, and the Duffer brothers have said it's meant to evoke a Saturday morning cartoon. On the same day, "Running Point" season 2 continues Kate Hudson's question to run the <del>Lakers</del> family's basketball franchise.</p><p>And the last few days of April bring an two action thrillers: the movie "Apex" starring Charlize Theron, Taron Egerton and Eric Bana; and the series "Man on Fire" (based on the novel previously adapted into the 2004 film with Denzel Washington).</p><p>While I'm personally looking forward to "Beef" and "Running Point," I can wait a couple of weeks to binge both — and save money in the process.</p><h2 id="how-much-you-ll-save-by-canceling-netflix">How much you'll save by canceling Netflix</h2><p>If you drop Netflix from your streaming lineup in April, the savings are a bit more noticeable than they used to be. Following its latest price increase, plans now cost $8.99/month with ads, $19.99 for Standard and $26.99 for Premium. </p><p>Taking a month off can put $9 to $27 back in your pocket. It’s not a huge sum on its own, but it adds up quickly if you make a habit of rotating your subscriptions. Canceling just one or two services each month can save you well over $100 across the year without really changing your viewing habits. It’s an easy way to keep your budget in check while still dipping back in whenever a true must-watch finally lands.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WwzMAe"></div>                            </div>                            <script src="https://kwizly.com/embed/WwzMAe.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/how-to-get-free-netflix">How to get Netflix for free</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/what-streaming-costs-in-2026-the-price-of-netflix-disney-plus-max-and-more">What streaming costs in 2026</a></li><li><a href="https://www.tomsguide.com/best-picks/best-free-streaming-services">Best free streaming services</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Everything new on Apple TV in April 2026  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/everything-new-on-apple-tv-in-april-2026</link>
                                                                            <description>
                            <![CDATA[ Our guide on the new movies and shows coming to Apple TV Plus in April 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">MJ2te5g5PbtdMLSekULUdW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4VdQw8T8Xz9Cct4TixYkfc-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 29 Mar 2026 07:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Christina Izzo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/LMncQCRNbbLXxxjbfZJvWE.jpeg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/4VdQw8T8Xz9Cct4TixYkfc-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV logo on a yellow rays background]]></media:description>                                                            <media:text><![CDATA[Apple TV logo on a yellow rays background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV logo on a yellow rays background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4VdQw8T8Xz9Cct4TixYkfc-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The winter's <em>finally </em>gone, folks, and with the start of spring comes a fresh blooming of streaming titles to pick from. As you already know, <a href="https://www.tomsguide.com/reviews/apple-tv-plus">Apple TV</a> does a bit of spring cleaning through its sprawling selection of films and TV series every month, and April 2026 will be no exception, with the return of fan favorites and the debut of buzzy new titles.</p><p>Kicking off this month is the second season of "<a href="https://www.tomsguide.com/entertainment/streaming/shows-like-your-friends-and-neighbors">Friends & Neighbors</a>" with Jon Hamm back as financial titan-turned-white collar criminal Coop Cooper. Then we've got the premiere of "Outcome," a star-studded new flick from Jonah Hill, featuring the likes of Keanu Reeves, Cameron Diaz and Matt Bomer. </p><p>Later in the month, Oscar nominee Elle Fanning will lead the new David E. Kelly comedic series "Margo's Got Money Problems," and Matthew Rhys will anchor Katie Lippold's new horror-comedy show "Widow's Bay." There's also a second installment of "<a href="https://www.tomsguide.com/news/watch-criminal-record-online">Criminal Record</a>" on the way. Looking for what to queue up next? Keep scrolling for a closer look at what’s new on Apple TV this April. </p><h2 id="friends-neighbors-season-2">'Friends & Neighbors' season 2</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Eo0StesaFNY" allowfullscreen></iframe></div></div><p>Who knows what viral memes Jon Hamm will cook up this time as Andrew "Coop" Cooper, a former hedge fund manager who, after being fired in disgrace, has turned to a life of suburban crime against his affluent neighbors to keep up his own wealthy facade in Westmont Village. </p><p>There will certainly be even more criminal hijinks in the second season, which drops on Apple TV on Friday, April 3. But things will get complicated for Coop when his secret is threatened by the arrival of a charming but mysterious billionaire (played by "Paradise" star James Marsden) who moves in next door. Along with that splashy cast newcomer, season 2 will see returning stars including Amanda Peet, Olivia Munn, Hoon Lee, Mark Tallman, Lena Hall, Aimee Carrero, Eunice Bae, Isabel Gravitt and Donovan Colan.</p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/show/your-friends--neighbors/umc.cmc.74o37kzay0yuuub8iumddjsg" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting April 3</strong></em></p><h2 id="outcome">'Outcome'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/NQQqInahTAM" allowfullscreen></iframe></div></div><p>Directed and co-written by Jonah Hill, "Outcome" sees Hollywood icon Keanu Reeves playing — fittingly — a Hollywood icon named Reef Hawk, a sobered-up movie star who must confront his personal demons and past mistakes when he gets blackmailed with a mysterious video that could shatter his beloved image and end his acting career. Leaning on his lifelong best friends Kyle (Cameron Diaz) and Xander (Matt Bomer), as well as crisis lawyer Ira (Hill), Reef sets off to find out who's behind the damaging tape and make amends with those he's wronged in the past.</p><p>And just in case that cast isn't stacked enough for you, Hill has assembled a supporting ensemble that includes Drew Barrymore, Susan Lucci, Laverne Cox, David Spade, Atsuko Okatsuka, Roy Wood Jr., Kaia Gerber, Ivy Wolk and even Martin Scorsese. Catch the black comedy on Apple TV beginning Friday, April 10. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/movie/outcome/umc.cmc.3uvjztuy2y8ve2rj6nvgyop89" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting April 10</strong></em></p><h2 id="margo-s-got-money-troubles">'Margo's Got Money Troubles'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/AjI52haEerU" allowfullscreen></iframe></div></div><p>Fresh off her Oscar nom for 'Sentimental Value," Elle Fanning heads to the small screen with this Apple TV miniseries “Margo’s Got Money Troubles,” which is based on the bestselling Rufi Thorpe novel and created by David E. Kelley ("Big Little Lies," "Nine Perfect Strangers").</p><p>In the new family dramedy, Fanning (also an executive producer on the series) plays the titular Margo, a recent college dropout, an aspiring writer and the daughter of some unconventional parents: ex-Hooters waitress Shyanne (Michelle Pfeiffer) and ex-pro wrestler Jinx (Nick Offerman). After an unplanned pregnancy, and with single parenthood and piles of bills looming before her, Margot turns to OnlyFans to make ends meet.</p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> from April 15</strong></em></p><h2 id="criminal-record-season-2">‘Criminal Record' season 2</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/G_sohSQWHvg" allowfullscreen></iframe></div></div><p>The character-driven British crime thriller is back for a second season, beginning its eight-episode run Wednesday, April 22, when we'll catch up with Detective Chief Inspector Daniel Hegarty (Oscar winner Peter Capaldi) and Detective Sergeant June Lenker (Olivier nominee Cush Jumbo) as they take on more cases in contemporary London. </p><p>Season 2 sees the investigative duo forced into an uneasy alliance after a young man is stabbed to death at a political rally. As they dig deeper into the murder, their efforts escalate into a high-stakes undercover operation to thwart a far-right bomb plot targeting the heart of London. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/show/criminal-record/umc.cmc.1sbjeoma6tvxgda6l0h4bb0x3" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting April 22</strong></em></p><h2 id="widow-s-bay">'Widow's Bay'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/41f4xRSQV_g" allowfullscreen></iframe></div></div><p>Our title setting is a quaint island town off the coast of New England, where we meet town mayor Tom Loftis ("The Beast in Me" star Matthew Rhys), who is desperate to turn the place into a tourist destination and revive the struggling community. However, the superstitious locals of Widow's Bay believe the island to be cursed, a belief not shared by skeptical Tom — that is, until those old ghost stories start playing out in real life. </p><p>Created by Katie Dippold ("Parks and Recreation"), with Hiro Murai ("Atlanta," "Barry") directing, the 10-episode horror-comedy series will premiere its first three episodes on Sunday, April 29. Along with Rhys, town inhabitants will include Kate O'Flynn, Stephen Root, Kingston Rumi Southwick, Kevin Caroll and Dale Dickey. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting April 29</strong></em></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">31 best Apple TV Plus shows to watch now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-tv-just-landed-its-own-major-fantasy-franchise-and-it-could-be-even-better-than-peak-game-of-thrones">Apple TV just landed its own major fantasy franchise — and it could be even better than peak 'Game of Thrones'</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ After watching the 'For All Mankind' season 5 premiere, I’m glad one of my favorite shows is back — even if it’s a bit of a mess ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/after-watching-the-for-all-mankind-season-5-premiere-im-glad-one-of-my-favorite-shows-is-back-even-if-its-a-bit-of-a-mess</link>
                                                                            <description>
                            <![CDATA[ Apple's most ambitious show is back for a fifth season. Here's what you need to know to get up to speed with "For All Mankind." ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">NFTAovcBQoXU9f3BK6WZXg</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/phCmN3FW2HsjkPZsk7T5U5-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 27 Mar 2026 05:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ kelly.woo@futurenet.com (Kelly Woo) ]]></author>                    <dc:creator><![CDATA[ Kelly Woo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jpnR8RZd8njtxaHRHimzsi.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Kelly is the managing editor of streaming for Tom’s Guide, so basically, she watches TV for a living. She writes news, features and reviews about the streaming realm — hardware, software and content. In a given week, she might test a new Roku stick, check out an interface update on HBO Max, sound off on the trailer for a new Netflix show and provide info on how to watch a fan-favorite series. &lt;/p&gt;&lt;p&gt;In addition to streaming coverage, she also occasionally contributes to the fitness and home sections.&lt;/p&gt;&lt;p&gt;Before joining Tom&#039;s Guide, she was a freelance entertainment writer for Yahoo, Vulture, TV Guide and other outlets and a content creator for HBO, Apple and DotDash. Prior to that, she was a senior editor at AOL Television and Moviefone. She graduated from Duke University with a degree in English literature.&lt;/p&gt;&lt;p&gt;When she’s not watching TV and movies for work, she’s watching them for fun, plus seeing live music, writing songs, knitting and gardening.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/phCmN3FW2HsjkPZsk7T5U5-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Sean Kaufman in For All Mankind season 5]]></media:description>                                                            <media:text><![CDATA[Sean Kaufman in For All Mankind season 5]]></media:text>
                                <media:title type="plain"><![CDATA[Sean Kaufman in For All Mankind season 5]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/phCmN3FW2HsjkPZsk7T5U5-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'For All Mankind' season 5</div><div class="fancy_box_body"><p class="fancy-box__body-text"><em><strong>Rating: </strong></em>4/5<strong> </strong>stars</p><p class="fancy-box__body-text"><em><strong>Verdict:</strong></em> Season 5 of For All Mankind gets off to a slightly uneven start, weighed down by its own sprawling history. But the ambition, scale and character work are still there — and if the show finds its footing, it’s set up to stick the landing.</p><p class="fancy-box__body-text"><em><strong>Release schedule: </strong></em>Episode 1 is available to stream now. Episodes 2-10 drop weekly on Fridays.</p><p class="fancy-box__body-text"><em><strong>Where to watch: </strong></em><a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/for-all-mankind/umc.cmc.6wsi780sz5tdbqcf11k76mkp7" target="_blank" rel="nofollow">Apple TV</a></p></div></div><p>"For All Mankind" season 5 opens not with a bang, but with a nagging question: Um, what exactly happened last season? After the customary “here’s the state of the world” montage, I found myself pausing to pull up a recap of season 4 (this <a href="https://www.youtube.com/watch?v=Sujw4bPajE4" target="_blank">YouTube video</a> was very helpful). </p><p>"For All Mankind" is one of the most ambitious shows on television, constantly leaping forward in time and reshaping its world. And look, I love that big-swing energy, but we’ve reached a point where the timeline is moving so fast it’s starting to feel like homework is required. If you forget a character or plot point, you'll feel a bit lost.</p><p>After the recap and watching the premiere episode, the good news is that once you re-acclimate, the show does what it’s always done: pull you into a world that feels both expansive and oddly intimate, even when it’s in deep space.</p><h2 id="what-is-for-all-mankind-season-5-about">What is 'For All Mankind' season 5 about?</h2><p>At this point, "For All Mankind" has moved well beyond its original “what if the Soviets landed on the Moon first?” hook. The show is now less about space exploration and more about what comes after: Colonization has consequences; progress creates friction. </p><p>Season 5 picks up in 2012, with Mars no longer a frontier but a functioning — and increasingly restless — society. Happy Valley has evolved into a real community, complete with families, jobs and a new generation that’s grown up almost entirely off Earth. That includes Alex Poletov Baldwin (now played by Sean Kaufman), Kelly’s son, who’s now coming into his own alongside other young Mars-born characters figuring out what their future looks like and whether that future is tied to Earth at all.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/zojwKLlY_H8" allowfullscreen></iframe></div></div><p>Because that’s the real conflict of the season: Mars vs. Earth. The colonists want autonomy. Earth, unsurprisingly, wants control, especially since money, resources and political power are on the line. </p><p>Even as the show shifts focus to the next gen, it continues to track its legacy characters. Ed Baldwin (Joel Kinnaman) is — somehow, at the age of what must be 120 — still very much part of the picture. Aleida (Coral Peña) remains a key player, tethered to Margo (Wrenn Schmidt) in a relationship that’s as complicated as ever. And Kelly Baldwin (Cynthy Wu) and Dev Ayesa (Edi Gathegi) are still chasing their big-picture visions.</p><p>The premiere episode also introduces a murder mystery, adding a procedural element to the story that's a bit unusual for "For All Mankind." More on that later.</p><h2 id="here-comes-the-next-generation-but-old-faces-are-still-in-the-picture">Here comes the next generation (but old faces are still in the picture)</h2><p>That's just the tip of the asteroid. The premiere is trying to juggle a lot of plot threads and characters at once — maybe too many of them. The thing that made me pause and watch a recap was the appearance of Miles Dale (Toby Kebbell), the oil rig worker whose existence I'd completely forgotten.</p><p>I'm kind of shocked at how much of the show still revolves around Ed Baldwin. How is this man still alive? And why isn't he in some kind of elder prison for his role in the Goldilocks heist? The show acknowledges his age, but doesn’t really reckon with what that should mean.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="z243M6LacG5eHqPyL4H4sU" name="forallmankind-season5-edkelly" alt="Cynthy Wu and Joel Kinnaman in For All Mankind season 5" src="https://cdn.mos.cms.futurecdn.net/z243M6LacG5eHqPyL4H4sU.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>In a more believable turn, Aleida continues to be one of the show’s strongest characters, and her relationship with Margo (in prison, as she should be) is one of the few emotional threads that consistently lands. There’s deep history there, and the show wisely plays on it.</p><p>The newer additions help balance things out. Sean Kaufman, coming off "The Summer I Turned Pretty," is a strong fit as Alex. I'm intrigued to see how this Mars-raised kid grapples with adulthood in the coming interplanetary conflict.</p><p>Back to the murder mystery element ... I genuinely don't know what to feel. It feels tonally mismatched with the other storylines, though I'm sure the writers have a plan that will slowly be revealed over the course of the season. (I'm also perturbed that Gordo Steven's name has become a kind of throwaway joke to refer to people who die of atmospheric exposure.) That aside, I'm glad to see Mireille Enos as the cop investigating the case, and I hope we get a true "The Killing" reunion between her and Kinnaman.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uunVQodFTw2kvhm9uRdeEo" name="forallmankind-season5-enos" alt="Mireille Enos in For All Mankind season 5" src="https://cdn.mos.cms.futurecdn.net/uunVQodFTw2kvhm9uRdeEo.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><h2 id="verdict-big-messy-and-still-one-of-the-best-shows-on-television">Verdict: Big, messy and still one of the best shows on television</h2><p>Based on the first episode alone, season 5 of "For All Mankind" feels like a show in transition. It’s still wildly ambitious and operating on a scale most series wouldn’t attempt. But it’s also working through some growing pains as it figures out how to balance its legacy characters with its future, and how to keep its sprawling story from becoming unwieldy. </p><p>Even with a slightly uneven start, "For All Mankind" remains exactly what it’s always been: a little messy, thoroughly compelling and impossible to quit. And with the show recently renewed for a sixth and final season, there’s at least some reassurance that all of this is building toward a defined endgame.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X1AoAX"></div>                            </div>                            <script src="https://kwizly.com/embed/X1AoAX.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/paramount-plus/i-just-watched-all-6-episodes-of-the-madison-and-i-wish-i-hadnt">I just watched all 6 episodes of ‘The Madison,’ and I wish I hadn't</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/prime-videos-new-mystery-thriller-with-nicole-kidman-is-one-of-the-most-bingeable-series-of-2026-so-far">Prime Video’s new mystery thriller with Nicole Kidman is one of the most bingeable series of 2026 (so far)</a></li><li><a href="https://www.tomsguide.com/entertainment/hbo-max/rooster-review-another-winning-heartfelt-dramedy-from-the-creator-of-ted-lasso-and-shrinking">'Rooster' review: Another winning, heartfelt dramedy from the creator of 'Ted Lasso' and 'Shrinking'</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'For All Mankind' season 5 — stream sci-fi drama from anywhere in the world ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/how-to-watch-for-all-mankind-season-5-online</link>
                                                                            <description>
                            <![CDATA[ Tensions are growing between the populations of Earth and Mars as Apple TV’s ‘what if’ space drama returns for a 10-episode run. Here’s how to stream the show. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">jycDAQq6PVxZXmVHQVLRnB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/eurrLJYSsbusjhp6Se9Aee-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Fri, 27 Mar 2026 05:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Bill Borrows ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xeK7rkjq8eWYnEFsoB9rka.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Bill Borrows is a leading journalist, feature writer and columnist. His work appears in most U.K. national newspapers from the &lt;a href=&quot;https://www.mirror.co.uk/sport/boxing/ricky-hatton-documentary-mental-health-30827644 )&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Daily Mirror&lt;/a&gt; to the &lt;a href=&quot;https://www.telegraph.co.uk/authors/b/bf-bj/bill-borrows/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Daily Telegraph&lt;/a&gt; but also in publications such as the &lt;a href=&quot;https://www.thetimes.co.uk/article/owen-farrell-on-england-the-six-nations-father-andy-and-the-art-of-leadership-dtt5t8vvw&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Times Magazine&lt;/a&gt; where he has produced exclusive interviews with rugby legend Owen Farrell and heavyweight World champion boxer &lt;a href=&quot;https://www.thetimes.co.uk/article/tyson-fury-after-depression-and-deontay-wilder-the-comeback-continues-&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Tyson Fury&lt;/a&gt;. He has been a regular contributor to the prestigious &lt;a href=&quot;https://www.radiotimes.com/author/billborrows/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Radio Times&lt;/a&gt; magazine (and online) for over 10 years and during that time, alongside cover interviews with major TV personalities, has covered programmes on everything from the Paralympics to poltergeists and the Qatar World Cup to the Iraq War. Work has also appeared in many other magazines, including Cosmopolitan, &lt;a href=&quot;https://www.marieclaire.co.uk/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Marie Clare&lt;/a&gt;, Grazia, Vogue Hommes International and TimeOut. &lt;/p&gt;&lt;p&gt;In a previous life he was Editor-at-Large at Loaded and &lt;a href=&quot;https://www.independent.co.uk/news/media/my-mentor-bill-borrows-on-hunter-s-thompson-6230842.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;interviewed his mentor&lt;/a&gt;, Hunter S. Thompson. He was also Editor-at-Large at Maxim magazine and Contributing Editor at Esquire and launch editor of both TimeOut Manchester and talkSPORT digital magazine. He is the author of the best-selling &lt;a href=&quot;https://www.amazon.co.uk/Hurricane-Turbulent-Life-Times-Higgins/dp/184354069X&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;The Hurricane&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: The Turbulent Life and Times of Alex Higgins&lt;/em&gt; - Sports Books of the Year The Times &amp; Sunday Telegraph, Books of the Year New Statesman - and also editor for several sport-related books including the &lt;a href=&quot;https://www.simonandschuster.com/books/The-talkSPORT-Book-of-Premier-League-Legends/Bill-Borrows/9781849839419&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;talkSPORT Book of Premier League Legends&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;and co-wrote the &lt;a href=&quot;https://www.amazon.co.uk/Talksport-Greatest-British-Sporting-Legends/dp/0857200933&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;talkSPORT 100 Greatest British Sporting Legends&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;with a lot of help from fellow journalist &lt;a href=&quot;https://www.tomsguide.com/author/tom-bailey&quot;&gt;Tom Bailey&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;On television he conceived and developed the &lt;a href=&quot;https://www.youtube.com/watch?v=IPDtcESrFWE )&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;Posh Pawn&lt;/em&gt;&lt;/a&gt; TV series for Channel 4 and was Associate Producer on the award-winning &lt;em&gt;Murder in the Outback&lt;/em&gt; for Channel Seven in Australia and &lt;a href=&quot;https://www.channel4.com/programmes/murder-in-the-outback&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Channel 4&lt;/a&gt; in the U.K.. A frequent contributor for BBC Radio 5, talkSPORT and talkRADIO, his areas of specialisation include sport, history, politics, TV and film. He is currently writing a biography of the greatest detective of the Victorian period and doesn’t get much free time but does admit to an addiction to true crime podcasts, following Manchester City football team and a weakness for Spanish food.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/eurrLJYSsbusjhp6Se9Aee-1280-80.png">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                        <media:description><![CDATA[Sean Kaufman will join the cast for season 5 of &quot;For All Mankind&quot; as Alex Poletov]]></media:description>                                                            <media:text><![CDATA[Sean Kaufman will join the cast for season 5 of For All Mankind]]></media:text>
                                <media:title type="plain"><![CDATA[Sean Kaufman will join the cast for season 5 of For All Mankind]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/eurrLJYSsbusjhp6Se9Aee-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>"For All Mankind" season 5 brings us up to in 2012 — fresh from 2003 (season 4) — in the addictive ‘what if’ sci-fi drama that covers fictional game-changing moments in an alternative history of the world after the Soviet Union beat the U.S. to put a man on the moon in 1969...<br><br>Here’s how to watch "For All Mankind" season 5 from anywhere in the world using a <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'For All Mankind' season 5 - Release Dates & Streams</div><div class="fancy_box_body"><p class="fancy-box__body-text">"For All Mankind" season 5 premieres on <strong>Friday, March 27</strong> worldwide.<br><strong>• Global - </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/for-all-mankind/umc.cmc.6wsi780sz5tdbqcf11k76mkp7" target="_blank" rel="nofollow"><strong>Apple TV</strong></a><br><strong>• Watch from anywhere in the world using </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN (74% Off)</strong></a></p></div></div><p>It's a hybrid show with real-life historical figures played by actors, fictional characters and genuine archive footage in a reimagining of the world order since 1969 over, so the  the producers have promised, the course of seven seasons.  </p><p>In this 2012, humanity is in a much better place than actually seems to be the case today but there is tension between Earth and the colony ("Happy Valley") that has been settled on Mars to exploit mining opportunities.</p><p>But there is an "Earth First"-type motivation to stop spending money on the colony and an urge to take it under control while a growing desire for independence on the red planet foreshadows conflict. The tension plays out over ten episodes.</p><p>Read on to find out all you need to watch <strong>"For All Mankind" season 5</strong> online from anywhere.</p><h2 class="article-body__section" id="section-how-to-watch-for-all-mankind-s5-on-apple-tv"><span>How to watch 'For All Mankind' s5 on Apple TV</span></h2><div class="product"><a data-dimension112="736a6dd4-cac9-488c-a480-d5763f82c290" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/us/show/for-all-mankind/umc.cmc.6wsi780sz5tdbqcf11k76mkp7" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>"For All Mankind" season 5 premieres globally on <a href="https://tv.apple.com/us/show/for-all-mankind/umc.cmc.6wsi780sz5tdbqcf11k76mkp7" target="_blank" rel="nofollow" data-dimension112="736a6dd4-cac9-488c-a480-d5763f82c290" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> on <strong>Friday, March 27</strong>.</p><p>You will not need to rent or buy it as it will come as part of your Apple TV subscription.<br><br>Prices for the streaming platform is as follows:</p><p>🇺🇸 In the U.S. prices start at $12.99/month.<br>🇨🇦 In Canada prices start at CA$14.99/month.<br>🇬🇧 In the U.K. prices start at £9.99/month.<br>🇦🇺 In Australia prices start at AU$15.99/month.<a class="view-deal button" href="https://tv.apple.com/us/show/for-all-mankind/umc.cmc.6wsi780sz5tdbqcf11k76mkp7" target="_blank" rel="nofollow" data-dimension112="736a6dd4-cac9-488c-a480-d5763f82c290" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-how-to-watch-for-all-mankind-season-5-from-anywhere-in-the-world"><span>How to watch 'For All Mankind' season 5 from anywhere in the world</span></h2><p>Away from home at the moment and blocked from watching "For All Mankind" season 5 on your usual subscription.</p><p>Don't worry, you can still watch the show thanks to the wonders of a <a href="https://www.tomsguide.com/best-picks/best-vpn"><strong>VPN</strong></a> (Virtual Private Network). The software allows your devices to appear to be back in your home country regardless of where in the world you are. So ideal for viewers away on vacation or on business. Our favorite is <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a>. It's the best on the market:</p><div class="product"><a data-dimension112="77fe3a54-f6c0-41f2-aa6f-2ebd77b6d186" data-action="Deal Block" data-label="NordVPN Deal: 74% Off + 3 Extra Months Free" data-dimension48="NordVPN Deal: 74% Off + 3 Extra Months Free" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="77fe3a54-f6c0-41f2-aa6f-2ebd77b6d186" data-action="Deal Block" data-label="NordVPN Deal: 74% Off + 3 Extra Months Free" data-dimension48="NordVPN Deal: 74% Off + 3 Extra Months Free" data-dimension25=""><strong>NordVPN Deal: 74% Off + 3 Extra Months Free</strong></a><br><br>Boasting lightning fast speeds, great features, streaming power, and class-leading security, <strong>NordVPN</strong> is our #1 VPN.<br><br><strong>✅ 3 months extra FREE!</strong><br><strong>✅ 74% off usual price</strong><br><br>Use Nord to unblock Apple TV and watch "For All Mankind" season 5 online with our <em><strong>exclusive</strong></em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="77fe3a54-f6c0-41f2-aa6f-2ebd77b6d186" data-action="Deal Block" data-label="NordVPN Deal: 74% Off + 3 Extra Months Free" data-dimension48="NordVPN Deal: 74% Off + 3 Extra Months Free" data-dimension25="">View Deal</a></p></div><p>It's really easy to use a VPN to watch "For All Mankind" season 5 </p><p><strong>1. Install the VPN of your choice</strong>. As we've said, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our favorite.</p><p><strong>2. Choose the location you wish to connect to in the VPN app. </strong>For instance, if you want to watch it on the U.S. version of Apple TV, choose 'United States' from the list.</p><p><strong>3. Sit back and enjoy the action. </strong>Head to Apple TV, sign in, and watch "For All Mankind" season 5.</p><h2 class="article-body__section" id="section-for-all-mankind-season-5-need-to-know"><span>'For All Mankind' season 5 — Need to Know</span></h2><h2 id="for-all-mankind-season-5-trailer">'For All Mankind' season 5 — Trailer</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/zojwKLlY_H8" allowfullscreen></iframe></div></div><h2 id="for-all-mankind-season-5-cast">'For All Mankind' season 5 — Cast</h2><ul><li><strong>RETURNING CAST</strong></li><li>Joel Kinnaman as Edward Baldwin</li><li>Edi Gathegi as Dev Ayesa</li><li>Cynthy Wu as Kelly Baldwin</li><li>Coral Peña as Aleida Rosales</li><li>Wrenn Schmidt as Margo Madison</li><li>Toby Kebbell as Miles Dale</li><li>Dimiter D. Marinov as Ilya Breshov</li><li>Randy Oglesby as James Bragg</li><li>Myk Watford as Palmer James</li><li>Shannon Lucio as Amanda Dale</li><li><strong> NEW CAST</strong></li><li>Mireille Enos as Celia Boyd</li><li>Costa Ronin as Leonid "Lenya" Polivanov</li><li>Tyler Labine as Fred</li><li>Michael Klesic as Oleg Vyshinsky</li><li>Sean Kaufman as Alex Poletov</li><li>Ruby Cruz as Lily Dale</li><li>Ines Asserson as A.J. Jarrett</li><li>Barrett Carnahan as Marcus</li><li>Choi Ban-ya as Nam Moon Yeong</li></ul><h2 id="for-all-mankind-season-5-episode-guide">'For All Mankind' season 5 — Episode guide</h2><ul><li><strong>Season 5 Episode 1: "First Light" </strong>—<strong> </strong>Mar. 27</li><li><strong>Season 5 Episode 2: "The Hard Six" </strong>—<strong> </strong>Apr. 3</li><li><strong>Season 5 Episode 3: "Home" </strong>—<strong> </strong>Apr. 10</li><li><strong>Season 5 Episode 4: "Open Source" </strong>—<strong> </strong>Apr. 17</li><li><strong>Season 5 Episode 5: "Svoboda" </strong>—<strong> </strong>Apr. 24</li><li><strong>Season 5 Episode 6: "No Sudden Moves" </strong>— May 1</li><li><strong>Season 5 Episode 7: "The Sirens of Titan" </strong>—<strong> </strong>May 8</li><li><strong>Season 5 Episode 8: "Brave New World" </strong>— May 15</li><li><strong>Season 5 Episode 9: "Sons and Daughters" </strong>— May 22</li><li><strong>Season 5 Episode 10: "This Land is Our Land" </strong>—<strong> </strong>May 29</li></ul><section class="article__schema-question"><h3>Where does the title "For All Mankind" come from?</h3><article class="article__schema-answer"><p>The name is inspired by the lunar plaque left on the Moon by the crew of Apollo 11. It reads, “Here men from the planet Earth first set foot upon the Moon July 1969, A.D. WE CAME IN PEACE <strong>FOR ALL MANKIND</strong>.”</p></article></section><h2 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h2><ul><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-inside-the-rage-machine">How to watch 'Inside the Rage Machine' documentary</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-uefa-champions-league-25-26">Champions League 2025-26 streaming fuide</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-imperfect-women">How to watch 'Imperfect Women' — stream psychological thriller from anywhere</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 15 years after ‘Bridesmaids,’ Rose Byrne proves she’s still a comedy queen in this Apple TV show ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/15-years-after-bridesmaids-rose-byrne-proves-shes-still-a-comedy-queen-in-this-apple-tv-show</link>
                                                                            <description>
                            <![CDATA[ Apple TV's underrated comedy "Platonic" reunites Seth Rogen with his Oscar-nominated pal Rose Byrne as two longtime friends dealing with midlife crises ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Q2X8EvKyUHKNJZpq7rdxEg</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/6oekf9XrYDbFU33W8nhMfa-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 19 Mar 2026 10:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Christina Izzo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/LMncQCRNbbLXxxjbfZJvWE.jpeg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/6oekf9XrYDbFU33W8nhMfa-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Rose Byrne and Seth Rogen in Platonic]]></media:description>                                                            <media:text><![CDATA[Rose Byrne and Seth Rogen in Platonic]]></media:text>
                                <media:title type="plain"><![CDATA[Rose Byrne and Seth Rogen in Platonic]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/6oekf9XrYDbFU33W8nhMfa-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Rose Byrne is officially having a career-defining year. Fresh off her first Academy Award nomination for her devastating turn in "If I Had Legs I’d Kick You" — and that viral, charmingly chaotic Golden Globes win — the Australian star has the entire industry captivated by her acting range. But while she's fresh off the awards circuit, don’t forget that Byrne remains one of the sharpest comedic weapons in the business, especially when she’s paired with Seth Rogen.</p><p>Rogen has certainly had a lot of success on Apple TV as of late, what with his absurdly funny Hollywood satire "The Studio" raking in a record-breaking 13 Emmy Awards in its first season — the most for any freshman comedy in Emmy history—and hitting the top of the streaming viewership charts thanks to all that critical acclaim. But the showbiz send-up isn't the only hilarious series that Rogen has on the Apple streaming service: Don't sleep on "Platonic," a great buddy comedy that reunites the actor with Byrne for a performance that is just as essential as her recent big-screen accolades.</p><p>The series might not have as much of a spotlight on it as that award-winning behemoth "The Studio," but it's still a very worthy, witty watch all the same, thanks to the excellent chemistry between its leads and the messy relatability of its premise. (More on that in a minute!) The breezy half-hour comedy has already been renewed for a third season on Apple TV, so if you haven't caught the series yet (or just need more Byrne in your life post-Oscars), now's the time. Here's why you should add "Platonic" to your next Apple TV binge.</p><h2 id="what-is-platonic-about">What is 'Platonic' about?</h2><p>Stars Rose Byrne and Seth Rogen lead the cast as stay-at-home mom Sylvia and her former best friend Will, newly divorced, as they platonically reconnect after a long rift. </p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Nnn02jJf5ys" allowfullscreen></iframe></div></div><p>With the fortysomething pals steadily approaching midlife crises, their connection becomes not only an all-consuming, codependent outlet but also a hilariously destabilizing force in their everyday lives and personal relationships. (Speaking of, Luke Macfarlane appears as Sylvia's lawyer husband Charlie, Carla Gallo plays her best friend Katie, Alisha Wainwright recurs as Will's ex-wife Audrey, and Andrew Lopez rounds out the ensemble as Reggie, the main investor of Will's brewery.)</p><p>"Platonic" season 2 sees the ride-or-die BFFs continue to contend with grown-up issues, from work woes to wedding planning to the stresses of parenthood, all to funnily relatable effect. </p><h2 id="why-you-should-watch-platonic-on-apple-tv">Why you should watch 'Platonic' on Apple TV</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="W2XN8NAFxo5bWq3nz5MELN" name="Seth Rogen and Rose Byrne in Platonic" alt="Seth Rogen and Rose Byrne in Platonic" src="https://cdn.mos.cms.futurecdn.net/W2XN8NAFxo5bWq3nz5MELN.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>Starting with 2014's "Neighbors." Rogen and Byrne have proven to be a winning onscreen duo, parlaying their real-life friendship and considerable comedic skills into believable camaraderie<strong> </strong>and teasing banter onscreen. "Platonic" is just the latest, and possibly greatest, of their collaborations.</p><p>"Even with bold swings and romance off the table, the rambunctious rapport between Rose Byrne and Seth Rogen makes 'Platonic' an ideal relationship comedy," praises the critical consensus over on <a href="https://www.rottentomatoes.com/tv/platonic" target="_blank" rel="nofollow">Rotten Tomatoes</a>, where the show's first season earned a strong 93% approval rating, only to be outdone by season 2's perfect 100% critical score. </p><p>Co-created by Francesca Delbanco and Nicholas Stoller, "Platonic" also offers up a hysterically sharp depiction of the intensity — and, yes, sometimes toxicity — of non-romantic relationships, especially as those players enter the back-half of their lives. Midlife monotony and millennial dread have rarely been so funny.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/platonic/umc.cmc.y7bc18x7co813l8i2tlsyb4l" target="_blank" rel="nofollow"><em><strong>"Platonic" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-coming-to-apple-tv-in-march-2026">Everything new coming to Apple TV in March 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/huge-ted-lasso-season-4-update-including-summer-release-window-first-look-images-and-new-characters">Huge 'Ted Lasso' season 4 update — 'summer' release window, first-look images and new characters</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv-plus/is-pluribus-season-2-happening-what-we-know-so-far">Is 'Pluribus' season 2 happening? What we know so far</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Imperfect Women' — stream psychological thriller from anywhere in the world ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/watch-imperfect-women</link>
                                                                            <description>
                            <![CDATA[ Eight-part drama about a murder and the traumatic consequences. Here's how to watch "Imperfect Women" on Apple TV from anywhere in the world. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4deHqHUjAjvZpBhj4JVQkg</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/KERX72srm5kngpgqMyJRZj-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Wed, 18 Mar 2026 07:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Bill Borrows ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xeK7rkjq8eWYnEFsoB9rka.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Bill Borrows is a leading journalist, feature writer and columnist. His work appears in most U.K. national newspapers from the &lt;a href=&quot;https://www.mirror.co.uk/sport/boxing/ricky-hatton-documentary-mental-health-30827644 )&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Daily Mirror&lt;/a&gt; to the &lt;a href=&quot;https://www.telegraph.co.uk/authors/b/bf-bj/bill-borrows/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Daily Telegraph&lt;/a&gt; but also in publications such as the &lt;a href=&quot;https://www.thetimes.co.uk/article/owen-farrell-on-england-the-six-nations-father-andy-and-the-art-of-leadership-dtt5t8vvw&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Times Magazine&lt;/a&gt; where he has produced exclusive interviews with rugby legend Owen Farrell and heavyweight World champion boxer &lt;a href=&quot;https://www.thetimes.co.uk/article/tyson-fury-after-depression-and-deontay-wilder-the-comeback-continues-&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Tyson Fury&lt;/a&gt;. He has been a regular contributor to the prestigious &lt;a href=&quot;https://www.radiotimes.com/author/billborrows/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Radio Times&lt;/a&gt; magazine (and online) for over 10 years and during that time, alongside cover interviews with major TV personalities, has covered programmes on everything from the Paralympics to poltergeists and the Qatar World Cup to the Iraq War. Work has also appeared in many other magazines, including Cosmopolitan, &lt;a href=&quot;https://www.marieclaire.co.uk/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Marie Clare&lt;/a&gt;, Grazia, Vogue Hommes International and TimeOut. &lt;/p&gt;&lt;p&gt;In a previous life he was Editor-at-Large at Loaded and &lt;a href=&quot;https://www.independent.co.uk/news/media/my-mentor-bill-borrows-on-hunter-s-thompson-6230842.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;interviewed his mentor&lt;/a&gt;, Hunter S. Thompson. He was also Editor-at-Large at Maxim magazine and Contributing Editor at Esquire and launch editor of both TimeOut Manchester and talkSPORT digital magazine. He is the author of the best-selling &lt;a href=&quot;https://www.amazon.co.uk/Hurricane-Turbulent-Life-Times-Higgins/dp/184354069X&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;The Hurricane&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: The Turbulent Life and Times of Alex Higgins&lt;/em&gt; - Sports Books of the Year The Times &amp; Sunday Telegraph, Books of the Year New Statesman - and also editor for several sport-related books including the &lt;a href=&quot;https://www.simonandschuster.com/books/The-talkSPORT-Book-of-Premier-League-Legends/Bill-Borrows/9781849839419&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;talkSPORT Book of Premier League Legends&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;and co-wrote the &lt;a href=&quot;https://www.amazon.co.uk/Talksport-Greatest-British-Sporting-Legends/dp/0857200933&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;talkSPORT 100 Greatest British Sporting Legends&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;with a lot of help from fellow journalist &lt;a href=&quot;https://www.tomsguide.com/author/tom-bailey&quot;&gt;Tom Bailey&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;On television he conceived and developed the &lt;a href=&quot;https://www.youtube.com/watch?v=IPDtcESrFWE )&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;Posh Pawn&lt;/em&gt;&lt;/a&gt; TV series for Channel 4 and was Associate Producer on the award-winning &lt;em&gt;Murder in the Outback&lt;/em&gt; for Channel Seven in Australia and &lt;a href=&quot;https://www.channel4.com/programmes/murder-in-the-outback&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Channel 4&lt;/a&gt; in the U.K.. A frequent contributor for BBC Radio 5, talkSPORT and talkRADIO, his areas of specialisation include sport, history, politics, TV and film. He is currently writing a biography of the greatest detective of the Victorian period and doesn’t get much free time but does admit to an addiction to true crime podcasts, following Manchester City football team and a weakness for Spanish food.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/KERX72srm5kngpgqMyJRZj-1280-80.png">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                        <media:description><![CDATA[&quot;Imperfect Women&quot; is all about the relationships between Mary (played by Elisabeth Moss), Eleanor (Kerry Washington) and Nancy (Kate Mara) ]]></media:description>                                                            <media:text><![CDATA[Friends ]]></media:text>
                                <media:title type="plain"><![CDATA[Friends ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/KERX72srm5kngpgqMyJRZj-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>"Imperfect Women" reflects upon the murder of one of three close friends and plays with the timeline and perspective to give a picture of the complicated relationships we have with those closest to us and how grief can tear at that fabric...<br><br>Here’s how to watch "Imperfect Women" from anywhere in the world using a <a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow"><strong>VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Imperfect Women' - Release Dates & Streams</div><div class="fancy_box_body"><p class="fancy-box__body-text">"Imperfect Women" premieres on <strong>Wednesday, March 18</strong> worldwide.<br><strong>• Global - </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/us/show/imperfect-women/umc.cmc.1w2rmpbqzt24879bt7109zgi6" target="_blank" rel="nofollow"><strong>Apple TV</strong></a><br><strong>• Watch from anywhere in the world using </strong><a data-analytics-id="inline-link" href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow"><strong>NordVPN (73% Off + Amazon Gift Card)</strong></a></p></div></div><p><strong>*NO SPOILER ALERT* </strong>It's Nancy who is murdered but it does not matter that you know that at his point as the eight-part drama goes forward and backwards around the deed to deliver tension and suspense with every episode.</p><p>Nancy (played by Kate Mara), Mary (Elisabeth Moss) and Eleanor (Kerry Washington) all inhabit very different worlds but the lives of the latter two begin to unravel in surprising ways as they attempt to deal with their grief and altered surroundings.</p><p>Read on to find out all you need to watch <strong>"Imperfect Women"</strong> online from anywhere.</p><h2 class="article-body__section" id="section-how-to-watch-imperfect-women-on-apple-tv"><span>How to watch 'Imperfect Women' on Apple TV</span></h2><div class="product"><a data-dimension112="736a6dd4-cac9-488c-a480-d5763f82c290" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/us/show/imperfect-women/umc.cmc.1w2rmpbqzt24879bt7109zgi6" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2252px;"><p class="vanilla-image-block" style="padding-top:95.91%;"><img id="xMs4xSGLpHHMFdKy5dp9Aj" name="Apple-TV-IOS-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xMs4xSGLpHHMFdKy5dp9Aj.jpg" mos="" align="middle" fullscreen="" width="2252" height="2160" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>"Imperfect Women" premieres globally on <a href="https://tv.apple.com/us/show/imperfect-women/umc.cmc.1w2rmpbqzt24879bt7109zgi6" target="_blank" rel="nofollow" data-dimension112="736a6dd4-cac9-488c-a480-d5763f82c290" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> on <strong>Wednesday, March 18</strong>.</p><p>You will not need to rent or buy it as it will come as part of your Apple TV subscription.<br><br>Prices for Apple TV are as follows:</p><p>🇺🇸 In the U.S. prices start at $12.99/month.<br>🇨🇦 In Canada prices start at CA$14.99/month.<br>🇬🇧 In the U.K. prices start at £9.99/month.<br>🇦🇺 In Australia prices start at AU$15.99/month.<a class="view-deal button" href="https://tv.apple.com/us/show/imperfect-women/umc.cmc.1w2rmpbqzt24879bt7109zgi6" target="_blank" rel="nofollow" data-dimension112="736a6dd4-cac9-488c-a480-d5763f82c290" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-how-to-watch-imperfect-women-from-anywhere-in-the-world"><span>How to watch 'Imperfect Women' from anywhere in the world</span></h2><p>Away from home at the moment and blocked from watching "Imperfect Women" on your usual subscription.</p><p>Don't worry, you can still watch the show thanks to the wonders of a <a href="https://www.tomsguide.com/best-picks/best-vpn" target="_blank"><strong>VPN</strong></a> (Virtual Private Network). The software allows your devices to appear to be back in your home country regardless of where in the world you are. So ideal for viewers away on vacation or on business. Our favorite is <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a>. It's the best on the market:</p><div class="product"><a data-dimension112="77fe3a54-f6c0-41f2-aa6f-2ebd77b6d186" data-action="Deal Block" data-label="NordVPN Deal: 73% Off + 4 Extra Months Free" data-dimension48="NordVPN Deal: 73% Off + 4 Extra Months Free" href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="77fe3a54-f6c0-41f2-aa6f-2ebd77b6d186" data-action="Deal Block" data-label="NordVPN Deal: 73% Off + 4 Extra Months Free" data-dimension48="NordVPN Deal: 73% Off + 4 Extra Months Free" data-dimension25=""><strong>NordVPN Deal: 73% Off + 4 Extra Months Free</strong></a><br><br>Boasting lightning fast speeds, great features, streaming power, and class-leading security, <strong>NordVPN</strong> is our #1 VPN.<br><br><strong>✅ 3 months extra FREE!</strong><br><strong>💰 73% off usual price</strong><br>🎁 <strong>Free Amazon Gift Card (up to $50)</strong><br><br>Use Nord to unblock Apple TV and watch "Imperfect Women" online with our <em><strong>exclusive</strong></em> deal.<a class="view-deal button" href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="77fe3a54-f6c0-41f2-aa6f-2ebd77b6d186" data-action="Deal Block" data-label="NordVPN Deal: 73% Off + 4 Extra Months Free" data-dimension48="NordVPN Deal: 73% Off + 4 Extra Months Free" data-dimension25="">View Deal</a></p></div><p>It's really easy to use a VPN to watch "Imperfect Women".</p><p><strong>1. Install the VPN of your choice</strong>. As we've said, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our favorite.</p><p><strong>2. Choose the location you wish to connect to in the VPN app. </strong>For instance, if you want to watch it on the U.S. version of Apple TV, choose 'United States' from the list.</p><p><strong>3. Sit back and enjoy the action. </strong>Head to Apple TV, sign in, and watch "Imperfect Women"</p><h2 class="article-body__section" id="section-imperfect-women-need-to-know"><span>'Imperfect Women' - Need to Know</span></h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/TKEPv8FBeSw" allowfullscreen></iframe></div></div><h2 id="imperfect-women-cast">'Imperfect Women' - Cast</h2><ul><li>·       Elisabeth Moss as Mary</li><li>·       Kerry Washington as Eleanor</li><li>·       Kate Mara as Nancy</li><li>·       Joel Kinnaman as Robert</li><li>·       Corey Stoll as Howard</li><li>·       Sandrine Holt as Jenny</li><li>·       Rome Flynn as Jordan</li><li>·       Ana Ortiz as Detective Ganz</li><li>·       Sherri Saum as Zoe</li><li>·       Wilson Bethel as Scott</li><li>·       Keith Carradine as RL Hennessy</li><li>·       Jackson Kelly as Marcus</li><li>·       Leslie Odom Jr. as Donovan</li></ul><h2 id="imperfect-women-episode-guide">'Imperfect Women' - Episode guide</h2><ul><li><strong>Season 01 Episode 01: "Eleanor" - </strong>The long friendship between Mary, Eleanor, and Nancy is shattered when a shocking murder occurs. As investigators begin examining the case, secrets from the women’s past begin to surface, suggesting their lives — and friendships — may not have been as perfect as they appeared. (Mar. 18)</li><li><strong>S01 E02: "Crush" -</strong> (Mar. 18)</li><li><strong>S01 E03: "Monster" -</strong> (Mar. 25)</li><li><strong>S01 E04: "Predator" - </strong>(Apr. 1)</li><li><strong>S01 E05: </strong>"TBC"<strong> </strong>(Apr. 8)</li><li><strong>S01 E06: </strong>"TBC" (Apr. 15)</li><li><strong>S01 E07: </strong>"TBC" (Apr. 22)</li><li><strong>S01 E08: </strong>"TBC" (Apr. 29)</li></ul><section class="article__schema-question"><h3>Is "Imperfect Women" based on a book?</h3><article class="article__schema-answer"><p>It is. The show is adapted from the 2019 novel of the same name by Araminta Hall.</p></article></section><h2 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h2><ul><li><a href="https://www.tomsguide.com/entertainment/streaming/watch-uefa-champions-league-25-26" target="_blank">Champions League 2025-26 Streaming Guide</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/new-netflix-shows-and-movies-january-12-18-2026">Netflix new releases — 7 shows and movies you need to stream</a></li><li><a href="https://www.tomsguide.com/entertainment/streaming/dont-miss-these-21-new-shows-and-movies-in-march-2026-heres-where-to-stream-them">Your Spring binge list: 21 top movies and shows to stream in March</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch 'Twisted Yoga' online from anywhere – stream the Apple TV true crime docuseries ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/watch-twisted-yoga-online</link>
                                                                            <description>
                            <![CDATA[ A three-part investigation into the alleged dark side of a global tantric yoga movement. Here is how to watch 'Twisted Yoga' on Apple TV+ wherever you are. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">nsdpz8BeKBqQFSJ8u3EU3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/84RE9DQJH9KXnwPJRDi3mk-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 12 Mar 2026 15:38:42 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Caroline Preece ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/s3Tee49LANgRMebYz2MZnF.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Caroline is a freelance writer and product tester for Tom’s Guide, translating hands-on testing into clear reviews, buying advice, and how-tos. Previously a writer and smart home editor across Future titles including Livingetc, Homes &amp; Gardens, and TechRadar, she brings 15 years’ experience covering consumer tech, appliances, and home gadgets. Her focus is real-world performance, usability, and value, with an eye for the details that matter in everyday life. Based in a cozy Suffolk apartment, Caroline tests products where they’re used most, at home, and helps readers cut through the noise to choose the right gear with confidence for their homes.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/84RE9DQJH9KXnwPJRDi3mk-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Twisted Yoga on Apple TV]]></media:description>                                                            <media:text><![CDATA[Twisted Yoga on Apple TV]]></media:text>
                                <media:title type="plain"><![CDATA[Twisted Yoga on Apple TV]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/84RE9DQJH9KXnwPJRDi3mk-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple TV is adding a major true-crime entry to its March slate with "Twisted Yoga," a three-part documentary series that digs into serious allegations surrounding Romanian self-styled guru Gregorian Bivolaru and the global tantric yoga network he led.</p><p>Below, we’ll show you how to watch "Twisted Yoga" online, plus how to stream it <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere in the world with a VPN</strong></a>.</p><div  class="fancy-box"><div class="fancy_box-title">'Twisted Yoga' streaming info, date</div><div class="fancy_box_body"><p class="fancy-box__body-text">All three episodes of "Twisted Yoga" premiere on Friday, March 13, 2026, exclusively on Apple TV.<br><strong>• Global stream </strong>— <a data-analytics-id="inline-link" href="https://tv.apple.com/gb/show/twisted-yoga/" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br><strong>• Watch from </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>anywhere with NordVPN</strong></a></p></div></div><p>The series follows former members as they describe how a search for community and spiritual growth allegedly morphed into manipulation, coercion, and abuse, with claims that include sex trafficking. It also follows the growing push for accountability, set against an international investigation and ongoing legal proceedings involving Bivolaru, who has faced charges including human trafficking, kidnapping, and rape, all of which he denies.</p><p>"Twisted Yoga" premieres on Friday, March 13, 2026, and as an Apple Original, it’s only available to stream on <a href="https://tv.apple.com/gb/show/twisted-yoga/" target="_blank" rel="nofollow"><strong>Apple TV with a 7-day free trial</strong></a>. </p><p>Below, we break down all the ways to watch "Twisted Yoga" online and how to keep up if you’re traveling.</p><h2 class="article-body__section" id="section-watch-twisted-yoga-from-anywhere"><span>Watch 'Twisted Yoga' from anywhere</span></h2><div class="product"><a data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" href="https://tv.apple.com/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:284px;"><p class="vanilla-image-block" style="padding-top:96.48%;"><img id="9VbrdNAdwAjgHj94KHETr4" name="Screen Shot 2020-10-21 at 3.59.58 PM.png" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9VbrdNAdwAjgHj94KHETr4.png" mos="" align="middle" fullscreen="" width="284" height="274" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Yoga crime doc "Twisted Yoga"premieres on <a href="https://tv.apple.com/gb/show/twisted-yoga/" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25=""><strong>Apple TV</strong></a> in the U.S., U.K., Australia, and Canada on <strong>Friday, March 13, 2026</strong>.</p><p>An Apple TV+ subscription also gets you access to some of the <a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies" target="_blank">best Apple TV originals</a> around, including "Pluribus", "Severance", and "Masters of the Air".<a class="view-deal button" href="https://tv.apple.com/" target="_blank" rel="nofollow" data-dimension112="6d5a76c5-0e22-433e-bc5b-3ea1b24752d3" data-action="Deal Block" data-label="Apple TV" data-dimension48="Apple TV" data-dimension25="">View Deal</a></p></div><p>If you’re traveling and find that your usual streaming apps are blocked or showing the wrong library, a <a href="https://www.tomsguide.com/best-picks/best-vpn">VPN</a> (virtual private network) can make your device appear as if it’s back in your home country. That means you can continue to use your existing subscriptions while you’re abroad.</p><p>We’ve tested a wide range of services, and <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our top pick for speed, reliability, and broad device support. It also comes with a 30-day money-back guarantee, so you can try it out without a long-term commitment.</p><div class="product editors-choice"><div class="editors-choice__title">Editors Choice</div><a data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Nm3SFHDT4ppWD7z6muXXKe" name="NordVPN@2x.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Nm3SFHDT4ppWD7z6muXXKe.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://nordvpn.com/special/?coupon=future2025&utm_medium=affiliate&utm_term=&utm_content=TG&utm_campaign=off564&utm_source=aff3013" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25=""><strong>NordVPN deal: 75% Off + 3 Months FREE</strong></a><br><br>Boasting lightning fast speeds, great features, streaming power, and class-leading security, <strong>NordVPN</strong> is our #1 VPN.<br><br><strong>✅  3 months extra FREE!</strong><br><strong>✅  75% off usual price</strong><br><strong>✅  $50 gift card (selected plans)</strong><br><br>Use Nord to unblock your preferred coverage and watch <a href="https://tv.apple.com/gb/show/twisted-yoga/" target="_blank" rel="nofollow"><strong>Apple TV</strong></a> online with our <em>exclusive</em> deal.<a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="63b8969e-73d5-4414-b2a5-d1b3495165eb" data-action="Deal Block" data-label="NordVPN deal: 75% Off + 3 Months FREE" data-dimension48="NordVPN deal: 75% Off + 3 Months FREE" data-dimension25="">VIEW DEAL ON </a></p></div><h3 class="article-body__section" id="section-twisted-yoga-official-trailer"><span>'Twisted Yoga' official trailer</span></h3><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/0iKOvNHhnBo" allowfullscreen></iframe></div></div><h3 class="article-body__section" id="section-twisted-yoga-episode-guide"><span>'Twisted Yoga' episode guide</span></h3><ul><li><strong>Chapter One: All About Love – </strong>Charts the movement's initial appeal, focusing on the promise of spiritual awakening and the charismatic pull of its leader.</li><li><strong>Chapter Two: Initiation – </strong>Examines the shift toward darker practices, exploring how members were allegedly coerced and how the organisation maintained control.</li><li><strong>Chapter Three: The Guru – </strong>Looks at the legal fallout, the international manhunt for Bivolaru, and survivors’ efforts to hold him accountable.</li></ul><section class="article__schema-question"><h3> How many episodes is "Twisted Yoga"?</h3><article class="article__schema-answer"><p>It’s a three-part limited series (Chapter One: All About Love, Chapter Two: Initiation, and Chapter Three: The Guru).</p></article></section><section class="article__schema-question"><h3>Who is Gregorian Bivolaru?</h3><article class="article__schema-answer"><p>He is the central figure in the series, a self-styled Romanian "guru" who founded a global yoga empire. He was arrested in Paris in November 2023 and currently faces charges including human trafficking, kidnapping, and rape.</p></article></section><section class="article__schema-question"><h3>Who is Ashleigh?</h3><article class="article__schema-answer"><p>Ashleigh is a former contestant on "The Bachelor Australia" who joined the yoga school in London. She went on to become a key whistleblower after witnessing the group’s deeper practices in Paris.</p></article></section><section class="article__schema-question"><h3>Is "Twisted Yoga" based on a true story?</h3><article class="article__schema-answer"><p>Yes, it’s a true-crime documentary. It features first-hand accounts from survivors and investigative reporting on real events involving the Atman Yoga Federation.</p></article></section><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/round-up/best-apple-tv-apps">Best Apple TV apps and games</a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn">The best streaming VPN</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv-plus/watch-pluribus-stream-new-sci-fi-drama">How to watch 'Pluribus' online</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Why your TV doesn't look as good as expected — this one setting caps quality ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tvs/why-your-tv-doesnt-look-as-good-as-expected-this-one-setting-caps-quality</link>
                                                                            <description>
                            <![CDATA[ Learn how to enable enhanced HDMI on your TV for better picture quality with gaming consoles and streaming devices. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">WSwPg7PzkLvMZvveGpQvqP</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/yrBJgLwcwQLHpirwQN8NGV-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 08 Mar 2026 10:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[TVs]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sUwQW8yCGXFHeksAFjqSxZ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/yrBJgLwcwQLHpirwQN8NGV-1280-80.jpg">
                                                            <media:credit><![CDATA[How-To-Geek]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[PS5 Pro on TV in living room]]></media:description>                                                            <media:text><![CDATA[PS5 Pro on TV in living room]]></media:text>
                                <media:title type="plain"><![CDATA[PS5 Pro on TV in living room]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/yrBJgLwcwQLHpirwQN8NGV-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>You've got an expensive TV, connected your PS5, Apple TV 4K, or gaming PC. Everything works — the picture is sharp, colors look decent, HDR seems to be on, but something just doesn't feel right. For what you paid, the image should look better than this.</p><p>The problem isn't your TV's panel or your device. It's your HDMI settings. Most TVs ship with HDMI ports set to standard or compatible mode that limits bandwidth. This ensures compatibility with any device you plug in, preventing connection errors and no signal screens. But it also caps your picture quality far below what your TV and devices can actually deliver.</p><p>Switching to enhanced HDMI mode unlocks the full capabilities you paid for. Here's how to enable it and why it matters.</p><h2 id="why-hdmi-defaults-to-limited-mode">Why HDMI defaults to limited mode</h2><p>When you connect a device via HDMI, your TV and that device negotiate resolution, refresh rate, color depth, and HDR support. If anything goes wrong during this — an old cable, incompatible device, or weak connection — you get black screens or no signal at all.</p><p>TV manufacturers avoid this by defaulting to a conservative bandwidth limit that works with virtually anything you plug in. Which is great for them, but can mean you're not getting the full capabilities you paid for.</p><p>Enhanced mode removes that safety buffer and lets your TV and devices communicate at maximum bandwidth. The result: proper HDR, richer colors, sharper text, and higher refresh rates that were available all along but initially capped.</p><h2 id="some-tvs-already-have-enhanced-hdmi-enabled">Some TVs already have enhanced HDMI enabled</h2><p>Before diving into settings, know that some TV brands ship with enhanced HDMI already enabled on newer models. <strong>Many recent Samsung and LG TVs default to enhanced mode</strong>, though this varies by specific model, year, and region.</p><p>Hisense and Sony TVs typically require manual activation. Regardless of brand, it's worth checking your settings — even if enhanced mode is already on, verifying ensures you're getting full picture quality from your devices.</p><section class="howto-block">                    <h3>How to enable enhanced HDMI on your TV </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/iZzEzz3mYbarhxXj9TzjXm.jpg"                                        alt="Microsoft Copilot AI assistant on a Samsung TV"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/iZzEzz3mYbarhxXj9TzjXm.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Microsoft)</div></figure>                    <p><p>Enhanced HDMI is a per-port setting on most TVs. Enabling it on HDMI 1 doesn't automatically apply to HDMI 2, 3, or 4. You need to activate it individually for each port you're using, or enable it globally if your TV offers that option.</p><p>The setting has different names depending on manufacturer:</p><p><strong>Samsung: Go to Settings, General, External Device Manager, Input Signal Plus (or HDMI UHD Colo</strong>r on older models). Then <strong>toggle it on</strong> for the specific ports where your PS5, Apple TV, or PC are connected.</p><p><strong>LG: Navigate to Settings, General, Devices, HDMI Settings, and HDMI Deep Color</strong>. Enable it for the ports you're using.</p><p><strong>Sony: Open Settings, Watching TV, External Inputs, HDMI Signal Format. Then select Enhanced Forma</strong>t for the relevant ports.</p><p><strong>Hisense: Go to Settings, Picture, Advanced Settings, HDMI Format. From here, change from Standard to Enhanced</strong> for each port.</p><p><strong>For other brands, look for settings labeled Enhanced Format, 4K Signal Format, HDMI Deep Color, Input Signal Plus, or similar</strong>. If you can't locate it, check your TV's manual. The function exists on virtually all 4K TVs made after 2016.</p></p>                </section><section class="howto-block">                    <h3>Restart your devices </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="http://cdn.mos.cms.futurecdn.net/o2MW6Vb44S6zJKTvTxfGXZ.jpg"                                        alt="The Apple TV 4K (2022) remote in front of a TV with the tvOS home screen."                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="http://cdn.mos.cms.futurecdn.net/o2MW6Vb44S6zJKTvTxfGXZ.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Henry T. Casey / Tom's Guide)</div></figure>                    <p><p>After enabling enhanced HDMI, <strong>restart your connected devices</strong>. Some devices automatically detect the change and adjust output settings, while others require a manual reboot to recognize the increased bandwidth.</p></p>                </section><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W3V5je"></div>                            </div>                            <script src="https://kwizly.com/embed/W3V5je.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/tvs/i-made-my-old-smart-tv-feel-brand-new-here-are-the-5-things-that-worked">Old smart TV running slow? 5 changes that restore speed and performance</a></li><li><a href="https://www.tomsguide.com/tvs/these-5-tv-settings-silently-inflate-your-electricity-bill-heres-how-to-turn-them-off">5 TV settings you should change now to lower your electricity bill</a></li><li><a href="https://www.tomsguide.com/tvs/your-tv-is-watching-you-how-to-turn-off-data-collection-on-lg-samsung-roku-and-more">Your TV is watching you — how to turn off data collection on LG, Samsung, Roku and more</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How to watch F1 2026 live online — Formula 1 streams, schedule, Dutch Grand Prix ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/watch-f1-live-online</link>
                                                                            <description>
                            <![CDATA[ See how to watch F1 2026 live streams for free and from anywhere with information on international broadcasters and this season's Formula 1 schedule. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">WZRQA3fKR9b79N34bJnWfP</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DTSzym4poHET4ZD2SshZgf-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 05 Mar 2026 09:00:00 +0000</pubDate>                                                                                                                                <updated>Tue, 28 Jul 2026 15:43:33 +0000</updated>
                                                                                                                                            <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Adam Marshall ]]></dc:creator>                                                                                                        <dc:description><![CDATA[ &lt;p&gt;Adam was the Content Director of Subscriptions and Services at Future, meaning that he oversaw many of the articles the publisher produces about antivirus software, VPN, TV streaming, broadband and mobile phone contracts - from buying guides and deals news, to industry interest pieces and reviews.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Having graduated with a degree in Law, Adam started his life as a communicator with five years as a lawyer before retraining as a writer. He completed his NCTJ Diploma at the London School of Journalism in 2012 and hasn&#039;t looked back since.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Adam quickly established his authority around the safeguarding and championing of his readers&#039; interests, after starting his career at consumer watchdog Which?. There he developed an expertise in cybersecurity and promoting safe use of the internet, before heading to Future in 2016 and applying his editorial nous to the dizzying world of virtual private networks. From there, he helped establish TechRadar as a leading voice in consumer and business VPNs, helping to demystify their uses and help his audience make the best &amp;nbsp;buying decisions they can.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Adam can still be dusting his keyboard off to write articles for the likes of TechRadar, T3 and Tom&#039;s Guide.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/DTSzym4poHET4ZD2SshZgf-1280-80.jpg">
                                                            <media:credit><![CDATA[Clive Rose/Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Max Verstappen of Red Bull Racing and Lando Norris and Oscar Piastri of McLaren in a row during a Formula 1 formation lap.]]></media:description>                                                            <media:text><![CDATA[Max Verstappen of Red Bull Racing and Lando Norris and Oscar Piastri of McLaren in a row during a Formula 1 formation lap.]]></media:text>
                                <media:title type="plain"><![CDATA[Max Verstappen of Red Bull Racing and Lando Norris and Oscar Piastri of McLaren in a row during a Formula 1 formation lap.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DTSzym4poHET4ZD2SshZgf-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The 2026 Formula 1 season continues with the <strong>Dutch Grand Prix on Sunday, August 23</strong> as standings frontrunner Kimi Antonelli looks to extend the gap at the top of the Drivers' Championships standings after a month-long gap in the season. Keep reading to discover how to watch 2026 F1 live streams <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>from anywhere with a VPN</strong></a><strong> — potentially for free!</strong></p><div  class="fancy-box"><div class="fancy_box-title">F1 2026 live streams: TV channels, dates</div><div class="fancy_box_body"><p class="fancy-box__body-text">F1 2026 live streams take place <strong>from March 6 until December 6, 2026</strong><br><strong>• U.S. — </strong><a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial)</strong></a><br><strong>• U.K. — </strong><a data-analytics-id="inline-link" href="https://www.sky.com/tv/sports" target="_blank" rel="nofollow"><strong>Sky Sports</strong></a><br><strong>• Watch your local stream anywhere — try </strong><a data-analytics-id="inline-link" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN 100% risk free</strong></a></p></div></div><p>After a few years of Max Verstappen dominating proceedings, it was every F1 fan's dream to have a genuinely competitive title race last year, with the contest going all the way to the final race in Abu Dhabi. The McLaren of Norris prevailed over the Flying Dutchman and teammate Oscar Piastri, and the Brit started the season with the number 1 on his car and a target on his back.</p><p>It's proved fascinating to see how the regulation changes brought in for 2026 have affected the rankings, however, with constructors battling to squeeze every last m.p.h. out of their machines. We've witnessed how Mercedes pair Kimi Antonelli and George Russell have positioned themselves as the team to beat, leaving Red Bull (Verstappen & Isack Hadjar), Ferrari (Lewis Hamilton & Charles Leclerc) and McLaren all hoping to push them to each checkered flag. While the paddock welcomes two brand new teams to the track this year: Audi Revolut and Cadillac.</p><p>Below is our guide on where to watch live F1 2026 streams online from anywhere, with FREE options explained and a calendar of all this season's races after it was shortened from 24 to 22 events.</p><h3 class="article-body__section" id="section-round-12-dutch-grand-prix"><span>Round 12: Dutch Grand Prix</span></h3><p>The twelfth Grand Prix of the 2026 F1 season takes place at the Circuit Zandvoort and will be contested over 72 laps of the 4.26km (around 2.65 miles) long circuit. It's a Sprint race weekend, so extra points will be available.</p><p>Heading into the second half of the truncated 2026 season, the question when the checkered flag is taken will be how big Kimi Antonelli's standings lead will be as the teams return from their four-week break. It currently stands at a mighty 40 points, with British drivers Lewis Hamilton and George Russell trailing.</p><p>Only Max Verstappen (three times), Lando Norris and Oscar Piastri have won the Dutch G.P. since it returned to the F1 calendar in 2021, so Antonelli and co will be eager to add their names to the list. Zandvoort is a really fast circuit, so should reward the cars that have managed to develop the most amount of grunt during the hiatus.</p><h2 class="article-body__section" id="section-where-can-i-watch-f1-2026-season-on-free-to-air"><span>Where can I watch F1 2026 season on free-to-air?</span></h2><p>That depends on where you live. Viewers in the following countries can watch free F1 live streams on these TV broadcasters and streaming services. Check local broadcaster details for specific information.</p><p><strong>🇦🇹 Austria </strong>– <a href="https://www.servustv.com/jetzt-live/" target="_blank" rel="nofollow">ServusTV</a> and <a href="https://on.orf.at/live" target="_blank" rel="nofollow">ORF</a> (free live broadcast of every race)</p><p><strong>🇧🇷 Brazil</strong> – <a href="https://globoplay.globo.com/" target="_blank" rel="nofollow">Globoplay</a> (free live broadcast of 15 races)</p><p><strong>🇭🇷 Croatia </strong>– <a href="https://www.rtl.hr/" target="_blank" rel="nofollow">RTL</a> (free live broadcast)</p><p><strong>🇱🇺 Luxembourg </strong>– <a href="https://www.rtl.lu/tele/live" target="_blank" rel="nofollow">RTL Zwee</a> (free live broadcast)</p><p><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>Apple TV (free trial)</strong></a> has confirmed that it will show free coverage of several races across the year in the U.S. (although hasn't confirmed which ones at the time of writing). Plus, it offers a 7-day trial so new subscribers can watch the Chinese G.P. for free.</p><p>And many other countries show free-to-air broadcasts of their own Grand Prix. For example, <a href="https://10.com.au/" target="_blank" rel="nofollow"><strong>10 Streaming</strong></a> in Australia, <a href="https://www.channel4.com/" target="_blank" rel="nofollow"><strong>Channel 4 (British G.P.)</strong></a> in the U.K. and <a href="https://www.ctv.ca/" target="_blank" rel="nofollow"><strong>CTV</strong></a> in Canada.</p><h2 class="article-body__section" id="section-watch-f1-2026-from-anywhere"><span>Watch F1 2026 from anywhere</span></h2><p>Away from home at the moment and blocked from watching the Grand Prix on your usual subscription?</p><p>Provided terms allow, you can watch your usual stream – whether it's free or paid – from anywhere with a good <a href="https://www.tomsguide.com/best-picks/best-vpn">VPN</a> (Virtual Private Network).  Our favorite is <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow">NordVPN</a> — we explain why in our <a href="https://www.tomsguide.com/reviews/nordvpn-review">NordVPN review</a>.</p><div class="product"><a data-dimension112="4135fabc-842d-11f1-8b1d-31cd8dc0f6d4" data-action="Deal Block" data-label="NordVPN deal: Try risk-free for 30 days" data-dimension48="NordVPN deal: Try risk-free for 30 days" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vALBz9LuPk5AhB3g6DbZvf" name="Nord-VPN_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vALBz9LuPk5AhB3g6DbZvf.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>🟩 <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="4135fabc-842d-11f1-8b1d-31cd8dc0f6d4" data-action="Deal Block" data-label="NordVPN deal: Try risk-free for 30 days" data-dimension48="NordVPN deal: Try risk-free for 30 days" data-dimension25=""><strong>NordVPN deal: Try risk-free for 30 days</strong></a></p><p>Boasting super fast speeds, great features, streaming power and industry-leading security, <strong>NordVPN</strong> is our #1 VPN.<br><br><strong>✅ 30-day money-back guarantee</strong><br><strong>✅ 75% off the usual price</strong><br><strong>✅ Get 3 months FREE</strong><br><br>Use NordVPN to unblock your usual streaming service and watch live F1 streams with this <em>exclusive </em>deal. <a class="view-deal button" href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow" data-dimension112="4135fabc-842d-11f1-8b1d-31cd8dc0f6d4" data-action="Deal Block" data-label="NordVPN deal: Try risk-free for 30 days" data-dimension48="NordVPN deal: Try risk-free for 30 days" data-dimension25="">View Deal</a></p></div><p>Using a VPN is incredibly simple.</p><p><strong>1. Install the VPN of your choice</strong>. As we've said, <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN</strong></a> is our favorite.</p><p><strong>2. Choose the location you wish to connect to in the VPN app. </strong>For instance, if you're visiting the U.K. and want to view your usual U.S. service, select 'United States' in the app.</p><p><strong>3. Sit back and watch the F1. </strong>Head your usual streaming service and watch the racing.</p><h2 class="article-body__section" id="section-how-to-watch-f1-live-streams-in-the-u-s"><span>How to watch F1 live streams in the U.S.</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="UHZYAaZCSyV7FkHxYGxtJ6" name="TG_US_Flag_1920_400_shutterstock.jpg" alt="US flag" src="https://cdn.mos.cms.futurecdn.net/UHZYAaZCSyV7FkHxYGxtJ6.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><strong>Apple TV (7-day free trial to watch F1)</strong></a> is now the <em>exclusive</em> broadcaster of Formula 1 in the U.S. for the next five years. No more ABC or ESPN.</p><p>All Practice, Qualifying, Sprint sessions, and Grands Prix will stream live on Apple TV (the app is available for phones, laptops, smart TVs and consoles).</p><p>Apple has also confirmed that select TBC races will also be available for free throughout the course of the season. </p><p>One race — the Canadian GP — was simulcast on Apple TV <em>and </em>Netflix. </p><p>After you've taken advantage of Apple TV's <a href="https://tv.apple.com/" target="_blank" rel="nofollow">7-day free trial</a>,  subscriptions cost from only $12.99/month. Or you can combine it with access to <a href="https://www.tomsguide.com/reviews/peacock" target="_blank">Peacock</a> for just a couple of dollars more.</p><p>Anybody who buys an Apple device can claim three months free Apple TV, too. If you fancy a new Mac, now would be a good time...</p><p><strong>U.S. F1 fans abroad can still access their Apple TV stream using </strong><a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>NordVPN (try risk-free)</strong></a>.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/NJhUrJEuvUM" allowfullscreen></iframe></div></div><h2 class="article-body__section" id="section-where-to-watch-f1-live-streams-in-the-u-k"><span>Where to watch F1 live streams in the U.K.</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="ttCSpj8r9kHj68j7NhsBL9" name="TG_British_Flag_1920_400_shutterstock.jpg" alt="British flag" src="https://cdn.mos.cms.futurecdn.net/ttCSpj8r9kHj68j7NhsBL9.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p><a href="https://www.sky.com/tv/sports" target="_blank" rel="nofollow"><strong>Sky Sports</strong></a> has the rights to every race weekend across the season and broadcasts F1 live streams in up to 4K. Sky Sports packages including the F1 channel start from £20/month on top of a regular Sky TV subscription.</p><p>The new presenter lineup is out and sadly Danica Patrick has left after five years. Martin Brundle will, however, be back with his legendary — and enjoyably awkward — gridwalks.</p><ul><li><strong>FREE extended highlights: </strong><a href="https://www.channel4.com/programmes/formula-1" target="_blank" rel="nofollow"><strong>Channel 4</strong></a> in the U.K. provides full extended highlights of each race in the form of a <strong>2.5-hour show</strong> with ad breaks. It's typically available on-demand a few hours after the race and is a favorite way to watch F1 races back</li><li><strong>Traveling outside the U.K</strong>.? <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow"><strong>Download this VPN</strong></a> and use it to unblock your usual F1 stream and watch it as if you were back home.</li></ul><h2 class="article-body__section" id="section-how-to-watch-f1-online-in-canada"><span>How to watch F1 online in Canada </span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="eByagaoLZki73CLtYaRPMG" name="TG_Canada_Flag_1920_400_shutterstock.jpg" alt="Canada Flag" src="https://cdn.mos.cms.futurecdn.net/eByagaoLZki73CLtYaRPMG.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>All practice sessions, qualifying and races are broadcast in English on <strong>TSN</strong> in Canada, while <strong>RDS</strong> provides coverage in French. If you receive the network through your cable or satellite provider, you can use TSN Go by signing in with your TV service credentials to watch online</p><p>If you’ve cut the cord you’ll want to check out the <a href="https://www.tsn.ca/tsnplus" target="_blank" rel="nofollow"><strong>TSN Plus</strong></a> streaming platform, which costs $8/month or $80/year. The TSN app will allow you to live stream F1 races from your phone, streaming box or other supported device. <a href="https://prf.hn/click/camref:1011liQxs/pubref:hawk-custom-tracking/destination:https%3A%2F%2Fwww.formula1.com%2Fen%2Fsubscribe-to-f1-tv.html%23en-US" target="_blank" rel="nofollow"><strong>F1 TV Pro</strong></a> is another option.</p><p>And <a href="https://www.ctv.ca/" target="_blank" rel="nofollow"><strong>CTV</strong></a> showed the <strong>Canadian Grand Prix absolutely free</strong> on May 22-24 this year.</p><p><strong>Not back home in Canada at the moment?</strong> With <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow">NordVPN</a> and other VPNs, you can access the streaming services you already subscribe to (always check the terms and conditions).</p><h2 class="article-body__section" id="section-how-to-watch-f1-online-in-australia"><span>How to watch F1 online in Australia</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="R4wb8TX7wmafWv7eBYfay3" name="TG_australia_Flag_1920_400_shutterstock.jpg" alt="Australia flag" src="https://cdn.mos.cms.futurecdn.net/R4wb8TX7wmafWv7eBYfay3.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Every Grand Prix of the 2026 Formula 1 season will be broadcast by <strong>Fox Sports</strong> and <a href="https://www.foxtel.com.au/" target="_blank" rel="nofollow"><strong>Foxtel</strong></a> in Australia.</p><p>For a more flexible streaming option, there's <a href="https://kayosports.com.au/" target="_blank" rel="nofollow"><strong>Kayo Sports</strong></a>. Rolling monthly subscriptions start at $30 after a <a href="https://kayosports.com.au/" target="_blank" rel="nofollow"><strong>7-day FREE trial or your first month for $1</strong></a>. You can pay an extra $16 for Kayo Premium and watch F1 live streams in 4K.</p><p>The Australian Grand Prix, the opening race of the season, was free to watch on Network 10 and <a href="https://10.com.au/" target="_blank" rel="nofollow"><strong>10 Streaming</strong></a>.</p><p>Don’t forget you can use one of the <a href="https://www.tomsguide.com/best-picks/best-vpn">best VPN</a> services to follow the action from your home country even <strong>when you're overseas</strong>.</p><h2 class="article-body__section" id="section-how-to-watch-f1-online-in-india"><span>How to watch F1 online in India</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:20.83%;"><img id="RxnPoqJK2DGj3YFRYTadon" name="TG-india-flag-1920x400.jpg" alt="A segment of the Indian flag" src="https://cdn.mos.cms.futurecdn.net/RxnPoqJK2DGj3YFRYTadon.jpg" mos="" align="middle" fullscreen="" width="1920" height="400" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>If you're based in India you can live stream the entire F1 season exclusively via the <a href="https://www.fancode.com" target="_blank" rel="nofollow"><strong>Fancode</strong></a><strong> </strong>website and app. Plans start at 49 rupees (around 50 cents) per race or 199 rupees/month (around $2).</p><p><strong>If you already subscribe but are traveling outside of India</strong>, you can simply choose a top VPN service such as <a href="http://go.nordvpn.net/aff_c?offer_id=564&aff_id=3013&url_id=10992" target="_blank" rel="nofollow">NordVPN</a> to access your usual local stream.</p><h2 class="article-body__section" id="section-formula-1-2026-season-schedule"><span>Formula 1 2026 season schedule</span></h2><div ><table><thead><tr><th class="firstcol " ><p>Round</p></th><th  ><p>Date</p></th><th  ><p>Grand Prix</p></th><th  ><p>Location</p></th><th  ><p>Winner</p></th></tr></thead><tbody><tr><td class="firstcol " ><p>1</p></td><td  ><p>March 6-8</p></td><td  ><p>Australia</p></td><td  ><p>Melbourne</p></td><td  ><p>George Russell</p></td></tr><tr><td class="firstcol " ><p>2</p></td><td  ><p>March 13-15</p></td><td  ><p>China</p></td><td  ><p>Shanghai</p></td><td  ><p>Kimi Antonelli</p></td></tr><tr><td class="firstcol " ><p>3</p></td><td  ><p>March 27-29</p></td><td  ><p>Japan</p></td><td  ><p>Suzuka</p></td><td  ><p>Kimi Antonelli</p></td></tr><tr><td class="firstcol " ><p>-</p></td><td  ><p>CANCELLED</p></td><td  ><p>Bahrain</p></td><td  ><p>Sakhir</p></td><td  ><p>N/A</p></td></tr><tr><td class="firstcol " ><p>-</p></td><td  ><p>CANCELLED</p></td><td  ><p>Saudi Arabia</p></td><td  ><p>Jeddah</p></td><td  ><p>N/A</p></td></tr><tr><td class="firstcol " ><p>4</p></td><td  ><p>May 1-3</p></td><td  ><p>Miami</p></td><td  ><p>Miami</p></td><td  ><p>Kimi Antonelli</p></td></tr><tr><td class="firstcol " ><p>5</p></td><td  ><p>May 22-24</p></td><td  ><p>Canada</p></td><td  ><p>Montreal</p></td><td  ><p>Kimi Antonelli</p></td></tr><tr><td class="firstcol " ><p>6</p></td><td  ><p>June 5-7</p></td><td  ><p>Monaco</p></td><td  ><p>Monaco</p></td><td  ><p>Kimi Antonelli</p></td></tr><tr><td class="firstcol " ><p>7</p></td><td  ><p>June 12-14</p></td><td  ><p>Barcelona-Catalunya</p></td><td  ><p>Barcelona</p></td><td  ><p>Lewis Hamilton</p></td></tr><tr><td class="firstcol " ><p>8</p></td><td  ><p>June 26-28</p></td><td  ><p>Austria</p></td><td  ><p>Spielberg</p></td><td  ><p>George Russell</p></td></tr><tr><td class="firstcol " ><p>9</p></td><td  ><p>July 3-5</p></td><td  ><p>Great Britain</p></td><td  ><p>Silverstone</p></td><td  ><p>Charles Leclerc</p></td></tr><tr><td class="firstcol " ><p>10</p></td><td  ><p>July 17-19</p></td><td  ><p>Belgium</p></td><td  ><p>Spa</p></td><td  ><p>Kimi Antonelli</p></td></tr><tr><td class="firstcol " ><p>11</p></td><td  ><p>July 24-26</p></td><td  ><p>Hungary</p></td><td  ><p>Budapest</p></td><td  ><p>Lando Norris</p></td></tr><tr><td class="firstcol " ><p>12</p></td><td  ><p>August 21-23</p></td><td  ><p>Netherlands</p></td><td  ><p>Zandvoort</p></td><td  ></td></tr><tr><td class="firstcol " ><p>13</p></td><td  ><p>September 4-6</p></td><td  ><p>Italy</p></td><td  ><p>Monza</p></td><td  ></td></tr><tr><td class="firstcol " ><p>14</p></td><td  ><p>September 11-13</p></td><td  ><p>Spain</p></td><td  ><p>Madrid</p></td><td  ></td></tr><tr><td class="firstcol " ><p>15</p></td><td  ><p>September 24-26</p></td><td  ><p>Azerbaijan</p></td><td  ><p>Baku</p></td><td  ></td></tr><tr><td class="firstcol " ><p>16</p></td><td  ><p>October 9-11</p></td><td  ><p>Singapore</p></td><td  ><p>Marina Bay</p></td><td  ></td></tr><tr><td class="firstcol " ><p>17</p></td><td  ><p>October 23-25</p></td><td  ><p>USA</p></td><td  ><p>Austin</p></td><td  ></td></tr><tr><td class="firstcol " ><p>18</p></td><td  ><p>Oct. 30 - Nov. 1</p></td><td  ><p>Mexico</p></td><td  ><p>Mexico City</p></td><td  ></td></tr><tr><td class="firstcol " ><p>19</p></td><td  ><p>November 6-8</p></td><td  ><p>Brazil</p></td><td  ><p>Sao Paulo</p></td><td  ></td></tr><tr><td class="firstcol " ><p>20</p></td><td  ><p>November 19-21</p></td><td  ><p>Las Vegas</p></td><td  ><p>Las Vegas</p></td><td  ></td></tr><tr><td class="firstcol " ><p>21</p></td><td  ><p>November 27-29</p></td><td  ><p>Qatar</p></td><td  ><p>Lusail</p></td><td  ></td></tr><tr><td class="firstcol " ><p>22</p></td><td  ><p>December 4-6</p></td><td  ><p>Abu Dhabi</p></td><td  ><p>Yas Marina</p></td><td  ></td></tr></tbody></table></div><h2 class="article-body__section" id="section-drivers-championship-standings-top-10-only-after-round-11"><span>Drivers' Championship standings (top 10 only) — after Round 11</span></h2><ol start="1"><li><strong>Kimi Antonelli</strong> (Mercedes) — 219</li><li><strong>Lewis Hamilton</strong> (Ferrari) — 169</li><li><strong>George Russell </strong>(Mercedes) — 160</li><li><strong>Charles Leclerc</strong> (Ferrari) — 138</li><li><strong>Lando Norris</strong> (McLaren) — 128</li><li><strong>Max Verstappen</strong> (Red Bull) — 109</li><li><strong>Oscar Piastri </strong>(McLaren) — 92</li><li><strong>Isack Hadjar</strong> (Red Bull) — 68</li><li><strong>Liam Lawson</strong> (Racing Bulls) — 43</li><li><strong>Pierre Gasly</strong> (Alpine) — 42</li></ol><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/how-to-watch-formula-1-on-apple-tv">How to watch F1 on Apple TV</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-announces-f1-partnerships-with-netflix-tubi-and-imax-for-2026-along-with-incredible-multiview-features">Apple announces F1 partnerships with Netflix, Tubi and IMAX for 2026</a></li><li><a href="https://www.tomsguide.com/best-picks/streaming-vpn">The best streaming VPNs</a></li></ul><p>We test and review VPN services in the context of legal recreational uses. For example:1. Accessing a service from another country (subject to the terms and conditions of that service).2. Protecting your online security and strengthening your online privacy when abroad.We do not support or condone the illegal or malicious use of VPN services. Consuming pirated content that is paid-for is neither endorsed nor approved by Future Publishing.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I found 5 hidden shortcuts for my Apple TV 4K that make it so much easier to use — here's how to use them ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tvs/i-found-5-hidden-shortcuts-for-my-apple-tv-4k-that-make-it-so-much-easier-to-use-heres-how-to-use-them</link>
                                                                            <description>
                            <![CDATA[ Learn five Apple TV 4K features that improve navigation, organization, and ease of use. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">uTxdcCrooDVCEmPxbhDuKa</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/o2MW6Vb44S6zJKTvTxfGXZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 01 Mar 2026 09:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[TVs]]></category>
                                                                                                                    <dc:creator><![CDATA[ David Crookes ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/yQWsHDmJr9eBZrL4xqd3bE.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;David Crookes has been writing professionally for close to 30 years and, as well as a great fondness for gaming, space, film, music, history, health and politics, he&#039;s largely specialized in technology for much of his career. He particularly focuses on Apple devices, having admired the company&#039;s tech since using iMac G3 in 1998. He also developed a fondness for the older Macintosh LC III that he later used in his first job as a newspaper reporter.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Since becoming a freelance writer, he has written for a wide number of publications including the Apple-focussed magazines iCreate and Macworld as well as Micro Mart, Web User, T3, Retro Gamer, MagPi, Computer Shopper, Gadget and 3D Artist. His love of gaming has seen him write for Retro Gamer, GamesTM and Wireframe among others and, despite his love of Apple, he still uses a PC – working for PC Pro and once writing for Total PC Gaming.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;One of his joys is helping others to use technology which has led him to writing many “how to” tutorials explaining many ways of getting the most out of various devices. He&#039;s become an expert user of the iPhone, iPad, Mac, Apple Watch and Apple TV. He also likes to kick back with a gaming session on an PlayStation 5 or Xbox Series X | S while getting his retro fix on an Evercade handheld.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/o2MW6Vb44S6zJKTvTxfGXZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Henry T. Casey / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Apple TV 4K (2022) remote in front of a TV with the tvOS home screen.]]></media:description>                                                            <media:text><![CDATA[The Apple TV 4K (2022) remote in front of a TV with the tvOS home screen.]]></media:text>
                                <media:title type="plain"><![CDATA[The Apple TV 4K (2022) remote in front of a TV with the tvOS home screen.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/o2MW6Vb44S6zJKTvTxfGXZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Apple TV 4K hasn't received a major update in years, and it shows. The device feels overdue for a refresh, and rumors suggest one is coming soon. But before you replace it or relegate it to a drawer, there are several interface tweaks that can make it run more smoothly and feel significantly easier to use.</p><p>This isn't about picture quality settings or discovering new apps and games. Instead, we're focusing on practical navigation features that improve how you interact with Apple TV 4K every day—shortcuts that save time, organization tools that reduce clutter, and settings that eliminate common frustrations.</p><p>Here are five ways to make your Apple TV 4K easier to navigate and use.</p><section class="howto-block">                    <h3>1. Quickly go to the Home Screen</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/hWizDuKxZccLU5XPUTm7QR.png"                                        alt="5 hidden ways to make your Apple TV 4K easier to use"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/hWizDuKxZccLU5XPUTm7QR.png"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>One of the most frustrating things about Apple TV is the constant cycling backwards through menus in order to reach the Home Screen. Sometimes, you just want to be able to press a single button and view all of your apps again. So can that be done? Quick answer: yes!</p><p>Simply <strong>open the Settings app</strong> and <strong>select Remotes and devices</strong> then <strong>click TV Button</strong> to set it to Home Screen. Now when you <strong>press the TV button on the Remote</strong>, you will instantly go back to the Home Screen instead of opening Apple TV which is the default setting for this button.</p></p>                </section><section class="howto-block">                    <h3>2. Put apps into folders</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/k4hUWYYQonrHxN3dNCp7xR.png"                                        alt="5 hidden ways to make your Apple TV 4K easier to use"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/k4hUWYYQonrHxN3dNCp7xR.png"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>The Apple TV interface can soon become cluttered but there are ways to help you better navigate the Home Screen. For starters, <strong>place your favorite apps in the top row of the Home Screen</strong> so that they are easily to hand. You can also <strong>highlight this row of icons to see a preview </strong>of the content. </p><p>More notably, however, you can also place apps into folders.</p><p>To move an app, you need to <strong>press and hold on the clickpad or touch surface of your remote</strong> and <strong>select Edit Home Screen</strong>. The clickpad or touch surface can then be used to <strong>drag an app icon </strong>around.</p><p>But if you <strong>select Move to</strong> and then <strong>select New Folder</strong>, you can begin to group your apps together in any way you wish (for example, by putting all the video apps in one folder). You’ll also be given the option to <strong>name the folder</strong> for easier identification.</p></p>                </section><section class="howto-block">                    <h3>3. Change the top row to Continue Watching</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/tNngpQKLNdoAKXdoYXpmhR.png"                                        alt="5 hidden ways to make your Apple TV 4K easier to use"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/tNngpQKLNdoAKXdoYXpmhR.png"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>The Apple TV app uses the top row (or top shelf as it’s known) to promote shows it thinks you would like to use. This means you’ve got to put in a bit more effort to continue watching shows that you’ve already invested in but help is at hand.</p><p>If you <strong>open the Settings app</strong> and <strong>select Apps </strong>then <strong>choose TV</strong>, you can <strong>set Top Shelf to Continue Watching </strong>instead. Now when you open the Apple TV app, you can quickly pick up where you left off.</p></p>                </section><section class="howto-block">                    <h3>4. Make it easier to input letters</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/VwbanY2HGMUCHLUyFFXsWR.png"                                        alt="5 hidden ways to make your Apple TV 4K easier to use"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/VwbanY2HGMUCHLUyFFXsWR.png"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>Entering text on an Apple TV 4K fills me with dread mainly because it’s just so fiddly. Thankfully there is a great workaround for this: you can use your iPhone or iPad as a keyboard. As long as your devices are signed into the same Apple Account and Bluetooth and Wi-Fi are enabled on the iPad or iPhone, then a notification will appear whenever a text field is present on screen.</p><p>There are times, however, when you don’t have your iPhone and iPad to hand (yes, shock, horror). So, if you’re relying on using the remote for text-entry, at least alter the keyboard layout so you’re not scrolling through a linear line of letters. </p><p>For this, <strong>open the Settings app</strong>, <strong>select General </strong>and <strong>choose Keyboard Layout </strong>then, from the options, <strong>select Grid</strong>.</p></p>                </section><section class="howto-block">                    <h3>5. Use the Control Center</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/fUqZt8GsDCaBLfio3NFnER.png"                                        alt="5 hidden ways to make your Apple TV 4K easier to use"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/fUqZt8GsDCaBLfio3NFnER.png"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>You don’t necessarily need to open the Settings app to make quick changes. You can <strong>press and hold the TV button on the Remote to open Control Center</strong> instead.</p><p>From here, you can turn your Apple TV 4K off, change your Wi-Fi or Ethernet settings, activate Do Not Disturb so your viewing pleasure isn’t interrupted by notifications, and decide which speakers or headphones you wish to use.</p><p>The Control Center also lets you set a sleep timer and open game controller settings. There’s a search engine too so you can type or dictate any queries.</p></p>                </section><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/tvs/7-apple-tv-4k-settings-to-change-now-for-the-best-results">7 Apple TV 4K settings to change now for the best results</a></li><li><a href="https://www.tomsguide.com/how-to/how-to-fix-an-apple-tv-thats-not-working">How to fix an Apple TV that's not working — and fix Apple TV remote issues too</a></li><li><a href="https://www.tomsguide.com/how-to/how-to-airplay-to-an-apple-tv">How to AirPlay to an Apple TV</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I would definitely cancel Apple TV and Peacock for March 2026 —here's why ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/i-would-definitely-cancel-apple-tv-and-peacock-for-march-2026-heres-why</link>
                                                                            <description>
                            <![CDATA[ Here's why you should consider canceling Netflix and Disney+ in January 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Ho8pvNxjYLzWhqsJzdbeYj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/GJmgDyMVMkV7P7W7dMYXEG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 28 Feb 2026 08:05:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                <author><![CDATA[ kelly.woo@futurenet.com (Kelly Woo) ]]></author>                    <dc:creator><![CDATA[ Kelly Woo ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/jpnR8RZd8njtxaHRHimzsi.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Kelly is the managing editor of streaming for Tom’s Guide, so basically, she watches TV for a living. She writes news, features and reviews about the streaming realm — hardware, software and content. In a given week, she might test a new Roku stick, check out an interface update on HBO Max, sound off on the trailer for a new Netflix show and provide info on how to watch a fan-favorite series. &lt;/p&gt;&lt;p&gt;In addition to streaming coverage, she also occasionally contributes to the fitness and home sections.&lt;/p&gt;&lt;p&gt;Before joining Tom&#039;s Guide, she was a freelance entertainment writer for Yahoo, Vulture, TV Guide and other outlets and a content creator for HBO, Apple and DotDash. Prior to that, she was a senior editor at AOL Television and Moviefone. She graduated from Duke University with a degree in English literature.&lt;/p&gt;&lt;p&gt;When she’s not watching TV and movies for work, she’s watching them for fun, plus seeing live music, writing songs, knitting and gardening.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/GJmgDyMVMkV7P7W7dMYXEG-1280-80.jpg">
                                                            <media:credit><![CDATA[Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Computer with logo: Netflix , HBO MAX, APPLE TV PLUS, NETFLIX, PRIME VIDEO are online video streaming services]]></media:description>                                                            <media:text><![CDATA[Computer with logo: Netflix , HBO MAX, APPLE TV PLUS, NETFLIX, PRIME VIDEO are online video streaming services]]></media:text>
                                <media:title type="plain"><![CDATA[Computer with logo: Netflix , HBO MAX, APPLE TV PLUS, NETFLIX, PRIME VIDEO are online video streaming services]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/GJmgDyMVMkV7P7W7dMYXEG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As winter winds down and spring spending creeps in, it’s a smart moment to reassess the monthly charges that quietly renew in the background — and streaming subscriptions are often the easiest place to start trimming.</p><p>Americans now spend an average of $84 a month on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a>, according to <a href="https://www.depositaccounts.com/blog/digital-subscription-inflation-study.html" target="_blank">Lending Tree</a>,  and that total keeps climbing as prices rise and new tiers roll out. But there’s no rule that says you have to stay subscribed year-round. You can save a chunk of money by pausing a service or two. It’s easy to hop back in when a must-watch show or movie drops.</p><p>For March 2026, I recommend canceling Apple TV and Peacock. Their current lineups make this a natural window to step away, save a little money and return next month. Here’s why cutting Peacock and Apple TV this month could be a smart move.</p><h2 id="why-i-d-cancel-apple-tv-in-march-2025">Why I'd cancel Apple TV in March 2025</h2><p>No one doubts the quality of Apple TV; when it lands a hit, it really lands. The platform has built a reputation for and prestige originals packed with stars and boasting high production values. The catch is volume: Apple TV is still a curated boutique compared with its rivals, and that makes quieter months, like March, more noticeable.</p><p>There are only three major <a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-coming-to-apple-tv-in-march-2026">new Apple TV releases in March</a>, and the biggest doesn't land until the very end of the month. "For All Mankind" returns for its fifth season on March 27, continuing the space drama’s alternate-history saga. The new season jumps ahead in the years following the Goldilocks asteroid heist, with Happy Valley now a bustling Martian colony. But tensions are rising as Earth’s governments try to impose order on a frontier that no longer wants oversight.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/zojwKLlY_H8" allowfullscreen></iframe></div></div><p>The late premiere date, with just one episode, means you won't miss much if you cancel Apple TV in March. You can easily catch up in April, while saving a bit of cash.</p><p>The other title that might make you hesitate is "Imperfect Women," a glossy psychological thriller led by Elisabeth Moss, Kerry Washington and Kate Mara. Based on Araminta Hall's novel, the eight-part drama follows three lifelong friends whose bond fractures after a devastating crime forces buried secrets to the surface. "Imperfect Women" debuts March 18 with two episodes, then will air weekly after, so again, this is a show you can binge down the road.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/TKEPv8FBeSw" allowfullscreen></iframe></div></div><p>The third noteworthy release is "The Hunt" on March 4, a French thriller that finally debuts after a delay tied to now-resolved plagiarism allegations involving creator-director Cédric Anger. Benoît Magimel stars as Franck, whose routine hunting trip with friends turns deadly when a rival group begins targeting them without warning. The survivors keep the incident secret, but back home with his wife, played by Mélanie Laurent, Franck can’t shake the sense that the men are still coming for revenge.</p><p>The only other consideration against canceling Apple TV in March is the ongoing run of "Shrinking" season 3. You would miss four half-hour episodes, true, but the season finale isn't until April 8. Binge-watching two hours before the last episode will be a breeze.</p><h2 id="why-i-d-cancel-peacock-in-march-2026">Why I'd cancel Peacock in March 2026</h2><p>Peacock’s lineup feels especially quiet in March now that their big live-sports tentpoles, the Super Bowl and Winter Olympics, are over. Their only big new original this month is "Ted" season 2, which debuts on March 5 with all eight episodes. </p><p>Season 2 features the same raunchy humor and coming-of-age antics fans love. Set in 1994, it follows foul-mouthed teddy bear Ted and his awkward best friend John through senior year in their chaotic Boston household. Between John’s blustering dad Matty, endlessly sweet mom Susan and outspoken cousin Blaire, family tensions run high.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/C93GFpbp554" allowfullscreen></iframe></div></div><p>The only other noteworthy addition to Peacock in March is the arrival of "Wicked: For Good." The second part of the blockbuster adaptation reunites Elphaba (Cynthia Erivo) and Glinda (Ariana Grande) for the epic ending of their magical adventure. The regular movie version is also joined by "Wicked: For Good Sing Along."</p><h2 id="how-much-you-ll-save-by-canceling-apple-tv-and-peacock">How much you'll save by canceling Apple TV and Peacock</h2><p>If you hit cancel both Peacock and Apple TV for March, the savings add up faster than you might expect. </p><p>Apple TV costs $12.99/month, while Peacock’s tiers range from $7.99 for Select (which excludes originals, movies, and sports) to $10.99 for Premium with ads, and $16.99 for Premium Plus with no ads and downloads. </p><p>Skipping both for a month can easily free up $20–$30 or more. Not a fortune, but a welcome breather. Both services will roll out new content later in the year, so you can cancel now, reset your budget and jump back in when the next can’t-miss release drops.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV for free</a></li><li><a href="https://www.tomsguide.com/entertainment/peacock/how-to-get-peacock-for-free">How to get Peacock for free</a></li><li><a href="https://www.tomsguide.com/best-picks/best-free-streaming-services">Best free streaming services</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 'Monarch: Legacy of Monsters' season 2 premiere delivers a new Titan and more Kong  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/monarch-legacy-of-monsters-season-2-premiere-delivers-a-new-titan-and-more-kong</link>
                                                                            <description>
                            <![CDATA[ 'Monarch: Legacy of Monsters' season 2 premiere is a mixed bag, but delivers a lot of promise with a new Titan on Earth and more Kong. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">uqeVhftCmXnTW3s78ddxcE</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Pxmj4CzDMEg6ZUvKKaYynd-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Fri, 27 Feb 2026 17:13:59 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ malcolm.mcmillan@futurenet.com (Malcolm McMillan) ]]></author>                    <dc:creator><![CDATA[ Malcolm McMillan ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sSDLEbNEgBXf86HpujaWZ6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Malcolm McMillan is a Streaming Editor for Tom&#039;s Guide, covering all the latest in streaming TV shows and movies. That means news, analysis, recommendations, reviews and more for just about anything you can watch, including sports! If it can be seen on a screen, he can write about it. &lt;/p&gt;&lt;p&gt;Malcolm has been with Tom&#039;s Guide since June 2022, starting as a staff writer covering breaking news. Since then, he&#039;s transitioned to cover artificial intelligence (AI), A/V tech and VR headsets. Since late 2023 he has almost exclusively covered streaming and entertainment for Tom&#039;s Guide.&lt;/p&gt;&lt;p&gt;Before writing for Tom&#039;s Guide, Malcolm worked as a fantasy football analyst writing for several sites and also had a brief stint working for Microsoft selling laptops, Xbox products and even the ill-fated Windows phone. He is passionate about video games and sports, though both cause him to yell at the TV frequently. He proudly sports many tattoos, including an Arsenal tattoo, in honor of the team that causes him to yell at the TV the most.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/Pxmj4CzDMEg6ZUvKKaYynd-1280-80.png">
                                                            <media:credit><![CDATA[Apple TV]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Kong in &quot;Monarch: Legacy of Monsters,&quot; now streaming on Apple TV.]]></media:description>                                                            <media:text><![CDATA[Kong in &quot;Monarch: Legacy of Monsters,&quot; now streaming on Apple TV.]]></media:text>
                                <media:title type="plain"><![CDATA[Kong in &quot;Monarch: Legacy of Monsters,&quot; now streaming on Apple TV.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Pxmj4CzDMEg6ZUvKKaYynd-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">Tom's Guide Verdict: 'Monarch: Legacy of Monsters' season 2 premiere</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li><strong>Rating: 3/5 Stars</strong></li><li><strong>Verdict: </strong>"Monarch: Legacy of Monsters" season 2 kicks off right where we left off in season 1. There's so much lore and so many timelines that you wonder if you don't need an encyclopedia to understand it all, and one storyline is starting to separate itself from the pack in terms of quality. But we also get Kong chasing of a Titan, so I can't complain too much.</li><li><strong>Premiere date/time:</strong> Currently available to stream</li><li><strong>Where to watch:</strong> <a data-analytics-id="inline-link" href="https://tv.apple.com/" target="_blank" rel="nofollow">Stream the season 2 premiere on Apple TV</a></li></ul></p></div></div><p>"Monarch: Legacy of Monsters" season 2 just premiered on <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a>, and my first reaction after finishing the episode was that we're going to get a lot of Kong this season. My second reaction is that I'm starting to only care about one particular storyline in this show, and that might be a Titan-sized problem.</p><p>But for the most part, the season 2 premiere is largely set up for the rest of the season. We kick things off right where we left off in season 1: on Skull Island with Kong going berserk. And by the end of the episode, we're still on Skull Island with Kong going berserk, but this time he's chasing off Titan X.</p><p>It's not just the present where Titan X is a problem, either. One of the hallmarks of this sci-fi series is that it's split between two timelines: one in the past with <em>Wyatt</em> Russell starring as Col. Lee Shaw, and one in the present with <em>Kurt</em> Russell starring as Col<em>.</em> Lee Shaw. In season 2, they're both hunting down Titan X, and it remains to be seen if it goes well for either version of Shaw.</p><h2 id="this-show-has-a-time-hopping-problem">This show has a time-hopping problem</h2><p>The split timelines are officially my most and least favorite thing about this show. I think it's great for filling in the story and fleshing out the world. But I'm starting to find myself really wanting to see one particular timeline, and losing interest in the other.</p><p>This largely comes down to two things: chemistry and writing. I love Anna Sawai, who plays Cate Randa; her performance in "Shogun" is exemplary. But this show is <em>not</em> "Shogun," and her character's dialogue is nowhere near as well-written. I find little compelling about her or her half-brother Kentaro (Ren Watabe), and his ex, May/Corah (Kiersey Clemons), only occasionally piques my interest. I'm not sure the group has chemistry with each other, and it drags the story down.</p><p>Their story takes place in the present-day timeline, where the highlight is by far Kurt Russell as the older version of Col. Shaw. But the past timeline is far superior, and growing more so with every episode.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2852px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="sCuBLiF3oTaWuNmvbYmJwc" name="Monarch_Legacy_of_Monsters_Photo_020107-1 (1)" alt="Mari Yamamoto, Anders Holm and Wyatt Russell in "Monarch: Legacy of Monsters," now streaming on Apple TV." src="https://cdn.mos.cms.futurecdn.net/sCuBLiF3oTaWuNmvbYmJwc.png" mos="" align="middle" fullscreen="" width="2852" height="1604" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple TV)</span></figcaption></figure><p>Again, this largely comes down to chemistry and writing. The younger version of Shaw, played by Kurt's son Wyatt, is simply better written in terms of character building and dialogue, to the point where the performance is running laps around his dad, who I'd still argue is the better actor.</p><p>But the most engaging thing about the past storyline is the simmering tension between Shaw, Dr. Keiko Miura (Mari Yamamoto) and Bill Randa (Anders Holm). Not only is their professional tension — the scientific-minded Keiko and Bill vs. the military man Shaw — a compelling plotline to monitor, but their personal tension is as well. Keiko and Bill end up together, but it's clear she had eyes for Shaw first, and it's just as clear that she's left a hole in his heart that he's struggled to fill. Despite this, the three remain collegial and friendly, adding another layer to the group dynamic.</p><h2 id="despite-a-flawed-premiere-monarch-legacy-of-monsters-season-2-looks-set-to-deliver-an-epic-story">Despite a flawed premiere, 'Monarch: Legacy of Monsters' season 2 looks set to deliver an epic story</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ZgWrFoaisdk" allowfullscreen></iframe></div></div><p>It's a real problem if your monster show's more monster-heavy storyline has me less engaged than a love triangle that dips into will-they-won't-they territory and settling to prevent yourself from being hurt and unrequited love. The main draw of a show about giant monsters <em>should</em> be the giant monsters.</p><p>The good news is that by the end of the season 2 premiere, "Monarch" got me hooked with some giant monsters. We finally see the mythical Titan X, which we know from the trailer and things the cast have said in interviews, is the big bad of the season. We also get a decent amount of Kong in this episode, including when he chases off Titan X into the sea when the latter arrives through the rift from Axis Mundi to Skull Island.</p><p>The one monster we don't get? Godzilla. Based on the trailer, that'll be fixed before the end of season 2, which looks likely to feature a showdown between Kong, Titan X and Godzilla. If that's the case, I'll gladly suffer through a lot of unengaging story to get that titanic showdown.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W21Y7e"></div>                            </div>                            <script src="https://kwizly.com/embed/W21Y7e.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More From Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/movies/pillion-is-a-moving-romance-movie-with-alexander-skarsgard-thats-a-must-watch-just-dont-bring-your-parents">'Pillion' is a moving romance movie with Alexander Skarsgård that’s a must-watch, just don’t bring your parents</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/apple-announces-f1-partnerships-with-netflix-tubi-and-imax-for-2026-along-with-incredible-multiview-features">Apple announces F1 partnerships with Netflix, Tubi and IMAX for 2026, along with incredible Multiview features</a></li><li><a href="https://www.tomsguide.com/entertainment/hulu/3-new-to-hulu-shows-you-need-to-binge-watch-this-weekend-feb-27-march-1">3 new to Hulu shows you need to binge-watch this weekend (Feb. 27-March 1)</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple announces F1 partnerships with Netflix, Tubi and IMAX for 2026, along with incredible Multiview features ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/apple-announces-f1-partnerships-with-netflix-tubi-and-imax-for-2026-along-with-incredible-multiview-features</link>
                                                                            <description>
                            <![CDATA[ Apple just announced partnerships with Netflix, Tubi and IMAX for the 2026 Formula 1 season, as well as new Multiview features and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">QoY6dTUDPDF29CtYwoGP48</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/CgkimsepozM7xkqBMDhkbM-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 26 Feb 2026 18:45:42 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                <author><![CDATA[ malcolm.mcmillan@futurenet.com (Malcolm McMillan) ]]></author>                    <dc:creator><![CDATA[ Malcolm McMillan ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/sSDLEbNEgBXf86HpujaWZ6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Malcolm McMillan is a Streaming Editor for Tom&#039;s Guide, covering all the latest in streaming TV shows and movies. That means news, analysis, recommendations, reviews and more for just about anything you can watch, including sports! If it can be seen on a screen, he can write about it. &lt;/p&gt;&lt;p&gt;Malcolm has been with Tom&#039;s Guide since June 2022, starting as a staff writer covering breaking news. Since then, he&#039;s transitioned to cover artificial intelligence (AI), A/V tech and VR headsets. Since late 2023 he has almost exclusively covered streaming and entertainment for Tom&#039;s Guide.&lt;/p&gt;&lt;p&gt;Before writing for Tom&#039;s Guide, Malcolm worked as a fantasy football analyst writing for several sites and also had a brief stint working for Microsoft selling laptops, Xbox products and even the ill-fated Windows phone. He is passionate about video games and sports, though both cause him to yell at the TV frequently. He proudly sports many tattoos, including an Arsenal tattoo, in honor of the team that causes him to yell at the TV the most.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/CgkimsepozM7xkqBMDhkbM-1280-80.jpg">
                                                            <media:credit><![CDATA[Photo by Steve Etherington / LAT Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Lando Norris, McLaren MCL38, leads Max Verstappen, Red Bull Racing RB20, Oscar Piastri, McLaren MCL38, Charles Leclerc, Ferrari SF-24, Carlos Sainz, Ferrari SF-24, and the rest of the field at the start during the Hungarian GP at Hungaroring on Sunday July 21, 2024 in Budapest, Hungary. ]]></media:description>                                                            <media:text><![CDATA[Lando Norris, McLaren MCL38, leads Max Verstappen, Red Bull Racing RB20, Oscar Piastri, McLaren MCL38, Charles Leclerc, Ferrari SF-24, Carlos Sainz, Ferrari SF-24, and the rest of the field at the start during the Hungarian GP at Hungaroring on Sunday July 21, 2024 in Budapest, Hungary. ]]></media:text>
                                <media:title type="plain"><![CDATA[Lando Norris, McLaren MCL38, leads Max Verstappen, Red Bull Racing RB20, Oscar Piastri, McLaren MCL38, Charles Leclerc, Ferrari SF-24, Carlos Sainz, Ferrari SF-24, and the rest of the field at the start during the Hungarian GP at Hungaroring on Sunday July 21, 2024 in Budapest, Hungary. ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/CgkimsepozM7xkqBMDhkbM-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div  class="fancy-box"><div class="fancy_box-title">F1 2026 on Apple TV: Key Points</div><div class="fancy_box_body"><p class="fancy-box__body-text"><ul><li>Included free with U.S. Apple TV subscriptions</li><li>"Formula 1: Drive to Survive" season 8 on Apple TV and Netflix starting Feb. 27</li><li>Canadian Grand Prix will be broadcast on Netflix as well as Apple TV</li><li>Multiview allows you to watch up to four feeds at once (five on Vision Pro)</li></ul></p></div></div><p>Apple just revealed a whole treasure trove of information about its plans for the 2026 <a href="https://www.tomsguide.com/tag/formula-1">Formula 1</a> season, and there are some major headlines. Top of the list is a major partnership with <a href="https://www.tomsguide.com/entertainment/streaming/netflix">Netflix</a>. This will bring season 8 of the hit Netflix series "Formula 1: Drive to Survive" to <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a> starting tomorrow (Feb. 27), the same time it drops on Netflix. In return, Netflix subscribers will get access to the broadcast of the Canadian Grand Prix, which is a big win for Netflix users.</p><p>In case you missed it, last year, <a href="https://www.tomsguide.com/entertainment/apple-tv-plus/apple-tv-just-announced-formula-1-is-coming-next-year-including-free-races-for-non-subscribers">Apple TV won the U.S. rights to F1 for the 2026 season</a> and beyond. Starting this year, Apple TV is the exclusive U.S. home for broadcasts and replays of F1 practice sessions, qualifying for both Sprints and Grands Prix, Sprint races, and Grand Prix races. Some of those races and <em>all </em>practice sessions will be available to stream for free in the Apple TV app and F1 TV Premium will be free to those with an Apple TV subscription.</p><p>But the big question mark was "Drive to Survive." Now that has been answered, but we've also learned about upcoming partnerships with Tubi and IMAX, new multiview features and so much more.</p><h2 id="netflix-tubi-and-imax-are-joining-in-on-the-f1-fun-with-apple">Netflix, Tubi and IMAX are joining in on the F1 fun with Apple</h2><p>I'll dive into all the technical details of the 2026 F1 experience on Apple's host of apps, but real quick, I want to highlight the partnerships that Apple's senior vice president of Services, Eddy Cue, announced in a virtual press briefing I attended today. I think these partnerships not only have the potential to grow the sport, but save you some money if you're considering getting into F1 but don't want to commit to an Apple TV subscription.</p><p>I already covered the Netflix details: "Drive to Survive" season 8 is coming to Apple TV as well as Netflix, and the 2026 Canadian Grand Prix is coming to Netflix in addition to Apple TV. But that's not the only <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">streaming service</a> that will get in on the F1 fun with Apple. Cue revealed that Tubi, one of the <a href="https://www.tomsguide.com/best-picks/best-free-streaming-services">best free streaming services</a>, will also be partnering with Apple. An Apple spokesperson clarified that this would come in the form of "altcasts" for select races that will be free to stream on Tubi.</p><p>IMAX will also be getting a selection of races at select IMAX theaters, per Apple. Unfortunately, more details aren't available yet, so stay tuned.</p><h2 id="multiview-4k-dolby-vision-and-more-coming-to-f1-on-apple-tv">Multiview, 4K, Dolby Vision and more coming to F1 on Apple TV</h2><p>OK, now you know all the places <em>where</em> you can watch F1 this season, but let's dive into the <em>how</em>.</p><p>One of the biggest features announced by Apple today, which will be broadcasting the F1 TV feed in 4K, with Dolby Vision and 5.1 surround audio, is that there will be <em>30</em> additional feeds you can stream during the broadcast. This includes a driver tracker, a driver data feed, feeds for P1, P2 and P3 drivers and a dedicated feed for each of the 22 drivers on the grid.</p><p>Thanks to multiview, you'll be able to watch up to four of these feeds at once on Apple TV 4K and iPad. If you're watching on an Apple Vision Pro, you'll be able to watch up to 5 feeds simultaneously. This includes curated multiviews such as a P1-P3 Multiview, team specfic feeds, etc. You'll even be able to access the Sky One broadcast as one of the feeds, if you prefer Sky's F1 commentary.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XY33oW"></div>                            </div>                            <script src="https://kwizly.com/embed/XY33oW.js" async></script><p>Finally, there are some Apple app synergies that Apple teased when it first announced the F1 deal last year. On race day, the race will be the first thing you see on the Apple TV home page, and you can go right into the race from the home page (it will also autoplay). The Apple Sports app will give you a live leaderboard from which you can launch the live race feed on Apple TV. It will also create live activities that appear automatically on iPhone and Apple Watch at race starts.</p><p>There will also be an F1 widget for the home screen, and Apple News will offer a live feed of the race in the Formula 1 news coverage section of its app. Apple Maps will expand F1 race maps to Melbourne this year (it was previously limited to Monaco) and finally, Apple Music will get a live broadcast commentary feed for free on Apple Radio, as well as a dedicated F1 hub with curated playlists.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/movies/crime-101-review-this-crime-thriller-is-one-of-my-favorite-movies-of-the-year-so-far">'Crime 101' review: This crime thriller is one of my favorite movies of the year so far</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/netflixs-the-night-agent-returns-for-season-3-and-delivers-a-slow-burn-spy-thriller-that-satisfies-rather-than-stuns">Netflix's 'The Night Agent' season 3 is 'the fast food of spy thrillers' — and it’s the perfect weekend binge</a></li><li><a href="https://proof.vanilla.tools/tomsguide/articles/edit/YzZw8UvqNZoSuQW7rTtXWV">'56 Days' is Prime Video's latest crime thriller and it’s an extremely bingeable watch</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ March 2026's streaming calendar is jam-packed with quality new shows – I've rounded up the top 8 that deserve to be on your watchlist ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/march-2026s-streaming-calendar-is-jam-packed-with-quality-new-shows-ive-rounded-up-the-top-8-that-deserve-to-be-on-your-watchlist</link>
                                                                            <description>
                            <![CDATA[ Not sure what to watch this March? These are the best blockbuster films and television shows coming soon to Australia's top streaming services. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">asG9HMmogVFEiXZB9QLVqD</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/CDmsBZ3HFBzjrfFG2pEkjK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 26 Feb 2026 02:31:28 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                <author><![CDATA[ lucy.scotting@futurenet.com (Lucy Scotting) ]]></author>                    <dc:creator><![CDATA[ Lucy Scotting ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/UC9ncAYxkmJ5ipHEyX44ri.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Lucy Scotting is a digital content writer for Tom’s Guide in Australia, covering NBN and internet-related news. Lucy started her career writing for HR and staffing industry publications, with articles covering emerging tech, business and finance.&lt;/p&gt;&lt;p&gt;In her spare time, Lucy can be found watching sci-fi movies, working on her dystopian fiction novel (in progress since 2017) or hanging out with her dog, Fletcher, and her three cats. If she’s not found doing any of the above, she’s likely on her next adventure to a new city, country, or continent. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/CDmsBZ3HFBzjrfFG2pEkjK-1280-80.jpg">
                                                            <media:credit><![CDATA[Netflix]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Heartbreak high season 3 key art]]></media:description>                                                            <media:text><![CDATA[Heartbreak high season 3 key art]]></media:text>
                                <media:title type="plain"><![CDATA[Heartbreak high season 3 key art]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/CDmsBZ3HFBzjrfFG2pEkjK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If I could choose one activity to do for the rest of my life without complaints, it would be binge-watching. From new streaming releases to theatrical debuts, 2026 is shaping up to be a great year in entertainment, if I do say so myself. </p><p>From the latest Ghostface entry, <a href="https://www.rottentomatoes.com/m/scream_7" target="_blank">Scream 7</a>, to the next assembling of Marvel Heroes in Avengers: Doomsday and the latest Hunger Games prequel, Sunrise on the Reaping, I'm pretty keen to take a seat at my local cinema and dig into a bucket of popcorn. And as a streaming writer, I'm pretty fortunate that watching new movies and television shows on the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services in Australia</a> is quite <em>literally</em> my bread and butter. </p><p>Now, I've got a few months to wait before I can get stuck into those films above — <a href="https://www.tomsguide.com/entertainment/movies/avengers-doomsday-cast-isnt-fully-assembled-yet-heres-who-i-think-should-join-next">Avengers: Doomsday</a> doesn't arrive until December 17, 2026, for example — so I've turned my excitement into what's coming up on streaming platforms, and boy, am I hyped. </p><p>March, in my humble opinion, is set to be a fantastic month for hot new entries coming to streaming services like <a href="https://www.tomsguide.com/reference/disney-plus-price-australia">Disney+</a>, <a href="https://www.tomsguide.com/reference/netflix-price-australia">Netflix</a>, <a href="https://www.tomsguide.com/reference/max-price-australia">HBO Max</a>, <a href="https://www.tomsguide.com/reference/stan-price-australia">Stan</a>, <a href="https://www.tomsguide.com/reference/prime-video-prices-australia">Prime Video</a> and more. There's a complete list of streaming entries coming in March over on our <a href="https://www.tomsguide.com/reference/what-to-watch-in-australia">constantly updated what to watch guide</a>, but in my opinion, these highly anticipated shows deserve their own time to shine. </p><p>From lighthearted reality romances to superhero action and shocking thrillers, there's something for everyone. And frankly, these new additions aren't worth glossing over. So pull up your calendar, and get ready to binge the best television shows coming to your favourite streaming platforms this March. </p><h2 id="daredevil-born-again-season-2">Daredevil: Born Again (Season 2)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/sBVjIlTjoIk" allowfullscreen></iframe></div></div><p>Charlie Cox is back! After a well-rated season one, Daredevil's reboot makes a triumphant return to Disney+ on March 25. </p><p>After the events of season one, season two picks up as Mayor Wilson Fisk (Vincent D'Onofrio) is crushing New York City underfoot as he hunts down public enemy number one, the Hell’s Kitchen vigilante known as Daredevil. But beneath the horned mask, Matt Murdock (Charlie Cox) will try to fight back from the shadows to tear down the Kingpin’s corrupt empire and redeem his home. </p><p>Returning to the series are Deborah Ann Woll as Karen Page, Ayelet Zurer as Vanessa Fisk, Wilson Bethel as Benjamin Poindexter/Bullseye and Margarita Levieva as Heather Glenn. This season also marks the long-awaited return of Krysten Ritter as fan-favourite Jessica Jones and introduces Matthew Lillard as the mysterious Mr Charles.</p><p><a href="https://www.disneyplus.com/en-au" target="_blank"><em>Stream Daredevil: Born Again on Disney+, premiering on March 25</em></a></p><h2 id="something-very-bad-is-going-to-happen">Something Very Bad is Going to Happen</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/jLSzx0gkQuA" allowfullscreen></iframe></div></div><p>From showrunner Haley Z Boston comes this gripping Netflix original series — of which I've been eagerly waiting for since I watched the trailer last week. </p><p>While not much has been revealed about the show's synopsis yet, we do know it is a limited atmospheric horror series set at a wedding, following a bride and groom in the week leading up to their ill-fated nuptials. That’s not a spoiler — just read the title. The first chilling trailer shows us a glimpse of what lies ahead, including the sinister stakes at play. </p><p><a href="https://www.netflix.com/au/" target="_blank" rel="nofollow"><em>Stream Something Very Bad is Going to Happen on Netflix from March 26</em></a></p><h2 id="deadloch-season-2">Deadloch (Season 2)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/bEu3XAz0otY" allowfullscreen></iframe></div></div><p>If you haven't experienced the joy, humour and all-around good time that is Deadloch season one, I'd suggest giving it a red hot go before sitting down for the new season. </p><p>Set in the fictional sleepy coastal town of Deadloch, Tasmania, this Aussie black comedy centres around an unlikely detective duo who reluctantly head up a murder investigation together: the meticulous Senior Sergeant Dulcie Collins (Kate Box), a Deadloch local, and the reckless Darwinite, Detective Eddie Redcliffe (Madeleine Sami). I've been referring to the series as "Kath and Kim do crime" since its debut in 2023, as it perfectly blends quintessential Aussie humour with the harrowing twists and turns of a suspenseful thriller. </p><p>Beyond that, I'm even more excited about the premise of season two, which sees Dulcie and Eddie head to the Top End to investigate the murder of Eddie's beloved former partner, Bushy. </p><p><a href="https://www.primevideo.com/" target="_blank"><em>Stream Deadloch on Prime Video, premiering on March 20</em></a></p><h2 id="heartbreak-high-season-3">Heartbreak High (Season 3)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wymtRy0AviI" allowfullscreen></iframe></div></div><p>Looking for Aussie teenage drama at its finest? Meet Heartbreak High. I've loved everything about this show — especially how it takes place in my home city of Sydney, Australia — but don't just take my word for it. The Netflix original has gotten a <a href="https://www.rottentomatoes.com/tv/heartbreak_high_2022" target="_blank">nice 86% RT audience rating</a> for its first two seasons, and I'm sure its finale will be just as good, if not better. </p><p>As per the logline, for Hartley High’s graduating class, it’s goodbye school, hello adulthood! Yet when a revenge prank goes horribly wrong, Amerie and her friends must cover up their secret or risk losing everything. </p><p><a href="https://www.netflix.com/au/" target="_blank" rel="nofollow"><em>Stream Heartbreak High on Netflix from March 25</em></a></p><h2 id="jury-duty-presents-company-retreat">Jury Duty Presents: Company Retreat</h2><div class="instagram-embed"><blockquote class="instagram-media"  data-instgrm-version="6" style="width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"><p><a href="https://www.instagram.com/p/DUGVI_RDnud/" target="_blank">A post shared by Jury Duty Presents (@jurydutypresents)</a></p><p>A photo posted by  on </p></blockquote></div><p>In a fun new instalment, Jury Duty is back, and this time, we're going on a company retreat! And if it's anything like the hit first season, we're in for a ride. </p><p>Jury Duty Presents: Company Retreat captures a corporate offsite event at a family-owned hot sauce company from the perspective of Anthony, a recently hired temporary worker. Undisclosed to Anthony, the entire experience is staged; every colleague around him is an actor, and every interaction has been orchestrated. As the founder prepares to step down, the getaway transforms into a clash between big corporate ambitions and small business values, with control of the company hanging in the balance.</p><p><a href="https://www.primevideo.com/"><em>Stream Jury Duty Presents: Company Retreat on Prime Video from March 20</em></a></p><h2 id="rooster">Rooster</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/L00r5BGgP64" allowfullscreen></iframe></div></div><p>A comedy series starring Steve Carell? Sign me up! HBO Max's Rooster is a character-driven, college-set comedy that follows a celebrated author, Greg Russo (Steve Carell), navigating the messy realities of academia, family, and reinvention. </p><p>At the centre is his complicated, often hilarious relationship with his daughter, Katie (Charly Clive), whose presence on campus forces them to confront long-standing tensions, shifting ambitions, and the challenge of redefining who they are to each other. </p><p><a href="https://www.hbomax.com/au/en" target="_blank" rel="nofollow"><em>Stream Rooster on HBO Max, premiering March 9</em></a></p><h2 id="the-madison">The Madison </h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/OSb-X_YkLg4" allowfullscreen></iframe></div></div><p>Paramount+ is doing what it does best — and that's beautifully crafted ranch landscapes with very attractive actors. From the creator of Yellowstone, Taylor Sheridan, comes this profound family story about grief, which has already been renewed for a second season before its premiere. </p><p>Starring Michelle Pfeiffer, Kurt Russell, Patrick J Adams and Elle Chapman, The Madison unfolds across two distinct worlds — the beautiful landscape of Montana and the vibrant energy of Manhattan — as it examines the ties that bind families together. Introducing the Clyburns, the six-episode first season of The Madison is a heartfelt study of grief and human connection following a New York City family in the Madison River valley of central Montana.</p><p><a href="https://www.paramountplus.com/au/" target="_blank" rel="nofollow"><em>Stream The Madison on Paramount+, premiering March 14 </em></a></p><h2 id="the-bachelorette">The Bachelorette</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/SVOwysZ0EWc" allowfullscreen></iframe></div></div><p>Will you have this rose? Yuuuup. As a fellow fan of the Disney+ reality show, The Secret Lives of Mormon Wives, it's no secret (pun intended) that I'll be diving into the latest season of The Bachelorette on Stan, starring none other than #MomTok founder herself, Taylor Frankie Paul. </p><p>Given how Taylor's past rocky relationship is portrayed on TSLMW, it'll be quite entertaining to watch her journey to find the one. And from the initial trailer, it seems like the producers have indeed found some eye candy that may tickle Paul's (and the viewers') fancy. </p><p><a href="https://www.stan.com.au/" target="_blank" rel="nofollow"><em>Stream The Bachelorette on Stan, premiering March 23</em></a></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eBnGme"></div>                            </div>                            <script src="https://kwizly.com/embed/eBnGme.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/reference/what-to-watch-in-australia">What to watch in Australia in March 2026</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/new-netflix-shows-and-movies-february-23-march-1-2026">Netflix new releases — 5 shows and movies you need to stream this week (Feb. 23-March 1)</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 best Apple TV shows to stream when you're snowed in  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/3-best-shows-to-stream-on-apple-tv-when-youre-snowed-in</link>
                                                                            <description>
                            <![CDATA[ Snowed in? These are the three best Apple TV shows to watch after a record blizzard dumped over two feet on snow in areas of the northeast. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CEbkMiMEw65TBKxqVrBRNY</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/YikeRnwZvksRMPFjw4xHrF-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 24 Feb 2026 18:42:37 +0000</pubDate>                                                                                                                                <updated>Wed, 25 Feb 2026 11:45:54 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alyse Stanley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/BxNnQuBWRHqkv5xWZsjrjc.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Alyse Stanley is a news editor at Tom’s Guide, overseeing weekend coverage and writing about the latest in tech, gaming, and entertainment. Before Tom’s Guide, Alyse worked as an editor for the Washington Post’s sunsetted video game section, Launcher, where she also wrote about indie games you shouldn’t miss, how to tackle your gaming backlog, and all things Nintendo. She previously led Gizmodo’s weekend news desk covering breaking tech news and has written game reviews and features for outlets like Polygon, Unwinnable, and Rock, Paper, Shotgun. A recent Chicago-area transplant born and raised in Virginia, Alyse is a big fan of horror movies, cartoons, and roller skating. She&#039;s also a puzzle fan and can often be found contributing to the NYT Connections coverage on Tom&#039;s Guide &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/YikeRnwZvksRMPFjw4xHrF-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV logo on winter blue background]]></media:description>                                                            <media:text><![CDATA[Apple TV logo on winter blue background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV logo on winter blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/YikeRnwZvksRMPFjw4xHrF-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>A blizzard with record snowfall hit the Northeast U.S. over the weekend, dumping over 2 feet of snow in the region. If the idea of curling up on the couch and catching up on your watchlist is your idea of riding out the storm, you're in the right place. As one of <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">the best streaming services</a> out there, Apple TV is packed with plenty of charming TV shows that are easy to get hooked on from the first episode. </p><p>Whether you're looking for a cozy mystery with some gorgeous Irish scenery (and deliciously messy sibling dynamics) or a heartwarming drama about adult friendships, there's something here to match whatever vibe you're looking for. So grab a blanket, pour yourself a mug of hot cocoa, and queue up these binge-worthy Apple TV series that deserve a spot on your watchlist. </p><p>If you're still hunting for even more recommendations on what to watch, check out all the new titles coming to <a href="https://www.tomsguide.com/entertainment/netflix/new-on-netflix-in-february-2026-5-best-shows-and-movies-to-stream-plus-full-release-list">Netflix</a> and <a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-february-2026-all-the-new-shows-and-movies-to-watch">Prime Video</a> this month.</p><h2 id="platonic">'Platonic'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Nnn02jJf5ys" allowfullscreen></iframe></div></div><p>You’ll hear plenty about how men grow lonelier with age and struggle to maintain close friendships — but that’s not the story in “Platonic.” Instead, the series flips the script, centering on a friendship that refuses to fade away. Seth Rogen and Rose Byrne share an electric, offbeat chemistry as Will (Rogen) and Sylvia (Byrne), two former best friends who reconnect in the middle of their respective midlife spirals. With two comedy heavyweights at the helm, "Platonic" is one of the funniest shows on Apple TV Plus to date, earning a spot on our <a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">best Apple TV Plus shows</a> list.</p><p>Will and Sylvia’s friendship imploded years ago after he married a woman Sylvia couldn’t stand, and they didn’t exactly leave things on good terms. But when Will’s marriage falls apart, the two find their way back into each other's orbit, now older, messier, and still wildly co-dependent. A more conventional show might steer them toward romance, but that would go against the show's title. These two are strictly platonic friends, a pair of co-dependent idiots attempting to reel in their worst impulses and become better for the people they love. Naturally, that’s much harder than it sounds.</p><p><em><strong>Watch </strong></em><a href="https://tv.apple.com/us/show/platonic/umc.cmc.y7bc18x7co813l8i2tlsyb4l" target="_blank" rel="nofollow"><em><strong>"Platonic" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="bad-sisters-2">'Bad Sisters'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/IZUrhfCl0Xc" allowfullscreen></iframe></div></div><p>I'm one of three sisters, so "Bad Sisters" is near and dear to my heart. A murder mystery isn’t usually what I reach for when I’m in the mood for something cozy. But between this show's phenomenal cast, dreamy Irish coastal backdrop, and messy family dynamics (siblings, amirite?), it's hard not to get hooked. It's part pitch-black dark comedy and part mystery thriller that keeps you guessing about who, if anyone, is going to come out of this mess unscathed.</p><p>At the heart of all the chaos are the fiercely loyal Garvey sisters—Grace (Anne-Marie Duff), Eva (Sharon Horgan), Ursula (Eva Birthistle), Bibi (Sarah Greene), and Becka (Eve Hewson). Their unbreakable bond starts to crack when Grace’s husband, John Paul (Claes Bang), turns out to be far from the nice guy he pretends to be. From the show's opening scene where the sisters gather at his funeral and collectively exhale in relief, it’s clear his death isn’t exactly a tragedy in their eyes. Each sister has a reason to want him gone, and it's up to floundering insurance agent Tom Claffin (Brian Gleeson) to get to figure out what really happened. Officially, he’s investigating a suspicious death. Unofficially, he’s trying to avoid a payout that would sink his father’s already struggling insurance business.</p><p><em><strong>Stream </strong></em><a href="https://tv.apple.com/us/show/bad-sisters/umc.cmc.14kr4vv65unannh7doqgvlh20" target="_blank" rel="nofollow"><em><strong>"Bad Sisters" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="pluribus">'Pluribus'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/a6lzvWby9UE" allowfullscreen></iframe></div></div><p>"Breaking Bad" and "Better Call Saul" creator Vince Gilligan's latest project, "Pluribus," arrived late last year, going on to become <a href="https://x.com/AppleTV/status/1999600267944427859" target="_blank">the most-watched show in Apple TV history.</a> The show brings Gilligan's distinctly dry humor and intrigue to a fresh spin on the post-apocalyptic zombie trope. The phenomenal Rhea Seehorn stars as Carol Sturka, a middle-aged, bestselling author of romantic fantasy novels and the last cynic standing after a mysterious virus unites the majority of the human race in an overly cheery collective consciousness. </p><p>Society desperately wants her to be as content and carefree as the rest of them, but her prickly demeanor becomes an act of rebellion. As the hive closes in with unnerving friendliness, it falls to her to save the world from this new wave of happiness. "Pluribus" is the kind of show you want to watch without knowing anything at all, so I won't say more to avoid spoilers, but "Pluribus" is easy to get hooked on after just a few episodes. </p><p><em><strong>Stream </strong></em><a href="https://tv.apple.com/us/show/pluribus/umc.cmc.37axgovs2yozlyh3c2cmwzlza" target="_blank" rel="nofollow"><em><strong>"Pluribus" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/prime-video/3-underrated-prime-video-shows-perfect-for-a-snow-day">3 Prime Video shows that are perfect to stream when you're snowed in</a></li><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV for free</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/everything-new-coming-to-apple-tv-in-march-2026">Everything new coming to Apple TV in March 2026</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Everything new coming to Apple TV in March 2026 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/everything-new-coming-to-apple-tv-in-march-2026</link>
                                                                            <description>
                            <![CDATA[ Our guide on the new movies and shows coming to Apple TV Plus in March 2026. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Jsx3VX3kUaCNvM2GNFaPUh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HF6MiZSEiQqKsfxnrwLtoE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 24 Feb 2026 06:30:00 +0000</pubDate>                                                                                                                                <updated>Tue, 24 Feb 2026 08:45:50 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Brittany Vincent ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/JDgb6vqXHys3nrFJpkRCub.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/HF6MiZSEiQqKsfxnrwLtoE-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple TV; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV logo on a orange yellow background]]></media:description>                                                            <media:text><![CDATA[Apple TV logo on a orange yellow background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV logo on a orange yellow background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HF6MiZSEiQqKsfxnrwLtoE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The year's frigid start is (very) slowly melting away, and the month's hot new batch of streaming releases might just be helping warm things up. Yes, the beginning of March brings freshly dropped films and buzzy TV titles to one of the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services </a>around, <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a>, giving you even more reasons to check in with the platform. </p><p>Leading the way is the much-talked-about French thriller series "The Hunt," which sets Benoît Magimel and Mélanie Laurent in the middle of a dangerous revenge plot. From there, a trio of award-winning actresses — Elisabeth Moss, Kerry Washington and Kate Mara — join forces to lead an all-star cast in the psychological series "Imperfect Women." And along with those new titles, the month also brings with it returning favorites, like the fifth season of the sci-fi favorite "For All Mankind." </p><p>Looking for what to queue up next? Keep scrolling for a closer look at what’s new on Apple TV this March. </p><h2 id="the-hunt">'The Hunt'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Uobdx84anoc" allowfullscreen></iframe></div></div><p>After a bit of a rocky start — Apple TV postponed the French drama series (titled "Traqués" in France) from its original December 2025 release date following allegations of plagiarism against the show's creator-slash-director Cédric Anger, concerns that have thus been resolved — "The Hunt" is finally making its way onto the streaming service this month. </p><p>The gripping thriller stars Benoît Magimel as Franck, who is on one of his regular weekend hunting excursions with his longtime friends when they come across another group of huntsmen who start targeting them without explanation. "When one of their party is shot, Franck’s friends strike back, sending an attacker to the ground. Barely managing to escape, the four friends keep the event a secret," reads the official logline. </p><p>However, when Franck tries to resume his normal life back home with wife Krystel (Mélanie Laurent), he can't shake the feeling that he's been hunted by the men, who are now hell-bent on getting their revenge. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting March 4</strong></em></p><h2 id="imperfect-women">‘Imperfect Women'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/TKEPv8FBeSw" allowfullscreen></iframe></div></div><p>Three formidable actresses (Elisabeth Moss, Kerry Washington and Kate Mara) star as the titular "imperfect" women in this upcoming psychological thriller, an adaptation of the Araminta Hall novel of the same name. </p><p>Created by Annie Weisman, the eight-part series examines a devastating crime that shatters the decades-spanning bond between three lifelong friends, forcing the women to uncover dark secrets and hidden truths while also confronting guilt, compromise and betrayal in their seemingly perfect lives.</p><p>Along with those leading ladies, the "Imperfect Women" cast also includes Joel Kinnaman, Corey Stoll, Sandrine Holt, Ana Ortiz and Leslie Odom, Jr. </p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> starting March 18</strong></em></p><h2 id="for-all-mankind-season-5">‘For All Mankind' season 5</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/nF6tso9D9jc" allowfullscreen></iframe></div></div><p>The space-set sci-fi drama — which follows an alternate history where the Soviet Union lands on the moon first, causing the global space race to never end — returns for a fifth season in late March, with ten new weekly episodes that pick up in the years since the Goldilocks asteroid heist.</p><p>Per the official season 5 logline: "Happy Valley has grown into a thriving colony with thousands of residents and a base for new missions that will take us even further into the solar system. But with the nations of Earth now demanding law and order on the Red Planet, friction continues to build between the people who live on Mars and their former home."</p><p>Along with returning stars Joel Kinnaman, Wrenn Schmidt, Edi Gathegi, Cynthy Wu and Coral Peña, season 5 welcomes new cast regulars including Mireille Enos, Costa Ronin, Sean Kaufman, Ruby Cruz and Ines Asserson.</p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> from March 27</strong></em></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/news/apple-tv-plus-free-trials">How to get Apple TV Plus for free</a></li><li><a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">31 best Apple TV Plus shows to watch now</a></li><li><a href="https://www.tomsguide.com/entertainment/apple-tv/3-cozy-shows-to-stream-on-apple-tv-that-are-perfect-for-a-cold-day">3 cozy shows to stream on Apple TV that are perfect for a cold day</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 best shows to watch after 'The Night Agent' season 3 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/streaming/5-best-shows-to-watch-after-the-night-agent-season-3</link>
                                                                            <description>
                            <![CDATA[ Raced through "The Night Agent" season 3 already? Here are the five spy thriller shows I'd recommend streaming next on Netflix, Prime Video, Apple TV, and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">XqjNXaKR4uDJU9uY7Uq9Uo</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4eWx7kCSCkcKcw4FUEbLqb-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 21 Feb 2026 11:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Streaming]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                                    <dc:creator><![CDATA[ Martin Shore ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/a5UrfxWQGQmYiGZ9sXbKja.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/4eWx7kCSCkcKcw4FUEbLqb-1280-80.jpg">
                                                            <media:credit><![CDATA[Des Willie/Prime Video/Apple TV/Netflix]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A photo collage comprised of (L-R) stills of Tom Hiddleston in &quot;The Night Manager&quot; season 2, Jackson Lamb (Gary Oldman) in &quot;Slow Horses&quot;, and Helen Webb (Keira Knightley) in Netflix&#039;s &quot;Black Doves&quot;]]></media:description>                                                            <media:text><![CDATA[A photo collage comprised of (L-R) stills of Tom Hiddleston in &quot;The Night Manager&quot; season 2, Jackson Lamb (Gary Oldman) in &quot;Slow Horses&quot;, and Helen Webb (Keira Knightley) in Netflix&#039;s &quot;Black Doves&quot;]]></media:text>
                                <media:title type="plain"><![CDATA[A photo collage comprised of (L-R) stills of Tom Hiddleston in &quot;The Night Manager&quot; season 2, Jackson Lamb (Gary Oldman) in &quot;Slow Horses&quot;, and Helen Webb (Keira Knightley) in Netflix&#039;s &quot;Black Doves&quot;]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4eWx7kCSCkcKcw4FUEbLqb-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="https://www.tomsguide.com/entertainment/streaming/netflix">Netflix</a> dropped <a href="https://www.tomsguide.com/entertainment/netflix/netflixs-the-night-agent-returns-for-season-3-and-delivers-a-slow-burn-spy-thriller-that-satisfies-rather-than-stuns">"The Night Agent" season 3</a> this week and put Gabriel Basso's titular character back in the field, this time to track down a treasury agent whose on the run after killing their boss. It's easily the biggest drop the streaming service has to offer this week, and I wouldn't be surprised to see it sitting high in the Netflix charts over the coming weeks.</p><p>Seeing as TG's own Malcolm McMillan said the show's latest chapter will keep you locked in in his <a href="https://www.tomsguide.com/entertainment/netflix/netflixs-the-night-agent-returns-for-season-3-and-delivers-a-slow-burn-spy-thriller-that-satisfies-rather-than-stuns">"Night Agent" season 3 review</a> — "while the pacing struggles at times, you'll always find yourself wanting to watch what's next" — I figure that means plenty of fans will be racing through episodes pretty quickly. And that <em>also </em>means viewers will likely be looking for more streaming recommendations before long. </p><p>With that in mind, I've scoured all the best streaming services and put together what I think is a pretty solid round-up of series to watch next. So, if you've just binge-watched "The Night Agent" season 3 and are looking for even more thrills, here are the five spy thriller shows I'd recommend watching, and where you can stream them.</p><h3 class="article-body__section" id="section-what-to-watch-after-the-night-agent"><span>What to watch after 'The Night Agent' </span></h3><h2 id="black-doves-netflix">'Black Doves' (Netflix)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/1R0d2jW7a-I" allowfullscreen></iframe></div></div><p>If you're looking to stay on Netflix, "<a href="https://www.tomsguide.com/entertainment/netflix/netflixs-new-no-1-show-is-one-of-my-favorite-thrillers-of-the-year-and-its-98-percent-on-rotten-tomatoes">Black Doves</a>" is the series I'd recommend turning to first. Released in December 2024, this Christmas-set spy series follows Helen Webb (Keira Knightley), the wife of the U.K.'s Secretary of State for Defence. Helen is a dedicated wife and mother ... but she's also been passing on her husband's political secrets to the clandestine organization she works for, the "Black Doves."</p><p>After a decade of secrets, Helen's world is shattered when her lover is murdered, prompting her handler to call in Helen's old pal Sam (Ben Whishaw) to keep her safe, and when the pair decide to look into the assassination, they stumble on a conspiracy that connects London's criminal underworld to a spiraling geopolitical crisis. "Black Doves" is intense, action-packed, and compulsive viewing, and is due to return for a second season at some point in the future — get streaming!</p><p><em><strong>Stream </strong></em><a href="https://www.netflix.com/title/81682935" target="_blank" rel="nofollow"><em><strong>“Black Doves” on Netflix</strong></em></a><em><strong> now</strong></em></p><h2 id="mr-and-mrs-smith-prime-video">'Mr. and Mrs. Smith' (Prime Video)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/AsaMWxppznk" allowfullscreen></iframe></div></div><p>It's been two whole years since the premiere of Prime Video's "Mr. & Mrs. Smith," and it's still (in my opinion) one of the streamer's finest shows, and I've been (im)patiently awaiting its long-delayed return. </p><p>This slick, stylish reimagining of the movie of the same name sees two lonely strangers (Maya Erskine and Donald Glover) land a job working for a mysterious spy agency that offers a luxurious lifestyle (and plenty of danger). The catch? They're given new identities and paired up as a married couple, John and Jane Smith. Together, the pair navigate their complicated relationship and are tasked with executing a series of dangerous, high-risk missions. It's a real romp, one with action, high stakes, drama, and that makes the most of its likeable leads (and their great on-screen chemistry).  </p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/gp/video/detail/B0CM45BG5K/" target="_blank" rel="nofollow"><em><strong>“Mr. and Mrs. Smith” on Prime Video</strong></em></a><em><strong> now</strong></em></p><h2 id="slow-horses-apple-tv">'Slow Horses' (Apple TV)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/cuRT1kgTdMQ" allowfullscreen></iframe></div></div><p>"<a href="https://www.tomsguide.com/tag/ted-lasso">Ted Lasso</a>" was <a href="https://www.tomsguide.com/entertainment/streaming/apple-tv">Apple TV</a>'s first must-watch series to really break through, but five seasons into "<a href="https://www.tomsguide.com/entertainment/apple-tv-plus/how-to-watch-slow-horses-season-5-online-stream-gary-oldman">Slow Horses</a>," I'm completely convinced that this British series has eclipsed it as Apple's best offering.  </p><p>Based on Mick Herron's bestselling book series, this hilarious spy series revolves around the dysfunctional team of MI5 agents who work out of Slough House —effectively a dumping ground for spies who've made career-ending screw-ups. We watch as River Cartwright (Jack Lowden) and the rest of the "Slow Horses" crew blunder their way through high-stakes threats and unravel conspiracies, working under Slough House's fearsome (and flatulent) leader, Jackson Lamb (Gary Oldman). </p><p><em><strong>Stream </strong></em><a href="https://tv.apple.com/us/show/slow-horses/umc.cmc.2szz3fdt71tl1ulnbp8utgq5o" target="_blank" rel="nofollow"><em><strong>“Slow Horses” on Apple TV </strong></em></a><em><strong>now</strong></em></p><h2 id="the-day-of-the-jackal-peacock">'The Day of the Jackal' (Peacock)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/shsIx-ZVL0E" allowfullscreen></iframe></div></div><p>If you'd enjoy being drawn into an intense, cat-and-mouse thriller, then Ronan Bennett's "<a href="https://www.tomsguide.com/entertainment/streaming/watch-the-day-of-the-jackal">The Day of the Jackal</a>" is the series to turn to next. This 2024 adaptation of the Frederick Forsyth book/movie of the same name modernizes that classic espionage story and reimagines it for our contemporary political climate, delivering another intense thriller that'll have you hooked.</p><p>Chiefly, the series revolves around two people: "The Jackal" (Eddie Redmayne), a world-renowned lone hitman-for-hire preparing to take out a high-profile new target, and Biana Pullman (Lashana Lynch, "<a href="https://www.tomsguide.com/news/no-time-to-die-release-date-trailer-cast-and-more">No Time To Die</a>"), a tenacious firearms expert working at MI6, who is <em>determined </em>to find and stop the killer at large. The show takes us across Europe and follows their chases as both figures risk everything in their respective missions. </p><p><em><strong>Stream </strong></em><a href="https://www.peacocktv.com/stream-tv/the-day-of-the-jackal" target="_blank" rel="nofollow"><em><strong>“The Day of the Jackal” on Peacock</strong></em></a><em><strong> now</strong></em></p><h2 id="the-night-manager-prime-video">'The Night Manager' (Prime Video)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/g-ZcaKdvML8" allowfullscreen></iframe></div></div><p>A decade ago, the BBC and AMC brought us this critically acclaimed adaptation of John le Carré's 1993 novel, turning it into a taut six-part series that plays as a gripping 007 audition for <a href="https://www.tomsguide.com/tag/marvel">Marvel </a>fave, Tom Hiddleston. </p><p>Here, we met Jonathan Pine, ex-soldier-turned-night manager at a luxury Cairo hotel. Pine is recruited by a British intelligence officer to go undercover and infiltrate the inner circle of the international arms dealer, Richard Roper (played by Hugh Laurie). Years down the line, the series was renewed for two further seasons, the first of which has <em>just </em>aired on the BBC and Prime Video. That second season delivered even more twists and thrills, and proved that the show was worth revisiting. </p><p><em><strong>Stream </strong></em><a href="https://www.amazon.com/gp/video/detail/B0CBG92MYG/" target="_blank" rel="nofollow"><em><strong>“The Night Manager” on Prime Video</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eEDbzX"></div>                            </div>                            <script src="https://kwizly.com/embed/eEDbzX.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/netflix/new-netflix-shows-and-movies-february-16-22-2026">New Netflix releases: 7 shows and movies to stream this week</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/i-fixed-netflix-buffering-without-upgrading-my-internet-here-are-the-tricks-that-worked">Stop Netflix buffering for good: 5 simple tricks that actually work</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/netflix-just-added-a-must-watch-oscar-movie-with-ethan-hawke-and-margaret-qualley-and-itll-break-your-heart">Netflix just got an Oscar movie with Ethan Hawke and Margaret Qualley</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Don’t waste time scrolling: 9 top new movies to stream this week on Netflix, Hulu and Apple TV (Feb 10-16)  ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/movies/7-top-new-movies-to-watch-this-week-on-netflix-hulu-apple-tv-and-more-feb-10-16</link>
                                                                            <description>
                            <![CDATA[ This week's crop of new movies across the best streaming services is packed with worthwhile picks, including "Eternity" and "Blue Moon." ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">apuyuewtvmjptXp79ZgqXJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/nfsTVW6GgmzweNJXQyjnXE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 10 Feb 2026 05:01:00 +0000</pubDate>                                                                                                                                <updated>Wed, 11 Feb 2026 20:58:04 +0000</updated>
                                                                                                                                            <category><![CDATA[Movies]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                                                                <author><![CDATA[ rory.mellon@futurenet.com (Rory Mellon) ]]></author>                    <dc:creator><![CDATA[ Rory Mellon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/5Rv6LtQXMj5JB4Eu8Lt4Sn.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/nfsTVW6GgmzweNJXQyjnXE-1280-80.jpg">
                                                            <media:credit><![CDATA[A24 / Searchlight Pictures]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[(L-R) Timothée Chalamet as Marty Mauser in &quot;Marty Supreme&quot;, Will Arnett as Alex Novak in &quot;Is This Thing On?&quot;, and Elizabeth Olsen as Joan in &quot;Eternity&quot; ]]></media:description>                                                            <media:text><![CDATA[(L-R) Timothée Chalamet as Marty Mauser in &quot;Marty Supreme&quot;, Will Arnett as Alex Novak in &quot;Is This Thing On?&quot;, and Elizabeth Olsen as Joan in &quot;Eternity&quot; ]]></media:text>
                                <media:title type="plain"><![CDATA[(L-R) Timothée Chalamet as Marty Mauser in &quot;Marty Supreme&quot;, Will Arnett as Alex Novak in &quot;Is This Thing On?&quot;, and Elizabeth Olsen as Joan in &quot;Eternity&quot; ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/nfsTVW6GgmzweNJXQyjnXE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It’s only the second week of February, but this week’s crop of new top movies across the <a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">best streaming services</a> looks like a contender for one of the strongest selections we’ll see in all of 2026. There are so many worthwhile new movies this week, it’s hard to know where to start. </p><p>Netflix has a solid pair, with a new Madea spin-off from Tyler Perry sure to have subscribers laughing, alongside one of this year’s strongest Oscar movies starring Ethan Hawke. Then you’ve got the PVOD premiere of “Marty Supreme” (for real this time after a delay), the newest “Predator” movie on Hulu and the perfect Valentine's Day rom-com on Apple TV. </p><p>See, what I mean? Check through this week’s most noteworthy new movies on streaming, and you’ll be spoilt for choice. So I've rounded up the flicks that need to be on your watchlist. For more recommendations, check out our guide to the <a href="https://www.tomsguide.com/entertainment/streaming/5-top-new-shows-you-can-stream-this-week-on-netflix-prime-video-and-more-feb-9-15">top new TV shows streaming this week</a> and the <a href="https://www.tomsguide.com/entertainment/prime-video/3-best-psychological-thriller-shows-on-prime-video-to-binge-watch-in-one-weekend">3 best psychological thriller shows on Prime Video</a>.</p><h2 id="marty-supreme-pvod">‘Marty Supreme’ (PVOD)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/s9gSuKaKcqM" allowfullscreen></iframe></div></div><p>After a last-minute delay saw “Marty Supreme” move from hitting PVOD last week to this Tuesday (Feb. 10), Josh Safdie’s Oscar-nominated drama is finally ready to make the switch from the big screen to streaming. And not a moment too soon. I rank “Marty Supreme” as my favorite movie of 2025, and considering I saw more than 110 movies in theaters last year, that is no small compliment. It’s a phenomenal sports drama. </p><p>Timothée Chalamet could at last win his much-coveted Oscar for his turn as the eponymous Marty Mauser. A tennis table player with dreams of becoming the world’s best and most marketable player. He faces numerous hurdles as he battles to achieve greatness, many self-inflicted. Also starring Gwyneth Paltrow, Odessa A'zion, Kevin O'Leary and Tyler Okonma, “Marty Supreme” is a fast-paced ride as energetic as its lead.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/Marty-Supreme-Josh-Safdie/dp/B0G6R2VGSC" target="_blank" rel="nofollow"><em><strong>Amazon (buy/rent)</strong></em></a><em><strong> from February 10</strong></em></p><h2 id="primate-pvod">‘Primate’ (PVOD)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wo87F-va410" allowfullscreen></iframe></div></div><p>Early 2026 has been great for horror with “28 Years Later: The Bone Temple” and “Send Help” delighting genre fans. “Primate” might not quite reach the quality bar of those two picks, but it’s got enough chilling moments and buckets of fake blood to have you hooked until it’s all action finale. Plus, it stars one of the more memorable horror movie villains of the 2020s, though don’t be surprised if you feel sympathy for its killer chimpanzee.</p><p>Lucy (Johnny Sequoyah) returns to her family home in Hawai’i after several years away. Reunited with her father (Oscar-winner Troy Kotsur) and younger sister Erin (Gia Hunter), the homecoming quickly turns to a nightmare when the family’s pet chimpanzee, Ben, becomes violent after being infected with rabies. Now it’s a battle for survival against an aggressive animal that Lucy and Erin once considered part of the family.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/detail/B0G7643HC3/" target="_blank" rel="nofollow"><em><strong>Amazon (buy/rent)</strong></em></a><em><strong> from February 10</strong></em></p><h2 id="is-this-thing-on-pvod">‘Is This Thing On?’ (PVOD)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/x4jx0Xgc_Pc" allowfullscreen></iframe></div></div><p>After directing back-to-back Oscar contenders, “A Star is Born” and “Maestro,” Bradley Cooper’s latest feature, “Is This Thing On?” feels, on the whole, a lot less showy. It's an intimate comedy-drama that explores a midlife crisis through a humorous lens. Well-received by critics, holding a 86% score on <a href="https://www.rottentomatoes.com/m/is_this_thing_on" target="_blank">Rotten Tomatoes</a>, the movie stars Will Arnett and Laura Dern as recent divorcees trying to adjust to living their lives separately.</p><p>Alex (Arnett) finds surprising solace in the New York stand-up scene, becoming a comic after trying out the craft at an open mic night. Meanwhile, Tess (Dern) faces the numerous sacrifices she made to raise two children, and rediscovers her passion for volleyball, even hoping to become a coach for the upcoming Olympics. “Is This Thing On?” is a sweet movie that proves that you’re never too old to discover your true calling.</p><p><em><strong>Watch on </strong></em><a href="https://www.amazon.com/gp/video/storefront" target="_blank" rel="nofollow"><em><strong>Amazon (buy/rent)</strong></em></a><em><strong> from February 10</strong></em></p><h2 id="predator-badlands-hulu">‘Predator: Badlands’ (Hulu)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/43R9l7EkJwE" allowfullscreen></iframe></div></div><p>Fans of the “Predator” franchise have been eating good lately. Following on from 2022’s excellent “Prey,” director Dan Trachtenberg returns to the alien hunting grounds for “Predator: Badlands,” and the results are fantastic. Dropping the series’ horror origins in favor of an action-adventure tone, “Predator: Badlands” doesn’t star a single human character and instead focuses on a young Predator warrior attempting to prove his worth. </p><p>Dek (Dimitrius Schuster-Koloamatangi) is the runt of his clan, and after being cast out by his cruel father, he heads off to a hostile alien world in search of the ultimate apex predator. He hopes defeating this beast will earn his father’s approval. Once on the so-called “death planet,” he teams up with a damaged android (Elle Fanning). Excellent visuals and well-crafted action make “Predator: Badlands” a wonderful sci-fi romp.</p><p><em><strong>Watch on </strong></em><a href="https://www.hulu.com/welcome" target="_blank" rel="nofollow"><em><strong>Hulu</strong></em></a><em><strong> from February 12</strong></em></p><h2 id="tyler-perry-s-joe-s-college-road-trip-netflix">‘Tyler Perry’s Joe’s College Road Trip’ (Netflix)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wAFF7SwGY_k" allowfullscreen></iframe></div></div><p>I’ve referred to Tyler Perry as the “Netflix whisperer” in the past, and for good reason. His stable of streaming movies may not earn much respect from critics, but viewers seem to lap up everything he produces with glee. I expect “Joe’s College Road Trip” will be no different. This comedy is part of Perry’s popular Madea franchise, but this time the spotlight is on Madea’s brother Joe (also played by Perry) and his grandson B.J. (Jermaine Harris). </p><p>The premise is as simple as the name: The inappropriate but lovable Joe plans to take his sheltered grandson on a cross-country road trip to prepare him for his college experience to come. Expect ridiculous hijinks and plenty of potty humor. Don’t expect this spinoff to try to redesign the Madea blueprint, but dedicated fans will surely push the movie to Netflix No. 1.</p><p><em><strong>Watch on </strong></em><a href="https://www.netflix.com/title/81702432" target="_blank" rel="nofollow"><em><strong>Netflix</strong></em></a><em><strong> from February 13</strong></em></p><h2 id="eternity-apple-tv">‘Eternity’ (Apple TV)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/irXTps1REHU" allowfullscreen></iframe></div></div><p>It’s Valentine’s week, and Apple TV has the perfect watch for loved-up couples (or singletons looking for a great rom-com, no shame here!). “Eternity” is one of the freshest rom-coms I’ve watched in ages, which is quite an accomplishment as repetitive films dominate the genre. “Eternity” feels original because of its novel core premise, and its charismatic leading trio, composed of Elizabeth Olsen, Callum Turner and Miles Teller.</p><p>“Eternity” is set in the afterlife, and in this spin on what comes next, souls are given one week to decide where they want to spend their eternity. When Joan (Olsen) dies surrounded by family, she faces a real dilemma: should she spend her never-ending existence with her life-long husband (Teller) or her first love (Turner), who died young and has spent 67 years waiting for their reunion. It’s a love triangle so knotty it threatens to ruin what should be eternal bliss.</p><p><em><strong>Watch on </strong></em><a href="https://tv.apple.com/us/movie/eternity/umc.cmc.4dlymcfscta2oo4u1whkzaqpl" target="_blank" rel="nofollow"><em><strong>Apple TV</strong></em></a><em><strong> from February 13</strong></em></p><h2 id="blue-moon-netflix">‘Blue Moon’ (Netflix)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/qo7gRHip0lI" allowfullscreen></iframe></div></div><p>One of the year’s more overlooked Oscar movies (it’s nominated for both Best Actor and Best Original Screenplay), “Blue Moon” is a melancholic biographical drama that gives Ethan Hawke the chance to shine, and he certainly doesn’t drop the ball. Directed by Richard Linklater, the movie is set almost entirely within a New York restaurant, and this setting proves fertile ground for snappy dialogue, self-destructive drama and heartwrenching moments. </p><p>In 1943, on the opening night of “Oklahoma!,” Lorenz Hart (Hawke), one half of the Broadway duo Rodgers and Hart, slips away to the iconic Sardi's restaurant to lament his partner's new show, made in collaboration with Oscar Hammerstein II (Simon Delaney). As the opening night party kicks off around him, Hart tries to make up with Rodgers (Andrew Scott) while also meeting with a young woman (Margaret Qualley) he’s fallen in love with.</p><p><em><strong>Watch on </strong></em><a href="https://www.netflix.com/title/82053241" target="_blank" rel="nofollow"><em><strong>Netflix</strong></em></a><em><strong> from February 14</strong></em></p><h2 id="song-sung-blue-peacock">'Song Sung Blue' (Peacock)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ZqU7iiHFCzw" allowfullscreen></iframe></div></div><p>Based on a documentary, "Song Sung Blue" stars Hugh Jackman as Mike Sardina. He's a struggling Don Ho impersonator, but when he meets Patsy Cline impersonator Claire Stengl (Kate Hudson), his life changes forever. That's because they decide to become a Neil Diamond tribute act together, and the rest is history.</p><p>Things do take a heartbreaking turn in the second act, though. Despite their skyrocketing popularity, life decides it has other plans and throws a few curveballs at the (now married) duo. If you're not a Neil Diamond fan, there's still something for you. Hudson's performance as Claire seems to resonate with everyone who sees it, even earning her an Oscar nomination.</p><p><em><strong>Watch on </strong></em><a href="https://peacocktv.com" target="_blank" rel="nofollow"><em><strong>Peacock</strong></em></a><em><strong> from February 13</strong></em></p><h2 id="good-fortune-starz">'Good Fortune' (Starz)</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ZKWndx83RwQ" allowfullscreen></iframe></div></div><p>What if you had a guardian angel? More importantly, what if you had a guardian angel that wasn't particularly good at his job?</p><p>These are the questions asked by "Good Fortune," which stars Keanu Reeves as the angel Gabriel. He tries to show Arj (Aziz Ansari) that money isn't everything by swapping Arj's life with the life of his boss, Jeff (Seth Rogen).</p><p>That plan totally backfires and results in Gabriel first losing his wings, then his job. Now, he and Jeff are searching for work, while Arj searches for the meaning of life.</p><p><em><strong>Watch on </strong></em><a href="https://www.kqzyfj.com/click-6361382-13894619?sid=hawk-custom-tracking" target="_blank" rel="nofollow"><em><strong>Starz</strong></em></a><em><strong> from February 14</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-O6pzje"></div>                            </div>                            <script src="https://kwizly.com/embed/O6pzje.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/streaming/5-top-new-shows-you-can-stream-this-week-on-netflix-prime-video-and-more-feb-9-15">5 top new shows you can stream this week</a></li><li><a href="https://www.tomsguide.com/us/best-streaming-video-services,review-2625.html">The best streaming services to subscribe to right now</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/5-must-watch-netflix-movies-with-high-imdb-ratings-including-a-best-picture-winner-and-one-of-leonardo-dicaprios-best-performances">5 must-watch Netflix movies with high IMDb ratings</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 cozy shows to stream on Apple TV that are perfect for a cold day ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/entertainment/apple-tv/3-cozy-shows-to-stream-on-apple-tv-that-are-perfect-for-a-cold-day</link>
                                                                            <description>
                            <![CDATA[ Looking for your next cozy watch? Check out these best Apple TV shows for your next binge ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">9GB6gLuAt65JUejaZyJGzk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/YikeRnwZvksRMPFjw4xHrF-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 01 Feb 2026 16:18:24 +0000</pubDate>                                                                                                                                <updated>Sun, 01 Feb 2026 16:20:37 +0000</updated>
                                                                                                                                            <category><![CDATA[Apple TV]]></category>
                                                    <category><![CDATA[Entertainment]]></category>
                                                    <category><![CDATA[Streaming]]></category>
                                                                                                                    <dc:creator><![CDATA[ Alyse Stanley ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/BxNnQuBWRHqkv5xWZsjrjc.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Alyse Stanley is a news editor at Tom’s Guide, overseeing weekend coverage and writing about the latest in tech, gaming, and entertainment. Before Tom’s Guide, Alyse worked as an editor for the Washington Post’s sunsetted video game section, Launcher, where she also wrote about indie games you shouldn’t miss, how to tackle your gaming backlog, and all things Nintendo. She previously led Gizmodo’s weekend news desk covering breaking tech news and has written game reviews and features for outlets like Polygon, Unwinnable, and Rock, Paper, Shotgun. A recent Chicago-area transplant born and raised in Virginia, Alyse is a big fan of horror movies, cartoons, and roller skating. She&#039;s also a puzzle fan and can often be found contributing to the NYT Connections coverage on Tom&#039;s Guide &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/YikeRnwZvksRMPFjw4xHrF-1280-80.jpg">
                                                            <media:credit><![CDATA[Apple; Shutterstock]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple TV logo on winter blue background]]></media:description>                                                            <media:text><![CDATA[Apple TV logo on winter blue background]]></media:text>
                                <media:title type="plain"><![CDATA[Apple TV logo on winter blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/YikeRnwZvksRMPFjw4xHrF-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We've been getting pelted with snow left and right this year, and as the forecast get colder, the idea of staying in and curling up on the couch starts looking better and better. If you've also hit couch-potato levels of productivity, you're in luck. </p><p>Apple TV is home to many charming TV shows you can binge in a weekend, whether you're looking for a cozy mystery with some gorgeous Irish scenery (and deliciously messy sibling dynamics) or a heartwarming drama about adult friendships. So grab a blanket, a mug of hot cocoa, and settle in for these cozy Apple TV series that deserve a spot on your watchlist. If you're looking for even more recommendations on what to watch, check out all the new titles coming to <a href="https://www.tomsguide.com/entertainment/netflix/new-on-netflix-in-february-2026-5-best-shows-and-movies-to-stream-plus-full-release-list">Netflix</a> and <a href="https://www.tomsguide.com/entertainment/prime-video/new-on-prime-video-in-february-2026-all-the-new-shows-and-movies-to-watch">Prime Video</a> this month. </p><h2 id="platonic-2">'Platonic'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Nnn02jJf5ys" allowfullscreen></iframe></div></div><p>You'll find plenty of stories about how men are lonely and struggle to keep their friendships as they get older — but not in "Platonic." Seth Rogen and Rose Byrne have a unique, winning chemistry as two long-estranged besties, Sylvia (Byrne) and Will (Rogen), who reconnect over their shared midlife crises. With two heavyweight comedians as its leads, Platonic is one of the funniest shows on Apple TV Plus to date, earning a spot on our <a href="https://www.tomsguide.com/best-picks/best-apple-tv-plus-shows-and-movies">best Apple TV Plus shows</a> list.</p><p>After Will married a woman Sylvia despised, the pair didn't exactly part on the best of terms. Now freshly divorced, they find themselves back in each other's orbit, though new relationships threatens to throw their already fragile dynamic off balance once more. Were this a more straightforward series, them falling in love would probably be the endgame, but that would go against the show's title. These two are strictly platonic friends, a pair of co-dependent idiots attempting to reel in their own brand of chaos and grow for the people they care most about. But that's easier said than done. </p><p><em><strong>Stream </strong></em><a href="https://tv.apple.com/channel/tvs.sbd.4000?showId=umc.cmc.y7bc18x7co813l8i2tlsyb4l&at=1001l369U&ct=tomsguide-us-4603762791387765342&itscg=30200&itsct=Future_TV" target="_blank" rel="nofollow"><em><strong>"Platonic" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="bad-sisters-3">'Bad Sisters'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/IZUrhfCl0Xc" allowfullscreen></iframe></div></div><p>As one of three sisters, "Bad Sisters" is near and dear to my heart. While "murder mystery" isn't the first thing that comes to mind when I think of cozy watches, the show's excellent cast, dreamy coastal Irish setting, and messy family dynamics (siblings, amirite?) are easy to get swept in. It's part pitch-black dark comedy and part mystery thriller that keeps you guessing about who, if anyone, is going to come out of this mess unscathed. </p><p>At the center of it all are the tight-knit Garvey sisters—Grace (Anne-Marie Duff), Eva (Sharon Horgan), Ursula (Eva Birthistle), Bibi (Sarah Greene), and Becka (Eve Hewson)—whose bond is put to the test when Grace’s husband, John Paul (Claes Bang), turns out to be far from the nice guy he pretends to be. His fate is sealed from the show opening moment when the Garvey sisters gathering at his funeral and collectively breathing a sigh of relief. Any one of them could have a motive for killing him, and it's up to floundering insurance agent Tom Claffin (Brian Gleeson) to get to the bottom of it. Mostly because of the whole "suspected murder" thing, but also because paying out John Paul's widow would bankrupt his father's struggling insurance agency.</p><p><em><strong>Stream </strong></em><a href="https://tv.apple.com/us/show/bad-sisters/umc.cmc.14kr4vv65unannh7doqgvlh20" target="_blank" rel="nofollow"><em><strong>"Bad Sisters" on Apple TV</strong></em></a><em><strong> now</strong></em></p><h2 id="central-park">'Central Park'</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/mvrXv63y4kI" allowfullscreen></iframe></div></div><p>"Bob's Burgers" is a staple of cozy TV watching, but creator Loren Bouchard's second musically-infused comedy show, "Central Park," doesn't always get the same flowers. It feels tailor-made for musical fans and theater nerds, delivering a whimsical glimpse into everyday life in New York City's iconic Central Park. Packed with excellent songs, a fantastic cast and plenty of laughs, this is one of the best Apple TV Plus show that too many people are sleeping on, especially if you're in the mood for uplifting sitcom vibes to waste a lazy afternoon. </p><p>Park manager Owen (Leslie Odom Jr.) and his wife Paige (Kathryn Hahn) raise kids Molly (Kristen Bell, then Emmy Raver-Lampman) and Cole (Tituss Burgess) in a house in the park. Owen is very much a Bob Belcher type, frequently the butt of good-hearted jokes while failing to command respect from anyone around him. On top of maintaining the park and navigating one of the world's most bustling metropolises, they also have to deal with the machinations of the real estate magnate Bitsy Brandenham (Stanley Tucci) who's keen to build condos where the park now stands. </p><p><em><strong>Stream "</strong></em><a href="https://tv.apple.com/us/show/central-park/umc.cmc.4qe3i11erof30x0vz8nwnjkw3" target="_blank" rel="nofollow"><em><strong>Central Park" on Apple TV</strong></em></a><em><strong> now</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Ww37wW"></div>                            </div>                            <script src="https://kwizly.com/embed/Ww37wW.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/entertainment/streaming/new-shows-and-movies-february-2026">Don't miss these 18 shows and movies in February 2026: Here's where to stream them</a></li><li><a href="https://www.tomsguide.com/entertainment/prime-video/5-cozy-rom-coms-on-prime-video-to-snuggle-up-with-on-a-cold-day">5 cozy rom-coms on Prime Video to snuggle up with on a cold day</a></li><li><a href="https://www.tomsguide.com/entertainment/netflix/netflix-just-added-a-charming-romantic-comedy-movie-that-deserved-better-and-its-a-guaranteed-mood-booster">Netflix just added a charming romantic comedy movie that deserved better — and it’s a guaranteed mood-booster</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
            </channel>
</rss>