@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2)format("woff2"),url(/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff)format("woff")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2)format("woff2"),url(/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff)format("woff")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2)format("woff2"),url(/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff)format("woff")}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2)format("woff2"),url(/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff)format("woff")}@font-face{font-family:Newsreader;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/newsreader-latin-400-normal-BFBkh4jY.woff2)format("woff2"),url(/assets/newsreader-latin-400-normal-gRTjlS2D.woff)format("woff")}@font-face{font-family:Newsreader;font-style:italic;font-display:swap;font-weight:400;src:url(/assets/newsreader-latin-400-italic-CEihAR-f.woff2)format("woff2"),url(/assets/newsreader-latin-400-italic-CNZoH1hn.woff)format("woff")}:root{color:#203a2b;font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--paper:#f6f5ef;--ink:#203a2b;--muted:#526056;--line:#d4d9ce;--accent:#203a2b;--display:"Newsreader", serif;--rust:#b44b32;--mono:"JetBrains Mono", monospace;background:#f6f5ef;font-family:IBM Plex Sans,sans-serif}*{box-sizing:border-box}body{min-width:0;margin:0}a{color:inherit}button,input{font:inherit;color:inherit}button{cursor:pointer}img,svg{max-width:100%;display:block}a,button,summary{touch-action:manipulation;-webkit-tap-highlight-color:transparent}:focus-visible{outline:2px solid var(--accent);outline-offset:5px}::selection{color:#203a2b;background:#dce8ce}html{scroll-behavior:smooth;scroll-padding-top:28px}main:focus{outline:none}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition:none!important;animation:none!important}}.skiper-link{align-items:center;gap:.3em;max-width:100%;text-decoration:none;display:inline-flex}.skiper-link-label{min-width:0;position:relative}.skiper-link-label:after{content:"";pointer-events:none;transform-origin:100%;background:currentColor;width:100%;height:.05em;transition:transform .3s cubic-bezier(.4,0,.2,1);position:absolute;bottom:.08em;left:0;transform:scaleX(0)}.skiper-link-arrow{opacity:0;flex:0 0 .55em;width:.55em;height:.55em;transition:transform .3s,opacity .3s;transform:translateY(4px)}.skiper-link:hover .skiper-link-label:after,.skiper-link:focus-visible .skiper-link-label:after{transform-origin:0;transform:scaleX(1)}.skiper-link:hover .skiper-link-arrow,.skiper-link:focus-visible .skiper-link-arrow{opacity:1;transform:translateY(0)}@media (hover:none),(prefers-reduced-motion:reduce){.skiper-link-arrow{opacity:1;transform:none}}@media (prefers-reduced-motion:reduce){.skiper-link-label:after,.skiper-link-arrow{transition:none}}.site-shell{width:min(1160px,100% - 96px);margin-inline:auto}.site-header{border-bottom:1px solid var(--line);grid-template-columns:1fr auto 1fr;align-items:center;gap:36px;padding-block:22px;display:grid}a{text-underline-offset:5px;text-decoration-thickness:1px}a:hover{text-decoration-thickness:2px}.site-brand{min-height:44px;font:400 40px/1 var(--display);letter-spacing:-.07em;justify-self:start;align-items:center;text-decoration:none;display:inline-flex}.site-brand span{color:#687a51}.site-header nav{gap:30px;display:flex}.site-header nav a{min-height:44px;color:var(--muted);align-items:center;font-size:14px;text-decoration:none;display:inline-flex}.site-header nav a:hover,.site-header nav a[aria-current]{color:var(--ink);text-decoration:underline}.resume-link{justify-self:end;align-items:center;min-height:44px;font-size:14px;font-weight:500;display:inline-flex}.link-arrow{margin-left:8px;font-family:IBM Plex Sans,sans-serif;display:inline-block}main{font-size:17px;line-height:1.65}main p{margin:0 0 18px}h1,h2,h3{text-wrap:balance;font-family:var(--display);letter-spacing:-.035em;overflow-wrap:break-word;margin:0;font-weight:400;line-height:1.08}h1{font-size:clamp(60px,8.8vw,112px)}h2{font-size:clamp(36px,4vw,48px)}h3{font-size:34px}.eyebrow,.small-label,.section-number,.entry-period,.source-note{font:400 12px/1.7 var(--mono);letter-spacing:.035em;color:var(--muted)}.eyebrow,.small-label{text-transform:uppercase}.muted{color:var(--muted)}.intro{padding-block:64px 44px}.intro-heading{grid-template-columns:1fr 240px;align-items:center;gap:32px;display:grid}.intro h1{margin:20px 0 18px}.intro h1 em{font-weight:400}.current-role{border-left:1px solid var(--line);margin-top:20px;padding-left:30px}.current-role .small-label{margin-bottom:12px}.current-role>p:last-child{margin:0;font-size:15px;line-height:1.6}.current-role strong{font-weight:500}.intro-academic{letter-spacing:-.015em;color:var(--muted);font-size:19px}.intro-bottom{justify-content:space-between;align-items:center;gap:48px;margin-top:30px;display:flex}.intro .intro-text{max-width:57ch;margin:0;font-size:18px;line-height:1.65}.intro-links{flex-shrink:0;align-items:center;gap:22px;display:flex}.button-link{background:var(--ink);border:1px solid var(--ink);min-height:46px;color:var(--paper);border-radius:3px;justify-content:center;align-items:center;gap:22px;padding:11px 17px;font-size:14px;font-weight:500;line-height:1.4;text-decoration:none;display:inline-flex}.button-link:hover{background:#304e39;border-color:#304e39}.text-link{align-items:center;min-height:44px;font-size:14px;font-weight:500;display:inline-flex}.availability{color:var(--muted);font:400 12px/1.8 var(--mono);align-items:baseline;gap:11px;display:flex}.intro .availability{margin:30px 0 0}.availability>span{background:#10b981;border-radius:50%;flex:0 0 8px;width:8px;height:8px;box-shadow:0 0 0 3px #10b9812e}.editorial-section{border-top:1px solid var(--line);margin-top:32px;padding-top:36px;scroll-margin-top:24px;position:relative}.section-label{align-items:baseline;gap:25px;margin-bottom:38px;display:flex}.section-number{white-space:nowrap}.section-content{min-width:0}.featured-project{grid-template-columns:minmax(0,.85fr) minmax(0,1.3fr);align-items:center;gap:56px;padding-bottom:42px;scroll-margin-top:28px;display:grid}.featured-project+.featured-project{border-top:1px solid var(--line);padding-top:42px}.project-description>.eyebrow{margin-bottom:14px}.featured-project h3{margin-bottom:18px;font-size:40px}.featured-project h3 a{align-items:center;gap:18px;text-decoration:none;display:flex}.featured-project h3 a>span{font:400 22px/1 IBM Plex Sans,sans-serif}.featured-project h3 a:hover{text-decoration:underline;text-decoration-thickness:1px}.work-overview{font-size:17px;font-weight:500;line-height:1.5}.work-detail{color:var(--muted);font-size:16px;line-height:1.65}.project-highlight{border-left:2px solid #8b9d72;margin-block:26px;padding-left:16px}.project-highlight strong{letter-spacing:-.03em;font-variant-numeric:tabular-nums;font-size:27px;font-weight:400;line-height:1.3;display:block}.project-highlight>span{font-size:14px}.project-highlight p{color:var(--muted);max-width:34ch;margin:5px 0 0;font-size:12px;line-height:1.5}.technology-tags{flex-wrap:wrap;gap:6px 14px;margin:0 0 20px;padding:0;list-style:none;display:flex}.technology-tags li{font:400 12px/1.8 var(--mono);color:var(--muted)}.work-actions{flex-wrap:wrap;align-items:center;gap:4px 20px;display:flex}.project-links{flex-wrap:wrap;align-items:center;gap:12px 22px;display:flex}.project-image{min-width:0;margin:0}.image-surface{border:1px solid var(--line);background:#e9e9e3;border-radius:4px;overflow:hidden}.image-d1-query-budget .image-surface{background:#232c31;border-color:#232c31;padding:20px}.image-taskly .image-surface{background:#e9e8e0;padding:26px}.project-image img{width:100%;height:auto;display:block}.project-image figcaption{color:var(--muted);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:0 15px;margin-top:9px;font-size:11px;display:flex}.project-image figcaption a{align-items:center;min-height:44px;display:inline-flex}.image-fallback{min-height:220px;color:var(--ink);background:var(--paper);padding:24px;font-size:15px}.image-fallback p{margin:12px 0 0}.section-projects{margin-top:66px}.experience-entry{grid-template-columns:.85fr 1.3fr;gap:56px;display:grid}.experience-heading h3{margin-bottom:10px;font-size:36px}.experience-heading .entry-period{margin-bottom:16px}.experience-role{font-size:16px}.experience-heading .technology-tags{max-width:32ch}.experience-description{font-size:16px}.contributions{color:var(--muted);margin:22px 0 0;padding-left:18px}.contributions li{margin-top:14px;padding-left:5px}.section-about{margin-top:66px}.education-stack{grid-template-columns:.85fr 1.3fr;gap:56px;display:grid}.education-block h3{margin:22px 0 15px;font-size:30px}.education-block>p:not(.small-label):not(.entry-period){font-size:15px}.education-block .entry-period{font-variant-numeric:tabular-nums}.education-award{margin-top:24px}.stack-specification{margin:0}.stack-specification>div{border-bottom:1px solid var(--line);grid-template-columns:145px 1fr;gap:20px;padding-block:18px;display:grid}.stack-specification dt{font-size:13px;font-weight:500}.stack-specification dd{color:var(--muted);margin:0;font-size:15px}.contact-ending{background:var(--ink);color:var(--paper);border-radius:4px;grid-template-columns:.85fr 1.3fr;align-items:center;gap:56px;margin-top:70px;padding:42px 46px;display:grid}.contact-ending .small-label{color:#cad6c7;margin-bottom:14px}.contact-ending h2{font-size:64px}.contact-ending>div>p:not(.small-label){color:#dce5d8;max-width:42ch;font-size:16px}.contact-address{letter-spacing:-.02em;overflow-wrap:anywhere;padding-block:7px;font-size:26px;display:inline-flex}.contact-ending :focus-visible{outline-color:var(--paper)}.site-footer{color:var(--muted);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px 24px;padding-block:25px;font-size:12px;display:flex}.site-footer>div{flex-wrap:wrap;gap:4px 26px;display:flex}.site-footer a{align-items:center;min-height:44px;display:inline-flex}.detail-page{max-width:840px;margin-inline:auto}.project-intro,.page-intro{padding-top:45px}.back-link{min-height:44px;color:var(--muted);align-items:center;margin-bottom:34px;font-size:14px;display:inline-flex}.project-intro h1,.page-intro h1{margin:14px 0 24px;font-size:clamp(52px,7vw,80px)}.project-lead{letter-spacing:-.02em;font-size:25px;line-height:1.45}.project-intro>p:not(.eyebrow):not(.project-lead){color:var(--muted);max-width:60ch}.project-spec{border-block:1px solid var(--line);grid-template-columns:1fr 1fr;gap:32px;margin-block:30px 0;padding-block:22px;display:grid}.project-spec dt{font:400 12px/1.7 var(--mono);text-transform:uppercase;color:var(--muted);margin-bottom:8px}.project-spec dd{margin:0;font-size:15px}.case-section{margin-top:44px;scroll-margin-top:28px}.case-section h2{margin-bottom:20px;font-size:36px}.case-section>p{max-width:70ch}.command-example,.query-comparison{border:1px solid var(--line);background:#e9ede3;border-radius:3px;margin:28px 0;padding:26px}.command-example figcaption,.query-comparison figcaption{font:400 12px/1.8 var(--mono);color:var(--muted)}.command-example blockquote{font:400 34px/1.3 var(--display);letter-spacing:-.025em;margin:24px 0}.command-flow{grid-template-columns:repeat(3,1fr);gap:24px;margin:0 0 20px;padding:0;font-size:14px;list-style-position:inside;display:grid}.command-flow strong{font-weight:500}.command-flow span{color:var(--muted);margin-top:8px;display:block}.command-example>p,.query-comparison>p{margin-bottom:0;font-size:14px}.table-scroll{margin-block:22px;overflow-x:auto}.query-comparison table{border-collapse:collapse;text-align:left;width:100%;font-size:14px}.query-comparison th,.query-comparison td{border-bottom:1px solid #cbd2c1;padding:13px 10px;font-weight:400}.query-comparison thead th{color:var(--muted);font-size:12px}.query-comparison td{font-variant-numeric:tabular-nums}.query-comparison .text-link{margin-top:12px}.detail-page>.project-image{margin-top:44px}.project-boundaries{border-top:1px solid var(--line);padding-top:32px}.source-note{margin-top:28px}.detail-page .contact-ending{grid-template-columns:1fr;gap:24px}.contact-page{min-height:68vh;padding-bottom:45px}.contact-page .page-intro{padding-top:70px}.contact-page .page-intro>p{max-width:46ch}.contact-page-address{letter-spacing:-.03em;overflow-wrap:anywhere;margin-block:14px 24px;padding-block:12px;font-size:clamp(23px,4.2vw,40px);display:inline-flex}.contact-directory{max-width:650px}.contact-directory>a{border-top:1px solid var(--line);justify-content:space-between;align-items:center;padding-block:20px;text-decoration:none;display:flex}.contact-directory strong{font-weight:500;display:block}.contact-directory span span{color:var(--muted);font-size:14px}.contact-directory>a:hover strong{text-underline-offset:4px;text-decoration:underline}.privacy-page,.not-found{padding-bottom:50px}.skip-link{z-index:10;background:var(--ink);color:var(--paper);padding:10px 16px;font-size:14px;position:fixed;top:10px;left:12px;transform:translateY(-150%)}.skip-link:focus{transform:translateY(0)}.sr-only{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.anchor-alias{margin-top:-36px;display:block;position:absolute}@media (width>=900px){.intro-academic{white-space:nowrap}}@media (width<=1050px){.site-shell{width:calc(100% - 64px)}.intro-heading{grid-template-columns:1fr 205px;gap:20px}.intro h1{font-size:88px}.current-role{padding-left:20px}.intro-academic{font-size:17px}.intro-bottom{gap:28px}.intro-links{gap:16px}.featured-project,.experience-entry,.education-stack{gap:32px}.featured-project h3{font-size:35px}.stack-specification>div{grid-template-columns:1fr;gap:6px}}@media (width<=800px){.site-header{grid-template-columns:auto 1fr auto;gap:24px}.site-header nav{justify-content:center;gap:20px}.intro{padding-top:46px}.intro-heading{grid-template-columns:1fr}.intro h1{margin-bottom:0;font-size:84px}.current-role{border-left:0;align-items:baseline;gap:14px;margin:0 0 12px;padding:0;display:flex}.current-role .small-label{margin:0}.current-role br{display:none}.current-role strong{margin-left:5px}.intro-bottom{flex-direction:column;align-items:flex-start;gap:24px}.intro-text{max-width:60ch}.featured-project{grid-template-columns:1fr;gap:25px}.project-description{max-width:65ch}.project-highlight{margin-block:20px}.project-highlight p{max-width:none}.project-image{width:100%}.image-d1-query-budget .image-surface{padding:22px}.section-label{margin-bottom:30px}.experience-entry,.education-stack{grid-template-columns:1fr;gap:25px}.experience-heading .technology-tags{max-width:none}.education-stack{gap:35px}.contact-ending{grid-template-columns:1fr;gap:24px;padding:34px}.contact-ending h2{font-size:58px}}@media (width<=560px){.site-shell{width:calc(100% - 40px)}.site-header{grid-template-columns:1fr auto;gap:7px 24px;padding-block:14px 6px}.site-brand{font-size:36px}.site-header nav{grid-area:2/1/auto/-1;justify-content:space-between;gap:10px}.site-header nav a{font-size:13px}.site-header .resume-link{grid-area:1/2}.intro{padding-block:40px 30px}.intro-heading{gap:18px}.intro h1{margin-top:18px;font-size:clamp(53px,12vw,68px)}.intro .eyebrow{max-width:32ch;font-size:11px}.current-role{flex-direction:column;gap:5px;margin-bottom:6px}.current-role .small-label{font-size:11px}.current-role>p:last-child{font-size:14px}.intro-academic{margin-bottom:0;font-size:17px;line-height:1.5}.intro-bottom{margin-top:24px}.intro .intro-text{font-size:16px}.intro .availability{margin-top:25px;font-size:12px}.editorial-section{margin-top:28px;padding-top:27px}.section-label{gap:15px;margin-bottom:28px}.section-label h2{font-size:36px}.featured-project{padding-bottom:32px}.featured-project+.featured-project{padding-top:30px}.featured-project h3{font-size:37px}.featured-project .work-overview{font-size:16px}.work-actions{gap:8px 20px}.image-d1-query-budget .image-surface,.image-taskly .image-surface{padding:10px}.project-image figcaption{font-size:11px}.section-projects,.section-about{margin-top:42px}.experience-description{font-size:15px}.contact-ending{margin-top:48px;padding:28px 22px}.contact-ending h2{font-size:52px}.contact-address{font-size:21px}.site-footer{gap:4px 20px;font-size:11px}.site-footer>div{gap:22px}.project-spec{grid-template-columns:1fr;gap:20px}.project-intro,.page-intro{padding-top:26px}.project-intro h1,.page-intro h1{font-size:52px}.project-lead{font-size:22px}.case-section h2{font-size:32px}.command-example,.query-comparison{padding:18px}.command-flow{grid-template-columns:1fr;gap:18px}.query-comparison table{min-width:420px}.contact-page-address{font-size:23px}}@media (prefers-reduced-motion:no-preference){.button-link>span,.text-link>.link-arrow{transition:transform .16s ease-out}.button-link:hover>span,.button-link:focus-visible>span{transform:translate(3px)}.text-link:hover>.link-arrow,.text-link:focus-visible>.link-arrow{transform:translate(2px,-2px)}}@media (prefers-reduced-motion:reduce),print{.fade-content{opacity:1!important}}
