Company: Vercel
Remote: No
Posted: 2026-03-16
Status: new
Apply: https://vercel.com/careers/engineering-manager-cdn-5701765004
Engineering Manager, CDN((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f?.[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","zeit-theme","system",null,["light","dark"],{"light":"light-theme","dark":"dark-theme"},true,true)
// Protect Geist code blocks from 1Password DOM flattening
(function() {
const codeBlockSnapshots = new WeakMap();
let isRestoring = false;
function saveSnapshot(codeElement) {
if (!codeBlockSnapshots.has(codeElement)) {
codeBlockSnapshots.set(codeElement, codeElement.cloneNode(true));
}
}
function checkAndRestore(codeElement) {
if (isRestoring) return;
// Check if our specific structure was flattened
const hasOurStructure = codeElement.querySelector('[data-geist-code-block-line]');
const snapshot = codeBlockSnapshots.get(codeElement);
if (!hasOurStructure && snapshot && snapshot.querySelector('[data-geist-code-block-line]')) {
// Our structure was destroyed (likely by 1Password), restore it
isRestoring = true;
codeElement.innerHTML = snapshot.innerHTML;
isRestoring = false;
}
}
function initializeCodeBlocks() {
document.querySelectorAll('code[data-geist-code-block]').forEach(saveSnapshot);
}
// Single global observer for all code blocks
const globalObserver = new MutationObserver(function(mutations) {
if (isRestoring) return;
mutations.forEach(function(mutation) {
// Check if new code blocks were added
mutation.addedNodes.forEach(function(node) {
if (node.nodeType === 1) {
if (node.matches && node.matches('code[data-geist-code-block]')) {
saveSnapshot(node);
} else if (node.querySelectorAll) {
node.querySelectorAll('code[data-geist-code-block]').forEach(saveSnapshot);
}
}
});
// Check if existing code blocks were modified
var target = mutation.target;
if (target.nodeType === 1) {
// Check if the target itself is a protected code block
if (target.matches && target.matches('code[data-geist-code-block]')) {
checkAndRestore(target);
}
// Check if the target contains protected code blocks
else if (target.closest && target.closest('code[data-geist-code-block]')) {
checkAndRestore(target.closest('code[data-geist-code-block]'));
}
}
});
});
// Initialize existing code blocks and start observing
function init() {
initializeCodeBlocks();
globalObserver.observe(document.documentElement, {
childList: true,
subtree: true,
characterData: true
});
}
// Run immediately and after DOM is ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();
(({protect:a})=>{function b(a){return new Promise((b,c)=>{if(document.querySelector(`script[src="${a}"]`))return void b();let d=document.createElement("script");d.src=a,d.async=!0,d.onload=()=>b(),d.onerror=a=>{console.error("Error loading script",a),c(a)},document.head.appendChild(d)})}var c=class a{#a;#b;#c=0;constructor(){let{promise:b,resolve:c}=a.#d();this.#a=b,this.#b=c,this.#e(),window.addEventListener("online",this.#f),window.addEventListener("visibilitychange",this.#f)}getChallenge=async()=>(await this.#g(),await this.#a.then(a=>"function"==typeof a?a():a));#f=()=>{if(document.hidden)return;let{promise:b,resolve:c}=a.#d();this.#a=b,this.#b=c,window.V_C=[],window.V_C.push=c;let d=document.querySelector('script[src*="c.js"]');d&&d.remove(),this.#c+=1};#e=()=>{if(window.V_C){let a=window.V_C.pop();a&&this.#b(a)}else window.V_C=[],window.V_C.push=this.#b};#g=()=>{let a=new URL("/149e9513-01fa-4fb0-aad4-566afd725d1b/2d206a39-8ed7-437e-a3be-862e0f06eea3/a-4-a/c.js",window.location.origin);return a.searchParams.set("i",String(this.#c)),a.searchParams.set("v",String(3)),a.searchParams.set("h",window.location.host),b(a.pathname+a.search)};#h=()=>{window.V_C=void 0};static #d(){let a,b;return{promise:new Promise((c,d)=>{a=c,b=d}),resolve:a,reject:b}}},d=class a{#a=!1;#b;constructor(a){this.#b=a}get loaded(){return this.#a}load=async()=>{this.#a||await this.#f()};#c=()=>{if(typeof globalThis.window>"u")throw Error("KPSDK is not available in the server");if(!window.KPSDK)throw Error("KPSDK is not loaded");let b=this.#b.map(b=>{let c=a.#e(b.path);return{domain:c.host,path:c.pathname,method:b.method}});try{window.KPSDK.configure(b)}catch(a){console.error("Error configuring KPSDK...",a)}};#f=async()=>{let a=this;return new Promise((c,d)=>{let e=()=>{document.removeEventListener("kpsdk-load",e),this.#c()},f=()=>{document.removeEventListener("kpsdk-ready",f),a.#a=!0,c()};document.addEventListener("kpsdk-load",e,{once:!0}),document.addEventListener("kpsdk-ready",f,{once:!0}),b("/149e9513-01fa-4fb0-aad4-566afd725d1b/2d206a39-8ed7-437e-a3be-862e0f06eea3/p.js").catch(a=>{document.removeEventListener("kpsdk-load",e),document.removeEventListener("kpsdk-ready",f),d(a)})})};static #e(a){let b;try{b=new URL(a)}catch{b=new URL(a,location.origin)}return b}},e=a=>{let b=a.replace(/[.?+^$[\]\\(){}|-]/g,"\\$&").split("*").join(".*");return RegExp(`^${b}$`)},f=({path:a,pattern:b})=>-1!==a.search(b);async function g(a,b,c){let d=XMLHttpRequest.prototype.open,g=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(a,b,c,e,f){return this._requestUrl=b.toString(),this._requestMethod=a,d.call(this,a,b,c??!0,e,f)},XMLHttpRequest.prototype.send=async function(d){let h=this._requestUrl;if(!h||this._isReexecution)return g.call(this,d);let i=new URL(h,location.href),j=this._requestMethod??"GET",k=c.find(a=>{let b=f({path:i.pathname,pattern:e(a.path)}),c=a.method===j||"*"===a.method;return b&&c});if(!k)return g.call(this,d);let l=await a.getChallenge();if(this.setRequestHeader("x-is-human",JSON.stringify(l)),this.setRequestHeader("x-path",i.pathname),this.setRequestHeader("x-method",j),0!==l.b||b.loaded||((1===l.d||k?.advancedOptions?.checkLevel==="deepAnalysis")&&await b.load(),!b.loaded))return g.call(this,d);this.setRequestHeader("x-is-human",JSON.stringify(l)),this.setRequestHeader("x-path",i.pathname),this.setRequestHeader("x-method",j);let m=new XMLHttpRequest;return m._isReexecution=!0,m.open(j,h,!0),m.setRequestHeader("x-is-human",JSON.stringify(l)),m.setRequestHeader("x-path",i.pathname),m.setRequestHeader("x-method",j),this.timeout&&(m.timeout=this.timeout),this.responseType&&(m.responseType=this.responseType),this.withCredentials&&(m.withCredentials=this.withCredentials),m.onreadystatechange=()=>{Object.defineProperty(this,"readyState",{value:m.readyState,writable:!0,configurable:!0}),m.readyState===XMLHttpRequest.DONE&&(Object.defineProperty(this,"status",{value:m.status,writable:!0,configurable:!0}),Object.defineProperty(this,"statusText",{value:m.statusText,writable:!0,configurable:!0}),Object.defineProperty(this,"response",{value:m.response,writable:!0,configurable:!0}),Object.defineProperty(this,"responseText",{value:m.responseText,writable:!0,configurable:!0}),Object.defineProperty(this,"responseXML",{value:m.responseXML,writable:!0,configurable:!0}),this.getAllResponseHeaders=()=>m.getAllResponseHeaders(),this.getResponseHeader=a=>m.getResponseHeader(a)),this.onreadystatechange&&this.onreadystatechange.call(this,new Event("readystatechange"))},m.onload=a=>{this.onload&&this.onload.call(this,a)},m.onerror=a=>{this.onerror&&this.onerror.call(this,a)},m.onabort=a=>{this.onabort&&this.onabort.call(this,a)},m.ontimeout=a=>{this.ontimeout&&this.ontimeout.call(this,a)},m.onloadstart=a=>{this.onloadstart&&this.onloadstart.call(this,a)},m.onloadend=a=>{this.onloadend&&this.onloadend.call(this,a)},m.onprogress=a=>{this.onprogress&&this.onprogress.call(this,a)},m.send(d)}}!function({protect:a=[]}){let b;for(let b of a)if(b.advancedOptions?.checkLevel!==void 0&&"deepAnalysis"!==b.advancedOptions.checkLevel&&"basic"!==b.advancedOptions.checkLevel)throw Error(`Invalid checkLevel "${b.advancedOptions.checkLevel}" for route "${b.path}". Must be one of: deepAnalysis, basic`);let h=new c,i=new d(a);g(h,i,a).catch(a=>{console.error("Error patching XMLHttpRequest:",a)}),b=window.fetch,window.fetch=async(c,d)=>{let g=new URL(c instanceof Request?c.url:c,location.href),j=g.origin===location.origin,k=d?.method??(c instanceof Request?c.method:"GET"),l=a.find(a=>{let b=f({path:g.pathname,pattern:e(a.path)}),c=a.method===k||"*"===a.method;return b&&c});if(null==l||!j)return b(c,d);let m=await h.getChallenge(),n=new Headers(d?.headers||(c instanceof Request?c.headers:void 0));n.set("x-is-human",JSON.stringify(m)),n.set("x-path",g.pathname),n.set("x-method",k);let o={...d,headers:n};return i.loaded||0!==m.b?b(c,o):1===m.d||l?.advancedOptions?.checkLevel==="deepAnalysis"?(await i.load(),window.fetch(c,o)):b(c,o)}}({protect:a})})({ protect: [{"path":"/api/solution-partners/contact-solution-partner","method":"POST"},{"path":"/api/report-abuse","method":"POST"},{"path":"/api/appeals","method":"POST"},{"path":"/api/ai/gateway-playground/chat/logged-out","method":"POST"}] });ProductsAI Cloudv0Build applications with AIAI SDKThe AI Toolkit for TypeScript
AI GatewayOne endpoint, all your modelsVercel AgentAn agent that knows your stackSandboxAI workflows in live environmentsCore PlatformCI/CDHelping teams ship 6× fasterContent DeliveryFast, scalable, and reliableFluid ComputeServers, in serverless formObservabilityTrace every stepSecurityBot ManagementScalable bot protectionBotIDInvisible CAPTCHAPlatform SecurityDDoS Protection, Firewall
Web Application FirewallGranular, custom protectionResourcesCompanyCustomersTrusted by the best teamsBlogThe latest posts and changesChangelogSee what shippedPressRead the latest newsEventsJoin us at an eventLearnDocsVercel documentationAcademyLinear courses to level upKnowledge BaseFind help quicklyCommunityJoin the conversationOpen Source
Next.jsThe native Next.js platformNuxtThe progressive web framework
SvelteThe web’s efficient UI framework
TurborepoSpeed with Enterprise scaleSolutionsUse Cases
AI AppsDeploy at the speed of AIComposable CommercePower storefronts that convertMarketing SitesLaunch campaigns fastMulti-tenant PlatformsScale apps with one codebaseWeb AppsShip features, not infrastructureToolsMarketplaceExtend and automate workflowsTemplatesJumpstart app developmentPartner FinderGet help from solution partnersUsersPlatform EngineersAutomate away repetition
Design EngineersDeploy for every ideaEnterprisePricing
@media (max-width: 1150px) {
#header-content { display: none; }
}
@media (min-width: 1151px) {
#mobile-menu-toggle { display: none; }
}
EngineeringSan FranciscoFull TimeEngineering Manager, CDNCareers /EngineeringEngineeringSan FranciscoFull TimeAbout Vercel:Vercel gives developers the tools and cloud infrastructure to build, scale, and secure a faster, more personalized web. As the team behind v0, Next.js, and AI SDK, Vercel helps customers like Ramp, Supreme, PayPal, and Under Armour build for the AI-native web. Our mission is to enable the world to ship the best products. That starts with creating a place where everyone can do their best work. Whether you're building on our platform, supporting our customers, or shaping our story: You can just ship things.About the Role:You’ll lead the team responsible for Vercel’s CDN, proxy, and edge caching systems—the core infrastructure that powers performance, reliability, and cost efficiency for every customer request at Vercel. Your mandate is twofold: Operate critical systems exceptionally (latency, reliability, COGS), and align the team to product and business goals, translating strategy into a clear roadmapYou will set direction, grow people, and create the conditions for high trust, high autonomy, and high output—balancing technical depth with strong people leadership. This is a manager role, not a principal IC role. You’ll code when it’s the highest leverage (e.g., prototypes/unblocking), but your default is delegation, coaching, and alignment.About You:8+ years building and operating large-scale distributed systems3+ years managing engineers (managing managers is a plus)Demonstrated success leading CDN/proxy/caching/edge or similar high-throughput, low-latency infrastructureProven ability to translate business goals into technical strategy and drive cross-org alignmentTrack record establishing trust, psychological safety, and clear expectations; skilled at timely, candid feedbackStrong facilitator in technical conflict—you listen, synthesize, decide, and bring the team with youCompetence across HTTP, TLS, caching strategies, load shedding, capacity planning, observability, and cost optimizationBonus If You:Have experience with Go, Lua, or Node at the edge; running high-signal hiring pipelinesCollaborating with product/PMM on customer-facing narratives.Benefits:Competitive compensation package, including equity.Inclusive Healthcare Package.Learn and Grow - we provide mentorship and send you to events that help you build your network and skills.Flexible Time Off.We will provide you the gear you need to do your role, and a WFH budget for you to outfit your space as needed.The San Francisco, CA base pay range for this role is $196,000.00 - $336,000.00. Actual salary will be based on job-related skills, experience, and location. Compensation outside of San Francisco may be adjusted based on employee location. The total compensation package may include benefits, equity-based compensation, and eligibility for a company bonus or variable pay program depending on the role. Your recruiter can share more details during the hiring process. Vercel is committed to fostering and empowering an inclusive community within our organization. We do not discriminate on the basis of race, religion, color, gender expression or identity, sexual orientation, national origin, citizenship, age, marital status, veteran status, disability status, or any other characteristic protected by law. Vercel encourages everyone to apply for our available positions, even if they don't necessarily check every box on the job description.Apply for RoleApply Now.Tell us why you’d be a good fit for the Engineering Manager, CDN role.First NameLast NameEmail AddressPhone NumberResumeUpload your resumeResume should be a PDF under 3.5MB.Are you currently based in any of these countries? Please note these are the only countries where we are accepting applicationsUnited StatesGermanyUnited KingdomArgentinaAustraliaCanadaIndiaJapanOtherWill you require Visa Sponsorship now, or in the future?YesNoYour authorization to work in the country where you live. Please choose the option that describes your work authorization.
I am authorized to work in the country due to my nationalityI am authorized to work in the country based on a valid work permit and do not need a company to sponsor my visaI am authorized to work in the country based on a valid work permit which needs to be sponsored by the company I work forI am not authorized to work in the country and need visa supportOtherDo you live in one of the following states?
Alabama, Alaska, Delaware, Kansas, Maine, Mississippi, Montana, Nebraska, New Mexico, North Dakota, South Dakota, West Virginia, or Wyoming.YesNoBy submitting my application, I acknowledge that I have read and understand Vercel’s Job Applicant Privacy Notice Acknowledge/ConfirmPlease double-check all the information provided above. Ensuring accuracy is crucial, as any errors or omissions may impact the review of your application.I have reviewed and confirmed that all the information provided is accurate and complete.Optionally, include links to your social media profiles. LinkedInlinkedin.com/in/ X (Twitter)x.com/ GitHubgithub.com/ Portfoliohttps://Submit ApplicationGet StartedTemplatesSupported frameworksMarketplaceDomainsBuildNext.js on VercelTurborepov0ScaleContent delivery networkFluid computeCI/CDObservabilityAI GatewayNewVercel AgentNewSecurePlatform securityWeb Application FirewallBot managementBotIDSandboxNewResourcesPricingCustomersEnterpriseArticlesStartupsSolution partnersLearnDocsBlogChangelogKnowledge BaseAcademyCommunityFrameworksNext.jsNuxtSvelteNitroTurboSDKsAI SDKWorkflow DevKitNewFlags SDKChat SDKStreamdown AINewUse CasesComposable commerceMulti-tenant platformsWeb appsMarketing sitesPlatform engineersDesign engineersCompanyAboutCareersHelpPressLegalPrivacy PolicyCommunityOpen source programEventsShipped on VercelGitHubLinkedIn XYouTubeLoading status…Select a display theme:system lightdarkrequestAnimationFrame(function(){$RT=performance.now()});Products$RB=[];$RV=function(a){$RT=performance.now();for(var b=0;b<a.length;b+=2){var c=a[b],e=a[b+1];null!==e.parentNode&&e.parentNode.removeChild(e);var f=c.parentNode;if(f){var g=c.previousSibling,h=0;do{if(c&&8===c.nodeType){var d=c.data;if("/$"===d||"/&"===d)if(0===h)break;else h--;else"$"!==d&&"$?"!==d&&"$~"!==d&&"$!"!==d&&"&"!==d||h++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;e.firstChild;)f.insertBefore(e.firstChild,c);g.data="$";g._reactRetry&&requestAnimationFrame(g._reactRetry)}}a.length=0};
$RC=function(a,b){if(b=document.getElementById(b))(a=document.getElementById(a))?(a.previousSibling.data="$~",$RB.push(a,b),2===$RB.length&&("number"!==typeof $RT?requestAnimationFrame($RV.bind(null,$RB)):(a=performance.now(),setTimeout($RV.bind(null,$RB),2300>a&&2E3<a?2300-a:$RT+300-a)))):b.parentNode.removeChild(b)};$RC("B:0","S:0")v0Build applications with AI$RC("B:1","S:1")AI SDKThe AI Toolkit for TypeScript$RC("B:2","S:2")
AI GatewayOne endpoint, all your models$RC("B:3","S:3")Vercel AgentAn agent that knows your stack$RC("B:4","S:4")SandboxAI workflows in live environments$RC("B:5","S:5")CI/CDHelping teams ship 6× faster$RC("B:6","S:6")Content DeliveryFast, scalable, and reliable$RC("B:7","S:7")Fluid ComputeServers, in serverless form$RC("B:8","S:8")ObservabilityTrace every step$RC("B:9","S:9")Bot ManagementScalable bot protection$RC("B:a","S:a")BotIDInvisible CAPTCHA$RC("B:b","S:b")Platform SecurityDDoS Protection, Firewall$RC("B:c","S:c")
Web Application FirewallGranular, custom protection$RC("B:d","S:d")Resources$RC("B:e","S:e")CustomersTrusted by the best teams$RC("B:f","S:f")BlogThe latest posts and changes$RC("B:10","S:10")ChangelogSee what shipped$RC("B:11","S:11")PressRead the latest news$RC("B:12","S:12")EventsJoin us at an event$RC("B:13","S:13")DocsVercel documentation$RC("B:14","S:14")AcademyLinear courses to level up$RC("B:15","S:15")Knowledge BaseFind help quickly$RC("B:16","S:16")CommunityJoin the conversation$RC("B:17","S:17")
Next.jsThe native Next.js platform$RC("B:18","S:18")NuxtThe progressive web framework$RC("B:19","S:19")
SvelteThe web’s efficient UI framework$RC("B:1a","S:1a")
TurborepoSpeed with Enterprise scale$RC("B:1b","S:1b")Solutions$RC("B:1c","S:1c")
AI AppsDeploy at the speed of AI$RC("B:1d","S:1d")Composable CommercePower storefronts that convert$RC("B:1e","S:1e")Marketing SitesLaunch campaigns fast$RC("B:1f","S:1f")Multi-tenant PlatformsScale apps with one codebase$RC("B:20","S:20")Web AppsShip features, not infrastructure$RC("B:21","S:21")Marke