ByBrian Tallerico,
a film critic with over 20 years of experience covering movies and TV.He is the president of the Chicago Film Critics Association, the co-producer of the Chicago Critics Film Festival, and managing editor of RogerEbert.com.
Late Night with the Devil.Photo: IFC Films and Shudder
This post is updated frequently as movies leave and enter Hulu. *New additions are indicated with an asterisk.
Isn’t the world scary enough nowadays? Of course not! Everyone needs a good break from reality now and then, and horror can be the best way to do that. And Hulu has a remarkably deep catalog of horror films, including massive hits, indie darlings, and even a few originals. These are the best chillers on Hulu right now, updated monthly.
How We Pick Our Films
Critic Brian Tallerico watches and writes about movies and TV every day. To curate this list, he dives into Hulu’s catalogue every month to surface terrifying horror titles — using his taste and a lifetime of cinema study as his guide, instead of whatever the algorithm happens to be pushing. After triple-checking to make sure they’re still available, he watches each and writes his recommendation. We highlight more than just the crowdpleasers: Filmmakers can use horror to craft spine-tingling moods, keep audiences on their toes, and comment on culture. Read on to find something to watch.
28 Weeks Later
Year: 2007 Runtime: 1h 40m Director: Danny Boyle
Danny Boyle handed off directorial duties on this sequel to his 28 Days Later to Juan Carlos Fresnadillo, and the result is an underrated action flick, a zombie movie that moves at lightning speed as it details the effort to establish a safe zone from the undead apocalypse in London. It has a phenomenal cast that includes Robert Carlyle, Rose Byrne, Jeremy Renner, Imogen Poots, and Idris Elba. There are reports that the long-delayed 28 Months Later may finally go into production soon — so catch up now.
The one that changed everything. Alien didn’t just launch a mega-franchise or create an iconic character in Sigourney Weaver’s Ripley. It shifted the entire sci-fi/horror landscape forever. And what’s even more stunning about Alien is that over four decades later, it still rips. From beginning to end, it is one of the rare movies that could be called perfect.
Georgina Marshall plays a woman who discovers that her AirBnB has been double-booked when she arrives and finds someone already staying there—the excellent Bill Skarsgard. Despite her instincts, she decides to stay too, and then things go very sideways, but not in the way you expect them to. A truly odd movie, Barbarian was a massive hit, making ten times its budget and producing roughly a million WTF reaction TikToks.
This mesmerizing riff on Frankenstein is one of the best horror films of 2023. Judy Reyes stars as a nurse whose daughter dies at the age of five, only to be brought back to life by a morgue technician (an unforgettable Marin Ireland) who has been experimenting with a daring new process. How far would you go to bring a child back from the dead? What lines would you cross? birth/rebirth is a brilliant, unforgettable piece of work.
Year: 2015 Runtime: 2h 12m Director: S. Craig Zahler
S. Craig Zahler has become one of the most divisive filmmakers working today after three vicious, brutal movies — Bone Tomahawk, Brawl in Cell Block 99, and Dragged Across Concrete. Bone Tomahawk is arguably the best, a slow-burn Western that stars Kurt Russell, Patrick Wilson, Matthew Fox, and Richard Jenkins as a posse of men who hunt a group of indigenous cannibals. The final act is terrifying and intense. (If you like it, check out Brawl too, also on Hulu.)
20th Century Fox had absolutely no idea what to do with David Prior’s adaptation of the graphic novel of the same name, and so quietly shuttled it into theaters and then VOD. The funny thing is that this ambitious study of an ex-cop (James Badge Dale) who investigates a missing girl has already started to develop a cult following of its own. It’s a smart, unique piece of work that is only going to get more and more popular.
There’s no reason for The First Omen to be as good as it is. First off, most studio horror films don’t take anywhere near the kind of risks that this daring genre flick takes. Second, horror prequels are very rarely good. This one is great. Nell Tiger Free (Servant) plays an American novitiate in Rome who discovers a vile plan to bring the antichrist to life. With stunning use of practical effects and an incredible lead performance, this is one of the best horror films of the 2020s.
Year: 1986 Runtime: 1h 36m Director: David Cronenberg
David Cronenberg delivered one of the best remakes of all time when he tackled the classic tale of a scientist who slowly becomes a fly after an experiment goes very wrong. Eschewing cheese for true body horror, Cronenberg pulled arguably the best performance of the career of Jeff Goldblum as the poor guy at the center of this waking nightmare. It’s gruesome and timeless.
The success of Parasite brought an entirely new, larger audience to the work of Bong Joon-ho, and they probably loved this riveting genre piece about a giant monster living in the Han River. Parasite star Song Kang-ho plays the patriarch of a family that’s forced into action when the creature kidnaps his daughter. When it was released, it became the highest-grossing South Korean film of all time. It rules.
Year: 2022 Runtime: 1h 46m Director: Jessica M. Thompson
Sony bungled the release of this one, being coy about its plot in ads that didn’t make it seem that appealing. It’s a fun horror movie, a retelling of Dracula from the perspective of a victim bride. It follows a young woman who goes to find her estranged family overseas only to, well, you can imagine. Nathalie Emmanuel goes all in on a film that should have found a bigger audience, and likely will on streaming services like Hulu.
Year: 2024 Runtime: 1h 33m Director: Colin Cairnes, Cameron Cairnes
A theatrical hit for IFC, the latest horror gem from the Cairnes landed on Shudder while it was still in some theaters, and has now escaped to Hulu. The wonderfully talented David Dastmalchian plays a ‘70s talk show host who has devised an unforgettable show for Halloween night, including a possessed girl as a guest. To say things go wrong would be an understatement. Stylish, funny, and original, this is one of the best horror films of 2024.
Lupita Nyong’o can do absolutely anything. Just look at this horror-comedy about a group of schoolchildren who get attacked by waves of the undead. Lupita rules as the teacher and the only one who knows how to act heroic in the moment. And she’s joined by a fun supporting performance from Josh Gad, who is very from Olaf here.
Panos Cosmatos gave Nicolas Cage one of the best roles of his career in this 2018 film that already feels like a cult classic. For about an hour, Mandy is a slow burn about a man who goes through a living hell when a cult kidnaps and murders his wife (Andrea Riseborough). And then for the second hour, it’s a crazy movie that’s just washed in blood and features a chainsaw fight. You can’t adequately describe it in words, so you just need to see it.
Year: 2019 Runtime: 1h 36m Director: Matt Betttinelli-Olpin, Tyler Gillett
The excellent Samara Weaving stars as a newlywed who discovers that her new husband’s family are a bunch of murderous lunatics. They hunt Weaving through the night as a part of a crazy Satanic ritual that takes place after every family wedding. The script is clever, the direction is tight, but this is Weaving’s show, and she rules.
It’s not traditional horror, but this thriller is so tense that it qualifies. The excellent Julia Garner reunites with Kitty Green (after 2019’s The Assistant) and co-stars alongside Jessica Henwick as two American women backpacking through Australia. They end up in one of those small towns in the deep outback that time seems to have forgotten, bartending at the Royal Hotel, where the clientele seems to be in a state of constant threat. It’s a sharp thriller about gender dynamics that doesn’t go where you think it’s going to go.
Year: 2022 Runtime: 1h 40m Director: Kyle Edward Ball
The little movie that could jumped from being a Shudder exclusive to Hulu after a brief stint in theaters that netted this five-figure movie over $1 million at the box office. Filming for almost nothing in his own childhood home, Ball taps into something primal — that feeling in the middle of the night when you wake up and can sense something is just wrong. Divisive in ways that always produce fascinating conversations, this is one of the essential horror movies of the 2020s.
Just weeks before the launch of the sequel to one of the biggest surprise horror hits of 2022 (over $200 million) worldwide, Hulu has pried it away from Paramount+ for its subscribers. One of the biggest commercial and critical horror hits of the decade, Smile is about a therapist who discovers something supernatural stalking her patients. It will get under your skin.
Dennis Paoli, the writer of Re-Animator and From Beyond, returns to H.P. Lovecraft with this unforgettable adaptation of “The Thing on the Doorstep.” Heather Graham, Judah Lewis, Bruce Davison, and the legendary Barbara Crampton star in a movie about identity, possession, and control, all of it with Lovecraftian insanity. How does one even begin to “blurb” a movie this defiantly strange? You just need to see it for yourself.
One of the best films of 2022, this was a Shudder exclusive until recently. Inspired by ‘70s paranoia horror, Watcher stars Maika Monroe (It Follows) as a woman who has moved to Romania with her husband Francis (Karl Glusman). Without much to do and unable to speak the language, she starts to get paranoid that someone is watching her from across the courtyard. Stylish and riveting, it’s a must-see.
When Evil Lurks is one of the most messed-up horror flicks you could watch on any streaming service. An Argentinian horror film that originally dropped on Shudder shortly after its Toronto Film Festival premiere and theatrical release, it’s the story of two brothers who discover that there’s a demonic entity living on the edge of their village. When it gets accidentally released, things get really bad. Gorey and strange in equal measure, this film takes no prisoners.
By submitting your email, you agree to our
Terms and Privacy Notice
and to receive email correspondence from us. This site is protected by reCAPTCHA and the Google
Privacy Policy and
Terms of Service apply.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
Already a subscriber?
Already a subscriber?
`;
// integrate Sub(x) scripts and elements
if (hostname !== 'subs.nymag.com') { // do not integrate on this subdomain
document.head.appendChild(trackingScript);
document.body.insertAdjacentHTML('beforeend', subXAnimationElements);
}
There was an error processing the request. Please try again later."}).catch(e=>console.error("Error verifying email: ",e)))(r.querySelector(".content"),o.bannerCTAVerification)})):(l.remove(),s.remove()),o.dismissable||n.remove(),o.useAlertIcon||a.remove(),r.classList.add("show"),n.addEventListener("click",()=>{u(),r.classList.remove("show")})}else r.remove()}});
}, {"1":1,"6":6,"12":12,"35":35,"40":40}];
window.modules["global-nav.client"] = [function(require,module,exports){"use strict";const dom=require(4),auth=require(12),signInButton=dom.find(".user-signin"),signOutButton=dom.find(".user-signout"),globalNav=dom.find('[class^="global-nav"]'),body=dom.find("body"),dropdownItems=dom.findAll(".dropdown-wrap"),gtm=require(1),appendLandingPageParams=require(135),pageUri=require(124).getPageUri(),subscriptionPromoLinks=dom.findAll(".persist-params"),searchString=window.location.search||"";function closeDropdowns(e){let n=globalNav.querySelectorAll(".dropdown.open");dropdownItems.forEach(function(t){let o=t.querySelector(".dropdown");!n||t.contains(e.target)&&27!==e.keyCode||o.classList.remove("open")})}function gtmSendReport(e,n,t){let o={eventCategory:"ecommerce",eventAction:"componentClick",brand:e,dimension23:"global-nav",list:pageUri,pageZone:"header",variant:"nav-link"};"global-nav-link"===t&&(o.eventLabel=n.href),gtm.reportNow(o)}function updateElementTargetUrlsIfQueryStrings(e){if(searchString){const n=new URLSearchParams(searchString);let t=e.href;if(t.includes("?")){const o=t.split("?"),i=new URLSearchParams(o[1]);for(let e of n.entries())i.set(e[0],e[1]);t=`${o[0]}?${i.toString()}`,e.href=t}else e.href=`${t}?${n.toString()}`}}function init(e){const n=e.querySelectorAll(".to-landing-page");window.addEventListener("auth:init",()=>{signInButton.addEventListener("click",function(e){e.preventDefault(),auth.showEmbeddedLoginFlow("top navigation")}),signOutButton.addEventListener("click",function(e){e.preventDefault(),gtmSendReport("Sign Out",e.target,"user-info-link"),auth.logout()}),auth.isAuthenticated()&&e.classList.add("signed-in"),auth.isSubscriber()&&e.classList.add("subscribed"),e.querySelectorAll(".user-link").forEach(e=>{e.classList.add("active")}),subscriptionPromoLinks.forEach(e=>{updateElementTargetUrlsIfQueryStrings(e)}),appendLandingPageParams(n)})}dropdownItems.forEach(function(e){e.addEventListener("click",function(){e.querySelector(".dropdown").classList.toggle("open")})}),body.addEventListener("click",closeDropdowns),document.addEventListener("keydown",closeDropdowns),globalNav.addEventListener("click",function(e){let n=e.target;n.classList.contains("global-nav-track")&>mSendReport(n.text,n,"global-nav-link")}),module.exports=init;
}, {"1":1,"4":4,"12":12,"124":124,"135":135}];
window.modules["aaa-module-mounting.legacy"] = [function(require,module,exports){"use strict";const _pickBy=require(221),_each=require(406),Fingerprint2=require(408),DS=require(407),Eventify=require(246);function registerGlobals(){window.DS=DS,window.Eventify=Eventify,window.Fingerprint2=Fingerprint2,DS.value("Eventify",Eventify),DS.value("Fingerprint2",Fingerprint2),DS.value("$document",window.document),DS.value("$window",window)}function mountDollarSliceComponents(){DS.service("components",["$document","$module",function(e,n){var o=_pickBy(n.definitions,e=>e.providerStrategy===n.providers.controller),r=Object.keys(o);function t(e){return o=>{try{n.get(e,o)}catch(e){logMountError(o,e)}}}_each(r,n=>{var o=e.querySelectorAll('[data-uri*="/_components/'+n+'/"]'),r=e.querySelectorAll('[data-uri$="/_components/'+n+'"]');_each(o,t(n)),_each(r,t(n))}),this.components=r}]),DS.get("components")}function logMountError(e,n){const o=e.outerHTML.slice(0,e.outerHTML.indexOf(e.innerHTML));console.error("Error attaching controller to "+o,n)}registerGlobals(),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{mountDollarSliceComponents()}):mountDollarSliceComponents();
}, {"221":221,"246":246,"406":406,"407":407,"408":408}];
window.modules["ads.legacy"] = [function(require,module,exports){"use strict";const _map=require(118),_forEach=require(107),_isString=require(268),_intersectionWith=require(409),_isEqual=require(274),_each=require(406),_debounce=require(182),_sortBy=require(205),page=require(124),visit=require(114);DS.service("adService",["Eventify","$cid","$document","$window",function(e,t,a,i){var o,n,s,r,d,c,u,l,g={},p=this,h=[],f=visit.getQueryParamsObject(["utm_campaign"]),m=document.querySelector('script[data-type="ad-a9"]'),b=[],w=!1,v=[],y=document.querySelector('script[data-name="ad-doubleverify"]');document.querySelector('script[data-name="concert-ads"]')||(i.NYM={},i.NYM.analytics={},i.NYM.analytics.adStartTime=i.performance.now(),i.googletag=i.googletag||{},i.googletag.cmd=i.googletag.cmd||[],u=i.googletag,(m||y)&&(i.googletag.cmd=i.googletag.cmd||[],i.googletag.cmd.push(function(){i.googletag.pubads().disableInitialLoad()})),m&&(l=i.setInterval(function(){void 0!==window.apstag&&void 0!==window.apstag.timeout&&(i.clearInterval(l),window.apstag.cleared=!0,l=null)},10),setTimeout(function(){l&&(i.clearInterval(l),i.googletag.pubads().refresh(),window.apstag||console.log("MESSAGE: Timeout for A9 load exceeded, aborting"))},500)),y&&(b.push(new Promise(function(e){w?e():v.push(e)})),c=i.setTimeout(T,2500)),o=function(e){var t,a,o=e.data,n=[];return o.loaded?e:(o.loaded=!0,t=null,(t=o.sizes?u.defineSlot(o.name,o.sizes,o.id).addService(u.pubads()):u.defineOutOfPageSlot(o.name,o.id).addService(u.pubads())).setTargeting("adid",o.id),f.hasOwnProperty("utm_campaign")&&t.setTargeting("utmcamp",f.utm_campaign),a=p.getAdCount(o.label),t.setTargeting("label",o.label+"_"+o.site+"-"+a),u.display(o.id),u.pubads().addEventListener("slotOnload",function(){i.NYM.analytics.firstAdLoadTime||(i.NYM.analytics.firstAdLoadTime=i.performance.now(),i.NYM.analytics.firstAdLoadLabel=e.data.label)}),n=_(o),Promise.all(b).then(function(){n?window.apstag&&window.apstag.cleared?window.apstag.fetchBids({slots:[n],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([t],{changeCorrelator:!1})})}):y&&u.pubads().refresh([t],{changeCorrelator:!1}):u.pubads().refresh([t],{changeCorrelator:!1})}),e.slot=t,e)},n=function(e){var a,i,o,n=t(),s=e.getAttribute("data-name"),r=e.getAttribute("data-sizes"),d=e.getAttribute("data-label"),c=e.getAttribute("data-site");n=e.id,r&&r.length?(r=r.split(","),a=[],_map(r,function(e){e=e.split("x"),i=parseInt(e[0]),o=parseInt(e[1]),a.push([i,o])})):(e.classList.add("oop"),a=!1),this.data={id:n,name:s,sizes:a,loaded:!1,label:d,site:c},g[n]=this},r=function(e){u.cmd.push(function(){var t=o(e);g[e.data.id]=t})},s=function(e){var t=[];e.slot?(t=_(e))&&window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[t],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([e.slot],{changeCorrelator:!1})})}):e&&r(e)},u.cmd.push(function(){var e,t,o,n=page.getMeta("article:tag"),s=page.getMeta("author"),r=i.location.href,d=(e=a.head.querySelector(".head-gtm"),t=a.body.querySelector(".gtm"),e&&"top"===e.getAttribute("data-gtm")?"gtmtop":t&&"bottom"===t.getAttribute("data-gtm")?"gtmbottom":"");o=[],_forEach([n,s,d],function(e){_forEach(e.split(","),function(e){(e=e.trim().toLowerCase().replace(/\s/g,"-").replace(/\'|\’/g,"")).length&&o.push(e)})}),u.pubads().setTargeting("kw",o),u.pubads().setTargeting("entry_group",o),r=r.slice(r.lastIndexOf("/")+1),u.pubads().setTargeting("pn",r),u.companionAds().setRefreshUnfilledSlots(!0),u.pubads().enableAsyncRendering(),u.enableServices()}),this.load=r,this.create=function(e){return new n(e)},this.refresh=function(e){var t;_isString(e)?(t=this.getById(e),s(t)):s(e)},this.remove=function(e){var t=e.data.id;a.getElementById(t).innerHTML=""},this.getAdCount=function(e){var t,a=0,i=Object.keys(g);return _each(i,function(i){(t=g[i]).data.loaded&&t.data.label===e&&a++}),a},this.getById=function(e){return g[e]},d=_debounce(function(){var e={TopLeaderboard:1,RightColTopMPU:2,outOfPage:99,"homepageTakeover/TopLeaderboard":1},t=_sortBy(h,function(t){return e[t.data.label]||10});_forEach(t,function(e){return e.data.sizes?r(e):i.setTimeout(function(){r(e)},2e3)}),y&&window.PQ.cmd.push(()=>{try{window.PQ.loadSignals(["ids","bsc","vlp"],T)}catch(e){T(),console.error(`There has been an error loading Double Verify signals: ${e}`)}}),h=[]},10),this.addToPageLoadQueue=function(e){h.push(e),d()});function _(e){var t,a=e.sizes;return a=_intersectionWith(a,[[970,250],[970,90],[728,90],[300,600],[300,250],[320,100],[320,50]],_isEqual),e.sizes&&e.sizes.length&&(t={slotID:e.id,sizes:a,slotName:e.label}),t}function T(){i.clearTimeout(c),w=!0,_forEach(v,function(e){e()})}}]);
}, {"107":107,"114":114,"118":118,"124":124,"182":182,"205":205,"268":268,"274":274,"406":406,"409":409}];
window.modules["cid.legacy"] = [function(require,module,exports){"use strict";DS.service("$cid",function(){var r=Math.floor(100*Math.random());return function(){return"cid-"+ ++r}});
}, {}];
window.modules["client.legacy"] = [function(require,module,exports){"use strict";require("cid.legacy"),require("ads.legacy"),require("facebook.legacy"),require("aaa-module-mounting.legacy");
}, {"cid.legacy":"cid.legacy","ads.legacy":"ads.legacy","facebook.legacy":"facebook.legacy","aaa-module-mounting.legacy":"aaa-module-mounting.legacy"}];
window.modules["facebook.legacy"] = [function(require,module,exports){"use strict";DS.service("facebook",[function(){this.fb=function(i){window.FB&&window.FB[i].apply(this,Array.prototype.slice.call(arguments,1))}}]);
}, {}];
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o typeof key === 'string' && key.match(/\.legacy$/)).forEach(key => window.require(key));
}
function tryToMount(fn, el, name) {
try {
fn(el); // init the controller
} catch (e) {
const elementTag = el.outerHTML.slice(0, el.outerHTML.indexOf(el.innerHTML));
console.error(`Error initializing controller for "${name}" on "${elementTag}"`, e);
}
}
/**
* mount client.js component controllers
*/
function mountComponentModules() {
Object.keys(window.modules).filter(key => typeof key === 'string' && key.match(/\.client$/)).forEach(key => {
let controllerFn = window.require(key);
if (typeof controllerFn === 'function') {
const name = key.replace('.client', ''),
instancesSelector = `[data-uri*="_components/${name}/"]`,
defaultSelector = `[data-uri$="_components${name}"]`,
instances = document.querySelectorAll(instancesSelector),
defaults = document.querySelectorAll(defaultSelector);
for (let el of instances) {
tryToMount(controllerFn, el, name);
}
for (let el of defaults) {
tryToMount(controllerFn, el, name);
}
}
});
}
// Make sure that a `window.process.env.NODE_ENV` is available in the client for any dependencies,
// services, or components that could require it
// note: the `` value is swapped for the actual environment variable in /lib/cmd/compile/scripts.js
window.process = window.process || {};
window.process.env = window.process.env || {};
if (!window.process.env.NODE_ENV) {
window.process.env.NODE_ENV = '';
}
// note: legacy controllers that require legacy services (e.g. dollar-slice) must
// wait for DOMContentLoaded to initialize themselves, as the files themselves must be mounted first
mountLegacyServices();
mountComponentModules();
// ]]