Henry’s review published on Letterboxd:
There’s a lot to love about this movie, the tension in the first two thirds is perfect and the performance by Josh Hartnett is chilling from start to finish. It’s a really clever idea that reminds me a lot of something like You where you hate the main character because you know they are a horrible person, but still find yourself somehow rooting for them. The cinematography is also really cool and adds more depth to every setting and character. But in true M. Night Shyamalan the third act goes completely off the rails. The amount of fake out endings made me want to rip my hair out and once it finally does end it’s about as unsatisfactory as possible. This is definitely a difficult story to resolve but as soon as we left the theater I was already imagining better endings. As frustrating as it was, I’d honestly still recommend seeing this, but if you end up having to leave during the last thirty minutes for any reason, don’t feel bad about it and just know that whatever ending you can imagine in your head is better than what really happens.
2024 Ranked
' ].join(''); if ( adsScript && adsScript === 'bandsintown' && adsPlatforms && ((window.isIOS && adsPlatforms.indexOf("iOS") >= 0) || (window.isAndroid && adsPlatforms.indexOf("Android") >= 0)) && adsLocations && adsMode && ( (adsMode === 'include' && adsLocations.indexOf(window.adsLocation) >= 0) || (adsMode === 'exclude' && adsLocations.indexOf(window.adsLocation) == -1) ) ) { var opts = { artist: "", song: "", adunit_id: 100005950, div_id: "cf_async_7213fb31-a24e-448a-81e5-a0b5addaa2b0" }; adUnit.id = opts.div_id; if (target) { target.insertAdjacentElement('beforeend', adUnit); } else { tag.insertAdjacentElement('afterend', adUnit); } var c=function(){cf.showAsyncAd(opts)};if(typeof window.cf !== 'undefined')c();else{cf_async=!0;var r=document.createElement("script"),s=document.getElementsByTagName("script")[0];r.async=!0;r.src="//srv.tunefindforfans.com/fruits/apricots.js";r.readyState?r.onreadystatechange=function(){if("loaded"==r.readyState||"complete"==r.readyState)r.onreadystatechange=null,c()}:r.onload=c;s.parentNode.insertBefore(r,s)}; } else { adUnit.id = 'pw-7213fb31-a24e-448a-81e5-a0b5addaa2b0'; adUnit.className = 'pw-div -tile300x250 -alignleft -bottommargin'; adUnit.setAttribute('data-pw-' + (renderMobile ? 'mobi' : 'desk'), 'med_rect_btf'); if (target) { target.insertAdjacentElement('beforeend', adUnit); } else { tag.insertAdjacentElement('afterend', adUnit); } window.addEventListener('DOMContentLoaded', (event) => { adUnit.insertAdjacentHTML('afterend', kicker); window.ramp.que.push(function () { window.ramp.addTag('pw-7213fb31-a24e-448a-81e5-a0b5addaa2b0'); }); }, { once: true }); } } tag.remove(); })(document.getElementById('script-7213fb31-a24e-448a-81e5-a0b5addaa2b0'));
' ].join(''); if ( adsScript && adsScript === 'bandsintown' && adsPlatforms && ((window.isIOS && adsPlatforms.indexOf("iOS") >= 0) || (window.isAndroid && adsPlatforms.indexOf("Android") >= 0)) && adsLocations && adsMode && ( (adsMode === 'include' && adsLocations.indexOf(window.adsLocation) >= 0) || (adsMode === 'exclude' && adsLocations.indexOf(window.adsLocation) == -1) ) ) { var opts = { artist: "", song: "", adunit_id: 100005950, div_id: "cf_async_3d8b51ba-14e1-453a-b4fb-b6ffcedf0441" }; adUnit.id = opts.div_id; if (target) { target.insertAdjacentElement('beforeend', adUnit); } else { tag.insertAdjacentElement('afterend', adUnit); } var c=function(){cf.showAsyncAd(opts)};if(typeof window.cf !== 'undefined')c();else{cf_async=!0;var r=document.createElement("script"),s=document.getElementsByTagName("script")[0];r.async=!0;r.src="//srv.tunefindforfans.com/fruits/apricots.js";r.readyState?r.onreadystatechange=function(){if("loaded"==r.readyState||"complete"==r.readyState)r.onreadystatechange=null,c()}:r.onload=c;s.parentNode.insertBefore(r,s)}; } else { adUnit.id = 'pw-3d8b51ba-14e1-453a-b4fb-b6ffcedf0441'; adUnit.className = 'pw-div'; adUnit.setAttribute('data-pw-' + (renderMobile ? 'mobi' : 'desk'), 'sky_btf'); if (target) { target.insertAdjacentElement('beforeend', adUnit); } else { tag.insertAdjacentElement('afterend', adUnit); } window.addEventListener('DOMContentLoaded', (event) => { adUnit.insertAdjacentHTML('afterend', kicker); window.ramp.que.push(function () { window.ramp.addTag('pw-3d8b51ba-14e1-453a-b4fb-b6ffcedf0441'); }); }, { once: true }); } } tag.remove(); })(document.getElementById('script-3d8b51ba-14e1-453a-b4fb-b6ffcedf0441'));