The clock is ticking on Dash and Lily’s love story. And I mean literally ticking: The finale episode continually reminds us of how many hours we have until the clock strikes midnight, one, because it is New Year’s Eve, but more important, because Lily and her parents will be on a flight to Fiji that night that departs at midnight.
Thanks to bookstore clerk Mark, Dash knows that he’s running out of time to make things up to Lily. That’s right, people: We’re back where we started. Dash is at the Strand being the saddest boy who ever lived, hanging out by the Salinger books and saying things like “What I’m looking for isn’t here” when well-meaning Strand employees offer some help. The saddest! Well, finally Mark shows up with the notebook and one final message from Lily. She writes to him that she’s leaving for Fiji and also that he was right — they would’ve never worked out. She was happy she had one last Christmas in which she believed in the magic of the season and the magic of New York, but she knows better now. The Fiji part is obviously alarming to Dash, but it’s really the idea that Lily would give up believing that hits him hard. That’s his fault.
It’s been a week since things ended so disastrously between Dash and Lily…but also between Dash and Boomer. Now Dash needs Boomer’s help to try to figure out what to do and his best friend won’t talk to him. Like a good Gen Z-er, Dash goes to Boomer’s Instagram to track him down. Dash finds him, but it means he’ll have to go to a place that truly terrifies him: A Jonas Brothers concert in Hudson Yards on New Year’s Eve. But that’s how much he loves his friend and wants to make things better. The mere fact that Dash is at this concert is enough to convince Boomer he’s sorry when Dash finds him in the crowd, rocking out to the JoBros with Sofia, Priya, and the Challah Back Boys. Dash knows he needs all of their help — the Challah Back Boys lead them to a fancy trailer where they can actually talk.
He fills them in on what’s happening and although they appreciate how bad he feels for hurting Lily, what really convinces them to help is that Dash admits it whole-heartedly: He can’t stop thinking about her. YOU GUYS. He is in love! But how can he fix things? Sofia sets him straight by pointing out that he, like so many guys, has been treating Lily like Cinderella and he’s the prince meant to save her — but that’s not how the world works. He needs to be real with her. You know who agrees with Sofia? Nick Jonas. Yep, Nick Jonas walks in on their conversation because it happens to be his trailer that they’ve commandeered. Don’t worry, Nick went to band camp with the Challah Back Boys, so it’s totally cool. Nick Jonas (one of the show’s executive producers, in case you were like, WTF are the Jonas Brothers doing here?) starts to tell Dash about how he had to be vulnerable and go to Priyanka Chopra as himself (honestly did not expect to be writing that sentence when I started this episode). Before he can launch into the whole story, Dash has heard enough. He knows what he needs to do. “Thank you, Nick Jonas!” he says on the way out. Truly, thank you, Nick Jonas.
Dash has a plan. They’re going back where they started. He’s going to have Lily meet him at the Strand. He and his friends get to work.
So what’s Lily up to as the clock gets closer to midnight? She’s getting her affairs in order and having one last New Year’s Eve with her family. Grandpa Arthur rents out their temple so they can all be there together before Lily and her parents take off for Fiji. Things seem fine up until it’s time for otoshidama, when Arthur is preparing envelopes of money to give his grandkids. Both Lily and Langston know that with this envelope comes their grandpa noting everything they did wrong that year in front of everyone else. Langston’s used to it, but Lily’s never experienced Arthur’s disappointment before. Uh, she experiences it this time.
Arthur really lays into her for all the trouble she’s gotten into over the past few days. All those “family” members who’ve been helping Lily with the notebook have also been blabbing to Arthur about it. He reveals that he was going to offer to have Lily live with him while her parents moved to Fiji but after hearing all of that decided not to. He will, however, change his mind and let her stay if she admits that the boy she was seeing is the one who made her do everything and it wasn’t her own poor decision-making on display. I respect my elders and everything, but Grandpa Arthur is being a real dick here.
Lily knows it too. She goes on an epic rant calling out all of her family for the mistakes they made this year, too. Grandpa Arthur refuses to compromise with both Great-Aunt Lillian and Mabel in Florida. Langston, as it turns out, broke up with Benny because he was going to Puerto Rico… to visit family for two weeks, which is truly an insane reason to break up with someone. And her parents kept a lot of information from her that was very much not cool. She also stands up to Arthur: It wasn’t Dash’s fault, she’s owning her mistakes. Our girl is living her life, Arthur!
He remains unmoved: Lily’s going to Fiji.
As Langston and Arthur wave goodbye to Lily and her parents heading off to the airport in a cab, Langston looks back at the front stoop to their apartment and sees the red notebook sitting there. He thinks about it for a second and then decides not to give it to Lily as the cab pulls away. Why? I guess to protect her? Help her start over? It remains unclear.
Thankfully, in the maybe five days that Langston and Benny dated they managed to take a pic of them together and get it printed, which honestly even with all the magic swirling around this show, seems highly unlikely. Still, he sees that photo and is reminded that love is real or something, reads Dash’s letter, and knows he has to send a photo of it to Lily.
This! Letter! Dash tells Lily that just because they had ridiculous expectations for one another, that doesn’t mean what they have isn’t real. He knows her better than anyone. He knows that she is “smart and brave” and takes “risks for what she wants.” He knows she’s “the girl [he’s] been falling in love with.” He tells her that “if it’s not too late, [he’ll] be waiting in the place where we began.” When I tell you Lily does not hesitate to jump out of that cab and start running toward the Strand, I mean, there’s like cartoon dust left in her wake. Do I feel bad for her parents who have no idea what’s going on? Sure. Did I, a grown-ass woman, also cry tears of joy as Lily ran down the street and we saw flashbacks of the Dash and Lily love story? YOU BET YOUR ASS. In case you didn’t know, it’s been a stressful time in the world and I am worn down and also that Gracie Abrams “Stay” song playing over the montage punched me directly in the gut. Leave me be! Lily is getting her “run-through-the-city-toward-love” rom-com moment!
She gets to the Strand and Jeff the Elf (you knew he was coming back) is there with the keys to let her in (also, being a part-time elf, he was able to assist with the decorations). She walks upstairs to find the space decked out for Christmas. The tree is covered in ornaments like extra-salty pretzels and a menorah and the Grand Central Station clock and on the table there’s mochi and cheese covered pie — basically, the place is covered in their story. “You gave me New York,” Lily says to Dash when she sees him. She’s moved.
Dash starts to apologize, but Lily stops him. She has something to say. Only, she is having trouble saying it. She’s never felt this way before. And when words fail, she gets brave: She goes in for the kiss. Finally. As Langston pointed out, “it’s not about the first kiss, it’s about the first kiss that matters.” And this is the one that matters.
There is, of course, the matter of Fiji hanging over their heads. Lucky for them, they’ve closed a door that they weren’t supposed to and are locked in the Strand. From there, everyone seems to get their happy ending: Arthur calls Lily and tells her that he and Aunt Lillian and Lily’s parents hashed it out and if Lily wants to stay with him she can, and while he’s in Florida (he’s going after Mabel, people! This is happening!), she’ll stay with Mrs. Basil E (the real MVP of this series). Langston finds Benny and basically admits to being a real dummy. Um, in a delightful surprise: Sofia and Boomer go see Collation and hold hands. And yes, Dash and Lily get to spend New Year’s Eve together in the Strand, their favorite place in the world. Now, if that’s not an ending just bursting with holiday magic, I don’t know what is.
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();
// ]]