:root{color-scheme:light dark;--bg:#ffffff;--text:#1f2328;--muted:#6e7781;--rule:#e8eaed;--link:#135ba5;--code-bg:#f6f8fa;--code-border:#e8eaed;--sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica,
    Arial, sans-serif;--mono:ui-monospace, "SF Mono", Menlo, Consolas, monospace}@media(prefers-color-scheme:dark){:root{--bg:#16191d;--text:#dde1e6;--muted:#8d97a1;--rule:#2c3138;--link:#82aede;--code-bg:#1c2026;--code-border:#2c3138}}*{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{margin:0;background:var(--bg);color:var(--text);font-family:var(--sans);font-size:17px;line-height:1.65;-webkit-font-smoothing:antialiased}a{color:var(--link);text-decoration:none}a:hover{text-decoration:underline}img{max-width:100%;height:auto}.wrap{max-width:42rem;margin:0 auto;padding:0 1.5rem}main.wrap{padding-top:3rem;padding-bottom:4rem}.site-header{display:flex;align-items:baseline;gap:1.5rem;padding-top:2rem}.site-header .site-name{color:var(--text);font-weight:600}.site-header .site-name:hover{text-decoration:none}.site-header nav{display:flex;gap:1.25rem;margin-left:auto}.site-header nav a{color:var(--muted)}.site-header nav a:hover,.site-header nav a.active{color:var(--text);text-decoration:none}.site-footer{display:flex;gap:1.25rem;align-items:baseline;flex-wrap:wrap;border-top:1px solid var(--rule);margin-top:2rem;padding-top:1.5rem;padding-bottom:3rem;font-size:.875rem;color:var(--muted)}.site-footer .spacer{flex:1}.site-footer a{color:var(--muted)}.site-footer a:hover{color:var(--text);text-decoration:none}h1{font-size:1.75rem;line-height:1.25;letter-spacing:-.01em;font-weight:650;margin:0 0 1rem}h2{font-size:1.25rem;font-weight:600;margin:2.5rem 0 .75rem}.meta{color:var(--muted);font-size:.875rem}.lede{color:var(--muted);margin:0 0 1rem}.bio p{margin:0 0 1.25em}.job-list{list-style:none;margin:1.75rem 0;padding:0}.job-list li{margin:0 0 1.75rem}.job-list li:last-child{margin-bottom:0}.job-list .role{display:block;font-weight:600;margin-bottom:.35rem}.job-list .job-cols{display:grid;grid-template-columns:11rem 1fr;gap:2rem}.job-list .job-left{display:flex;flex-direction:column;gap:.1rem}.job-list .company{font-size:.9375rem}.job-list .years{color:var(--muted);font-size:.875rem;font-variant-numeric:tabular-nums}.job-list p{margin:0;color:var(--muted);font-size:.9375rem}.project-list{list-style:none;margin:1.5rem 0 0;padding:0}.project-list li{padding:.45rem 0}.project-list li a,.project-list li .name{font-weight:600}.project-list li .soon{color:var(--muted);font-size:.8125rem;border:1px solid var(--rule);border-radius:3px;padding:.05rem .4rem;margin-left:.25rem;white-space:nowrap}.project-list li .desc{color:var(--muted);margin-left:.5rem}.divider{border:none;border-top:1px solid var(--rule);margin:2.5rem 0}.tech-list{list-style:none;margin:1.5rem 0 0;padding:0}.tech-list li{display:grid;grid-template-columns:7.5rem 1fr;gap:2rem;padding:.3rem 0}.tech-list .label{color:var(--muted);font-size:.9375rem}.post-list{list-style:none;margin:1.5rem 0 0;padding:0}.post-list li{display:flex;align-items:baseline;gap:1rem;padding:.45rem 0}.post-list li a{color:var(--text)}.post-list li a:hover{color:var(--link);text-decoration:none}.post-list li time{margin-left:auto;flex-shrink:0;color:var(--muted);font-size:.875rem;font-variant-numeric:tabular-nums}.post-header{margin-bottom:2.5rem}.post-header h1{margin-bottom:.5rem}.post-header .intro{color:var(--muted);margin:.75rem 0 0}.series-note{color:var(--muted);font-size:.9375rem;border-left:2px solid var(--rule);padding-left:1rem;margin:0 0 2rem}.post-footer{border-top:1px solid var(--rule);margin-top:3.5rem;padding-top:1.5rem;font-size:.9375rem;display:flex;flex-direction:column;gap:.4rem}.post-footer .label{color:var(--muted);margin-right:.5rem}.prose>:first-child{margin-top:0}.prose p{margin:0 0 1.25em}.prose h2{font-size:1.375rem;margin:2.25em 0 .6em}.prose h3{font-size:1.125rem;margin:1.75em 0 .5em}.prose h4{font-size:1rem;margin:1.5em 0 .5em}.prose ul,.prose ol{padding-left:1.5rem;margin:0 0 1.25em}.prose li{margin-bottom:.3em}.prose blockquote{margin:1.5em 0;padding-left:1rem;border-left:2px solid var(--rule);color:var(--muted)}.prose blockquote p{margin-bottom:.5em}.prose hr{border:none;border-top:1px solid var(--rule);margin:2.5em 0}.prose img{border:1px solid var(--rule);border-radius:4px;margin:1.5em 0}.prose table{width:100%;border-collapse:collapse;font-size:.9375rem;margin:1.5em 0}.prose th,.prose td{text-align:left;padding:.5rem .75rem;border-bottom:1px solid var(--rule)}.prose th{font-weight:600}code{font-family:var(--mono);font-size:.875em}.prose code{background:var(--code-bg);border:1px solid var(--code-border);border-radius:4px;padding:.1em .35em}.prose pre{background:var(--code-bg);border:1px solid var(--code-border);border-radius:6px;padding:1rem 1.25rem;overflow-x:auto;line-height:1.6;font-size:.875rem;margin:1.5em 0}.prose pre code{background:0 0;border:none;padding:0;font-size:inherit}.prose .highlight{margin:1.5em 0}.prose .highlight pre{margin:0}.prose .chroma{background:var(--code-bg)}.prose .chroma .k,.prose .chroma .kc,.prose .chroma .kd,.prose .chroma .kn,.prose .chroma .kp,.prose .chroma .kr,.prose .chroma .kt{color:#9d5bd2}.prose .chroma .s,.prose .chroma .sa,.prose .chroma .sb,.prose .chroma .sc,.prose .chroma .dl,.prose .chroma .sd,.prose .chroma .s2,.prose .chroma .sh,.prose .chroma .si,.prose .chroma .sx,.prose .chroma .sr,.prose .chroma .s1,.prose .chroma .ss{color:#2a7d4f}.prose .chroma .m,.prose .chroma .mb,.prose .chroma .mf,.prose .chroma .mh,.prose .chroma .mi,.prose .chroma .il,.prose .chroma .mo{color:#b25d0e}.prose .chroma .c,.prose .chroma .ch,.prose .chroma .cm,.prose .chroma .c1,.prose .chroma .cs,.prose .chroma .cp,.prose .chroma .cpf{color:var(--muted);font-style:italic}.prose .chroma .nf,.prose .chroma .nx{color:#135ba5}.prose .chroma .err{color:#c33c3c}.prose .chroma .gi{color:#2a7d4f}.prose .chroma .gd{color:#c33c3c}.prose .chroma .ln{color:var(--muted);margin-right:.75rem}@media(prefers-color-scheme:dark){.prose .chroma .k,.prose .chroma .kc,.prose .chroma .kd,.prose .chroma .kn,.prose .chroma .kp,.prose .chroma .kr,.prose .chroma .kt{color:#c395e8}.prose .chroma .s,.prose .chroma .sa,.prose .chroma .sb,.prose .chroma .sc,.prose .chroma .dl,.prose .chroma .sd,.prose .chroma .s2,.prose .chroma .sh,.prose .chroma .si,.prose .chroma .sx,.prose .chroma .sr,.prose .chroma .s1,.prose .chroma .ss{color:#86c996}.prose .chroma .m,.prose .chroma .mb,.prose .chroma .mf,.prose .chroma .mh,.prose .chroma .mi,.prose .chroma .il,.prose .chroma .mo{color:#d8a35c}.prose .chroma .nf,.prose .chroma .nx{color:#82aede}.prose .chroma .err{color:#e07777}.prose .chroma .gi{color:#86c996}.prose .chroma .gd{color:#e07777}}.project-banner{border:1px solid var(--rule);border-radius:6px;margin:2rem 0;overflow:hidden}.project-banner img{display:block;width:100%}.project-facts{color:var(--muted);font-size:.9375rem;margin:.75rem 0 0}.about-portrait{float:right;width:10rem;margin:0 0 1rem 1.5rem}.about-portrait img{display:block;border:1px solid var(--rule);border-radius:4px}@media(max-width:600px){.job-list .job-cols{grid-template-columns:1fr;gap:.35rem}.tech-list li{grid-template-columns:1fr;gap:.1rem;padding:.45rem 0}.about-portrait{float:none;margin:0 0 1.5rem}.post-list li{flex-direction:column;gap:.1rem;padding:.6rem 0}.post-list li time{margin-left:0}}