[{"data":1,"prerenderedAt":81},["ShallowReactive",2],{"api:\u002Fapi\u002Fconfig:en":3,"api:\u002Fapi\u002Fnotes:en":8,"api:\u002Fapi\u002Fprojects\u002Flegal-multipage-site: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":46,"highlights":47,"run":54,"hue":55,"og":56,"shots":57,"case":65,"case_lang":5,"prev":75,"next":78},"legal-multipage-site","Multi-page legal services website","site",[37,38,39,40,41,42,43,44,45],"Nuxt 4","Vue 3","TypeScript","Bootstrap 5","Zod","Vitest","Playwright","Docker","GitHub Actions","A delivered website for a legal and expert-appraisal firm built with Nuxt 4: 65 server-rendered pages, JSON-LD markup and 301 redirects from the previous site. Lead requests go through a server endpoint that checks Origin, caps body size and rate-limits clients.",[48,49,50,51,52,53],"65 SSR routes, generated sitemap.xml and robots.txt; indexing is switched on by an explicit env flag","Lead form: server endpoint with Origin check, 10 KB body cap, 3 requests per 10 minutes per IP, honeypot and optional captcha","JSON-LD: LegalService, WebSite, BreadcrumbList","Single-hop 301 redirects from legacy URLs and trailing slashes, security headers (CSP, HSTS)","CI\u002FCD: lint, typecheck, Vitest, build, Playwright; then a Docker image and server deploy","210 unit tests in 13 files and 4 e2e spec files","npm install && npm run build && node .output\u002Fserver\u002Findex.mjs",250,"\u002Fog\u002Fen\u002Flegal-multipage-site.jpg",{"desktop":58,"desktop_sm":59,"mobile":60,"dw":61,"dh":62,"mw":63,"mh":64},"\u002Fshots\u002Flegal-multipage-site-desktop.webp","\u002Fshots\u002Flegal-multipage-site-desktop-sm.webp","\u002Fshots\u002Flegal-multipage-site-mobile.webp",1280,800,390,844,{"about":66,"features":67,"run":68,"notes":70},[46],[48,49,50,51,52,53],[54,69],"# placeholder env values: NITRO_PRESET=node-server PORT=3310 NUXT_ALLOWED_ORIGIN=http:\u002F\u002Flocalhost:3310 NUXT_BITRIX_WEBHOOK_URL=http:\u002F\u002F127.0.0.1:9\u002F ; for development: npm run dev",[71,72,73,74],"This is a client site: the client name and contacts are not used in the card text; screenshots show the site itself.","Screenshots were taken from a local build with placeholder env values; no forms were submitted.","Figures and claims from the site content belong to the client and are not quoted in the card.","The local repository copy was shown, not the latest version.",{"slug":76,"title":77},"gitpulse","GitPulse: git repository analytics",{"slug":79,"title":80},"bad-club-booking-app","Bad Club: seat booking for a gaming coworking space",1792697892726]