1:"$Sreact.fragment" 2:I[878,["619","static/chunks/619-f09bc47e24909021.js","625","static/chunks/625-8a10369c10f5b167.js","278","static/chunks/278-2facacf06d9c0828.js","177","static/chunks/app/layout-609d47ae5c824ca5.js"],"TabAwayTitle"] 3:I[956,["619","static/chunks/619-f09bc47e24909021.js","625","static/chunks/625-8a10369c10f5b167.js","278","static/chunks/278-2facacf06d9c0828.js","177","static/chunks/app/layout-609d47ae5c824ca5.js"],"CursorGlow"] 4:I[8297,["619","static/chunks/619-f09bc47e24909021.js","625","static/chunks/625-8a10369c10f5b167.js","278","static/chunks/278-2facacf06d9c0828.js","177","static/chunks/app/layout-609d47ae5c824ca5.js"],"Nav"] 5:I[9766,[],""] 6:I[8924,[],""] 7:I[2619,["619","static/chunks/619-f09bc47e24909021.js","274","static/chunks/app/engineering-notes/%5Bslug%5D/page-a814044d591dac40.js"],""] 8:I[5989,["619","static/chunks/619-f09bc47e24909021.js","625","static/chunks/625-8a10369c10f5b167.js","278","static/chunks/278-2facacf06d9c0828.js","177","static/chunks/app/layout-609d47ae5c824ca5.js"],"FloatingAssistant"] e:I[7150,[],""] :HL["/_next/static/css/2ab64e17c806edc5.css","style"] 9:T655,{"@context":"https://schema.org","@type":"Person","name":"Samuel Ekunyan","url":"https://ekunyansamuel.dev","image":"https://ekunyansamuel.dev/brand/se-logo-master.png","jobTitle":"Backend Developer, Bot Builder & Automation Engineer","description":"Samuel Ekunyan is a backend developer who builds Node.js APIs, automation bots for any platform, workflow automation systems, and Laravel-powered business platforms. He also manages tech projects and mentors developers.","email":"Samuel@ekunyansamuel.dev","sameAs":["https://x.com/samuel_ekunyan","https://www.linkedin.com/in/samuel-ekunyan/","https://github.com/easamuel","https://www.instagram.com/ekunyan_samuel/","https://blog.ekunyansamuel.dev"],"knowsAbout":["Node.js Backend Development","Bot Development","Automation Engineering","Web Automation","Telegram Bot Development","WhatsApp Bot Development","Slack Bot Development","Discord Bot Development","REST API Development","Webhook Integration","Laravel Development","WordPress Development","Vue.js","MySQL Database Design","Tech Project Management","Software Consulting","Developer Mentorship","Workflow Automation","Business Process Automation","Fullstack Development"],"hasOccupation":[{"@type":"Occupation","name":"Backend Developer","description":"Builds Node.js APIs, automation systems, and server-side logic"},{"@type":"Occupation","name":"Bot Developer","description":"Builds automation bots for web, Telegram, WhatsApp, Slack, Discord and any platform"},{"@type":"Occupation","name":"Tech Project Manager","description":"Manages engineering teams and tech delivery for digital agencies and startups"}]}0:{"P":null,"b":"_4Tix7t0cV1Vo5Sp5uWrg","p":"","c":["","engineering-notes","authentication-boundary-before-feature"],"i":false,"f":[[["",{"children":["engineering-notes",{"children":[["slug","authentication-boundary-before-feature","d"],{"children":["__PAGE__",{}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2ab64e17c806edc5.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"__variable_0a80b4 __variable_dd5b2f __variable_9ef920 h-full antialiased","children":[["$","head",null,{"children":[["$","link",null,{"rel":"icon","href":"https://ekunyansamuel.dev/whatsapp-icon.png","sizes":"512x512","type":"image/png"}],["$","link",null,{"rel":"shortcut icon","href":"https://ekunyansamuel.dev/whatsapp-icon.png","type":"image/png"}],["$","link",null,{"rel":"apple-touch-icon","href":"https://ekunyansamuel.dev/apple-touch-icon.png","sizes":"180x180"}],["$","link",null,{"rel":"apple-touch-icon","href":"https://ekunyansamuel.dev/icon-192.png","sizes":"192x192"}],["$","link",null,{"rel":"apple-touch-icon-precomposed","href":"https://ekunyansamuel.dev/apple-touch-icon.png"}],["$","link",null,{"rel":"image_src","href":"https://ekunyansamuel.dev/whatsapp-icon.png"}],["$","script",null,{"dangerouslySetInnerHTML":{"__html":"try{var t=localStorage.getItem('theme');document.documentElement.dataset.theme=t==='light'?'light':'dark'}catch(e){document.documentElement.dataset.theme='dark'}"}}]]}],["$","body",null,{"className":"min-h-full bg-background text-foreground","children":[["$","$L2",null,{}],["$","$L3",null,{}],["$","$L4",null,{}],["$","main",null,{"children":["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","section",null,{"className":"flex min-h-[70vh] flex-col items-center justify-center px-6 py-24","children":[["$","p",null,{"className":"font-mono text-[11px] uppercase tracking-[0.28em] text-accent","children":"404"}],["$","h1",null,{"className":"mt-4 max-w-lg text-center font-serif text-4xl font-light tracking-[-0.04em] text-foreground md:text-5xl","children":"This page is not here."}],["$","p",null,{"className":"mt-6 max-w-md text-center text-sm leading-7 text-foreground/60","children":"The link may be old or mistyped. Head back to the home page and use the navigation or footer links."}],["$","$L7",null,{"href":"/","className":"mt-10 inline-flex bg-accent px-8 py-3 font-mono text-[10px] uppercase tracking-[0.22em] text-background transition hover:opacity-95","children":"Back home"}]]}],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}],["$","$L8",null,{}],["$","script",null,{"type":"application/ld+json","dangerouslySetInnerHTML":{"__html":"$9"}}]]}]]}]]}],{"children":["engineering-notes","$La",{"children":[["slug","authentication-boundary-before-feature","d"],"$Lb",{"children":["__PAGE__","$Lc",{},null,false]},null,false]},null,false]},null,false],"$Ld",false]],"m":"$undefined","G":["$e",[]],"s":false,"S":true} 10:I[4431,[],"OutletBoundary"] 12:I[5278,[],"AsyncMetadataOutlet"] 14:I[4431,[],"ViewportBoundary"] 16:I[4431,[],"MetadataBoundary"] 17:"$Sreact.suspense" a:["$","$1","c",{"children":[null,["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}] b:["$","$1","c",{"children":[null,["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}] c:["$","$1","c",{"children":["$Lf",null,["$","$L10",null,{"children":["$L11",["$","$L12",null,{"promise":"$@13"}]]}]]}] d:["$","$1","h",{"children":[null,[["$","$L14",null,{"children":"$L15"}],null],["$","$L16",null,{"children":["$","div",null,{"hidden":true,"children":["$","$17",null,{"fallback":null,"children":"$L18"}]}]}]]}] 15:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","2",{"name":"theme-color","media":"(prefers-color-scheme: dark)","content":"#07070e"}],["$","meta","3",{"name":"theme-color","media":"(prefers-color-scheme: light)","content":"#f7f1e6"}]] 11:null 19:I[3098,["619","static/chunks/619-f09bc47e24909021.js","274","static/chunks/app/engineering-notes/%5Bslug%5D/page-a814044d591dac40.js"],"NewsletterForm"] 1b:I[622,[],"IconMark"] f:[["$","article",null,{"className":"px-6 pb-24 pt-32","children":["$","div",null,{"className":"mx-auto max-w-3xl","children":[["$","p",null,{"className":"font-mono text-[11px] uppercase tracking-[0.28em] text-accent","children":"#004"}],["$","h1",null,{"className":"mt-5 font-serif text-5xl font-light leading-none text-foreground md:text-7xl","children":"Build the Authentication Boundary Before the Feature"}],["$","p",null,{"className":"mt-6 text-lg leading-8 text-foreground/62","children":"Why authentication should be treated as a system boundary, not a login screen you add at the end."}],["$","div",null,{"className":"mt-10 border-y border-white/[0.08] py-8","children":["$","div",null,{"className":"space-y-6 text-lg leading-9 text-foreground/72","children":[["$","p","Authentication is not the form where a user types an email. It is the contract that decides who may enter the system, what they are allowed to touch, how long that permission lasts, and how you recover when something goes wrong.",{"children":"Authentication is not the form where a user types an email. It is the contract that decides who may enter the system, what they are allowed to touch, how long that permission lasts, and how you recover when something goes wrong."}],["$","p","Before a feature ships, define the actors, permissions, session shape, audit trail, and failure states. If you skip this work, every later feature invents its own version of access control.",{"children":"Before a feature ships, define the actors, permissions, session shape, audit trail, and failure states. If you skip this work, every later feature invents its own version of access control."}],["$","p","A good auth boundary is boring in production. Users log in, teams understand permissions, admins can recover accounts, and engineers can reason about data exposure without reading every controller.",{"children":"A good auth boundary is boring in production. Users log in, teams understand permissions, admins can recover accounts, and engineers can reason about data exposure without reading every controller."}]]}]}],["$","div",null,{"className":"mt-10 border border-white/[0.08] bg-white/[0.025] p-6","children":[["$","p",null,{"className":"font-mono text-[10px] uppercase tracking-[0.22em] text-accent","children":"Keep learning"}],["$","p",null,{"className":"mt-3 text-sm leading-7 text-foreground/60","children":"Subscribe for backend engineering notes, and hire Samuel for architecture reviews, backend builds, and production consulting."}],["$","div",null,{"className":"mt-5","children":["$","$L19",null,{"source":"note-authentication-boundary-before-feature"}]}],["$","$L7",null,{"href":"/hire","className":"mt-5 inline-flex font-mono text-[10px] uppercase tracking-[0.22em] text-accent","children":"Hire Samuel for backend engineering consulting"}]]}],["$","div",null,{"className":"mt-10","children":[["$","p",null,{"className":"font-mono text-[10px] uppercase tracking-[0.22em] text-foreground/40","children":"Related notes"}],["$","div",null,{"className":"mt-4 grid gap-3","children":[["$","$L7","database-indexes-are-product-decisions",{"href":"/engineering-notes/database-indexes-are-product-decisions","className":"border border-white/[0.08] p-4 text-foreground transition hover:border-accent/45","children":["#003"," · ","Database Indexes Are Product Decisions"]}],["$","$L7","queues-are-how-backends-breathe",{"href":"/engineering-notes/queues-are-how-backends-breathe","className":"border border-white/[0.08] p-4 text-foreground transition hover:border-accent/45","children":["#002"," · ","Queues Are How Backends Breathe"]}]]}]]}]]}]}],["$","footer",null,{"className":"border-t border-white/[0.06] px-6 py-10","children":"$L1a"}]] 13:{"metadata":[["$","title","0",{"children":"Build the Authentication Boundary Before the Feature"}],["$","meta","1",{"name":"description","content":"A practical engineering note on designing authentication as a backend boundary before feature work begins."}],["$","link","2",{"rel":"author","href":"https://ekunyansamuel.dev"}],["$","meta","3",{"name":"author","content":"Samuel Ekunyan"}],["$","link","4",{"rel":"manifest","href":"/site.webmanifest","crossOrigin":"$undefined"}],["$","meta","5",{"name":"creator","content":"Samuel Ekunyan"}],["$","meta","6",{"name":"robots","content":"index, follow"}],["$","meta","7",{"name":"googlebot","content":"index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1"}],["$","link","8",{"rel":"canonical","href":"https://ekunyansamuel.dev/engineering-notes/authentication-boundary-before-feature"}],["$","meta","9",{"property":"og:title","content":"Build the Authentication Boundary Before the Feature"}],["$","meta","10",{"property":"og:description","content":"A practical engineering note on designing authentication as a backend boundary before feature work begins."}],["$","meta","11",{"property":"og:image","content":"https://ekunyansamuel.dev/og-image.png"}],["$","meta","12",{"name":"twitter:card","content":"summary_large_image"}],["$","meta","13",{"name":"twitter:title","content":"Build the Authentication Boundary Before the Feature"}],["$","meta","14",{"name":"twitter:description","content":"A practical engineering note on designing authentication as a backend boundary before feature work begins."}],["$","meta","15",{"name":"twitter:image","content":"https://ekunyansamuel.dev/og-image.png"}],["$","link","16",{"rel":"shortcut icon","href":"https://ekunyansamuel.dev/whatsapp-icon.png"}],["$","link","17",{"rel":"icon","href":"https://ekunyansamuel.dev/whatsapp-icon.png","sizes":"512x512","type":"image/png"}],["$","link","18",{"rel":"icon","href":"https://ekunyansamuel.dev/icon-192.png","sizes":"192x192","type":"image/png"}],["$","link","19",{"rel":"icon","href":"https://ekunyansamuel.dev/favicon-32.png","sizes":"32x32","type":"image/png"}],["$","link","20",{"rel":"icon","href":"https://ekunyansamuel.dev/icon.png","sizes":"512x512","type":"image/png"}],["$","link","21",{"rel":"apple-touch-icon","href":"https://ekunyansamuel.dev/apple-touch-icon.png","sizes":"180x180","type":"image/png"}],["$","link","22",{"rel":"apple-touch-icon","href":"https://ekunyansamuel.dev/icon-192.png","sizes":"192x192","type":"image/png"}],["$","link","23",{"rel":"apple-touch-icon","href":"https://ekunyansamuel.dev/whatsapp-icon.png","sizes":"512x512","type":"image/png"}],["$","$L1b","24",{}]],"error":null,"digest":"$undefined"} 18:"$13:metadata" 1a:["$","div",null,{"className":"mx-auto grid max-w-7xl gap-8 md:grid-cols-[1fr_1fr] md:items-start","children":[["$","div",null,{"children":[["$","p",null,{"className":"font-mono text-[10px] uppercase tracking-[0.24em] text-accent","children":"Newsletter"}],["$","p",null,{"className":"mt-3 max-w-md text-sm leading-7 text-foreground/55","children":"Backend notes on APIs, authentication, databases, architecture, and practical product engineering."}],["$","div",null,{"className":"mt-5","children":["$","$L19",null,{"source":"footer"}]}]]}],["$","div",null,{"className":"flex flex-col gap-5 md:items-end","children":[["$","div",null,{"className":"flex flex-wrap gap-4 font-mono text-[10px] uppercase tracking-[0.2em] text-foreground/35","children":[["$","$L7",null,{"href":"/engineering-notes","className":"transition hover:text-accent","children":"Notes"}],["$","$L7",null,{"href":"/blog","className":"transition hover:text-accent","children":"Blog"}],["$","$L7",null,{"href":"/services","className":"transition hover:text-accent","children":"Services"}],["$","$L7",null,{"href":"/services/whatsapp-automation","className":"transition hover:text-accent","children":"WhatsApp Automation"}],["$","$L7",null,{"href":"/hire","className":"transition hover:text-accent","children":"Hire"}],["$","$L7",null,{"href":"/privacy","className":"transition hover:text-accent","children":"Privacy"}]]}],["$","div",null,{"className":"flex gap-4","children":[["$","a","Twitter/X",{"href":"https://x.com/samuel_ekunyan","target":"_blank","rel":"noopener noreferrer","aria-label":"Twitter/X","className":"text-foreground/40 transition hover:scale-110 hover:text-accent","children":["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":22,"height":22,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-twitter","aria-hidden":"true","children":[["$","path","pff0z6",{"d":"M22 4s-.7 2.1-2 3.4c1.6 10-9.4 17.3-18 11.6 2.2.1 4.4-.6 6-2C3 15.5.5 9.6 3 5c2.2 2.6 5.6 4.1 9 4-.9-4.2 4-6.6 7-3.8 1.1 0 3-1.2 3-1.2z"}],"$undefined"]}]}],["$","a","Instagram",{"href":"https://www.instagram.com/ekunyan_samuel/","target":"_blank","rel":"noopener noreferrer","aria-label":"Instagram","className":"text-foreground/40 transition hover:scale-110 hover:text-accent","children":["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":22,"height":22,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-instagram","aria-hidden":"true","children":[["$","rect","2e1cvw",{"width":"20","height":"20","x":"2","y":"2","rx":"5","ry":"5"}],["$","path","9exkf1",{"d":"M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"}],["$","line","r4j83e",{"x1":"17.5","x2":"17.51","y1":"6.5","y2":"6.5"}],"$undefined"]}]}],["$","a","LinkedIn",{"href":"https://www.linkedin.com/in/samuel-ekunyan/","target":"_blank","rel":"noopener noreferrer","aria-label":"LinkedIn","className":"text-foreground/40 transition hover:scale-110 hover:text-accent","children":["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":22,"height":22,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-linkedin","aria-hidden":"true","children":[["$","path","c2jq9f",{"d":"M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"}],["$","rect","mk3on5",{"width":"4","height":"12","x":"2","y":"9"}],["$","circle","bt5ra8",{"cx":"4","cy":"4","r":"2"}],"$undefined"]}]}],["$","a","GitHub",{"href":"https://github.com/easamuel","target":"_blank","rel":"noopener noreferrer","aria-label":"GitHub","className":"text-foreground/40 transition hover:scale-110 hover:text-accent","children":["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":22,"height":22,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-github","aria-hidden":"true","children":[["$","path","tonef",{"d":"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4"}],"$L1c","$undefined"]}]}],"$L1d"]}],"$L1e"]}]]}] 1c:["$","path","9comsn",{"d":"M9 18c-4.51 2-5-2-7-2"}] 1d:["$","a","WhatsApp",{"href":"https://api.whatsapp.com/send?phone=2348036375292","target":"_blank","rel":"noopener noreferrer","aria-label":"WhatsApp","className":"text-foreground/40 transition hover:scale-110 hover:text-accent","children":["$","svg",null,{"ref":"$undefined","xmlns":"http://www.w3.org/2000/svg","width":22,"height":22,"viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":2,"strokeLinecap":"round","strokeLinejoin":"round","className":"lucide lucide-message-circle","aria-hidden":"true","children":[["$","path","1sd12s",{"d":"M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719"}],"$undefined"]}]}] 1e:["$","p",null,{"className":"font-mono text-[10px] uppercase tracking-[0.18em] text-foreground/30","children":"© 2026 Samuel Ekunyan · Backend Engineer · Technical Educator"}]