:root{--bg: #faf0e2;--line: #e6d9c5;--line-strong: #cebfa8;--ink: #241005;--ink-dim: #665043;--ink-faint: #958277;--accent: #ba472b;--accent-2: #a95b00;--accent-3: #b74165;--accent-4: #0077c5;--accent-5: #00877a;--mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--serif: "Fraunces", Georgia, "Times New Roman", serif;--content-max: 980px}*{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth}body{background:var(--bg);color:var(--ink);font-family:var(--mono);font-size:14px;line-height:1.65;-webkit-font-smoothing:antialiased;min-height:100vh}body:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;background:radial-gradient(ellipse 70% 50% at 90% -10%,color-mix(in oklch,var(--accent) 18%,transparent),transparent 65%),radial-gradient(ellipse 55% 40% at -10% 30%,color-mix(in oklch,var(--accent-5) 14%,transparent),transparent 70%),radial-gradient(ellipse 60% 40% at 110% 70%,color-mix(in oklch,var(--accent-3) 12%,transparent),transparent 70%),radial-gradient(ellipse 50% 50% at 30% 110%,color-mix(in oklch,var(--accent-2) 10%,transparent),transparent 70%);pointer-events:none;z-index:0}::selection{background:var(--accent);color:var(--bg)}a{color:inherit;text-decoration:none}.topbar{position:sticky;top:0;z-index:10;background:color-mix(in srgb,var(--bg) 85%,transparent);backdrop-filter:saturate(140%) blur(10px);-webkit-backdrop-filter:saturate(140%) blur(10px);border-bottom:1px solid var(--line)}.topbar-inner{display:flex;justify-content:space-between;align-items:center;gap:24px;padding:14px 32px;max-width:var(--content-max);margin:0 auto;font-family:var(--mono);font-size:12px;letter-spacing:.04em}.topbar-nav{display:flex;gap:28px;color:var(--ink-dim)}.topbar-nav a{transition:color .2s;position:relative}.topbar-nav a:hover,.topbar-nav a.is-active{color:var(--ink)}.topbar-nav a.is-active:after{content:"";position:absolute;left:-2px;right:-2px;bottom:-8px;height:2px;background:var(--accent-5)}.topbar-cta{border:1px solid var(--line-strong);padding:7px 12px;color:var(--ink);display:inline-flex;align-items:center;gap:8px;transition:all .2s}.topbar-cta:hover{border-color:var(--accent);color:var(--accent)}.topbar-cta .arrow{transition:transform .2s}.topbar-cta:hover .arrow{transform:translate(3px)}.layout{position:relative;z-index:1;max-width:var(--content-max);margin:0 auto;padding:64px 32px 96px}.page-head{margin-bottom:48px;position:relative}.page-eyebrow{font-family:var(--mono);font-size:11px;letter-spacing:.12em;text-transform:lowercase;color:var(--ink-faint);margin-bottom:20px}.page-title{font-family:var(--serif);font-weight:300;font-size:clamp(40px,6.5vw,72px);line-height:1.05;letter-spacing:-.025em;color:var(--ink);margin:0 0 0 -2px;white-space:nowrap}.page-title em{font-style:italic;color:var(--accent-5);font-weight:400;letter-spacing:-.02em}.page-title--name em{font-style:normal}.page-title-row{display:flex;align-items:center;justify-content:space-between;gap:32px}.page-title-row .page-title{flex:0 1 auto;min-width:0}.avatar{width:128px;height:128px;border-radius:50%;flex-shrink:0;background-size:cover;background-position:center}.avatar--placeholder{border:1px dashed var(--line-strong);background:radial-gradient(circle at 30% 30%,color-mix(in srgb,var(--accent) 14%,transparent),transparent 65%),color-mix(in srgb,var(--accent-5) 6%,transparent)}.page-section{padding:56px 0}.page-section:first-of-type{padding-top:0}.section-rule{display:flex;align-items:center;gap:14px;margin:0 0 32px;font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-faint)}.section-rule:before{content:"";width:32px;border-top:1px solid var(--line-strong)}.section-rule:after{content:"";flex:1;border-top:1px solid var(--line)}.section-rule-tag .dot{color:var(--accent);margin:0 4px}.lede{font-family:var(--serif);font-weight:300;font-size:clamp(20px,2.2vw,26px);line-height:1.5;color:var(--ink);margin-bottom:36px;max-width:64ch;letter-spacing:-.005em}.lede strong{font-weight:400;font-style:italic;color:var(--accent-5)}.contacts{display:flex;flex-wrap:wrap;gap:0;font-family:var(--mono);font-size:13px;color:var(--ink-dim)}.contacts a{color:var(--ink);transition:color .2s;padding:0 14px;border-right:1px solid var(--line)}.contacts a:first-child{padding-left:0}.contacts a:last-child{border-right:0}.contacts a:nth-child(1):hover{color:var(--accent)}.contacts a:nth-child(2):hover{color:var(--accent-5)}.contacts a:nth-child(3):hover{color:var(--accent-3)}.contacts a:nth-child(4):hover{color:var(--accent-4)}.contacts a:nth-child(5):hover{color:var(--accent-2)}.contacts a .arrow{display:inline-block;margin-left:4px;transition:transform .2s;opacity:.7}.contacts a:hover .arrow{transform:translate(2px,-2px);opacity:1}.row-list{list-style:none;border-top:1px solid var(--line-strong)}.row{--row-accent: var(--accent);display:grid;align-items:baseline;gap:20px;padding:18px 4px;border-bottom:1px solid var(--line);position:relative;font-size:13px;transition:background .2s}.row:hover{background:color-mix(in srgb,var(--row-accent) 6%,transparent)}.row:before{content:"";position:absolute;left:-8px;top:50%;width:0;height:1px;background:var(--row-accent);transition:width .3s,left .3s}.row:hover:before{width:12px;left:-16px}.row-tag{font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--row-accent);border:1px solid var(--row-accent);padding:0 9px;background:color-mix(in srgb,var(--bg) 60%,transparent);white-space:nowrap;width:max-content}.row-tag--draft{color:var(--accent-5);border-color:var(--accent-5)}.row-title{font-family:var(--serif);font-size:22px;font-weight:400;line-height:1.2;color:var(--ink);letter-spacing:-.005em;white-space:nowrap}.row--maintainer .row-title{font-style:italic;color:var(--row-accent)}.row--creator .row-title{color:var(--row-accent)}.row-slug{font-family:var(--mono);font-size:11.5px;color:var(--ink-faint);letter-spacing:.02em;white-space:nowrap}.row-meta{font-family:var(--mono);font-size:13px;color:var(--ink-dim);line-height:1.5}.row-action{font-family:var(--mono);font-size:12px;color:var(--ink);display:inline-flex;align-items:center;gap:14px;white-space:nowrap}.row-action a{display:inline-flex;align-items:center;gap:4px;transition:color .2s}.row-action a:hover{color:var(--row-accent)}.row-action .arrow{transition:transform .2s}.row-action a:hover .arrow{transform:translate(2px,-2px)}.row--project{grid-template-columns:110px auto 1fr auto;align-items:baseline}.row--project>*,.row--project .row-action a{line-height:1}.row--project .row-action .sep{color:var(--line-strong);-webkit-user-select:none;user-select:none}.row-tag{display:inline-flex;align-items:center;justify-content:center;line-height:1}.row--blog{grid-template-columns:80px minmax(0,1fr) auto;align-items:baseline}.row--blog .row-title{white-space:normal;font-size:20px;line-height:1.3}.row--creator:nth-of-type(1){--row-accent: var(--accent)}.row--maintainer:nth-of-type(2){--row-accent: var(--accent-5)}.row--maintainer:nth-of-type(3){--row-accent: var(--accent-3)}.jobs{display:flex;flex-direction:column;gap:48px;counter-reset:job}.job{position:relative;padding-left:24px;counter-increment:job}.job:before{content:counter(job,decimal-leading-zero);position:absolute;left:0;top:8px;font-family:var(--mono);font-size:10px;letter-spacing:.14em;color:var(--ink-faint)}.job-head{display:flex;justify-content:space-between;align-items:baseline;gap:16px;margin-bottom:6px;flex-wrap:wrap}.job-name{font-family:var(--serif);font-size:clamp(20px,2vw,24px);font-weight:400;color:var(--ink);letter-spacing:-.005em;line-height:1.2}.job-name .at{color:var(--ink-faint);font-style:italic;margin:0 6px;font-size:.85em}.job-name .company{font-style:normal}.job:nth-child(4n+1) .job-name .company{color:var(--accent)}.job:nth-child(4n+2) .job-name .company{color:var(--accent-5)}.job:nth-child(4n+3) .job-name .company{color:var(--accent-3)}.job:nth-child(4n+4) .job-name .company{color:var(--accent-4)}.job-period{font-family:var(--mono);font-size:12px;color:var(--ink-faint);letter-spacing:.02em;white-space:nowrap}.job-stack{font-family:var(--mono);font-size:11.5px;color:var(--ink-faint);margin-bottom:14px;letter-spacing:.01em}.job-summary{color:var(--ink-dim);font-size:14px;line-height:1.7;margin-bottom:12px}.job-summary strong{color:var(--ink);font-weight:500}.job-bullets{list-style:none;display:flex;flex-direction:column;gap:8px}.job-bullets li{position:relative;padding-left:18px;color:var(--ink-dim);font-size:13.5px;line-height:1.7}.job-bullets li:before{content:"·";position:absolute;left:4px;top:-2px;font-size:18px;line-height:1}.job:nth-child(4n+1) .job-bullets li:before{color:var(--accent)}.job:nth-child(4n+2) .job-bullets li:before{color:var(--accent-5)}.job:nth-child(4n+3) .job-bullets li:before{color:var(--accent-3)}.job:nth-child(4n+4) .job-bullets li:before{color:var(--accent-4)}.job-bullets li strong{color:var(--ink);font-weight:500}.skills{font-family:var(--mono);font-size:13px;color:var(--ink-dim);line-height:2}.skills span{display:inline-block;margin-right:4px;transition:color .2s;cursor:default}.skills span:hover{color:var(--accent)}.skills span:nth-child(3n):hover{color:var(--accent-5)}.skills span:nth-child(5n):hover{color:var(--accent-3)}.skills span:nth-child(7n):hover{color:var(--accent-4)}.skills span:nth-child(11n):hover{color:var(--accent-2)}.skills .sep{color:var(--line-strong)}.prev{display:flex;flex-direction:column}.prev-row{display:flex;justify-content:space-between;align-items:baseline;gap:16px;flex-wrap:wrap;padding:14px 4px;border-bottom:1px solid var(--line);font-size:13.5px}.prev-row:first-child{border-top:1px solid var(--line-strong)}.prev-row:last-child{border-bottom:0}.prev-row .who{color:var(--ink);font-family:var(--mono)}.prev-row .who em{color:var(--ink-faint);font-style:italic;margin:0 6px}.prev-row .when{color:var(--ink-faint);font-family:var(--mono);font-size:12px;white-space:nowrap}.back-link{font-family:var(--mono);font-size:13px;color:var(--ink);display:inline-flex;align-items:center;gap:8px}.back-link:hover{color:var(--accent)}.back-link .arrow{transition:transform .2s}.back-link:hover .arrow{transform:translate(3px)}.article-back{display:inline-flex;align-items:center;gap:6px;font-family:var(--mono);font-size:12px;letter-spacing:.04em;color:var(--ink-faint);margin-bottom:28px;transition:color .2s}.article-back:hover{color:var(--accent)}.page-title--article{font-size:clamp(28px,4vw,44px);line-height:1.15;letter-spacing:-.02em;white-space:normal}.article-meta{font-family:var(--mono);font-size:12px;color:var(--ink-faint);letter-spacing:.02em;margin-top:20px;display:flex;flex-wrap:wrap;gap:8px;align-items:baseline}.article-meta .dot{color:var(--line-strong)}.article-body{margin-top:8px;font-family:var(--mono);font-size:14.5px;line-height:1.75;color:var(--ink-dim)}.article-body>*:first-child{margin-top:0}.article-body h2{font-family:var(--serif);font-size:clamp(24px,3vw,32px);font-weight:400;color:var(--ink);letter-spacing:-.015em;line-height:1.15;margin:56px 0 20px;position:relative;padding-left:18px}.article-body h2:before{content:"";position:absolute;left:0;top:.5em;width:8px;height:1px;background:var(--accent)}.article-body h3{font-family:var(--serif);font-size:clamp(18px,2vw,22px);font-weight:500;color:var(--ink);margin:36px 0 14px;letter-spacing:-.01em}.article-body p{margin:0 0 18px}.article-body p:last-child{margin-bottom:0}.article-body strong{color:var(--ink);font-weight:500}.article-body em{color:var(--accent-5);font-style:italic}.article-body a{color:var(--accent);border-bottom:1px dotted color-mix(in srgb,var(--accent) 50%,transparent);transition:color .2s,border-color .2s}.article-body a:hover{color:var(--accent-5);border-bottom-color:var(--accent-5)}.article-body ul,.article-body ol{margin:0 0 22px;padding-left:0;list-style:none}.article-body li{position:relative;padding-left:22px;margin-bottom:6px;line-height:1.7}.article-body ul li:before{content:"·";position:absolute;left:4px;top:-4px;color:var(--accent);font-size:22px;line-height:1}.article-body ol{counter-reset:olst}.article-body ol li{counter-increment:olst}.article-body ol li:before{content:counter(olst) ".";position:absolute;left:0;top:0;color:var(--accent);font-family:var(--mono);font-size:12px;font-weight:500;letter-spacing:.02em}.article-body p code,.article-body li code,.article-body h2 code,.article-body h3 code{background:color-mix(in srgb,var(--ink) 7%,var(--bg));border:1px solid var(--line);padding:1px 6px;border-radius:2px;color:var(--ink);font-family:var(--mono);font-size:.86em}.article-body pre{background:color-mix(in srgb,var(--ink) 5%,var(--bg));border:1px solid var(--line);padding:18px 22px;overflow-x:auto;margin:0 0 24px;font-size:12.5px;line-height:1.65;border-left:2px solid var(--accent)}.article-body pre code{background:transparent;border:0;padding:0;color:var(--ink);font-family:var(--mono)}.article-body .table-wrap{margin:0 0 24px;overflow-x:auto;-webkit-overflow-scrolling:touch;border-top:1px solid var(--line-strong);border-bottom:1px solid var(--line-strong)}.article-body .table-wrap::-webkit-scrollbar{height:6px}.article-body .table-wrap::-webkit-scrollbar-thumb{background:var(--line-strong);border-radius:3px}.article-body table{width:100%;border-collapse:collapse;font-family:var(--mono);font-size:12.5px;white-space:nowrap}.article-body thead tr{border-bottom:1px solid var(--line)}.article-body th{text-align:left;font-weight:500;color:var(--ink);padding:10px 14px 10px 0;letter-spacing:.02em}.article-body th:first-child{padding-left:4px}.article-body td{color:var(--ink-dim);padding:10px 14px 10px 0;border-top:1px solid var(--line);vertical-align:top}.article-body td:first-child{padding-left:4px;color:var(--ink)}.article-body td strong{color:var(--accent);font-weight:500}.article-body video{display:block;width:100%;height:auto;margin:24px 0;border:1px solid var(--line);background:var(--ink)}.article-foot{margin-top:64px;padding-top:24px;border-top:1px solid var(--line)}.hljs{color:var(--ink);background:transparent}.hljs-comment,.hljs-quote{color:var(--ink-faint);font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:var(--accent)}.hljs-string,.hljs-doctag,.hljs-attr,.hljs-attribute{color:var(--accent-2)}.hljs-number,.hljs-literal,.hljs-meta,.hljs-symbol,.hljs-bullet{color:var(--accent-5)}.hljs-title,.hljs-section,.hljs-type,.hljs-class .hljs-title{color:var(--accent-3)}.hljs-built_in,.hljs-variable,.hljs-template-variable,.hljs-name{color:var(--accent-4)}.hljs-tag{color:var(--ink-dim)}.hljs-link{color:var(--accent-5);text-decoration:underline}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-deletion{color:var(--accent-3)}.hljs-addition{color:var(--accent-5)}.row-tag--year{color:var(--ink-faint);border-color:var(--line-strong);background:transparent}.row-title--link,.row-action--link{cursor:pointer;transition:color .2s}.row-title--link:hover,.row-action--link:hover{color:var(--accent)}.row-action--link .arrow{transition:transform .2s}.row-action--link:hover .arrow{transform:translate(2px,-2px)}.reveal{opacity:0;transform:translateY(12px);animation:reveal .7s ease forwards}@keyframes reveal{to{opacity:1;transform:translateY(0)}}.d1{animation-delay:.05s}.d2{animation-delay:.18s}.d3{animation-delay:.3s}.d4{animation-delay:.42s}.scroll-reveal{opacity:0;transform:translateY(20px);transition:opacity .7s cubic-bezier(.2,.7,.2,1),transform .7s cubic-bezier(.2,.7,.2,1);will-change:opacity,transform}.scroll-reveal.in{opacity:1;transform:translateY(0)}@media(prefers-reduced-motion:reduce){.reveal,.scroll-reveal{opacity:1;transform:none;animation:none;transition:none}}.scramble{font-feature-settings:"tnum";position:relative;display:inline-block;vertical-align:baseline;white-space:nowrap}.scramble-ghost{color:transparent;pointer-events:none;-webkit-user-select:text;user-select:text}.scramble-glyphs{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;white-space:pre;pointer-events:none;-webkit-user-select:none;user-select:none}@media(max-width:880px){.topbar-inner{padding:12px 22px;gap:14px}.topbar-nav{gap:18px}.layout{padding:40px 22px 80px}.page-head{margin-bottom:36px}.page-eyebrow{margin-bottom:16px}.page-title{font-size:clamp(36px,8vw,64px);white-space:normal}.page-title-row{gap:18px}.avatar{width:80px;height:80px}.page-section{padding:36px 0}.section-rule{margin-bottom:24px}.lede{font-size:19px;margin-bottom:28px}.contacts{row-gap:8px}.contacts a{padding:0 12px}.row-list{border-top:0}.row{gap:14px;padding:18px 0}.row-meta{line-height:1.7}.scroll-reveal{transform:translateY(12px)}.row--project,.row--blog{grid-template-columns:auto 1fr;grid-auto-rows:min-content;row-gap:14px}.row--project .row-tag,.row--blog .row-tag{grid-row:1}.row--project .row-title,.row--blog .row-title{grid-column:2;grid-row:1}.row--project .row-meta,.row--blog .row-meta{grid-column:1 / -1}.row--project .row-action,.row--blog .row-action{grid-column:1 / -1;gap:18px}.jobs{gap:44px}.job-head{flex-direction:column;gap:4px}.job-stack{margin-bottom:12px}.job-summary{margin-bottom:14px}.job-bullets{gap:10px}.prev-row{padding:16px 0}.article-back{margin-bottom:22px}.article-meta{margin-top:16px}.article-body{font-size:15px;line-height:1.72}.article-body h2{margin:40px 0 16px;padding-left:14px}.article-body h2:before{width:6px}.article-body h3{margin:28px 0 12px}.article-body p{margin:0 0 16px}.article-body ul,.article-body ol{margin:0 0 18px}.article-body pre{margin:0 0 18px;padding:14px 16px;font-size:12.5px}.article-body table{font-size:12px}.article-foot{margin-top:48px}}@media(max-width:480px){.layout{padding:32px 18px 64px}.page-head{margin-bottom:28px}.page-title{font-size:clamp(32px,9vw,64px)}.avatar{width:64px;height:64px}.page-section{padding:28px 0}.lede{font-size:18px;margin-bottom:24px}.topbar-nav a.is-active:after{bottom:-6px}.row--project .row-action,.row--blog .row-action{gap:14px;flex-wrap:wrap}.jobs{gap:36px}.article-body{font-size:14.5px}}
