Hubert (Xavier Dolan), jeune québécois de 17 ans, vit seul avec sa mère (interprétée par Anne Dorval). Leur cohabitation est difficile car la soif de liberté et de découvertes artistiques et sexuelles du fils se heurte à un mur : sa mère veut à tout prix maintenir les rituels de l’enfance et refuse de le voir devenir autonome. Elle perd peu à peu pied devant la violence croissante d’Hubert. Étouffé par cette relation d’amour et de haine mélangés, il ne parvient pas à lui dire ce qu’elle ne veut pas entendre : il aime les garçons.
En dehors de la maison, Hubert vit ouvertement une relation avec un chum (« copain » ou « amoureux » en québécois), Antonin (François Arnaud), qui lui peut assumer tranquillement sa sexualité. Il est soutenu par une mère complice, parfois envahissante (Patricia Tulasne). La relation amoureuse des deux garçons donne lieu à des scènes très fortes, notamment un moment où ils font l’amour tout en réalisant une peinture abstraite (un dripping).
Le père d’Hubert est appelé à la rescousse lorsque le pot au roses est découvert. Il tente de ramener son fils dans un « droit » chemin que ce dernier refuse obstinément. Puis on l’envoie de force comme interne dans un collège à la campagne, ce qui accroît encore la violence des relations entre la mère et le fils. Hubert pourra-t-il parvenir à une forme de libération et d’apaisement ?
Xavier Dolan, réalisateur à peine plus âgé que son héros, signait avec J’ai tué ma mère un premier film original et largement autobiographique, dans lequel il incarnait le rôle principal avec une force et une justesse étonnantes.