:root{--bg:#ffffff;--alt:#f6f6f4;--ink:#1a1a1a;--ink-2:#3d3d3d;--meta:#555555;--rule:#e4e4e1;--link:#0a5296;--visited:#5c2d91;--measure:40em;--c-tech:#6b3fa0;--c-life:#0f6b4f;--c-data:#0a5296;--c-ai:#9a4a06}@media(prefers-color-scheme:dark){:root{--bg:#161719;--alt:#1d1e21;--ink:#ececec;--ink-2:#c8c8c8;--meta:#a8a8a8;--rule:#2e3033;--link:#8fbaf2;--visited:#c3a3e8;--c-tech:#c4a3ee;--c-life:#6fd3ab;--c-data:#8fbaf2;--c-ai:#f0a97a}}*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}body{font-family:-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif;font-size:17px;line-height:1.65;color:var(--ink);background:var(--bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::selection{background:var(--link);color:#fff}.container{max-width:var(--measure);margin:0 auto;padding:1.6rem 1.5rem 4rem}a{color:var(--link);text-decoration:none}a:hover{text-decoration:underline;text-underline-offset:2px}header{display:flex;align-items:baseline;gap:1.3rem;flex-wrap:wrap;padding-bottom:1rem;border-bottom:1px solid var(--rule);margin-bottom:2rem}.mark{font-size:1.35rem;line-height:1.2;margin-right:auto;letter-spacing:-.005em;color:var(--ink)}.mark-hi{font-weight:700;color:var(--ink)}.mark-rest{font-weight:400;color:var(--ink-2)}.mark:hover{text-decoration:none}.mark:hover .mark-hi,.mark:hover .mark-rest{color:var(--link)}nav{display:flex;gap:1.2rem;align-items:baseline;flex-wrap:wrap}nav a{font-size:.97rem;color:var(--ink-2)}nav a:hover,nav a.active{color:var(--link)}nav a.active{font-weight:600}.hero{display:flex;gap:1.2rem;align-items:center;margin-bottom:1rem}.hero-text{min-width:0}.hero h1{font-size:1.35rem;font-weight:600;line-height:1.3;letter-spacing:-.012em;color:var(--ink)}.hero .tagline{font-size:1rem;color:var(--meta);margin-top:.2rem}.hero-blurb{color:var(--ink-2);padding-bottom:1.6rem;border-bottom:1px solid var(--rule)}.hero-blurb p+p{margin-top:.6rem}.portrait{width:64px;height:64px;border-radius:50%;overflow:hidden;flex-shrink:0;position:relative;background:var(--alt)}.portrait img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;z-index:1}.portrait-fallback{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:1.6rem;font-weight:600;color:var(--meta);user-select:none}.topics{font-size:.97rem;color:var(--meta);padding:1rem 0;border-bottom:1px solid var(--rule)}.topics .lead{margin-right:.4rem}.topics a{margin-right:.9rem;white-space:nowrap}h2{font-size:1.05rem;font-weight:600;color:var(--ink);margin-bottom:.7rem;letter-spacing:-.008em}h2 .side{font-weight:400;color:var(--meta);font-size:.93rem;margin-left:.4rem}section{margin-top:2.2rem}.year-group{margin-top:1.6rem}.year-label{display:flex;align-items:baseline;gap:.8rem;font-size:1rem;font-weight:600;color:var(--ink);font-variant-numeric:tabular-nums;margin-bottom:.1rem}.year-label::after{content:'';flex:1;height:1px;background:var(--rule)}.year-label .count{font-size:.88rem;font-weight:400;color:var(--meta)}.posts,.post-rows{list-style:none}.posts>li,.post-row{border-bottom:1px solid var(--rule)}.posts>li:last-child,.post-row:last-child{border-bottom:none}.posts>li>a,.post-row>a{display:flex;gap:1rem;align-items:flex-start;padding:.9rem .5rem;margin:0 -.5rem;color:var(--ink);border-radius:2px}.posts>li>a:hover,.post-row>a:hover{background:var(--alt);text-decoration:none}.thumb{flex:0 0 56px;width:56px;height:56px;display:block;object-fit:cover;border:1px solid var(--rule);background:var(--alt)}.post-content,.row-content{min-width:0;flex:1}.post-content,.row-content{min-width:0}.posts h3,.row-title{font-size:1.05rem;font-weight:600;line-height:1.4;letter-spacing:-.008em;color:var(--ink);margin-bottom:.15rem}.posts>li>a:hover h3,.post-row>a:hover .row-title{text-decoration:underline;text-underline-offset:2px}.post-meta,.row-meta{display:flex;align-items:baseline;gap:.45rem;flex-wrap:wrap;font-size:.9rem;color:var(--meta);margin-bottom:.2rem}.post-meta .sep,.row-meta .sep{color:var(--meta)}.row-date{font-size:.9rem;color:var(--meta);font-variant-numeric:tabular-nums}.excerpt{font-size:.96rem;color:var(--ink-2);line-height:1.55}.tag{font-size:.9rem;font-weight:400}.tag.tech{color:var(--c-tech)}.tag.life{color:var(--c-life)}.tag.data{color:var(--c-data)}.tag.ai{color:var(--c-ai)}.all-posts{margin-top:1.3rem;font-size:.97rem}.elsewhere-btns{display:flex;flex-direction:column;gap:.3rem}.elsewhere-btns a{font-size:1rem}.elsewhere-btns .what{color:var(--meta);font-size:.93rem}.closing{margin-top:2.4rem;padding:.2rem 0 .2rem 1.1rem;border-left:2px solid var(--rule)}.closing blockquote{font-size:1.08rem;font-style:italic;color:var(--ink);margin-bottom:.25rem}.closing cite{font-size:.92rem;color:var(--meta);font-style:normal}footer{margin-top:2.6rem;padding-top:1rem;border-top:1px solid var(--rule);font-size:.9rem;color:var(--meta);display:flex;justify-content:space-between;flex-wrap:wrap;gap:.6rem}footer a{color:var(--meta)}footer a:hover{color:var(--link)}.page-header{margin-bottom:1.6rem}.page-header h1{font-size:1.5rem;font-weight:600;letter-spacing:-.015em;line-height:1.28;color:var(--ink);margin-bottom:.2rem}.page-header .sub{font-size:1rem;color:var(--meta)}.filters{display:flex;flex-wrap:wrap;gap:.4rem;margin-bottom:1.6rem}.filter-btn{font:inherit;font-size:.9rem;padding:.28rem .75rem;border:1px solid var(--rule);border-radius:3px;background:0 0;color:var(--ink-2);cursor:pointer}.filter-btn:hover{border-color:var(--ink);color:var(--ink)}.filter-btn.active{background:var(--ink);border-color:var(--ink);color:var(--bg);font-weight:600}.filter-btn .n{font-weight:400;opacity:.75}.back{display:inline-block;font-size:.9rem;color:var(--meta);margin-bottom:1.6rem}.back:hover{color:var(--link)}.post-header{margin-bottom:1.8rem}.post-header h1{font-size:1.65rem;font-weight:600;letter-spacing:-.018em;line-height:1.24;color:var(--ink);margin:.3rem 0 .6rem}.post-header .deck{font-size:1.06rem;color:var(--ink-2);line-height:1.55}.post-hero-img{margin-bottom:1.8rem}.post-hero-img img{width:100%;height:auto;display:block;max-height:380px;object-fit:cover;border:1px solid var(--rule)}.post-hero-img figcaption{font-size:.9rem;color:var(--meta);padding-top:.45rem}.post-body{max-width:36em}.post-body p{color:var(--ink-2);margin-bottom:1.15rem}.post-body p:last-child{margin-bottom:0}.post-body>:first-child{margin-top:0}.post-body h1,.post-body h2{font-size:1.2rem;font-weight:600;color:var(--ink);letter-spacing:-.012em;margin:2rem 0 .6rem;padding-bottom:.35rem;border-bottom:1px solid var(--rule)}.post-body h3{font-size:1.05rem;font-weight:600;color:var(--ink);margin:1.6rem 0 .4rem}.post-body h4{font-size:1rem;font-weight:600;color:var(--ink);margin:1.3rem 0 .3rem}.post-body strong{color:var(--ink);font-weight:600}.post-body a{text-decoration:underline;text-underline-offset:2px}.post-body a:visited{color:var(--visited)}.post-body ul,.post-body ol{color:var(--ink-2);margin-bottom:1.15rem;padding-left:1.4rem}.post-body li{margin-bottom:.3rem}.post-body li>ul,.post-body li>ol{margin-top:.3rem;margin-bottom:.3rem}.post-body blockquote{border-left:2px solid var(--rule);margin:1.3rem 0;padding:.1rem 0 .1rem 1.1rem;color:var(--ink-2);font-style:italic}.post-body hr{border:none;border-top:1px solid var(--rule);margin:2rem 0}.post-body code{font-size:.9em;font-family:cascadia code,Consolas,sf mono,Monaco,monospace;background:var(--alt);border:1px solid var(--rule);border-radius:3px;padding:.1em .35em;color:var(--ink)}.post-body .highlight,.post-body pre{margin:1.3rem 0;border:1px solid var(--rule);border-radius:3px;overflow:hidden}.post-body .highlight pre,.post-body pre{margin:0;padding:.9rem 1rem !important;overflow-x:auto;font-size:.9rem;font-family:cascadia code,Consolas,sf mono,Monaco,monospace;line-height:1.6;background:var(--alt) !important;border:none;border-radius:0}.post-body .highlight pre code,.post-body pre code{background:0 0;border:none;padding:0;font-size:1em}.post-body table{width:100%;border-collapse:collapse;font-size:.96rem;margin:1.3rem 0;display:block;overflow-x:auto}.post-body th{text-align:left;font-weight:600;font-size:.93rem;color:var(--ink);padding:.5rem .8rem .5rem 0;border-bottom:1px solid var(--rule);white-space:nowrap}.post-body td{padding:.5rem .8rem .5rem 0;border-bottom:1px solid var(--rule);color:var(--ink-2);vertical-align:top}.post-body tbody tr:last-child td{border-bottom:none}.callout{background:var(--alt);border-left:3px solid var(--link);border-radius:0 3px 3px 0;padding:.85rem 1rem;margin:1.5rem 0;font-size:.97rem;color:var(--ink-2);line-height:1.55}.callout strong{color:var(--ink)}figure{margin:1.5rem 0}figure img{width:100%;height:auto;display:block;border:1px solid var(--rule)}figcaption{font-size:.9rem;color:var(--meta);margin-top:.45rem}.post-footer{margin-top:2.6rem;padding-top:1.2rem;border-top:1px solid var(--rule)}.post-footer-author{display:flex;align-items:center;gap:.9rem}.author-avatar{width:44px;height:44px;border-radius:50%;overflow:hidden;background:var(--alt);flex-shrink:0;position:relative}.author-avatar img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}.author-name{font-weight:600;font-size:.98rem;color:var(--ink)}.author-note{font-size:.93rem;color:var(--meta)}.next-prev{display:flex;justify-content:space-between;gap:1.2rem;margin-top:1.6rem;padding-top:1.2rem;border-top:1px solid var(--rule);font-size:.97rem}.prev-dir,.next-dir{display:block;font-size:.9rem;color:var(--meta);margin-bottom:.15rem}.about-intro{display:grid;grid-template-columns:120px 1fr;gap:1.5rem;align-items:start;margin-bottom:2rem}.portrait-sm{width:120px;height:120px;overflow:hidden;background:var(--alt);border:1px solid var(--rule);position:relative;flex-shrink:0}.portrait-sm img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;z-index:1}.portrait-sm .fallback{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:2.4rem;font-weight:600;color:var(--meta)}.bio p{color:var(--ink-2);margin-bottom:.7rem}.bio p:last-child{margin-bottom:0}.timeline{display:flex;flex-direction:column}.timeline-item{display:grid;grid-template-columns:8.5rem 1fr;gap:.3rem 1.1rem;padding:.75rem 0;border-bottom:1px solid var(--rule)}.timeline-item:last-child{border-bottom:none}.tl-year{font-size:.94rem;color:var(--meta);font-variant-numeric:tabular-nums;white-space:nowrap}.tl-content{min-width:0}.tl-title{font-weight:600;font-size:1.02rem;color:var(--ink)}.tl-org{font-size:.97rem;color:var(--ink-2)}.tl-note{font-size:.95rem;color:var(--meta);margin-top:.15rem;line-height:1.5}.skills-grid{display:grid;grid-template-columns:1fr 1fr;gap:1.2rem 2rem}.skill-group h3{font-size:.95rem;font-weight:600;color:var(--meta);margin-bottom:.4rem}.skill-list{list-style:none}.skill-list li{font-size:.98rem;color:var(--ink-2);padding:.1rem 0}.lang-list{list-style:none}.lang-item{display:flex;gap:1rem;align-items:baseline;flex-wrap:wrap;padding:.35rem 0;border-bottom:1px solid var(--rule)}.lang-item:last-child{border-bottom:none}.lang-name{font-size:.99rem;font-weight:600;color:var(--ink);min-width:8rem}.lang-level{font-size:.97rem;color:var(--ink-2)}.lang-bar,.lang-bar-fill{display:none}.now-list{list-style:none}.now-list li{display:flex;gap:.9rem;align-items:baseline;flex-wrap:wrap;padding:.35rem 0;border-bottom:1px solid var(--rule);font-size:.99rem;color:var(--ink-2)}.now-list li:last-child{border-bottom:none}.now-list .label{font-size:.95rem;color:var(--meta);min-width:7rem;flex-shrink:0}.connect-list{list-style:none}.connect-list li{padding:.3rem 0;font-size:1rem}.connect-list .at{color:var(--meta);font-size:.93rem}@media(max-width:560px){.container{padding:1.4rem 1.2rem 3rem}header{gap:1rem;margin-bottom:1.6rem}nav{gap:1rem}.hero{flex-direction:column;align-items:flex-start;gap:.9rem}.portrait{width:56px;height:56px}.posts>li>a,.post-row>a{gap:.8rem}.thumb{flex-basis:44px;width:44px;height:44px}.about-intro{grid-template-columns:1fr}.portrait-sm{width:100px;height:100px}.skills-grid{grid-template-columns:1fr}.timeline-item{grid-template-columns:1fr;gap:.1rem}.tl-year{order:-1}.next-prev{flex-direction:column;gap:.9rem}}@media print{header nav,.filters,.back,.next-prev,footer{display:none}body{font-size:11pt;color:#000;background:#fff}.container{max-width:none}a{color:#000;text-decoration:underline}}