TIFF 2025: Our Review of ‘Good Boy’

Posted in Festival Coverage, Movies, TIFF 2025 by - September 17, 2025
TIFF 2025: Our Review of ‘Good Boy’

Polish stalwart Jan Komasa makes his English language debut with Good Boy. It’s a deeply warped film based off of a script producer Jerzy Skolimowski gave to Komasa on the festival circuit in 2019. Tommy (Anson Boone from Sam Mendes’ 1917) is an extreme degenerate, routinely committing crimes in a drug and booze fueled rage. Then, couple Chris (Stephen Graham) and Kathryn (Andrea Riseborough) kidnap him and chain him in their basement as part of an attempt at rehabilitating this bad boy into a good one.

This is all established in the first fifteen minutes of the film. In true Komasa fashion, where the film goes is wholly unexpected. However, it ultimately provides a deep commentary on what is the true nature of freedom. Tommy’s obvious resistance to his circumstances slowly wears away as he comes to realize that we imprison ourselves when we don’t believe we’re capable of our best. You may believe you figured out the film. But it inevitably shifts once again, leaving you on the edge of your seat. Truly, I loved where this ended up, and what that suggests about the nature of being human.

Graham and Riseborough deliver stellar performances, particularly the latter as she develops a connection with Tommy. The script provides Boone with ample opportunity to provide comic relief, which he does with aplomb. If I could change one thing, I’d probably wish for a slightly less dreary look. Considering that the film takes place in manorial England, you probably expect this aesthetic.

This post was written by
Thomas Wishloff is currently an MA student at York University. He is new to the Toronto Film Scene, but has periodically written and podcasted for several now defunct ventures, and has probably commented on a forum with you at some point. The ex-Edmontonian has been known to enjoy a good board game, and claims to know the secret to the best popcorn in the world.
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-61364310-1', 'auto'); ga('send', 'pageview');