In 1995, Samantha Darko (Chase) follows her best friend Corey (Evigan) on a road trip from Virginia to California, in an attempt to become professional dancers. Their dreams are cut short when their car breaks down in a tiny Utah town. They are saved by the town bad boy, Randy (Westwick), who takes them to the local motel where they meet the conspiracy-loving owner. He tells them of Billy Moorcroft, a boy who went missing.
Samantha starts sleepwalking. A future version of her meets Justin (James Lafferty) at the windmill and tells him that the world will end; however, Justin knows this already. The next morning Samantha wakes up on a bus stop bench, where a policeman finds her and warns her about a pervert. He offers to drive her back to the motel but the two end up stopping at the site where a meteorite crashed. Samantha tells Corey that she doesn’t remember what happened the night before.
While at a cafe, a science-loving geek, Jeremy (Jackson Rathbone), tries to talk about the meteorite with Samantha. Randy invites the two girls to a party, where he tells her of his brother who went missing and how hard it has been on his family. Future Samantha stands in the middle of a road and is nearly hit by a car; Justin sees her and is entranced. Her ghost takes him to the local nondenominational church and commands him to burn it down.
The next day they find Justin’s dog tags in the ashes of the church. Samantha runs into Jeremy, who is beginning to show signs of radiation exposure. Subsequently, Justin has begun working on forging a bunny-skull mask out of metal, saying he needs to help “his princess.” Samantha wanders the town and soon encounters Randy and Corey. Samantha tells Corey how she wants to get out of town but the two get into a fight. Samantha runs away, and Randy’s car is unexpectedly run into by another car, pushing his car into Samantha and killing her.
Corey is full of anguish about her best friend’s death. She finds a book about time travel as well as a story Samantha wrote as a child, entitled The Last Unicorn, about a princess and a boy named Justin. A boy appears, and commands Corey to come with him in order to save Samantha. She follows him to a cave where she goes through a portal that takes her back in time. Everything moves backwards to when Samantha is walking down the road. Corey and Randy drive up to Samantha again and when they stop, Corey is nicer to her. As Randy drives off, the other car still runs into him, and this time Corey is killed instead.
Samantha is devastated about Corey’s death. After another sleep walking incident, she sees a dress in the window of the vintage shop Jeremy’s parents own. It is the same dress she wears as Future Samantha. Jeremy sees her admiring it and begins talking more about the meteorite he bought. Samantha notices tissue damage on Jeremy’s arm and when told about it, he quickly covers it up and calls it a rash.
The next morning Samantha wakes up on the hill where Justin is. He takes the book about time travel from her and explains that it was written by his grandmother. He asks her to “show him how to do it” but she doesn’t understand. He tells her that he made his mask from a drawing by Donnie, Samantha’s deceased brother, that she showed him. She asks how he knew her brother’s name and he responds by saying she told him “when she was dead”. Samantha walks away and finds the bodies of two dead boys, Randy’s little brother and the boy that appeared to Corey, Billy Moorcroft.
After telling the police about what she saw, everyone assumes that Justin is responsible. He soon asks Samantha to “show him how” again. The police then take him into custody. That night, Samantha returns to her motel where she finds the dress she saw at the shop, a gift from Jeremy. He asks her to wear it to see the fireworks with him. They go to a remote location and Jeremy sees what he calls tesseracts falling from the sky. He becomes manic and Samantha notes that his rash has gotten much worse. He tries to kiss Samantha but she resists and he eventually pushes her back roughly, killing her.
Future Samantha, now identical to regular Samantha, visits Justin in jail. Randy tries to find her as fiery tesseracts fall from the sky and eventually finds her where Jeremy left her. Justin approaches and sees his mask, putting it on. Justin then goes back in time. He climbs the windmill that was destroyed at the beginning. Justin believes that his death will prevent the series of events that will lead to the end of the world so he stays on the windmill this time and is killed by the meteorite.
It is now the morning after the meteorite landing again. Samantha and Corey visit the site and find the locals are saddened as they take away Justin’s body. Samantha, never having experienced the events after the meteorite crash, decides to go back home while Corey stays with Randy.