.chroma .k,.chroma .kc,.chroma .kd,.chroma .kn,.chroma .kp,.chroma .kr,.chroma .kt,.chroma .ow,.chroma .nt{color:var(--code-keyword)}.chroma .s,.chroma .s1,.chroma .s2,.chroma .sa,.chroma .sb,.chroma .sc,.chroma .sd,.chroma .se,.chroma .sh,.chroma .si,.chroma .sx,.chroma .sr,.chroma .ss,.chroma .dl{color:var(--code-string)}.chroma .m,.chroma .mb,.chroma .mf,.chroma .mh,.chroma .mi,.chroma .il,.chroma .mo{color:var(--code-number)}.chroma .c,.chroma .c1,.chroma .cm,.chroma .cp,.chroma .cpf,.chroma .cs,.chroma .ch{color:var(--code-comment);font-style:italic}.chroma .nf,.chroma .fm,.chroma .nc,.chroma .nd,.chroma .na{color:var(--code-function)}.chroma .nb,.chroma .bp{color:var(--code-builtin)}.chroma .hl{display:block;background:var(--code-highlight)}.chroma .lnt,.chroma .ln{color:var(--code-comment);margin-right:1em;user-select:none}:root{--bg:#f7f7f5;--fg:#17191c;--muted:#62676e;--line:#dfe0dc;--accent:#2d5bd7;--soft:#eeefec;--sea-1:#9fb4c4;--sea-2:#4f6d82;--code-keyword:#8a3fb8;--code-string:#2f7a3e;--code-number:#9a4a0c;--code-comment:#666b73;--code-function:#2d5bd7;--code-builtin:#0f6f7a;--code-highlight:#e3e6ea;--display:"Bricolage Grotesque", system-ui, sans-serif;--body:"Geist", system-ui, sans-serif;--mono:"Geist Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--width:1100px}@media(prefers-color-scheme:dark){:root{color-scheme:dark;--bg:#121416;--fg:#e8e9eb;--muted:#8e949b;--line:#2a2d31;--accent:#8fabff;--soft:#1b1e21;--sea-1:#33495a;--sea-2:#7fa0b6;--code-keyword:#d29cf2;--code-string:#93d49f;--code-number:#f0aa6c;--code-comment:#868c96;--code-function:#8fabff;--code-builtin:#7fd0d8;--code-highlight:#23272c}}*,*::before,*::after{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{margin:0;background:var(--bg);color:var(--fg);font:17px/1.65 var(--body)}body.inner{min-height:100vh;min-height:100dvh;display:flex;flex-direction:column}a{color:inherit}:focus-visible{outline:2px solid var(--accent);outline-offset:3px}img{max-width:100%;height:auto}.bar{width:100%;max-width:var(--width);margin:0 auto;padding:24px 20px;display:flex;align-items:center;justify-content:space-between;gap:16px;font-size:15px}.mark{display:inline-flex;color:var(--fg)}.mark:hover{color:var(--accent)}.mark-word{font:500 15px/28px var(--mono);letter-spacing:-.01em}.nav{display:flex;gap:22px;flex-wrap:wrap}.nav a{color:var(--muted);text-decoration:none}.nav a:hover,.nav a[aria-current=page]{color:var(--fg)}.harbour{position:relative;height:100vh;height:100dvh;min-height:520px;overflow:hidden}.harbour .sea,.shore .sea{position:absolute;inset:0;width:100%;height:100%;display:block}.harbour-inner{position:relative;height:100%;display:flex;flex-direction:column}.hero{width:100%;max-width:var(--width);margin:14vh auto 0;padding:0 20px}.hero h1{font:800 clamp(52px,10vw,112px)/.92 var(--display);letter-spacing:-.035em;margin:0 0 20px}.hero p{margin:0;font-size:19px;color:var(--muted)}.page{max-width:var(--width);margin:0 auto;padding:0 20px}.page>*{max-width:700px}.page-title{font:800 clamp(40px,6vw,64px)/1 var(--display);letter-spacing:-.03em;margin:48px 0 12px}.intro{color:var(--muted);font-size:18px;margin:0 0 40px}.intro p{margin:0}.year{font:500 13px var(--mono);color:var(--muted);margin:36px 0 4px}.posts{list-style:none;margin:0;padding:0}.posts a{display:grid;grid-template-columns:4.5em 1fr;gap:16px;align-items:baseline;padding:12px 0;border-bottom:1px solid var(--line);text-decoration:none}.posts a:hover span{color:var(--accent)}.posts time{font:13px var(--mono);color:var(--muted);font-variant-numeric:tabular-nums}.posts span{font-size:18px;font-weight:500;min-width:0}.job{display:grid;grid-template-columns:8em 1fr;gap:24px;padding:22px 0;border-top:1px solid var(--line)}.job>div{min-width:0}.job .when{font:13px/1.6 var(--mono);color:var(--muted);font-variant-numeric:tabular-nums}.job h2{font:600 22px/1.25 var(--display);letter-spacing:-.01em;margin:0}.job .industry{font:12px/1.6 var(--mono);color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin-bottom:2px}.job .stack{font:13px/1.6 var(--mono);margin-top:6px}.job .note{color:var(--muted);font-size:14px;margin-top:4px}.facts{font:13px var(--mono);color:var(--muted);margin:-24px 0 40px}.job p{margin:8px 0 0}.contact{margin:0}.contact div{display:grid;grid-template-columns:8em 1fr;gap:24px;padding:16px 0;border-top:1px solid var(--line);align-items:baseline}.contact dt{font:13px var(--mono);color:var(--muted);text-transform:uppercase;letter-spacing:.06em}.contact dd{margin:0;font-size:20px;min-width:0;overflow-wrap:anywhere}.contact a{text-decoration:none}.contact a:hover{color:var(--accent)}.post-head{margin:48px 0 36px}.post-head h1{font:800 clamp(34px,5vw,54px)/1.05 var(--display);letter-spacing:-.03em;margin:0 0 16px;text-wrap:balance}.post-head .meta{font:13px var(--mono);color:var(--muted);margin:0}.prose{font-size:18px;line-height:1.72;max-width:68ch}.prose>*{margin:0 0 22px}.prose h2{font:600 28px/1.2 var(--display);letter-spacing:-.02em;margin:48px 0 12px}.prose h3{font:600 21px/1.3 var(--display);margin:36px 0 10px}.prose a{color:var(--accent);text-underline-offset:3px;text-decoration-thickness:1px}.prose ul,.prose ol{padding-left:1.3em}.prose li{margin:4px 0}.prose blockquote{margin-left:0;padding-left:20px;border-left:2px solid var(--line);color:var(--muted)}.prose code{font:.86em var(--mono);background:var(--soft);padding:2px 5px;border-radius:4px}.prose pre{background:var(--soft);padding:18px 22px;border-radius:8px;overflow-x:auto;font:14px/1.65 var(--mono)}.prose pre code{background:0 0;padding:0;font-size:inherit}.prose .highlight pre{margin:0}.prose table{border-collapse:collapse;display:block;overflow-x:auto;font-size:15px;font-variant-numeric:tabular-nums}.prose th,.prose td{text-align:left;padding:6px 24px 6px 0;border-bottom:1px solid var(--line)}.prose th{font:500 12px var(--mono);color:var(--muted);text-transform:uppercase;letter-spacing:.06em}.prose img{border-radius:6px}.prose hr{border:0;border-top:1px solid var(--line)}.shore{position:relative;flex:none;height:140px;margin-top:auto;overflow:hidden}.inner .page{width:100%;padding-bottom:96px}@media(max-width:640px){.posts a,.job,.contact div{grid-template-columns:1fr;gap:2px}}