Standard Blueyepisodes are already notably short, typically running between six and eight minutes without credits. The minisodes, the second set of which launched this week, are shorter still — several just over 60 seconds before the credits kick in. Released at a time when the future of this beloved, immensely popular children’s show is uncertain, it’s unclear whether the Bluey minisodes are meant to tide viewers over until more standard Bluey is announced or if they’re a stopgap measure to keep the franchiseactive until a decision is made about its future.
Motivation for their existence aside, the minisodes as a group are both intriguing and suggestive. They put a strong emphasis on adult voices to carry the weight of each episode’s concept and action; although Bluey and Bingo appear in most of them, they participate mostly by laughing, making noises like “ahh!” or “hmm?,” and throwing in very short bits of supplemental dialogue. (This is notable because one of the ongoing questions about Bluey’s future relates to how it will deal with its aging child voice actors.) Some of the minisodes feel like brief asides — not cutting-room-floor-type excerpts, but scraps of a game or images that never quite found their way into a main Bluey episode. Several punch above their featherweight status; the ones that stand out have some of the heft of a full-length episode, or use the flexibility of the short-video format to work outside the expectations of the full-length format. Yes, some do feel repetitive and uninspired, but a few are almost — almost — enough to make you forget you’re not watching Bluey proper.
Author’s note: My children disagree with the finalists in this ranking. Although we share the same feelings about “Whirlpool” and “Animals,” they feel I drastically underranked “Browny Bear” and gave too much credit to the emotional complexity of “Blocks.”
14.
“Animals”
Two of the minisodes are essentially the same concept of a game expressed in slightly different ways. Between “Government” and “Animals,” the least impressive is the latter, in which Chilli sits on a park bench and walks her fingers along Bingo’s back, pretending to be multiple animals who stomp and chase each other. Chilli is fun, but she’s never allowed to be as teasing and silly as Bandit can be, which is why “Animals” doesn’t have the same energy as the minisode that plays out this same concept with Bandit.
13.
“Phoney”
Bandit’s nightmare alter ego Unicorse returns, directing the family’s not-Alexa device, Phoney, to play heavy metal immediately after Chilli requested “relaxing music.” Eventually, Bluey and Bingo wrestle Unicorse to the ground and demand he accede to Chilli’s desires. This is the one of the shorter minisodes (only about a minute long) because no can stand Unicorse for longer.
12.
“Whirlpool”
Another one-minute installment, “Whirlpool” is a sweet and nearly wordless articulation of a particular experience of playing, but it lacks any nugget of a concept beyond its short image of kids splashing in a backyard paddling pool.
11.
“Government”
“Government” is the counterpart to “Animals” — another game in which a parent has Bingo on their lap and is tickling, jiggling, and playing with her while acting out some role. “Government” and “Animals” are both patter minisodes, relying largely on the strength of Chilli or Bandit’s ability to lean into the game, and Bandit’s patter always wins out. In this one, Bingo is the letter Bandit is writing, folding, inserting into an envelope, stamping, and sending to the government in order to complain about his children’s behavior.
10.
“Hungry”
Another in the category of “Bandit’s allowed to be a goof” minisodes, Bandit hoists Bluey up and pretends to first eat her, then to get queasy and then finally to “chunder” her up onto the living room floor on top of Bingo, to Chilli’s exaggerated dismay and Bingo’s delight. In the final moment, Bandit declares he’s still a bit hungry, sniffs at the pile of his child-chunder, and then proceeds to “eat” Bluey all over again. (Bonus here for the split-second physical animation of the way Bandit leans over to actively smell Bluey, an example of one of the best little running gags of the series: small reminders that these characters are, in fact, dogs.)
9.
“Tattoo Shop”
Bandit requests that the girls give him a manly, strong, impressive back tattoo, and Bluey and Bingo start drawing all over his back with markers while Bandit rattles on about how excited he is for his new tough-guy tattoo. In the end, he turns around to reveal the inevitable: a unicorn, surrounded by rainbows, hearts and stars. Another one-minute episode, but it uses its time to better advantage.
8.
“Three Pigs”
The best of the minisodes’ patter installments, “Three Pigs” is a bedtime minisode where Bandit performs a wildly divergent stream-of-consciousness retelling of the Three Little pigs, featuring main characters Jingo, Gruey, and Jimmy. Bandit, desperate for bedtime but also trapped by his two daughters, lets loose even more than he usually does, incorporating the kind of absurd adult asides that some kids won’t get — Jimmy, for instance, is “on a team-building course for work,” which is why he doesn’t feature much in the story. Jingo nearly opens the door for the Big Bad Wolf after he asks to talk to her about her electricity bill; Jingo then calls the police and starts filming the interaction on her phone and “posting it on the ’gram.” The story gets sillier and stranger as Bluey and Bingo keep whispering their additions and suggestions, until Bandit finally struggles his way to bedtime.
7.
“Bingo 3000”
This episode’s closest analogues are “Hungry” and “Government,” but it’s stronger than either because of Bingo’s increased agency in the game. Bingo plays a robot butler whose legs are malfunctioning; Bandit keeps struggling with her settings and trying to read the manual to fix her, but her legs keep popping back into a bent position rather than staying straight. The game becomes more about the interplay between Bingo and Bandit, and the concept has more of a satisfying button on the end, as Bingo 3000 remains “broken” but still gets a chance to teeter around the house in her bent-legged butler mode.
6.
“Letter”
One of the few minisodes with a different visual style, the idea of “Letter” is that Nana reads aloud from a childhood letter Bandit wrote to her, while Bluey and Bingo giggle along at his assessments of Nana’s cooking, his likes and dislikes, and his abysmal childhood spelling. The show so often relies on Bandit’s adult playfulness; finding ways to explore what he was like as a child is a fun twist on the usual character dynamics. There’s a Dogman-esque appeal here, too, with each page of the letter displayed with Bandit’s original handwriting and illustrations so that the kids can laugh as Nana tries to decipher his confusing writing. (“I ride my skatboard on the drivway after skol.”)
5.
“Burger Dog”
On the one hand, “Burger Dog” is a cursed three minutes. Bluey and Bingo beg Bandit to play their annoying kid music on his phone, and Bandit’s so tired of the song they want to hear that he pretends his phone has run out of batteries. (Chilli eventually proves the phone is still fine.) The song written to illustrate Bluey’s idea of “annoying kids music” is a tune called “Burger Dog,” and it is exactly as obnoxious and empty as the genre it’s emulating. On the other hand, my entire family has been singing “Burger Dog” for months. Our family group chat has been renamed “Fluffy bun with some sesame seeds.” If Bluey releases “Burger Dog” as a single, I will have to move to the woods. It would be foolish to argue that’s not a success.
4.
“Drums”
Because the minisodes rely heavily on adult characters to do most of the speaking, with the children’s voices reduced to either very short lines or bursts of laughter, most of them are about what the adults are thinking and feeling or about games invented and played primarily by the parents. “Drums” is an elegant way to tell a Bingo story while working within the limitations of not using much audio from the child voice actors. While Chilli asks a music-store employee how to start violin lessons for Bingo, Bingo wanders over to an electric drum kit and starts playing with the headphones on. No one else can hear as she progresses from experimentation into full-on rock star, but the episode is full of her triumph and pleasure while Chilli and Bluey stand unwittingly in the background. None of the other minisodes feature Bluey or Bingo as distinctive individuals to this extent, and “Drums” is a fantastic entry in the larger Bingo canon.
3.
“Browny Bear”
Like many of the minisodes, “Browny Bear” is largely a flight of Bandit’s fancy. But it’s built out much more extensively than “Government” or “Three Pigs” with its own visual language, a fruitful cultural reference point for how the game works, and enough narrative arc for the ending to land with an exciting final swoop. After pulling the classic “made you look” shoulder-tap dad move, Bandit uses Browny Bear the puppet to become a noir-style detective, interviewing witnesses and gathering all the evidence to get to the bottom of who, actually, did the shoulder tapping. (“It was a Tuesday when this dame walked into my life,” Bandit says with a dopey Browny Bear voice as Chilli walks into his shadowy office.) It’s an episode that will play better for older kids, especially any old enough to recognize it as a noir, but it also holds together perfectly well as its own standalone “mystery,” especially because the answer to the mystery is clear from the start.
2.
“Muffin Unboxing”
“Browny Bear” and “Letter” have their own visual styles, and “Drums” is a clever workaround for the limitations of minisode production. But “Muffin Unboxing” is the most experimental and innovative minisode — the most immediately recognizable for kids, and the installment not just of the minisodes but of all of Bluey that speaks most directly to the specifics of kid life in 2024. The entire episode is an in-world YouTube style video, framed by a video title and a “subscribe” button, of Muffin unboxing a new toy dump truck. It works beautifully for those not deep in on Bluey lore, playing into Muffin’s impatience, the specific gestures and tropes of this video genre, and the unpredictability of all young kids when they’re asked to perform. But it’s most thrilling for viewers who understand all the subterranean social dynamics of these specific characters, particularly in terms of Stripe and Trixie’s socio-economic status and the occasional debate about their parenting choices. “Muffin Unboxing” has an effective ending, but its pinnacle comes earlier, as the edit cuts off just after Stripe finally gets the truck to work and sighs “oh, thank f—.”
1.
“Blocks”
While “Muffin Unboxing” is the richest text in terms of Bluey minor-character development and a way to embrace other mediums and formats, “Blocks” is the only minisode that feels as complex and thematically dense as a full-length episode. During a weekend visit with Nana and Bob, Bluey and Bingo construct an elaborate city of blocks in the living room, and they beg Nana to leave the blocks up until they can come back the next weekend. Over the next four minutes, “Blocks” follows Nana and Bob during the intervening week as they try to live their lives around this huge, disruptive, unstable blocks project. Like the best Bluey episodes, every frame pulls on multiple emotional levers at once — as Nana and Bob maneuver around the mess, there’s sweetness, absurdity, exasperation, and deep love all happening. Bob cranes his neck to try and see the TV over the tops of the block towers; when they inevitably knock down parts of the city, Nana and Bob end up sitting on the living room floor, painstakingly trying to rebuild it. Many of the minisodes feel like afterthoughts or echoes, but “Blocks” is an entirely new idea, articulated with humor and care. It’s not Bluey if no one’s moved to tears, and “Blocks” is the minisode most likely to drive that home.
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();
// ]]