Ask a casting director about their job — usually her job — and you will hear words like intuition and alchemy. Ideally, they work closely with their director to create the human canvas of a project. They serve the filmmaker’s vision with their encyclopedic knowledge of the acting community and an innate sense of what each role requires, both in terms of what’s on the page as well as the ensemble as a whole. Legends include Ellen Lewis, who has worked on every Scorsese movie since GoodFellas; or Nina Gold, who found every human role on Game of Thrones; or Francine Maisler, who has cast more than a dozen Best Picture nominees. Over the years, a casting director develops a sixth sense for star potential, that charismatic “It” factor you just can’t look away from. “I got to the point where I could tell in the waiting room who was going to be right,” says Joanna Colbert, whoco-cast the Step Up franchise. It’s not just about finding the right person for the role; it’s also about finding the right person for the next role. “Chris Pratt wouldn’t have been Star-Lord if I hadn’t seen him a lot earlier for Captain America,” says Sarah Finn, who casts the Marvel Cinematic Universe. Leslie Woo, who worked on the casting for Josh Trank’s Chronicle, still remembers when Jeremy Allen White came in: “He didn’t get it, but that was the first audition that ever made me cry.”
When next year’s Oscars ceremony takes place in March, for the first time in Academy history a casting director will get their own trophy. The addition of the Achievement in Casting category is the result of a long march through the institutions by Hollywood’s casting directors, who got one of their own, David Rubin, elected president of the Academy from 2019 to 2022. To many of his colleagues, the moment is long overdue. “We are one of the most important departments at the beginning of the movie and the first forgotten at the end,” says Jennifer Venditti, who has cast multiple A24 projects. But the casting Oscar also arrives at a time when the process of casting has fundamentally shifted — irreparably so, say some of the 20-plus casting directors Isurveyed this spring. “The magic is gone,” says Colbert, who also produced Casting By, the 2013 documentary that spurred the movement for Oscar recognition.
Like many others in the industry, casting directors’ work has been upended by a cascade of compounding trends: a pandemic that pushed the process online and drove actors away from the coasts, executives anxious that a project will vanish into the ether, a social-media audience ready to second-guess every decision. Some worry about the future of the artistry. To the pessimists among them, Hollywood’s most personal profession has lost its human touch. “For me, it’s not what I used to love to do,” says Gilmore Girls’s Jami Rudofsky. Adds another, “The job I signed up for doesn’t exist anymore.”
The move during COVID to digital auditions — largely self-tapes, in which an actor records, then submits themselves — opened up new possibilities. Many actors fled to cheaper cities, while the lower barrier to entry meant more people decided to enter the field. Self-tapes became a rallying cry around the 2023 SAG-AFTRA strike as actors complained about being responsible for lighting and editing and finding their own scene partners. Their new contract won actors the right to audition live over Zoom, as well as other guardrails, but in the 18 months since, the entropy of convenience has prevailed. “When we give actors an option of either coming in person or submitting a self-tape, 60 or 70 percent opt for the self-tapes,” says Marc Hirschfeld, head of casting for AMC Networks.
This shift has brought an exponential increase in the number of actors a casting director can consider. In person, a casting director might be able to see 30 actors a day at most. Now, it’s not unusual for them to see thousands of actors from all around the world. To cast the nearly 250 roles in the third season of I Think You Should Leave, Woo watched 5,000 self-tapes, which she had narrowed down from over 44,000 headshots and résumés. “Which is insane,” she says. “But that’s what you need to do to find the perfect 70-year-old man with a ponytail.”
“My friends in television get notes back from the network: ‘Bring more people in. We haven’t found them yet,’” says a casting director who primarily works on indies. “It becomes this churn of ‘See more people’ rather than having specific conversations about performances.” All this has to happen on a shorter timeline. “When I started in this industry, you did one movie, you worked three months on it, and then you moved on to the next one,” says Mathilde Snodgrass, a Paris-based casting director. “Today, you’re working on four or five projects at the same time.”
To longtime casting directors who put stock in their intuition, the change has been jarring. “I didn’t get a B.F.A. to sit in front of the computer for 12 hours a day,” says Doctor Odyssey casting director Tiffany Little Canfield. She and others are making a concerted effort to return to in-person auditions as much as possible. “I learn so much about how an actor works from the first ten seconds they walk in a room,” says Finn. “Can they take a note? Can they adjust, even if it’s not exactly what’s right for the scene? In a self-tape, you’re seeing one choice. Maybe that choice is going to get you the part, but what happens if it’s a two-hour movie and you read only three scenes?” Alexa Fogel, a casting director who works with David Simon and Ryan Murphy, swears off self-tapes completely: “My job is to understand the material better than the actor does. And I curate who I see very carefully. The idea of just seeing more people isn’t appealing to me.”
For all but the most established casting directors, going digital has fundamentally altered their relationships with the acting community. “I was just at a restaurant the other day, and a couple of servers were two actors whose self-tapes I had watched a couple hours earlier. One of them I just booked on a show the week before,” says Tiffany Mak, a casting director based in Vancouver. “They don’t know me, and I didn’t say who I was, but these are people who I’ve watched hours and hours of their tapes over the last few years. I’m just staring at them going, Good for you. They sometimes forget that there’s a human who’s pushing for them.” Casting directors used to be a face and a name. Now they’re an email address.
The best part of a casting director’s job is when they’re given the opportunity to create new stars. Avy Kaufman, who has worked with directors like Ang Lee and Steven Spielberg, remembers being “obsessed” with Adolescence’s Owen Cooper before he blew up but couldn’t get him cast on a film owing to his thin CV: “A month later, he’s the biggest little star in the world.” These occasions are all the more sweet for how rare they are. But the new calculus around star-casting has scrambled the casting process. It’s no longer a surprise to see established actors like Michael Keaton (Dopesick) or Michelle Williams (Dying for Sex) pop up on a stand-alone season of TV. “They can do this, make a bunch of money, and then move on to something else,” says Rudofsky. In these situations, a casting director might not audition anyone at all. Instead, they could simply assemble a list of viable names. “You go down the list with the producers and director and go, ‘Who do we want to make an offer to first?’” says Rudofsky. Now that you theoretically can get an Oscar nominee to lead your TV show, the expectation is that you will — even if the script may not necessarily be able to attract one. “But you can’t tell them that,” says one casting director. “You just keep making lists and keep going, ‘Sorry. Here’s a list of all the people who are not interested in doing this.’”
Streaming gave casting directors more work — or, at least, it did before the production slowdown — but also more masters to serve. “With the streamers, you’ve got ten people on an email weighing in, and I don’t know what half of them do,” says Victoria Thomas, who cast The Morning Show as well as Tarantino’s past three movies. “Sometimes they’re asking good questions. But sometimes it’s like, Why can’t this director have his choice?” For some, Netflix has a reputation for having a lot of voices in the room. Apple pushes back, sometimes with ideas that aren’t great, but is generally amenable. Peacock, perhaps anxious about its status as a second-banana service, is caught up in getting leads who are “promotable.”
Film has a similar problem as TV. “Most studio movies I’ve done, everybody needs a name or they think they need a name,” says Kaufman. Who’s considered a name? For a mainstream movie, it’s “the same people who are in all the Marvel movies,” says one casting director. On an A24 film, it might be guys like Austin Butler, Harris Dickinson, and Callum Turner. Many casting directors agree that cinema is suffering from a shortage of bankable leads. “That makes it more important to have what I call a ‘string of pearls,’” says Little Canfield. “You don’t necessarily have one actor who can guarantee a strong opening, but you find several wonderful actors who are also beloved.” (In 2022, critic Alissa Wilkinson spotlighted films like Amsterdam and Glass Onion as examples of this trend.) You can trace the dearth of new stars back to the franchise-heavy 2010s, when actors took a back seat to IP and the only ones strong enough to survive were the already megafamous. If you’re an optimist, you can see the success of films like Anyone But You, Challengers,and Sinners as proof that Glen Powell, Sydney Sweeney, Zendaya, and Michael B. Jordan are getting us back to those days.
However, there’s also a new kind of fame to contend with. In February, Maya Hawke set off a kerfuffle in the acting community when she spoke about industry pressure to cast actors based on their social-media stats: “If you have over this many followers, you can get the movie funded.” Many casting directors are skeptical about how prevalent this practice really is. “I think it’s a clickbait item that’s supposed to scare people who are starting out,” says Little Canfield. Others say that in highly specific situations, it does happen. “I call it ‘casting by numbers’ — by follower numbers,” says Linda Lamontagne, a casting director who works in animated TV. “Producers want a certain amount.” (Above 100,000 is where it starts to matter.) These projects tend to be aimed at younger audiences or a more online one. There are, of course, plenty of legitimate talents to be found on TikTok and Instagram, but there are also many people for whom influencing is in itself the end goal. Casting them is harder than it looks, says someone who has tried: “They get paid more for posting than they do for my entire project.”
It’s tempting to roll your eyes when you see someone like Ivy Wolk pop up all over the place: The deadpan 20-year-old comedian, who amassed over 200,000 TikTok followers before deleting her account, has since booked roles in Anora, English Teacher, and Friendship. But even this new-media rise turns out to contain an old-Hollywood familiarity. “Ivy has a manager, and I love his taste,” says Gayle Keller, who cast her on English Teacher. Some casting directors are starting to have fun with the practice of hiring influencers. On Doctor Odyssey’s spring-break episode, nearly every guest star was a nepo baby or TikTok celeb. “We tried to think of people whom young people would be curious about: people who are in social media or gossip columns,” Little Canfield says.
But “the tail is not wagging the dog yet,” says Hirschfeld. “Selena Gomez was cast in Only Murders in the Building, I’m sure, based purely on the fact that she was creatively right for it. But they would be foolish not to take advantage of the fact that she has over 400 million followers on Instagram. That is a hell of a lot more powerful of a promotional platform than putting a poster on the side of a bus.”
There are still parts of the industry where the casting process plays out in its idealized form, where filmmakers and casting directors can collaborate closely and are given the freedom to choose whichever actor they wish. Pros frequently mention The Bear and The White Lotus as examples of casting done the right way — projects that embrace risk, that try to mint new stars instead of settling for old ones. In movies, A24 fills a similar niche. “You’re allowed to have a little more fun,” says Kaufman.The studio also can be more willing to throw the weight of its brand around to help land an actor, which casting directors appreciate.
Neon’s Anora gave casting directors the most optimism — proof that a movie could still hit without a name — as well as a little concern. “Now Mikey Madison has an Academy Award, and last year people around the world had no idea who she was,” Rudofsky says. Anora, however, didn’t employ a casting director. “I am okay with a director casting their own movie, especially a director like Sean Baker who does everything,” says one casting director. “But don’t take that credit. He could win the Oscar for Best Casting in the future, and that would suck. That’s when it crosses the line of taking away from us.”
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?
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()}});
}, {"3":3,"6":6,"19":19,"39":39,"45":45}];
window.modules["global-nav.client"] = [function(require,module,exports){"use strict";const dom=require(4),auth=require(19),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(3),appendLandingPageParams=require(144),pageUri=require(134).getPageUri(),subscriptionPromoLinks=dom.findAll(".persist-params"),searchString=window.location.search||"";function closeDropdowns(e){let n=globalNav.querySelectorAll(".dropdown.open");dropdownItems.forEach(function(t){let i=t.querySelector(".dropdown");!n||t.contains(e.target)&&27!==e.keyCode||i.classList.remove("open")})}function gtmSendReport(e,n,t){let i={eventCategory:"ecommerce",eventAction:"componentClick",brand:e,dimension23:"global-nav",list:pageUri,pageZone:"header",variant:"nav-link"};"global-nav-link"===t&&(i.eventLabel=n.href),gtm.reportNow(i)}function updateElementTargetUrlsIfQueryStrings(e){if(searchString){const n=new URLSearchParams(searchString);let t=e.href;if(t.includes("?")){const i=t.split("?"),o=new URLSearchParams(i[1]);for(let e of n.entries())o.set(e[0],e[1]);t=`${i[0]}?${o.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"),auth.isMobileAppRequest()&&e.classList.add("nymag-app"),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;
}, {"3":3,"4":4,"19":19,"134":134,"144":144}];
window.modules["aaa-module-mounting.legacy"] = [function(require,module,exports){"use strict";const _pickBy=require(231),_each=require(419),Fingerprint2=require(418),DS=require(417),Eventify=require(257);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();
}, {"231":231,"257":257,"417":417,"418":418,"419":419}];
window.modules["ads.legacy"] = [function(require,module,exports){"use strict";const _map=require(128),_forEach=require(117),_isString=require(279),_intersectionWith=require(420),_isEqual=require(285),_each=require(419),_debounce=require(161),_sortBy=require(215),page=require(134),visit=require(124);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()})}}]);
}, {"117":117,"124":124,"128":128,"134":134,"161":161,"215":215,"279":279,"285":285,"419":419,"420":420}];
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("aaa-module-mounting.legacy");
}, {"cid.legacy":"cid.legacy","ads.legacy":"ads.legacy","aaa-module-mounting.legacy":"aaa-module-mounting.legacy"}];
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();
// ]]