The time has come for us, fans of The Afterparty — the time to find out whodunnit once and for all and to wrap up all the other storylines of the season. Before Danner and Aniq solve Edgar’s murder, we get one last red herring for the road when Danner points out that Zoë is the only person whose presence hasn’t been mentioned at the after-party by anyone else. Aniq obviously doesn’t want to hear that, but when Danner invokes Ye Olde Yasper, they pull Zoë into their inquisition room. For about three full seconds, it seems like Zoë is about to confess to killing Edgar. In a quick campy horror movie flashback, she confesses to Aniq and Danner that she accidentally killed … Isabel’s dog. The pup attacked her when she was slipping her MOH speech into Grace’s honeymoon bag, and things got …ragey, as they sometimes do with Zoë. It culminates in Zoë tossing the dog out the open window and, well, thinking she murdered him. Once again, Zoë Chao? Gifted with the physical comedy of it all.
But fear not, dog lovers of the world! Zoë isn’t actually a dog murderer. According to Isabel, that dog cannot — will not — die. Danner posits that the dog probably bounced off the trampoline, which would explain why Edgar was ranting about a “bounding hound of hell” at the after-party. Whew.
It’s nice that the dog lives on, but that still leaves the important question of … who killed Edgar? Aniq and Danner don’t think Grace did it, but they’re still stumped as to who did, and Sheriff Reardon is ready to slap cuffs on Grace. Danner and Aniq stall for time by pointing out that ten minutes ago, Isabel thought she did it, and when Isabel explains that she thought Edgar murdered himself by way of trying to murder her — that he was the wrong target — a (metaphorical) lightbulb goes off over Danner’s head.
Aniq steps back up to the sheriff to contend that he has no evidence, just motive, and everyone here has a motive. Then, he has his own lightbulb moment. Danner and Aniq speak their own special detectiving language for a sec — it’s very endearing how well they work together — and try to rush off to get some of “the footage.” The sheriff stops them, so Aniq kicks off a “we all killed Edgar” moment wherein everyone stands up and says they did it (except Sebastian and Isabel), and Hannah confesses she’s in love with Grace.
Things are getting messy, so Reardon agrees to five minutes for Aniq and Danner to convince him someone other than Grace did it. Aniq and Danner get to it: They explain that everyone had the means (the Devil’s Trumpet in the centerpieces) and opportunity (the after-party) to kill Edgar. They also all had a motive— “Isabel, the betrayed mother; Sebastian, the fired partner; Hannah, the lovesick sister; Travis, the jealous ex-boyfriend; Ulysses, the wanderer who hates rich guys; Feng, the father-in-law who’s secretly broke; Vivian, the mother-in-law who has her secret; Zoë, the doubting sister-in-law; and Grace, the not-so-in-love bride.” The one with the strongest motive did it.
So, obviously, Ulysses did it.
Cue the record scratch. Everyone is like, whaaat, his motive is so weak, how could it be?! And Aniq and Danner explain Ulysses didn’t mean to kill Edgar (and Roxana) — HE MEANT TO KILL FENG.
Danner asks Vivian to tell them all what happened when she and Ulysses met under the weeping willow after the rehearsal dinner. Vivian does, in the form of a soft-focus, highly color-saturated 1980s soap opera. Basically, Ulysses wanted them to be together again, and Vivian told him no, that she loves Feng, who is kind, sweet, funny, generous, and brave. She reiterates it now to everyone in the room — she loves her husband. Feng’s smile when she says this? It’s perfect.
So Ulysses concocted a plan to get Feng out of the way to pave the path for him and Vivian to be together. He took the Devil’s Trumpet from the centerpieces, used the hot water from Aniq’s shower (see episode one), and brewed the tea in his horn (see also episode 1). Then mixed the tea into whiskey at the after-party.
At this point, Danner and Aniq reveal that the paternity test story (which Grace is SHOCKED to hear about) was clearly a cover because Vivian made no mention of discussing paternity in her weeping willow story and because Grace was drinking rose wine — not whiskey — and Sebastian said Ulysses was messing with a whiskey glass. And as we know from Hannah’s tale, Grace doesn’t like whiskey. Then, after Feng and Ulysses toasted — but Feng, too filled with hate for his brother and consumed with getting Edgar to taste the baobing, didn’t actually drink — Feng walked over to Edgar and accidentally switched glasses with him as he walked away, rejected. (This also means that Feng drank the Adderall-spiked glass, explaining why he was up all night brainstorming business ideas.) This is confirmed when Zoë casts Kyler’s footage onto the living room TV, and everyone can see the glass swap go down. And in the morning, Ulysses running to Vivian’s door — where he thought she was screaming, having found Feng’s dead body — is who Travis heard crunching on the pistachio shells.
I love when all the details come together, don’t you? This is what makes a murder mystery story so satisfying!
Anyway, Ulysses protests and Sheriff Reardon isn’t convinced (especially when his deputies find the teapot hidden in Edgar and Grace’s room). After a minute of babbling about the teapot and Zoë protecting Grace, Vivian steps up to the plate: if Aniq and Danner are wrong, then Ulysses should let Vivian drink some of Isabel’s “top shelf hooch” from his horn. “If there’s no poison in it, then there’s no problem, right?” Go, Vivian! What a brave bet to make. Of course, Ulysses stops her right as she’s about to sip the gin because … yes, there’s poison in his horn.
Ulysses confesses, sort of, and insults Feng, who punches his brother right in the face!
Okay, so we got our killer, and we get a lot of closure and fist pump moments of comeuppance, too — like when Grace signs the prenup and immediately turns around gives the $1 million it entitles her to to her father for his business. And when Isabel fires Sebastian because he sold off Bucephalus at 62 cents on the dollar, but Travis sent his “Reddit army” in to invest, and now Bucephalus is skyrocketing in value. Or something like that; the point is, Travis became the house, and he totally knows how to pronounce Bucephalus, and Sebastian is effed.
We also get a bunch of lovey-dovey happy endings, though may I just point out that there is hardly one moment of solemnity spared for the fact that Edgar (and Roxana) weren’t even the original target?! Edgar wasn’t the best guy, for sure, but no one seems to care at all that he was accidentally murdered, a casualty of someone else’s (twisted) love story. Have they all just processed it already after one day? Or do they just not care?
Anyway, Grace and Hannah canoodle happily on a footbridge; Feng and Vivian are solid as a rock, as are the Zhus as a family unit minus their Funcle; and Vivian and Feng warmly accept Aniq. Then, he and Zoe have the cutest double-proposal scene ever that just 100 percent, a million times over, proves that they are meant to be together. They are so dorky and perfect for each other, and that proposal scene is a nice reminder of it at the end of a season where they spent so much time investigating separately and somewhat at odds.
Danner gets her happy ending, too, in the form of a movie (not a book) about the Xavier case and a romance with Jaleel White! Her Xavier movie stars Daniel Radcliffe as Xavier, Keke Palmer as Danner, Gemma Chan as Zoe, Elijah Wood as Yasper, and Jaleel White as Aniq. Honestly, I’d watch it. Even though the first season of The Afterparty was pretty great in its own right.
That’s a wrap on season two of The Afterparty, as well as my recaps. It’s been a fun ride, even though almost no one seemed to care about the dead guy and his dead lizard by the end. At least we’ve got some hilarious Edgar one-liners to remember him by.
And now, I bid you adieu, for it “is time for the evening’s grand finale, in which you drive in your cars back to your own houses.” Bye!
Clues Clues Clues
• Clues Clues Clues? More like, Closure Closure Closure: this finale wraps things up in a neat lil’ bow — even fast-forwarding one year ahead to find Zoë and Aniq already married; so much for the idea I was nursing that their wedding after-party could be the season three murder scene (at that point, they would have to accept they were cursed and stop attending parties altogether, right?). So, what do we think? Are we getting a season three? I’ll be watching if we do.
• Hannah also reveals the info she held back from Aniq and Danner, and it’s that when she and Grace were in Amsterdam, Hannah got too high, and Grace spent the afternoon comforting her, and then their souls intertwined. Sweet.
• If Ulysses used the rest of the camel’s milk in the Dutch babies, and the milk was in his horn … shouldn’t everyone have been just a little bit high/poisoned after eating them if there were still traces of the Devil’s Trumpet tea in his horn (as we know it was since he stopped Vivian from drinking the gin from it)? Did he lie about using the milk in the pancakes? Did the hallucinogenic/poison burn off when cooking in the Dutch babies? Am I thinking too hard about this? Discuss!
• I love this exchange between Zoë and Aniq: “There’s no one I’d rather go through a murder with than you.” / “I feel the same! But we are hoping that’s it for murders, though, right?”
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();
// ]]