@font-face{font-family:familjen grotesk;src:url(/fonts/familjen-grotesk.woff2)format("woff2");font-weight:400 700;font-display:swap}@font-face{font-family:jetbrains mono;src:url(/fonts/jetbrains-mono.woff2)format("woff2");font-weight:400 700;font-display:swap}:root{--ground:#fafaf8;--ink:#0a0a0a;--muted:#4a4a46;--rule:#dcdcd6;--red:#c4211a;--code-bg:#111214;--code-ink:#d8d5cd;--code-edge:transparent;--ink-2:#2a2a27;--code-inline:#ededE8;color-scheme:light;--sans:"Familjen Grotesk", system-ui, sans-serif;--mono:"JetBrains Mono", ui-monospace, monospace}@media(prefers-color-scheme:dark){:root:not([data-theme=light]){--ground:#111110;--ink:#ecebe5;--muted:#a19f97;--rule:#2e2e2b;--red:#f0544a;--code-bg:#1c1d20;--code-edge:#2e2e2b;--ink-2:#d4d2ca;--code-inline:#23231f;color-scheme:dark}}:root[data-theme=dark]{--ground:#111110;--ink:#ecebe5;--muted:#a19f97;--rule:#2e2e2b;--red:#f0544a;--code-bg:#1c1d20;--code-edge:#2e2e2b;--ink-2:#d4d2ca;--code-inline:#23231f;color-scheme:dark}*,*::before,*::after{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{margin:0;background:var(--ground);color:var(--ink);font-family:var(--sans);font-size:18px;line-height:1.5;overflow-wrap:anywhere}a{color:var(--ink);text-decoration-thickness:1px;text-underline-offset:3px}a:hover{color:var(--red)}:focus-visible{outline:2px solid var(--red);outline-offset:3px}img{max-width:100%;height:auto}.mono{font-family:var(--mono)}.muted{color:var(--muted)}.red{color:var(--red)}.wrap{max-width:1180px;margin:0 auto;padding:clamp(20px,4vw,40px)clamp(16px,3vw,24px)80px;display:flex;flex-direction:column;gap:clamp(36px,6vw,56px)}main{display:contents}.skip{position:absolute;left:-999px}.skip:focus{left:16px;top:16px;background:var(--ink);color:var(--ground);padding:10px 14px}.site-header,.site-footer{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:4px 16px}.site-header .brand{font-family:var(--mono);font-size:14px;text-decoration:none;padding:12px 0}.site-nav{display:flex;flex-wrap:wrap;gap:0 24px;font-size:18px}.site-nav a{text-decoration:none;padding:12px 0;border-bottom:2px solid transparent}.site-nav a[aria-current]{border-bottom-color:var(--red)}.site-tools{display:flex;flex-wrap:wrap;align-items:center;gap:8px 32px}.theme-switch{display:flex;border:1px solid var(--ink);font-family:var(--mono);font-size:13px}.theme-switch[hidden]{display:none}.theme-switch button{min-height:44px;padding:0 12px;border:0;background:0 0;color:var(--ink);font:inherit;cursor:pointer}.theme-switch button[aria-pressed=true]{background:var(--ink);color:var(--ground)}.theme-switch button:hover{color:var(--red)}.theme-switch button[aria-pressed=true]:hover{color:var(--ground)}.site-footer{font-family:var(--mono);font-size:14px;border-top:2px solid var(--ink);padding-top:8px;gap:8px 16px}.site-footer .links{display:flex;flex-wrap:wrap;gap:0 16px}.site-footer a,.site-footer span{padding:12px 0}.hero{display:flex;flex-direction:column;gap:24px}.hero h1{margin:0;font-weight:700;letter-spacing:-.045em;line-height:.85;overflow-wrap:normal;font-size:clamp(56px,12vw,160px)}.hero.home h1{font-size:clamp(56px,14vw,200px)}.hero h1 .dot,.post-head h1 .dot{color:var(--red)}.hero .lede{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(300px,100%),1fr));gap:20px 32px;align-items:end}.hero .lede p{margin:0}.hero .lede .big{font-size:clamp(21px,3vw,26px);line-height:1.3;font-weight:500;max-width:30ch}.hero .lede .small{font-size:18px;line-height:1.55;color:var(--muted);max-width:44ch}.hero .lede .cmd{font-family:var(--mono);font-size:14px;color:var(--muted)}.strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(300px,100%),1fr));gap:0 24px;border-top:2px solid var(--ink);border-bottom:2px solid var(--ink)}.strip>div{display:flex;flex-direction:column;gap:6px;padding:20px 0;border-bottom:1px solid var(--rule)}.strip>div:last-child{border-bottom:0}.label{font-family:var(--mono);font-size:12px;letter-spacing:.06em;color:var(--muted);text-transform:uppercase}.strip .value{font-size:22px;font-weight:500;line-height:1.25}.strip .sub{font-size:16px;color:var(--muted)}.strip code{font-family:var(--mono);font-size:14px}.section{display:flex;flex-direction:column;gap:20px}.section-head{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px 16px;border-bottom:2px solid var(--ink);padding-bottom:12px}.section-head h2{margin:0;font-family:var(--mono);font-size:18px;font-weight:700}.chips{display:flex;flex-wrap:wrap;gap:8px;font-family:var(--mono);font-size:14px}.chips a{text-decoration:none;padding:12px 16px;border:1px solid var(--ink)}.chips a[aria-current=page]{background:var(--ink);color:var(--ground)}.log{display:flex;flex-direction:column;margin:0;padding:0;list-style:none}.log li{display:block}.log .row{display:grid;grid-template-columns:52px minmax(0,1fr);text-decoration:none;color:var(--ink)}.log.single .row{grid-template-columns:36px minmax(0,1fr)}.lanes{position:relative}.lanes::before,.lanes::after{content:"";position:absolute;top:0;bottom:0;width:2px}.lanes::before{left:12px;background:var(--ink)}.lanes::after{left:34px;background:var(--red)}.log.single .lanes::after{display:none}.log.single.writing .lanes::before{background:var(--red)}.lanes .dot{position:absolute;top:24px;width:14px;height:14px;border-radius:50%}.lanes .dot.work{left:6px;background:var(--ink)}.lanes .dot.writing{left:28px;background:var(--ground);border:2px solid var(--red)}.log.single .lanes .dot{left:6px}.log.single .lanes .dot.writing{border-color:var(--red)}.lanes .dot.break{background:var(--ground);border:2px solid var(--ink)}.entry{display:flex;flex-wrap:wrap;gap:6px 24px;padding:18px 0 18px 4px;border-bottom:1px solid var(--rule)}.entry .when{flex:0 0 104px;font-family:var(--mono);font-size:13px;color:var(--muted);padding-top:3px}.log.wide-dates .entry .when{flex-basis:180px}.entry .what{flex:1 1 260px;min-width:0;display:flex;flex-direction:column;gap:6px}.entry .kind{font-family:var(--mono);font-size:12px;letter-spacing:.06em;color:var(--muted)}.entry .kind.writing{color:var(--red)}.entry .title{font-size:clamp(20px,2.4vw,24px);font-weight:500;line-height:1.2}.entry .note{font-size:16px;color:var(--muted);line-height:1.45}.entry .tags{font-family:var(--mono);font-size:13px;color:var(--red)}a.row:hover .title{color:var(--red)}.entry.is-break .title{color:var(--muted)}.more{align-self:flex-start;font-family:var(--mono);font-size:14px;padding:12px 0}.year{font-size:clamp(36px,5vw,56px);font-weight:700;letter-spacing:-.03em;line-height:1;margin:12px 0 8px}.certs{list-style:none;margin:0;padding:0}.certs li{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:4px 24px;padding:14px 0;border-bottom:1px solid var(--rule)}.certs .name{flex:1 1 320px;min-width:0;display:flex;flex-direction:column;gap:2px}.certs .name strong{font-size:19px;font-weight:500}.certs .name span{font-size:15px;color:var(--muted)}.certs .status{font-family:var(--mono);font-size:13px}.certs .expired,.certs .expired strong{color:var(--muted)}.edu{display:flex;flex-direction:column;gap:6px;padding-top:8px}.edu strong{font-size:20px;font-weight:500}.post{display:flex;flex-direction:column;gap:32px}.post-head{display:flex;flex-direction:column;gap:20px;border-bottom:2px solid var(--ink);padding-bottom:32px}.post-head .back{align-self:flex-start;font-family:var(--mono);font-size:14px;text-decoration:none;padding:10px 0}.post-head .meta{display:flex;flex-wrap:wrap;gap:4px 16px;font-family:var(--mono);font-size:13px;color:var(--muted)}.post-head .meta .tags a{color:var(--red);text-decoration:none;margin-right:10px}.post-head h1{margin:0;font-size:clamp(40px,7vw,92px);line-height:.95;font-weight:700;letter-spacing:-.035em;max-width:18ch;overflow-wrap:normal}.post-head .summary{margin:0;font-size:clamp(20px,2.6vw,26px);line-height:1.35;font-weight:500;max-width:36ch;color:var(--ink-2)}.post-head .origin{font-family:var(--mono);font-size:13px;color:var(--muted)}.prose{max-width:680px;font-size:19px;line-height:1.65}.prose>*{margin:0 0 22px}.prose h2{margin-top:40px;font-size:30px;line-height:1.15;letter-spacing:-.02em}.prose h3{margin-top:32px;font-size:23px;line-height:1.2}.prose blockquote{margin-left:0;padding-left:20px;border-left:2px solid var(--ink);color:var(--ink-2)}.prose ul,.prose ol{padding-left:24px}.prose li+li{margin-top:6px}.prose hr{border:0;border-top:1px solid var(--rule);margin:40px 0}.prose code{font-family:var(--mono);font-size:.85em;background:var(--code-inline);padding:2px 6px}.prose pre{background:var(--code-bg)!important;color:var(--code-ink);border:1px solid var(--code-edge);padding:18px 20px;overflow-x:auto;font-size:14px;line-height:1.6}.prose pre code{background:0 0;padding:0;font-size:inherit}.prose .highlight{margin:0 0 22px}.prose figure{margin:8px 0 30px}.prose figure img{display:block;border:1px solid var(--rule)}.prose figcaption{font-family:var(--mono);font-size:13px;color:var(--muted);margin-top:8px}.linkcard{display:flex;flex-direction:column;gap:4px;padding:16px 18px;border:1px solid var(--ink);text-decoration:none;line-height:1.4}.linkcard strong{font-size:18px;font-weight:500}.linkcard span{font-size:15px;color:var(--muted)}.linkcard .domain{font-family:var(--mono);font-size:13px}.read-on{display:inline-block;padding:14px 20px;background:var(--ink);color:var(--ground);text-decoration:none;font-weight:500}.read-on:hover{color:var(--ground);background:var(--red)}.terminal{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;border:1px solid var(--ink);padding:16px 18px;font-family:var(--mono);font-size:14px}.pager{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(300px,100%),1fr));gap:16px;border-top:2px solid var(--ink);padding-top:24px}.pager a{display:flex;flex-direction:column;gap:6px;text-decoration:none;padding:8px 0}.pager .title{font-size:22px;font-weight:500;line-height:1.2}.bg{color:#e6edf3;background-color:#0d1117}.chroma{color:#e6edf3;background-color:#0d1117;-webkit-text-size-adjust:none}.chroma .err{color:#f85149}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#6e7681}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#737679}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#6e7681}.chroma .line{display:flex}.chroma .k{color:#ff7b72}.chroma .kc{color:#79c0ff}.chroma .kd{color:#ff7b72}.chroma .kn{color:#ff7b72}.chroma .kp{color:#79c0ff}.chroma .kr{color:#ff7b72}.chroma .kt{color:#ff7b72}.chroma .nc{color:#f0883e;font-weight:700}.chroma .no{color:#79c0ff;font-weight:700}.chroma .nd{color:#d2a8ff;font-weight:700}.chroma .ni{color:#ffa657}.chroma .ne{color:#f0883e;font-weight:700}.chroma .nl{color:#79c0ff;font-weight:700}.chroma .nn{color:#ff7b72}.chroma .nx{color:#e6edf3}.chroma .py{color:#79c0ff}.chroma .nt{color:#7ee787}.chroma .nv{color:#79c0ff}.chroma .vc{color:#79c0ff}.chroma .vg{color:#79c0ff}.chroma .vi{color:#79c0ff}.chroma .vm{color:#79c0ff}.chroma .nf{color:#d2a8ff;font-weight:700}.chroma .fm{color:#d2a8ff;font-weight:700}.chroma .l{color:#a5d6ff}.chroma .ld{color:#79c0ff}.chroma .s{color:#a5d6ff}.chroma .sa{color:#79c0ff}.chroma .sb{color:#a5d6ff}.chroma .sc{color:#a5d6ff}.chroma .dl{color:#79c0ff}.chroma .sd{color:#a5d6ff}.chroma .s2{color:#a5d6ff}.chroma .se{color:#79c0ff}.chroma .sh{color:#79c0ff}.chroma .si{color:#a5d6ff}.chroma .sx{color:#a5d6ff}.chroma .sr{color:#79c0ff}.chroma .s1{color:#a5d6ff}.chroma .ss{color:#a5d6ff}.chroma .m{color:#a5d6ff}.chroma .mb{color:#a5d6ff}.chroma .mf{color:#a5d6ff}.chroma .mh{color:#a5d6ff}.chroma .mi{color:#a5d6ff}.chroma .il{color:#a5d6ff}.chroma .mo{color:#a5d6ff}.chroma .o{color:#ff7b72;font-weight:700}.chroma .ow{color:#ff7b72;font-weight:700}.chroma .or{color:#ff7b72;font-weight:700}.chroma .c{color:#8b949e;font-style:italic}.chroma .ch{color:#8b949e;font-style:italic}.chroma .cm{color:#8b949e;font-style:italic}.chroma .c1{color:#8b949e;font-style:italic}.chroma .cs{color:#8b949e;font-weight:700;font-style:italic}.chroma .cp{color:#8b949e;font-weight:700;font-style:italic}.chroma .cpf{color:#8b949e;font-weight:700;font-style:italic}.chroma .gd{color:#ffa198;background-color:#490202}.chroma .ge{font-style:italic}.chroma .gr{color:#ffa198}.chroma .gh{color:#79c0ff;font-weight:700}.chroma .gi{color:#56d364;background-color:#0f5323}.chroma .go{color:#8b949e}.chroma .gp{color:#8b949e}.chroma .gs{font-weight:700}.chroma .gu{color:#79c0ff}.chroma .gt{color:#ff7b72}.chroma .gl{text-decoration:underline}.chroma .w{color:#6e7681}