[{"data":1,"prerenderedAt":87},["ShallowReactive",2],{"api:\u002Fapi\u002Fconfig:en":3,"api:\u002Fapi\u002Fnotes:en":8,"api:\u002Fapi\u002Fprojects\u002Flanding-3d:en":32},{"email":4,"lang":5,"name":6,"role":7},"hello@ewsirdev.example","en","Ewsirdev","Web developer: websites, landing pages and Go services",[9,16,22,27],{"slug":10,"lang":5,"title":11,"date":12,"summary":13,"project":14,"minutes":15},"double-booking","Double booking: a transaction plus a partial UNIQUE index","2026-10-20","How booking-slots protects against two clients booking the same time at once, and how that protection is tested.","booking-slots",1,{"slug":17,"lang":5,"title":18,"date":12,"summary":19,"project":20,"minutes":21},"lease-and-fencing","Lease and fencing: how a queue neither loses a job nor lets a zombie finish it twice","A worker can crash, stall, or wake up after its job was taken by someone else. How the lease and the lease token in job-queue deal with that on SQLite.","job-queue",2,{"slug":23,"lang":5,"title":24,"date":12,"summary":25,"project":26,"minutes":21},"p95-nearest-rank","p95 in an uptime monitor: the nearest-rank method and what it does not hide","How uptime-monitor computes p50\u002Fp95 latency and uptime, why the nearest-rank method was chosen, and where those numbers can mislead.","uptime-monitor",{"slug":28,"lang":5,"title":29,"date":12,"summary":30,"project":31,"minutes":21},"websocket-from-scratch","WebSocket on the standard library: what really happens under new WebSocket()","Why realtime-rooms has its own RFC 6455 layer, which protocol violations it checks, and why a library is still the better choice for production.","realtime-rooms",{"slug":33,"title":34,"type":35,"stack":36,"description":45,"highlights":46,"run":51,"hue":52,"og":53,"shots":54,"case":62,"case_lang":5,"prev":81,"next":84},"landing-3d","OKSO T1: 3D landing page","landing",[37,38,39,40,41,42,43,44],"HTML5","CSS3","Vanilla JS","WebGL2","GLSL ES 3.00","Raymarching\u002FSDF","Scroll choreography","GitHub Actions","A landing page for a fictional air sensor (demo): the object is drawn by one fragment shader on plain WebGL2 with no libraries, four SDF shapes morph on scroll, with an SVG fallback, reduced-motion support and a pause when off screen.",[47,48,49,50],"One fragment shader, WebGL2 without libraries","Four SDF shapes morphing on scroll","SVG fallback and prefers-reduced-motion","Rendering pauses off screen","cd landing-3d && python -m http.server 8094",90,"\u002Fog\u002Fen\u002Flanding-3d.jpg",{"desktop":55,"desktop_sm":56,"mobile":57,"dw":58,"dh":59,"mw":60,"mh":61},"\u002Fshots\u002Flanding-3d-desktop.webp","\u002Fshots\u002Flanding-3d-desktop-sm.webp","\u002Fshots\u002Flanding-3d-mobile.webp",1280,800,390,844,{"about":63,"features":66,"run":74,"notes":78},[64,65],"A landing page for a fictional air sensor, OKSO T1. The product, company, clients and figures do not exist, and the page marks this as a demo.","The object is drawn by one fragment shader on plain WebGL2 with no libraries: about 250 lines of JavaScript and GLSL ES 3.00. Four SDF shapes morph into one another as you scroll.",[67,68,69,70,71,72,73],"Raymarching over signed distance fields (SDF): a sphere, a torus, a rounded box with a dimple and a wavy sphere; morphing by mixing the distances","Scroll choreography: a sticky section 420svh tall, with the value smoothed exponentially","Lighting in the shader: a normal from the SDF, ambient occlusion, a procedural studio environment, fresnel and a highlight","The device pixel ratio is capped, and when frames take longer than 26 ms the resolution drops automatically","Rendering runs only while the scene is on screen (IntersectionObserver) and the tab is visible","An SVG fallback without WebGL2 or after a lost context; prefers-reduced-motion support","The demo form is validated on the client and sends nothing; link checks run in GitHub Actions",[75,76,77],"git clone \u003Crepository on request> landing-3d","cd landing-3d","python -m http.server 8094   # http:\u002F\u002Flocalhost:8094",[79,80],"Performance on a real GPU was not measured: the scene was checked on a software renderer (SwiftShader).","The brand, copy and kits are made up; there are no real clients or testimonials. Fonts come from Google Fonts and fall back to system fonts when offline.",{"slug":82,"title":83},"notes-search","Card Index: notes with search",{"slug":85,"title":86},"raft-kv","Raft KV: a key-value store on Raft",1792697892726]