Horror is particularly good at building bridges. Sharing what scares us — whether that’s zombies, ghosts, aging, or being left behind — helps us understand each other better. The best horror books of 2024 are the ones that feel like a primal scream, a demand to be seen and recognized. From catharsis to revenge, from cannibalism to slashers, from vampires to giant bugs, here are the horror books that stood out this year.
All books are listed by publishing date, starting with the latest releases.
American Rapture, by C.J. Leede
Sophie has been raised in a severely conservative Catholic community, kept cloistered by her parents, terrified of sin and sex and the secular world. So when a plague starts to spread — one that turns sexual desire into something ugly and violent — she’s profoundly unprepared. Nevertheless, she sets out across a hellish vision of Wisconsin to find her brother, assembling a motley crew of survivors along the way, all the while navigating her own newly awakened sexuality. Though Sophie is a teenager, this is not a young-adult book. The themes here — Christofascism, sexuality, shame, moral panics — are heady, the book is brutally violent, and, as with her previous novel, Maeve Fly, Leede doesn’t pull a single punch. It’s also touching, and funny, and sad — I sobbed straight through the last 50 pages.
By the time Ash starts to realize that her boyfriend, Richie, really sucks, they’re stuck in rural Mississippi on a detour from the road trip from hell. In a small town, they discover an oddball film festival for CICADA, a found-footage cult-classic creature feature filmed there years before. But something’s off — the townsfolk are a little intense, and nobody seems to want to let them leave. And then, of course, the killings begin. Turns out that found-footage movie was more like a documentary. Ash is a delightful lead, full of piss and vinegar — a final girl, yes, but an active and resourceful one whose primary mode is Deeply Irritated. Richie immediately and decisively enters the Bad Horror Boyfriends Hall of Fame, and the eponymous monster is deliciously disgusting.
A Sunny Place for Shady People, by Mariana Enriquez
The stories in Mariana Enriquez’s newest collection share thematic DNA with her two previous collections: They’re about Argentina in the wake of the junta, about the lives of women and families, about generational trauma, and, always, about the familiar made strange and hostile. But there’s no such thing as a boring Mariana Enriquez story. Standouts here include “Black Eyes,” about NGO employees serving food to the homeless who are haunted by two uncanny children; “Hyena Hymns,” in which a vacationing couple explore an abandoned building formerly used for torture and detention; and the title story, about an Argentinian journalist reporting on a cult that has grown up around the real-life disappearance and death of Elisa Lam at a Los Angeles hotel in 2013. With A Sunny Place for Shady People, Enriquez demonstrates yet again why she’s an undisputed master of short horror.
It’s Sloane’s birthday weekend, and her distant husband has booked her a getaway with her wild child best friend Naomi. When Naomi, true to form, finagles an invite to a house party thrown by some mysterious European strangers, though, things take a turn for the sexy, and then the bloody. Before long, both women have crossed a rubicon, and their lives will never be the same. There’s no one else currently working in horror who writes about women (particularly women’s friendships) the way Rachel Harrison does — her characters are so real and flawed and lovable you could almost pick up the phone and call them. So Thirsty is a millennial Thelma & Louise with vampires, a story about friendship, aging, and agency, and it goes down like cold water on a hot day.
When Carlyle Morrow summons his estranged sons, Nick and Joshua, home for a deathbed reunion, Nick doesn’t expect his sister-in-law Emilia to join — after all, Carlyle disowned Joshua years before for the crime of marrying an Asian woman. But soon enough, all three have arrived at the Morrow estate in rural Nebraska, where the aftereffects of Carlyle’s cruel, domineering parenting still echo. Joshua, always the favored son, reconnects with Carlyle immediately, leaving Nick and Emilia at loose ends. Emilia keeps her own counsel, but it’s clear she has an agenda. Pedersen, who was herself adopted from China by a Nebraskan family, conjures a starkly beautiful vision of the Plains reminiscent of David Wroblewski’s The Story of Edgar Sawtelle. It’s a remarkable debut, a striking blend of American frontier stoicism and Chinese folklore.
Set during and immediately after Hurricane Maria, the 2017 storm that devastated Puerto Rico, House of Bone and Rain is the story of five friends on the precipice between adolescence and adulthood. When one of their mothers is murdered outside the club where she works, they vow revenge against her killer, a fearsome drug lord — but the storm is coming, and with it, nameless evils. Iglesias makes Old San Juan come alive on the page — it’s colorful, humid, rundown, and vital all at once — and the relationships between the main characters vibrate with loyalty, friction, and frustration. It’s a touching and terrifying story with a cosmic horror twist. There’s a refrain in the novel that serves as a mission statement for horror fiction in general as much as it does for this specific book: “Todas las historias son historias de fantasmas.” All stories are ghost stories.
Stephen Graham Jones is horror literature’s slasher maestro. I Was a Teenage Slasher comes hot on the heels of the conclusion of Jones’ meta-slasher Indian Lake trilogy (and I do mean hot — The Angel of Indian Lake came out in March of this year), and introduces us to a very different kind of killer. It’s 1989 in dusty west Texas, and Tolly Driver is having a bad night. He’s gotten embarrassingly drunk at a house party, nearly died from an allergic reaction to an errant peanut, and — don’t you hate it when this happens? — incurred a curse that dooms him to kill for revenge. It’s a slasher novel with a paranormal twist, narrated by the slasher (the Tolly of middle age, reflecting on the year that defined and derailed his life). It’s hard enough to reinvent such a thoroughly-explored subgenre, let alone to do so twice in the same year. But Jones makes it look effortless. His idiosyncratic narrative style, conversational and discursive, may take a little getting used to if you haven’t read him before, but he’s a singular talent — the sensitively-shaded contrast between present-day Tolly and teenage Tolly alone is worth the price of admission here.
College-age Ji-won and her younger sister, Ji-hyun, are left to pick up the pieces while their mother grieves the end of her marriage in the wake of her husband’s infidelity. But then their Umma brings home a new boyfriend, George, a walking microaggression who can’t keep his roving eyes off any Asian woman he sees. And then Ji-won starts having dreams of eyeballs — beautiful blue eyes, just like George’s. And they make her hungry. Kim’s gut-churning debut is a sharp, sly commentary on the fetishization of Asian women, particularly how it feels to be on the receiving end. Ji-won is an engaging antiheroine, a vivid portrait of the way rage can curdle when it doesn’t have an outlet. It’s a perfect blend of high and low, of message and (sometimes literal) pulp entertainment, grounded by elements like the lived-in relationship between Ji-won and Ji-hyun.
Felker-Martin’s new novel is equal parts IT, Invasion of the Body Snatchers, and The Thing, but queerer, nastier, and gooier than all three of those stories combined. Cuckoo begins in the ’90s, when a handful of queer and trans teens are ripped from their families and shipped off to a conversion camp in the desert, where they’re subject to abuse and made to perform hard labor under inhumane conditions. Naturally, there’s something much darker going on at Camp Resolution — something that explains why the kids who “graduate” from the camp go back to their families a little … different. As with Tilman Singer’s unrelated 2024 horror movie of the same name, the title is a clue, but even that knowledge can’t prepare you for what waits beneath Camp Resolution. Felker-Martin has a real talent for sensory detail on the page, which she applies to everything from jewel-like hummingbirds in lush gardens to the roiling, weeping flesh of an alien monstrosity. But the thing that truly sets her writing apart is anger: Cuckoo is full of barely restrained rage at the world’s treatment of queer and trans youths, and at the unutterable betrayal of a parent sending their child to a place like Camp Resolution. (The book’s dedication reads, simply, “For all unwanted children.”)
Breakups are hard. Breakups in a small town where you have to run into your ex all the time? Even harder. Breakups during a zombie outbreak over Pride weekend? Now that’s a nightmare. Wendy, newly single, is trying to navigate Pride in her adopted home of San Lazaro, Arizona. But when the violence begins, Wendy has to fight for survival, relying on her own wits and a ragtag queer found family — which, of course, includes her ex, Leah. King-Miller’s debut novel is firing on all cylinders: There’s heartbreak, laugh-out-loud moments, some very hot sex, and a couple truly devastating deaths (an interstitial chapter narrated by a peripheral character as they succumb to the infection moved me to tears). There’s even a nonbinary stoner pizza-delivery person named Sunshine. The Z Word tackles corporations at pride, rainbow-washing, hard seltzer, queer drama, sword lesbians, and so much more.
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(3),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(136),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,"3":3,"12":12,"124":124,"136":136}];
window.modules["aaa-module-mounting.legacy"] = [function(require,module,exports){"use strict";const _pickBy=require(221),_each=require(408),Fingerprint2=require(407),DS=require(406),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(408),_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,"408":408,"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","aaa-module-mounting.legacy":"aaa-module-mounting.legacy","ads.legacy":"ads.legacy","facebook.legacy":"facebook.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();
// ]]