Do not be fooled by Invincible’s good vibes. Amazon’s new animated series opens with a superhero origin that combines elements of the Incredibles, Superman, and Spider-Man in a vibrant, optimistic tale of a teenage boy connecting with his superhero father and civilian mother as he discovers his own extraordinary abilities. But this is a project from Robert Kirkman, the mind behind very dark projects like The Walking Dead and Outcast. After the title card drops at the 37-minute mark, “It’s About Time” switches into a very different mode, completely upending viewer expectations and complicating the show’s central concept in the most gruesome way possible.
When Invincible debuted in 2003, Image Comics was just over a decade old, still heavily focused on superhero comics, and coasting on the fumes of its success in the ’90s. Kirkman was an up-and-coming writer building a name with books like Battle Pope and SuperPatriot, but his value to Image became clear when he launched Invincible and The Walking Dead in the same year, creating two of the publisher’s biggest hits of the decade. Invincible isn’t a superhero IP with pop-culture dominance, but, much like Amazon’s massive superhero hit The Boys, it incorporates the iconography and character archetypes of more popular properties to give viewers something that still feels familiar and inviting. Also like The Boys, Invincible twists these concepts in ways that make them less idealistic and bright, and an evil Superman is the key antagonist of both.
Mark Grayson (Steven Yeun) has been waiting for his superpowers to manifest ever since his father, Nolan (J.K. Simmons), revealed to him that he is the costumed crime fighter Omni-Man. In a sweet rooftop chat under the stars, Nolan tells his child about the advanced alien planet he grew up on and the extraordinary people who live on it and send their superpowered ambassadors across the universe to help other worlds. Moments like this give Invincible’s father-son relationship tenderness and intimacy, and Simmons is one of the best actors around for playing charismatic, supportive patriarchs. The acting, the writing, and the subtle animation all work together to give viewers the warm fuzzies, putting them in Mark’s shoes as he connects with his father, who’s even more of an aspirational figure now.
There’s a lot of very satisfying superhero action in this episode, but the bond between Mark, his father, and his mother, Debbie (Sandra Oh), is what gives the viewer something to emotionally latch on to. Mark is introduced reading a comic on the toilet when his mother barges into the bathroom to get ready, and Debbie’s playful ribbing of her son gains deeper resonance later in the episode when his powers finally manifest. She gives him shit because she knows he’s eventually going to follow in his father’s extraordinary footsteps, and while he may be invincible, he’ll always be vulnerable to his mother’s ribbing.
Invincible is Yeun’s second Kirkman project after getting his big Hollywood break as Glenn on The Walking Dead, a beloved character whose death marked a turning point for the series both in its narrative brutality and ratings dominance. Yeun is open about his experience on that show and how Glenn’s position as the story’s moral compass held him back as an actor, which makes Mark’s impending moral conflict an especially intriguing prospect for Yeun as a performer. Mark definitely has the impulses of a do-gooder, but there’s also a part of him that wants to exert his dominance and show off his superiority, which he does when he tells the school bully to beat on him as hard as possible. Yeun gets to spotlight a lot of different sides to Mark’s character in this episode: the petulant son, the vulnerable nerd, the overeager rookie desperate to prove himself, and, finally, the triumphant hero.
What both the Invincible comic and the series do so well is establish the human side of Mark: his nerdy interests, his relationships with family and friends, his responsibilities as a teen balancing school and a job. I’ve always loved the moment when Mark’s powers first kick in while he’s taking out the trash at work, connecting the fantastic and the mundane in this major transitional moment. Mark struggles with the first bag’s weight, but the second one goes flying when he tosses it in. This moment plays just as well onscreen as it does on the page and is intensified by the exuberant joy in Yeun’s voice acting. The Incredibles’ vibe is especially strong when Mark and his dad meet with a superhero costume designer to nail down Mark’s look. This is another moment pulled from the comics, and it’s interesting that Invincible touched on a lot of the ideas in The Incredibles almost two years before that movie debuted.
Watching the first episode of Invincible really does feel like watching the comic come to life, probably because the people who worked on it are directly involved. Kirkman is an executive producer and wrote this first episode; Invincible’s co-creator and original artist, Cory Walker, is the show’s lead character designer; and Ryan Ottley, who drew the majority of the book’s run, is a creative consultant. The presence of Walker is especially valuable given that his eye for bold colors and graphic, geometric patterns is responsible for these characters’ visual appeal. His streamlined style translates seamlessly to animation, and the production team ably captures the charming personality and dynamic movement of his artwork.
Animation director Hae Young Jung worked on shows like Avatar: The Last Airbender, The Legend of Korra, and Voltron: Legendary Defender, honing a skill for slick, powerful action and fully realized emotional character acting. There’s a lot of heart in this first episode, and much of that comes from nuanced facial expressions and gestures that enrich the work of an exceptional voice cast. Casting director Linda Lamontagne brilliantly assembled the talent for this episode, which also includes Mahershala Ali, Zazie Beetz, Andrew Rannells, Jon Hamm, Mark Hamill, and more. This is a starry lineup of distinct voices, and while Invincible as a property may not have the greatest name recognition, this cast certainly does.
Heavily exaggerated violence is a defining characteristic of the Invincible comic, and while live-action superhero media have amped up the violence considerably, they still have difficulty reproducing the artistry of the violence on the page. Invincible’s fight scenes are ballets of blood and guts, the still images allowing readers to linger on every grisly detail and appreciate how the artists have pushed the limits of human movement. That’s extremely difficult to do in live-action, with its constraints on both budgets and physical bodies. You can do a lot more with animation, and from the opening sequence introducing the Justice League Guardians of the Globe, the Invincible TV show proves it can meet the high standards set by the source material.
I was pleasantly surprised to see Joaquim Dos Santos among the episode’s storyboard artists, and given his history working on shows like Justice League Unlimited, it would make a lot of sense for him to work on the Guardians of the Globe sequences. (Dos Santos’s next gig? Directing the Spider-Verse sequel.) This episode’s opening introduces the Guardians with strong JLU energy, starting with a shot showing each hero using their powers as they drop from the sky. This scene builds momentum with exhilarating fight choreography, and it’s important that the team comes across as an unstoppable, well-oiled ass-kicking machine because, by the episode’s end, they will be stopped. Hard.
The TV superhero family is having a moment right now with Superman and Lois and WandaVision, and while Invincible at first appears to be more like the former, it goes on to take the latter’s idea of an ethically compromised superhero parent to a new extreme. Omni-Man shows up to help the Guardians at the end of their big opening fight, but in the episode’s final scene, he gathers the team together so he can literally tear them apart with his bare hands. It’s a shocking heel turn after all the warmth this character showed in the preceding 40 minutes, and the relentlessly graphic violence completely shatters the viewer’s previous perception of Omni-Man, which is his son’s current view. What’s going to happen when Mark learns the truth?
The Invincible comic waited a few issues before revealing Omni-Man’s true nature, but it makes an ideal cliffhanger for a TV series, giving viewers a much clearer idea of the story’s direction — and that direction is very bloody. The creative team delights in the gory violence it can deliver through animation, sending an aggressive message that this series isn’t afraid to show what would happen if a cold-blooded killer had superhuman power. When Omni-Man crushes Red Rush’s head, the shot doesn’t move from Red Rush’s face while bones crack, blood spurts, and an eyeball pops out.
The ease with which Omni-Man mutilates his former colleagues is deeply disturbing, and the direction heightens the terror, as in the slow-motion shot when Omni-Man smashes a mace into Aquarius’s fish head and makes it pop like a giant water balloon full of brains. There’s no music during this scene, just the sounds of the fight. Omni-Man doesn’t need villain music when his actions are so declarative, and when the massacre ends, the silence lingers over the closing credits. After the sunny high of Mark’s superhero debut,“It’s About Time” drags viewers down into the darkest aspects of the genre and leaves them there.
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();
// ]]