@font-face{font-family:Geist;font-style:normal;font-weight:300 700;font-display:swap;src:url(/fonts/geist-300-700-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist;font-style:normal;font-weight:300 700;font-display:swap;src:url(/fonts/geist-300-700-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/geist-mono-400-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/geist-mono-400-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/geist-mono-400-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/geist-mono-400-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--paper: #ffffff;--paper-2: #fafafa;--ink: #000000;--muted: #666666;--faint: #8f8f8f;--hair: #eaeaea;--accent: #0066b1;--accent-2:#e2001a;--serif: "Geist", ui-sans-serif, system-ui, -apple-system, sans-serif;--sans: "Geist", ui-sans-serif, system-ui, -apple-system, sans-serif;--mono: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, "Cascadia Code", monospace;--maxw: 47rem;--gutter: clamp(1.25rem, 5vw, 3.5rem);--section-gap: clamp(1.9rem, 4.5vw, 3.1rem)}@media(prefers-color-scheme:dark){:root{--paper: #000000;--paper-2: #0a0a0a;--ink: #ededed;--muted: #a1a1a1;--faint: #6f6f6f;--hair: #2e2e2e;--accent: #2f9be6;--accent-2:#fb4b57}}*,*:before,*:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{margin:0;background:var(--paper);color:var(--ink);font-family:var(--sans);font-size:clamp(1rem,.97rem + .18vw,1.08rem);line-height:1.55;font-weight:400;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;font-optical-sizing:auto}::selection{background:var(--accent);color:var(--paper)}a{color:inherit}h1,h2,h3{font-family:var(--serif);font-weight:600;font-optical-sizing:auto}code{font-family:var(--mono);font-size:.86em;letter-spacing:-.01em}.page{max-width:var(--maxw);margin-inline:auto;padding:clamp(1.9rem,4.5vw,3.4rem) var(--gutter) 2.4rem}section{margin-top:var(--section-gap)}.sec-head{display:flex;align-items:baseline;gap:.85rem;margin-bottom:1.15rem}.sec-head .idx{font-family:var(--sans);font-size:.72rem;font-weight:600;letter-spacing:.14em;color:var(--accent-2);transform:translateY(-.15em)}.sec-head h2{margin:0;font-size:clamp(1.32rem,1.15rem + .7vw,1.6rem);letter-spacing:-.01em}.sec-head .rule{flex:1;height:1px;background:var(--hair);transform:translateY(-.25em)}.masthead{display:flex;flex-direction:column;gap:clamp(1.5rem,3.5vw,2.1rem)}.identity{display:flex;gap:clamp(1rem,2.5vw,1.4rem);align-items:center}.avatar{flex:none;width:clamp(76px,8vw,96px);height:clamp(76px,8vw,96px);border-radius:50%;object-fit:cover;border:1px solid var(--hair)}.identity-text{min-width:0}.intro{display:grid;grid-template-columns:1fr;gap:1.4rem}@media(min-width:720px){.intro{grid-template-columns:1.5fr 1fr;gap:clamp(2rem,5vw,3rem);align-items:start}}.name{margin:0;font-size:clamp(2.3rem,1.6rem + 4vw,3.5rem);line-height:.98;letter-spacing:-.022em;font-weight:600}.role{margin:.55rem 0 0;font-family:var(--sans);font-weight:500;font-size:clamp(1.02rem,.95rem + .4vw,1.18rem);color:var(--ink);letter-spacing:.005em}.tagline{margin:0;font-family:var(--sans);font-weight:400;font-size:clamp(1.02rem,.97rem + .4vw,1.16rem);line-height:1.45;color:var(--muted);max-width:40ch}.contact{display:grid;gap:.55rem;align-content:start}.contact .row{display:grid;grid-template-columns:5.1rem 1fr;gap:.4rem .9rem;align-items:baseline;font-size:.93rem}.contact .k{font-size:.66rem;letter-spacing:.13em;text-transform:uppercase;font-weight:600;color:var(--faint);transform:translateY(-.05em)}.contact a{color:var(--ink);text-decoration:none;border-bottom:1px solid var(--hair);padding-bottom:1px;transition:border-color .15s,color .15s}.contact a:hover{color:var(--accent);border-color:var(--accent)}.contact .v{color:var(--muted)}.contact .cv-link{font:inherit;width:100%;text-align:left;color:var(--ink);background:none;border:0;border-bottom:1px solid var(--hair);padding:0 0 1px;cursor:pointer;transition:border-color .15s,color .15s}.contact .cv-link:hover{color:var(--accent);border-color:var(--accent)}.summary{margin-top:clamp(1.6rem,3.5vw,2.3rem);padding-top:clamp(1.6rem,3.5vw,2.3rem);border-top:1px solid var(--hair);font-size:clamp(1.05rem,1rem + .42vw,1.2rem);line-height:1.5;color:var(--ink);max-width:58ch}.summary strong{font-weight:600}.summary em{font-family:var(--serif);font-style:italic;font-weight:400}.project{padding-top:1.15rem;margin-top:1.15rem;border-top:1px solid var(--hair)}.project:first-of-type{padding-top:0;margin-top:0;border-top:0}.project .top{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:.3rem 1rem}.project h3{margin:0;font-size:1.42rem;letter-spacing:-.012em}.project .when{font-size:.7rem;letter-spacing:.12em;text-transform:uppercase;font-weight:600;color:var(--faint)}.project .when b{color:var(--accent);font-weight:600}.project .lede{margin:.55rem 0 0;font-family:var(--sans);font-weight:400;font-size:1.05rem;line-height:1.45;color:var(--muted)}.project ul{margin:.7rem 0 0;padding:0;list-style:none}.project li{position:relative;padding-left:1.1rem;margin-bottom:.38rem;color:var(--ink)}.project li:before{content:"";position:absolute;left:0;top:.66em;width:5px;height:5px;border-radius:50%;background:var(--accent);opacity:.85}.stack{margin:1rem 0 0;font-size:.82rem;letter-spacing:.01em;color:var(--muted)}.links{margin:.7rem 0 0;display:flex;flex-wrap:wrap;gap:.35rem 1.15rem}.links a{font-size:.86rem;font-weight:500;color:var(--accent);text-decoration:none;border-bottom:1px solid transparent;transition:border-color .15s}.links a:after{content:" ↗";font-size:.78em;color:var(--faint)}.links a:hover{border-color:var(--accent)}.print-url{display:none}.ledger{display:grid;gap:.4rem}.entry{display:grid;grid-template-columns:1fr;gap:.35rem 1.8rem;padding:1rem 0;border-top:1px solid var(--hair)}.entry:first-child{border-top:0;padding-top:0}@media(min-width:640px){.entry{grid-template-columns:9.5rem 1fr}}.entry .when{font-size:.7rem;letter-spacing:.11em;text-transform:uppercase;font-weight:600;color:var(--faint);display:block}.entry .org{font-family:var(--serif);font-size:.98rem;color:var(--muted);margin-top:.25rem;display:block}.entry h3{margin:0;font-size:1.12rem;font-weight:600;font-family:var(--sans);letter-spacing:-.005em}.entry h3 .at{color:var(--muted);font-weight:400}.entry .sub{margin:.15rem 0 0;color:var(--muted);font-size:.95rem}.entry p.body{margin:.55rem 0 0;color:var(--ink)}.entry .stack{margin-top:.6rem}.engagements{margin:1rem 0 0;display:grid;gap:.9rem}.eng{position:relative;padding-left:1.15rem;border-left:1px solid var(--hair)}.eng:before{content:"";position:absolute;left:-3px;top:.55em;width:5px;height:5px;border-radius:50%;background:var(--accent);opacity:.8}.eng .h{display:flex;flex-wrap:wrap;align-items:baseline;gap:.2rem .7rem}.eng .h strong{font-weight:600}.eng .h .tag{font-size:.68rem;letter-spacing:.1em;text-transform:uppercase;color:var(--faint);font-weight:600}.eng p{margin:.25rem 0 0;color:var(--muted);font-size:.95rem}.eng .stack{margin-top:.4rem}.skill-row{display:grid;grid-template-columns:1fr;gap:.2rem 1.8rem;padding:.6rem 0;border-top:1px solid var(--hair)}.skill-row:first-child{border-top:0}@media(min-width:640px){.skill-row{grid-template-columns:9.5rem 1fr;align-items:baseline}}.skill-row .label{font-size:.68rem;letter-spacing:.12em;text-transform:uppercase;font-weight:600;color:var(--accent)}.skill-row .list{color:var(--ink);font-size:.96rem;line-height:1.55}footer{margin-top:var(--section-gap);padding-top:1.15rem;border-top:1px solid var(--hair);display:flex;flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.8rem 1.5rem;font-size:.85rem;color:var(--muted)}footer a{color:var(--muted);text-decoration:none;border-bottom:1px solid var(--hair);transition:color .15s,border-color .15s}footer a:hover{color:var(--accent);border-color:var(--accent)}.foot-links{display:flex;flex-wrap:wrap;gap:1.1rem}.print-btn{font:inherit;font-size:.85rem;color:var(--muted);background:none;border:0;border-bottom:1px solid var(--hair);cursor:pointer;padding:0;transition:color .15s,border-color .15s}.print-btn:hover{color:var(--accent);border-color:var(--accent)}@media(prefers-reduced-motion:no-preference){.reveal>*{opacity:0;transform:translateY(8px);animation:rise .6s cubic-bezier(.22,.61,.36,1) forwards}.reveal>*:nth-child(1){animation-delay:.02s}.reveal>*:nth-child(2){animation-delay:.08s}.reveal>*:nth-child(3){animation-delay:.14s}.reveal>*:nth-child(4){animation-delay:.2s}.reveal>*:nth-child(5){animation-delay:.26s}.reveal>*:nth-child(n+6){animation-delay:.3s}@keyframes rise{to{opacity:1;transform:none}}}@media print{:root{--paper:#fff;--paper-2:#fff;--ink:#000;--muted:#2e2e2e;--faint:#555;--hair:#cfcfcf;--accent:#000;--accent-2:#000;--section-gap: .58rem}@page{margin:10mm 12mm}html,body{background:#fff}body{font-size:9.3pt;line-height:1.25}.page{max-width:none;margin:0;padding:0}.reveal>*{opacity:1!important;transform:none!important;animation:none!important}a{color:#000!important;border:0!important}.no-print,.print-btn,.links a:after{display:none!important}.print-url{display:inline;color:#555;font-size:.82em}.links{margin-top:.3rem}.links a,.contact a{color:#000}.name{font-size:20pt}.role{margin-top:.4rem}.tagline{display:none}.intro{display:block}.summary{font-size:9.5pt;margin-top:.58rem;padding-top:.58rem;max-width:none}section{margin-top:.5rem}.sec-head{margin-bottom:.4rem}.sec-head h2{font-size:12pt}.project{padding-top:.45rem;margin-top:.45rem}.project h3{font-size:11.5pt}.project .lede{font-size:10pt;margin-top:.22rem}.project ul{margin-top:.32rem}.project li{margin-bottom:.2rem}.stack{margin-top:.3rem}.entry,.skill-row{grid-template-columns:8rem 1fr;gap:.3rem 1.1rem}.entry{padding:.28rem 0}.engagements{margin-top:.45rem;gap:.48rem}.skill-row{padding:.2rem 0}.skill-row .list{font-size:9pt;line-height:1.34}footer{margin-top:.5rem;padding-top:.5rem}.eng,.skill-row,.project li{page-break-inside:avoid}.sec-head,h3,.project .top,.project .lede{page-break-after:avoid}}
