[{"data":1,"prerenderedAt":93},["ShallowReactive",2],{"api:\u002Fapi\u002Fconfig:en":3,"api:\u002Fapi\u002Fnotes:en":8,"api:\u002Fapi\u002Fprojects\u002Fgitpulse: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":47,"highlights":48,"run":53,"hue":54,"og":55,"shots":56,"case":64,"case_lang":5,"prev":87,"next":90},"gitpulse","GitPulse: git repository analytics","cli",[37,38,39,40,41,42,43,44,45,46],"Go","stdlib only","CLI","git","html\u002Ftemplate","SVG","ANSI","os\u002Fexec","GitHub Actions","Docker","A Go CLI that analyzes git repositories with no external dependencies (only git is needed): stats with colors and sparklines in the terminal, report, a self-contained HTML report with an activity heatmap, churn and hot files, author contributions, bus factor per directory, code growth by language and quiet periods (light and dark themes), diff-hotspots between revisions and a local serve on 127.0.0.1. History is read as a stream through git log -z --numstat -M. A side project.",[49,50,51,52],"Go stdlib only, a single external binary: git","A git log -z --numstat -M stream with .mailmap and renames handled","A self-contained HTML report: heatmap, churn, bus factor, light and dark themes","A synthetic history of 100,000 commits is analyzed in about 5 seconds","cd gitpulse && go run .\u002Fcmd\u002Fgitpulse stats .",7,"\u002Fog\u002Fen\u002Fgitpulse.jpg",{"desktop":57,"desktop_sm":58,"mobile":59,"dw":60,"dh":61,"mw":62,"mh":63},"\u002Fshots\u002Fgitpulse-desktop.webp","\u002Fshots\u002Fgitpulse-desktop-sm.webp","\u002Fshots\u002Fgitpulse-mobile.webp",1280,800,390,844,{"about":65,"features":68,"run":77,"notes":82},[66,67],"GitPulse is a console utility in Go for analyzing git repositories: from the commit history it shows where the work is happening, which files change most often, who contributed how much and in which directories the knowledge rests on one person. A side project.","Go standard library only, with a single external binary: git. History is read as a stream through git log -z --numstat -M (via os\u002Fexec): no own packfile parser was written, because .mailmap, shallow clones and rename detection are needed and git already solves them reliably. The result is the same for the terminal, HTML and JSON.",[69,70,71,72,73,74,75,76],"The stats command: a summary, weekly activity with sparklines, churn, hot files with risk, authors, bus factor, commit sizes, languages and quiet periods in the terminal with colors and ANSI (NO_COLOR and -color auto|always|never are honored)","The report command: a self-contained single-file HTML report with no external requests: an activity heatmap, churn, author contributions, bus factor per directory, code growth by language, quiet periods, light and dark themes, SVG charts","The diff-hotspots \u003Crev1>..\u003Crev2> command: hot files and author contributions inside a revision range","The serve command: the report in a browser on 127.0.0.1 (loopback addresses only), a Host header check against DNS rebinding, CSP, a cached result, \u002Fapi\u002Fstats and \u002Fhealthz","A streaming parse of git log -z --numstat -M: one commit lives in memory, paths with tabs and Cyrillic do not break, renames are followed (the history of the old path is credited to the new one), and .mailmap is honored through %aN\u002F%aE","The flags -json, -since, -until, -max-commits, -top, -depth, -include-generated, -quiet and -color; lock files, vendor\u002F, node_modules\u002F and min files are skipped by default; exit codes 0\u002F1\u002F2\u002F3\u002F130","Tests build synthetic repositories through git and compare the metrics with precomputed numbers; a golden test of the HTML structure and a check that the report is self-contained and escaped","Cross-builds for windows, linux and darwin with scripts\u002Fbuild.sh, CI in GitHub Actions and a Dockerfile; a synthetic history of 100,000 commits is analyzed in about 5 seconds",[78,79,80,81],"git clone \u003Crepository on request> gitpulse","cd gitpulse","go run .\u002Fcmd\u002Fgitpulse stats .                   # tables in the terminal (git must be in PATH)","go run .\u002Fcmd\u002Fgitpulse report -o report.html .  # a single-file HTML report",[83,84,85,86],"Git must be installed. Time is the author's UTC time, the author's time zone is not taken into account; merges are not analyzed, so work visible only in a merge is lost.","Language growth is an estimate of \"added minus removed\" by extension, not a snapshot of the tree. Bus factor and risk are heuristics over line counts in commits, not real knowledge of the code; refactorings and mass edits distort them.","Memory grows with the number of files and authors; very large repositories need -max-commits and -since. -json includes author e-mails and the HTML does not, but names are in the report, so review it before publishing.","Tests do not run on macOS in CI (no runner was available) and darwin is cross-compiled; tests with -race run only in CI; the Dockerfile was not verified.",{"slug":88,"title":89},"pixel-wall","Pixel Wall: a shared canvas",{"slug":91,"title":92},"legal-multipage-site","Multi-page legal services website",1792697892726]