1(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,12240,e=>{"use strict";var t=e.i(43476);e.s(["JsonLd",0,function({data:e}){return(0,t.jsx)("script",{type:"application/ld+json",dangerouslySetInnerHTML:{__html:JSON.stringify(e).replace(/</g,"\\u003c")}})}],12240)},2486,e=>{"use strict";var t=e.i(43476),a=e.i(71645),r=e.i(11274);let n=`#version 300 es 2precision highp float; 3 4in vec2 v_uv; 5out vec4 outColor; 6 7uniform vec2 u_res; /* device px */ 8uniform float u_time; 9uniform float u_intro; /* 0 to 1, LINEAR: the easing is per cell, below */ 10uniform float u_cell; /* device px, the grid */ 11uniform vec3 u_dot; 12/* ââ ITERATION SWITCH, 2026-09-18 âââââââââââââââââââââââââââââââââââââââââ 13 ?rail=1 to ?rail=7 swaps the scatter for one of seven candidate textures 14 so they can be judged on the live page rather than on a board. (No 15 backticks in this comment: it lives inside a template literal.) 16 0 (the default, and any unknown value) is the shipped scatter, untouched. 17 Trial scaffolding: once a texture is chosen it becomes the only path and 18 this switch goes. */ 19uniform int u_variant; 20uniform float u_dpr; /* device px per CSS px */ 21uniform float u_side; /* 0 = left rail, 1 = right rail */ 22 23 24float hash1(vec2 p) { 25 return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); 26} 27 28/* 8x8 Bayer threshold, 0..63, from the bit-reversed interleave of x and y. */ 29int bayer8(ivec2 q) { 30 int x = q.x & 7; 31 int y = q.y & 7; 32 int z = x ^ y; 33 return ((z & 1) << 5) | ((y & 1) << 4) | ((z & 2) << 2) | ((y & 2) << 1) | ((z & 4) >> 1) | ((y & 4) >> 2); 34} 35 36/* Every candidate arrives the same way: a soft top-down wipe over the intro, 37 so the trial rails still take part in the fold rather than popping. */ 38float arrive() { 39 return clamp((u_intro - 0.5 * v_uv.y) / 0.5, 0.0, 1.0); 40} 41 42vec4 candidate(vec2 p) { 43 vec2 c = p / u_dpr; /* CSS px */ 44 vec3 ink = vec3(0.102); /* --r3-text #1a1a1a */ 45 vec3 olive = vec3(0.337, 0.396, 0.243); /* --r3-text-brand #56653e */ 46 float a = 0.0; 47 vec3 col = ink; 48 /* 0 at the hairline (content side), 1 at the outer edge of the rail. */ 49 float outward = u_side < 0.5 ? 1.0 - v_uv.x : v_uv.x; 50 51 if (u_variant == 1) { 52 /* Ledger rules: a hairline every 8px, every fifth one darker. */ 53 float y = mod(c.y, 8.0); 54 if (y < 1.0 / u_dpr * 1.01) { 55 bool major = mod(floor(c.y / 8.0), 5.0) < 0.5; 56 a = major ? 0.11 : 0.055; 57 } 58 } else if (u_variant == 2) { 59 /* Dot register: a 1px dot on a 6px grid. */ 60 vec2 g = mod(c, 6.0); 61 if (abs(g.x - 3.0) < 0.5 && abs(g.y - 3.0) < 0.5) a = 0.16; 62 } else if (u_variant == 3 || u_variant == 7) { 63 /* Dither fade: ordered Bayer on 2px cells, dense at the outer edge and 64 gone at the hairline. 7 is the same in the brand olive. */ 65 ivec2 q = ivec2(floor(c / 2.0)); 66 float thr = float(bayer8(q)) / 64.0; 67 float t = outward * outward * (u_variant == 7 ? 0.8 : 0.9); 68 if (t > thr) { 69 a = u_variant == 7 ? 0.42 : 0.34; 70 if (u_variant == 7) col = olive; 71 } 72 } else if (u_variant == 4) { 73 /* Diagonal hatch: 45 degree hairlines on a 7px pitch. */ 74 float d = mod(c.x + c.y, 7.0); 75 if (d < 0.75) a = 0.10; 76 } else if (u_variant == 5) { 77 /* Paper tooth: device-pixel flecks, no shape, no grid. */ 78 vec2 px = floor(p); 79 float h = hash1(px + 9.0); 80 if (h < 0.10) a = 0.10 + 0.14 * hash1(px + 4.0); 81 } else if (u_variant == 6) { 82 /* Ruler ticks: a dotted spine down the middle, a tick every 40px, a long 83 one every 200. */ 84 float mid = u_res.x / u_dpr * 0.5; 85 if (abs(c.x - mid) < 0.5 && mod(c.y, 4.0) < 1.0) a = 0.22; 86 float ty = mod(c.y, 40.0); 87 if (ty < 1.0) { 88 bool long_ = mod(floor(c.y / 40.0), 5.0) < 0.5; 89 float len = long_ ? 18.0 : 8.0; 90 if (abs(c.x - mid) < len * 0.5) a = long_ ? 0.35 : 0.18; 91 } 92 } 93 94 a *= arrive(); 95 return vec4(col * a, a); 96} 97 98/* ââ THE FIELD âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 99 Returns premultiplied colour for one fragment of the scatter. */ 100vec4 field(vec2 p) { 101 vec2 cell = floor(p / u_cell); 102 vec2 inCell = (p - cell * u_cell) / u_cell; /* 0..1 within the cell */ 103 104 float h = hash1(cell); 105
106 /* Sparse: only some cells carry a dot at all, which is what gives the comp 107 its patchy, scattered look rather than an even halftone. 108 109 0.18, not 0.42. The first pass used 0.42 and the rails photographed as two 110 dense grey bands competing with the headline. In the comp this is barely 111 there: a light scatter you notice on the second look. 112 113 0.34, up from 0.18. Two changes compounded into an invisible field: the 114 cell went 11px -> 5px (so any given patch has ~4.8x the cells but each 115 dot is a quarter the area) AND the alpha was cut to match. 116 117 0.425, up from 0.34. life below takes cells all the way out and brings 118 them back, which costs about a fifth of the standing ink. Occupancy pays it 119 back so the MEAN density of the rail is where it was measured: 7.242 per 120 mille against the previous build's 7.218, on the left rail at 1600 x 900 121 dpr 2. The gate for this is ink coverage, not a pixel diff, because the 122 whole point of the change is that the pixels move. 123 124 0.32, down from 0.425 (2026-09-14, "the side grids seems too much to me 125 ... keep it for show and not take too much attention"). Measured against 126 the comp's own gutter rectangles (Rectangle 7 / Rectangle 10 in frame 127 215:13881, rendered at native 1440 x 11072): the comp carries 66.40 marks 128 per mille at a luminance threshold of 252 and the 0.425 build carried 129 85.79, so the count was about 30 percent over the source. This brings the 130 count back under the comp while the alpha cut below does the heavier 131 lifting, because the count was never the main offender. */ 132 if (h > 0.32) { 133 return vec4(0.0); 134 } 135 136 /* Below the cull on purpose: 57 percent of fragments never get here, and a 137 hash is a sin call. */ 138 float h2 = hash1(cell + 17.3); 139 float h3 = hash1(cell + 5.1); 140 float h4 = hash1(cell + 91.7); 141 float h5 = hash1(cell + 63.2); 142 143 /* ARRIVAL, PER CELL. This was one front sweeping down the rail, which reads 144 as a wipe: a moving edge with everything behind it already final. Each cell 145 now has its own start and its own duration, so the field assembles out of 146 nothing as scatter. A light top-down term survives in delay so the rail 147 still fills from the top rather than at random. */ 148 float delay = 0.14 * v_uv.y + 0.34 * h3; 149 float dur = 0.22 + 0.26 * h2; 150 float tIn = clamp((u_intro - delay) / dur, 0.0, 1.0); 151 if (tIn <= 0.0) { 152 return vec4(0.0); 153 } 154 float appear = 1.0 - pow(1.0 - tIn, 3.0); 155 /* The overshoot rides on SIZE, not on ink. A dot that flashes brighter than 156 its resting alpha reads as a blink; a dot that arrives 30 percent large and 157 settles reads as landing. */ 158 float pop = 1.0 + 0.30 * sin(3.14159 * tIn) * (1.0 - tIn); 159 160 /* VARIANCE AT REST. The old term moved every dot on the same 0.6 rad/s sine 161 at 12 percent, which averages into a field that photographs frozen. Each 162 cell now has its own rate and its own bias: the low-bias cells only 163 breathe, the high-bias ones go all the way out and come back, so the 164 scatter slowly re-deals itself instead of holding one arrangement. Periods 165 run 18 to 48 seconds, far too slow to catch in the act and far too slow to 166 read as twinkling. 167 168 Spread widened from 0.10 + 0.34 to 0.045 + 0.62 (2026-09-14, "make animate 169 variably"). The old band put every cell between 14 and 63 seconds, which 170 is a wide enough range on paper but narrow enough in practice that 171 neighbouring cells stayed roughly in step and the rail read as one slow 172 breath. The new band runs 10 to 140 seconds, so a cell beside a cell can
173 be an order of magnitude apart in period. That is what makes the field 174 look re-dealt rather than pulsed: the eye cannot find a common beat. */ 175 float rate = 0.045 + 0.62 * h4; 176 float wave = 0.5 + 0.5 * sin(u_time * rate + 6.2831 * h5); 177 /* Bias spread widened from 0.54 to 0.80 (2026-09-11, "more variable ... 178 idle states"). At the old spread almost every cell sat in the band where 179 life never leaves the middle, so the rail breathed as a whole and 180 photographed as one flat tone. Across a wider spread the extremes 181 separate: some cells now hold near solid, some drop out entirely and 182 return, and only the middle band breathes. Same mean ink, far more 183 variance between neighbours, which is what reads as alive when nothing is 184 moving fast enough to see. 185 186 Widened again to -0.32 + 0.86 (2026-09-14), for the same note. A wider 187 spread puts more cells at the two ends: more that sit out entirely for a 188 stretch and come back, more that simply hold. Both are what stops the 189 field reading as a single dimmer being turned. */ 190 float bias = -0.32 + 0.86 * h3; 191 float life = smoothstep(0.0, 0.38, wave - bias); 192 if (life <= 0.0) { 193 return vec4(0.0); 194 } 195 196 /* Dots sit slightly off-centre per cell so the field does not read as a grid. */ 197 vec2 jitter = vec2(h2, hash1(cell + 41.7)) * 0.34 - 0.17; 198 vec2 toCentre = inCell - (vec2(0.5) + jitter); 199 200 /* NO POINTER TERM. The field used to grow and green every dot within ~65 201 CSS px of the cursor ("i didnt fuckin ask this hover animation", 202 2026-09-11), then handed the cursor response to a pair of beetles, which 203 went on 2026-09-16 (see the header). The rail is purely ambient now. */ 204 float radius = 0.17 * (0.70 + 0.56 * h2) * pop * mix(0.82, 1.0, life); 205 /* ââ BLOCKS AND CROSSES âââââââââââââââââââââââââââââââââââââââââââââââââ 206 2026-09-18: "make it more like blocks and random cross". Two marks now: 207 208 block a crisp square, about a fifth larger than the old dot so it 209 reads as a block rather than a speck; roughly two thirds of 210 the marks. 211 cross a plus sign: two thin bars through the same centre, the arms 212 1.6x the block's half-width, the bar a third of it. The other 213 third of the marks, chosen per cell by hash so the mix is 214 scattered, not striped. 215 216 Both keep the half-pixel feather so they do not crawl on resize. */ 217 float d; 218 if (hash1(cell + 27.9) < 0.34) { 219 float arm = radius * 1.6; 220 float bar = max(radius * 0.36, 0.045); 221 vec2 a = abs(toCentre); 222 float horizontal = max(a.x - arm, a.y - bar); 223 float vertical = max(a.y - arm, a.x - bar); 224 d = min(horizontal, vertical) + radius; 225 } else { 226 d = max(abs(toCentre.x), abs(toCentre.y)) / 1.2; 227 } 228 float mask = 1.0 - smoothstep(radius - 0.06, radius + 0.06, d); 229 if (mask <= 0.0) { 230 return vec4(0.0); 231 } 232 233 vec3 col = u_dot; 234 /* ALPHA SET BY LOOKING, NOT BY ARITHMETIC. The first 5px pass reasoned that 235 ~4.8x the cells needed ~1/5 the alpha. That is right for total ink and 236 wrong for perception: each dot became a quarter of its old AREA *and* a 237 fifth of its old opacity, so no individual dot cleared the threshold of 238 being visible and the rail photographed as blank paper. 239 240 0.26 + 0.40, up from 0.17 + 0.23 (2026-09-11, "brighten the blocks"). The 241 spec calls the gutters "sparse, subtle by intent" and this is a deliberate 242 override of that line, asked for directly. The RANGE widens more than the 243 floor does: the point is that the blocks stop reading as one uniform dust 244 and start having loud cells and quiet cells, which is the other half of 245 the same note ("make it more variable"). Judged on a DPR-2 crop. 246 247 0.12 + 0.34, down from 0.26 + 0.40 (2026-09-14, "too much ... not take too 248 much attention"). This is the lever that actually mattered, and measuring 249 the comp is what identified it. Against Rectangle 7 / Rectangle 10 in 250 215:13881 at native resolution, the comp's DARKEST gutter pixel is 251 luminance 236: the source scatter is a whisper that never approaches real 252 ink. The 0.26 + 0.40 build reached 154, which is five times the depth 253 below white, and that weight is what read as "too much" far more than the 254 count did. The floor drops by more than half and the ceiling by a sixth, 255 so the ratio between a quiet cell and a loud one goes from 2.5x to 3.7x:
256 the field recedes AND gets more internal contrast, which is the pair the 257 note asks for. It is deliberately not taken all the way to the comp's 236, 258 because that value was already tried on 2026-09-11 and the verdict was 259 that the rails were "not visible at all". Judged on a DPR-2 crop and on 260 ink coverage, not arithmetic. */ 261 /* 0.08 + 0.24, down from 0.12 + 0.34 (2026-09-18, "dim this down a little 262 more"). Same ratio between quiet and loud cells, a third less weight. */ 263 float alpha = mask * appear * life * (0.08 + 0.24 * h2); 264 alpha = clamp(alpha, 0.0, 1.0); 265 266 return vec4(col * alpha, alpha); 267} 268 269void main() { 270 vec2 p = v_uv * u_res; 271 outColor = u_variant == 0 ? field(p) : candidate(p); 272}`,i=[.4,.4,.4],o=1/12;function s({canvas:e}){let t,a,i=(0,r.createQuadProgram)(e,n);if(!i)return null;let{gl:o,program:l}=i;return o.enable(o.BLEND),o.blendFunc(o.ONE,o.ONE_MINUS_SRC_ALPHA),{gl:o,u:{res:o.getUniformLocation(l,"u_res"),time:o.getUniformLocation(l,"u_time"),intro:o.getUniformLocation(l,"u_intro"),cell:o.getUniformLocation(l,"u_cell"),dot:o.getUniformLocation(l,"u_dot"),variant:o.getUniformLocation(l,"u_variant"),dpr:o.getUniformLocation(l,"u_dpr"),side:o.getUniformLocation(l,"u_side")},painted:-1,variant:function(e){let t=e.parentElement?.dataset.railVariant;if(void 0===t)return null;let a=Number.parseInt(t,10);return Number.isInteger(a)&&a>=0&&a<=7?a:null}(e)??(Number.isInteger(a=null===(t=new URLSearchParams(window.location.search).get("rail"))?1:Number.parseInt(t,10))&&a>=0&&a<=7?a:1),side:+!!e.parentElement?.classList.contains("r3-rails-right")}}function l(e,t){let{gl:a,u:r}=e,{elapsed:n,width:s,height:l,dpr:d}=t;(n<1.9||!(n-e.painted<o))&&(e.painted=n,a.viewport(0,0,a.drawingBufferWidth,a.drawingBufferHeight),a.clearColor(0,0,0,0),a.clear(a.COLOR_BUFFER_BIT),a.uniform2f(r.res,s*d,l*d),a.uniform1f(r.time,n),a.uniform1f(r.cell,5*d),a.uniform3f(r.dot,...i),a.uniform1i(r.variant,e.variant),a.uniform1f(r.dpr,d),a.uniform1f(r.side,e.side),a.uniform1f(r.intro,Math.min(n/1.5,1)),a.drawArrays(a.TRIANGLES,0,6))}function d({side:e,fold:i=!1,variant:o}){let h=(0,r.useCanvasLoop)({setup:s,draw:l,settleAfter:1.7,keepAlive:!0,version:n}),c=function(e){let[t]=(0,a.useState)(()=>{if(!e)return null;let t=performance.getEntriesByType("paint").find(e=>"first-contentful-paint"===e.name),a=t?performance.now()-t.startTime:0;return a>740?null:Math.max(0,360-a)});return t}(i);return(0,t.jsx)("div",{ref:h,"aria-hidden":!0,className:`r3-rails r3-rails-${e}${null===c?"":" r3-fold-draw"}`,"data-rail-variant":o,style:null===c?void 0:{animationDelay:`${c}ms`}})}function h(){let[e,t]=(0,a.useState)(!1);return(0,a.useEffect)(()=>{let e=window.matchMedia("(min-width: 1024px)"),a=()=>t(e.matches);return a(),e.addEventListener("change",a),()=>e.removeEventListener("change",a)},[]),e}e.s(["R3DotRails",0,function({fold:e=!1}={}){return h()?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(d,{side:"left",fold:e}),(0,t.jsx)(d,{side:"right",fold:e})]}):null},"R3RailPreview",0,function({variant:e}){return h()?(0,t.jsx)(d,{side:"left",variant:e}):null}])},1977,e=>{"use strict";var t=e.i(71645);function a(){return"1"===new URLSearchParams(window.location.search).get("still")}let r=()=>()=>{},n=()=>!1;e.s(["isStill",0,a,"useIsStill",0,function(){return(0,t.useSyncExternalStore)(r,a,n)}])},11274,e=>{"use strict";var t=e.i(71645),a=e.i(1977);e.s(["createQuadProgram",0,function(e,t){let a=e.getContext("webgl2",{alpha:!0,antialias:!1,premultipliedAlpha:!0,preserveDrawingBuffer:!1,powerPreference:"low-power"});if(!a)return null;let r=`#version 300 es 273 const vec2 verts[6] = vec2[6]( 274 vec2(-1.0, -1.0), vec2(1.0, -1.0), vec2(-1.0, 1.0), 275 vec2(-1.0, 1.0), vec2(1.0, -1.0), vec2(1.0, 1.0) 276 ); 277 out vec2 v_uv; 278 void main() { 279 vec2 p = verts[gl_VertexID]; 280 /* Flip Y so v_uv matches CSS coordinates: 0 at the top. */ 281 v_uv = vec2(p.x * 0.5 + 0.5, 0.5 - p.y * 0.5); 282 gl_Position = vec4(p, 0.0, 1.0); 283 }`,n=(e,t)=>{let r=a.createShader(e);return r?(a.shaderSource(r,t),a.compileShader(r),a.getShaderParameter(r,a.COMPILE_STATUS))?r:(a.deleteShader(r),null):null},i=n(a.VERTEX_SHADER,r),o=n(a.FRAGMENT_SHADER,t);
283if(!i||!o)return null;let s=a.createProgram();return s&&(a.attachShader(s,i),a.attachShader(s,o),a.linkProgram(s),a.deleteShader(i),a.deleteShader(o),a.getProgramParameter(s,a.LINK_STATUS))?(a.useProgram(s),{gl:a,program:s}):null},"useCanvasLoop",0,function({setup:e,draw:r,settleAfter:n=1/0,keepAlive:i=!1,trackPointer:o=!1,pointerHold:s=0,startMargin:l="10% 0px",version:d=""}){let h=(0,t.useRef)(null),c=(0,t.useRef)(e),u=(0,t.useRef)(r);return(0,t.useEffect)(()=>{c.current=e,u.current=r}),(0,t.useEffect)(()=>{let e=h.current;if(!e)return;let t=document.createElement("canvas");t.style.display="block",t.style.width="100%",t.style.height="100%",t.style.visibility="hidden",e.appendChild(t);let r=c.current({canvas:t});if(null===r)return void t.remove();let d=()=>{e.dataset.canvas="live",t.style.visibility=""},m=()=>{delete e.dataset.canvas,t.style.visibility="hidden"},f=0,p=0,v=1,g=null,w=null,b=!1,x=0,y=0,k=1/0,_=0,E=null,R=0,T=!1,S=!1,N=()=>{let a=e.getBoundingClientRect();x=a.left,y=a.top;let r=Math.min(window.devicePixelRatio||1,2),n=Math.max(1,Math.round(a.width)),i=Math.max(1,Math.round(a.height));(n!==f||i!==p||r!==v)&&(f=n,p=i,t.width=Math.round(n*(v=r)),t.height=Math.round(i*v),S=!1)},A=e=>{let t=null===E?0:Math.min((e-E)/1e3,1/15);E=e,_+=t,k+=t,N(),w&&(g={x:w.x-x,y:w.y-y},s>0&&!b&&g.x>=-s&&g.y>=-s&&g.x<=f+s&&g.y<=p+s&&(k=0));let a=null===g?0:Math.max(0,1-k/.7);if(u.current(r,{elapsed:_,width:f,height:p,dpr:v,pointer:g,pointerFade:
283a}),d(),a<=0&&(g=null,w=null),!i&&_>=n&&a<=0){S=!0,R=0;return}R=requestAnimationFrame(A)},L=()=>{R||!T||S||(E=null,R=requestAnimationFrame(A))},I=()=>{R&&(cancelAnimationFrame(R),R=0)},j=(0,a.isStill)(),q=j||window.matchMedia("(prefers-reduced-motion: reduce)").matches;if(j)return N(),_=Number.isFinite(n)?n:1,u.current(r,{elapsed:_,width:f,height:p,dpr:v,pointer:null,pointerFade:0}),d(),S=!0,()=>{t.remove(),m()};let M=e=>{e.preventDefault(),I(),m()},C=()=>{let e=c.current({canvas:t});if(null!==e){if(Object.assign(r,e),q){N(),_=Number.isFinite(n)?n:1,u.current(r,{elapsed:_,width:f,height:p,dpr:v,pointer:null,pointerFade:0}),d(),S=!0;return}S=!1,_=0,E=null,L()}};t.addEventListener("webglcontextlost",M),t.addEventListener("webglcontextrestored",C);let P=new IntersectionObserver(e=>{if(!(T=e.some(e=>e.isIntersecting)))return void I();if(q){N(),_=Number.isFinite(n)?n:1,u.current(r,{elapsed:_,width:f,height:p,dpr:v,pointer:null,pointerFade:0}),d(),S=!0;return}L()},{rootMargin:l});P.observe(e);let O=new ResizeObserver(()=>{(N(),q||S)?u.current(r,{elapsed:_,width:f,height:p,dpr:v,pointer:null,pointerFade:0}):L()});O.observe(e);let B=t=>{let a=e.getBoundingClientRect();w={x:t.clientX,y:t.clientY},g={x:t.clientX-a.left,y:t.clientY-a.top},b=!1,k=0,q||(S=!1,L())},F=e=>{null===e.relatedTarget&&(b=!0,k=.7)};return o&&!q&&(window.addEventListener("pointermove",B,{passive:!0}),window.addEventListener("pointerout",F,{passive:!0})),()=>{I(),P.disconnect(),O.disconnect(),o&&!q&&(window.removeEventListener("pointermove",B),window.removeEventListener("pointerout",F)),t.removeEventListener("webglcontextlost",M),t.removeEventListener("webglcontextrestored",C),t.remove(),m()}},[n,i,o,s,l,d]),h}])},54805,e=>{"use strict";var t=e.i(71645),a=e.i(1977);let r={threshold:.12,rootMargin:"0px 0px -5% 0px"};e.s(["R3_REVEAL_OBSERVER",0,r,"useR3Reveal",0,function(){(0,t.useEffect)(()=>{let e=window.matchMedia("(prefers-reduced-motion: reduce)").matches,t=e=>e.setAttribute("data-r3-reveal","in"),n=(0,a.isStill)();if(e||n){let e=e=>e.querySelectorAll("[data-r3-reveal]").forEach(t);e(document);let a=n?new MutationObserver(()=>e(document)):null;return a?.observe(document.body,{childList:!0,subtree:!0}),()=>a?.disconnect()}let i=new IntersectionObserver(e=>{for(let a of e)a.isIntersecting&&(t(a.target),i.unobserve(a.target))},r),o=e=>{if("in"!==e.getAttribute("data-r3-reveal")){if((e=>{for(let t=e.parentElement;t&&t!==document.body;t=t.parentElement){let e=getComputedStyle(t).overflowX;if("auto"===e||"scroll"===e)return!0}return!1})(e)||(e=>{let t=e.getBoundingClientRect();if(0===t.height)return!1;let a=.95*window.innerHeight;return(Math.min(t.bottom,a)-Math.max(t.top,0))/t.height>=r.threshold})(e))return void t(e);e.setAttribute("data-r3-reveal","pending"),i.observe(e)}},s=e=>{e instanceof Element&&e.hasAttribute("data-r3-reveal")&&o(e),e.querySelectorAll("[data-r3-reveal]").forEach(o)};s(document);let l=new MutationObserver(e=>{for(let t of e)for(let e of t.addedNodes)e.nodeType===Node.ELEMENT_NODE&&s(e)});return l.observe(document.body,{childList:!0,subtree:!0}),()=>{i.disconnect(),l.disconnect()}},[])}])},18210,e=>{"use strict";var t=e.i(43476),a=e.i(71645),r=e.i(12240),n=e.i(57444);let i=[{index:"01",question:"What is the world model?",answer:"One graph of your codebase and the work around it: the code, the pull requests, the review threads, the incidents and the sessions your agents run. Every product reads from that one index instead of keeping a private copy. That is why a review can cite the specific past incident a diff would re-create."},{index:"02",question:"What does the Model Router actually do?",answer:"It picks a model per turn, not per project. Each turn is scored against a quality floor you set, and the cheapest model that clears it does the work, while anything that does not clear it escalates. The saving comes out of the routing, never out of the answer.",link:{label:"How the router decides",href:"/model-router"}},{index:"03",question:"Where do the $0.18 and $0.41 numbers come from?",answer:"They are cost per verified bug found, measured in our 2026 benchmark, not a blended token price. The task set, the method and the per-model results are all published. Read it and disagree with it if the method does not hold for your co
283debase.",link:{label:"Read the benchmark report",href:"/entelligence-benchmark-report-2026"}},{index:"04",question:"What can I actually measure once it is on?",answer:"Cost per session and per merged pull request, which model handled what share of turns, review coverage across your repos, and how often a past incident is cited before it repeats. Every figure is broken out per repo and per team, so the numbers belong to a codebase rather than to an average."},{index:"05",question:"Do I have to change how my team works?",answer:"No. It connects to the repos and pull requests you already have, and the reviews and the routing happen inside that flow. Nobody has to open a new tool for the index to start building."},{index:"06",question:"Is this a surveillance tool for managers?",answer:"No. The measurements are about the work, cost per session, review coverage, incidents that repeat, and not about ranking people. Access is role based, and the point of the memory is that the next engineer does not have to relearn what the last one already paid for."},{index:"07",question:"Is my code safe?",answer:"SOC 2 Type II and GDPR, no training on customer code, secrets encrypted at rest, and role-based access. Your code is only ever used for your own organization. If that is still not enough, self-hosted and bring-your-own-key deployments are both supported."},{index:"08",question:"How much does it cost to start?",answer:"You can sign up, connect a repo and watch the world model build without talking to anyone first. Paid plans are banded by team size and the number of reviews you run each month, and enterprise is scoped with you. The current numbers live on the pricing page, where they stay correct.",link:{label:"See pricing",href:"/pricing"}}];function o({id:e,titleId:a="r3-faq-title",title:i,sub:l,aside:d,entries:h,schema:c=!1}){return(0,t.jsxs)("section",{id:e,"aria-labelledby":a,className:"relative border-t border-r3-border-subtle px-6 py-16 sm:px-8 sm:py-[4.5rem] lg:px-12 lg:py-20",children:[c?(0,t.jsx)(r.JsonLd,{data:(0,n.faqJsonLd)(h.map(({question:e,answer:t})=>({question:e,answer:t})))}):null,(0,t.jsxs)("div",{className:"mx-auto grid max-w-[74rem] gap-10 lg:grid-cols-[420fr_732fr] lg:gap-x-8",children:[(0,t.jsxs)("div",{className:"lg:pt-6","data-r3-reveal":"",style:{"--r3-reveal-i":0},children:[(0,t.jsx)("h2",{id:a,className:"r3-display text-[1.625rem] leading-[1.12] tracking-[-0.026em] text-balance text-r3-text sm:text-[1.7921rem] sm:leading-[1.1]",children:i}),l?(0,t.jsx)("p",{className:"mt-4 max-w-[23.75rem] text-[1rem] leading-[1.625] font-medium tracking-[-0.01em] text-pretty text-r3-text-muted",children:l}):null,d?(0,t.jsx)("div",{className:"mt-6",children:d}):null]}),(0,t.jsx)("ul",{className:"border-b border-r3-border-brand",children:h.map((e,a)=>(0,t.jsx)(s,{entry:e,revealIndex:a+1},e.index))})]})]})}function s({entry:e,revealIndex:r}){let[n,i]=(0,a.useState)(!1),o=(0,a.useId)(),l=`${o}-q`,d=`${o}-a`;return(0,t.jsxs)("li",{className:"not-first:border-t not-first:border-r3-border-brand","data-r3-reveal":"",style:{"--r3-reveal-i":r},children:[(0,t.jsxs)("button",{type:"button",id:l,"aria-expanded":n,"aria-controls":d,"data-interaction":"faq_open","data-interaction-item":e.index,onClick:()=>i(e=>!e),className:"group flex min-h-[3.5rem] w-full cursor-pointer items-start gap-3 py-4 text-left transition-colors duration-[180ms] hover:bg-r3-surface-brand focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-r3-text-brand sm:px-3",children:[(0,t.jsx)("span",{className:"mt-1 w-8 shrink-0 text-right font-r3-mono text-[0.875rem] leading-4 font-bold text-r3-text-brand",children:e.index}),(0,t.jsx)("span",{className:"flex-1 text-[1rem] leading-6 font-semibold text-r3-text-brand",children:e.question}),(0,t.jsx)("span",{"aria-hidden":!0,className:`mt-1 shrink-0 text-r3-text-muted transition-[transform,color] duration-[240ms] ease-[cubic-bezier(0.16,1,0.3,1)] group-hover:text-r3-text-brand motion-reduce:transition-none ${n?"rotate-45":"rotate-0"}`,children:(0,t.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",focu
283sable:"false",children:(0,t.jsx)("path",{d:"M2.5 8h11M8 2.5v11",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})})]}),(0,t.jsx)("div",{className:"grid transition-[grid-template-rows] duration-[420ms] ease-[cubic-bezier(0.16,1,0.3,1)] motion-reduce:transition-none",style:{gridTemplateRows:n?"1fr":"0fr"},children:(0,t.jsx)("div",{id:d,role:"region","aria-labelledby":l,inert:!n,className:"overflow-hidden",children:(0,t.jsxs)("div",{className:"pr-7 pb-5 pl-11 sm:pl-14",children:[(0,t.jsx)("p",{className:"max-w-[38rem] text-[0.9375rem] leading-[1.65] text-pretty text-r3-text-secondary",children:e.answer}),e.link?(0,t.jsxs)("a",{href:e.link.href,className:"mt-2 -my-3 inline-flex items-center gap-1 py-3 text-[0.875rem] font-semibold text-r3-text-brand","data-r3-dash-host":"",children:[(0,t.jsx)("span",{className:"r3-dash-link",children:e.link.label}),(0,t.jsx)("span",{"aria-hidden":!0,children:"â"})]}):null]})})})]})}e.s(["Faq",0,function(){return(0,t.jsx)(o,{id:"home-faq",title:(0,t.jsx)(t.Fragment,{children:"What youâd ask before pointing this at your co
283debase."}),sub:(0,t.jsx)(t.Fragment,{children:"Got a question we missed? Weâre one message away."}),entries:i,schema:!0})},"R3FaqBlock",0,o],18210)},15843,e=>{"use strict";var t=e.i(54805);e.s(["R3RevealRuntime",0,function(){return(0,t.useR3Reveal)(),null}])},70337,20711,e=>{"use strict";var t=e.i(43476),a=e.i(57688),r=e.i(59476);function n(e,t,a=80){let i;if(!(0,r.isImageKitUrl)(e))return e;if((0,r.shouldPreserveOriginal)(e)){let t;if(!(0,r.isImageKitUrl)(e)||!(0,r.shouldPreserveOriginal)(e))return e;try{t=new URL(e)}catch{return e}if(t.pathname.includes("/tr:orig")||/(^|,)orig-true(,|$)/.test(t.searchParams.get("tr")||""))return e;let a=t.pathname.split("/").filter(Boolean);if(a.length<2)return e;let n=a[0],i=a.slice(1).join("/");return t.pathname=`/${n}/tr:orig-true/${i}`,t.toString()}try{i=new URL(e)}catch{return e}if(i.pathname.includes("/tr:"))return e;let o=i.pathname.split("/").filter(Boolean);if(o.length<2)return e;let s=o[0],l=o.slice(1).join("/"),d=Math.max(1,Math.min(Math.round(t),1920)),h=Math.max(1,Math.min(Math.round(a),100)),c=i.searchParams.get("tr");i.searchParams.delete("tr");let u=`tr:${c?`${c}:`:""}w-${d},q-${h},f-auto`;return i.pathname=`/${s}/${u}/${l}`,i.toString()}function i({src:e,width:t,quality:a}){return n(e,t,a??80)}e.s(["imageKitLoader",0,i,"withImageKitTransform",0,n],20711),e.s(["Media",0,function({alt:e,decorative:n=!1,...o}){let s="string"==typeof o.src?o.src:null;return(0,t.jsx)(a.default,{...o,...s&&(0,r.isImageKitUrl)(s)&&!o.loader?{loader:i}:{},unoptimized:o.unoptimized??(s?(0,r.shouldPreserveOriginal)(s):void 0),alt:n?"":e?.trim()??"",...n?{"aria-hidden":!0}:{}})}],70337)},57444,e=>{"use strict";e.i(36156).siteConfig.url,e.s(["faqJsonLd",0,function(e){return{"@context":"https://schema.org","@type":"FAQPage",mainEntity:e.map(e=>({"@type":"Question",name:e.question,acceptedAnswer:{"@type":"Answer",text:e.answer}}))}}])}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.