[{"data":1,"prerenderedAt":288},["ShallowReactive",2],{"blog-posts":3},[4,56,225],{"id":5,"title":6,"body":7,"date":44,"description":45,"extension":46,"meta":47,"navigation":48,"path":49,"seo":50,"stem":51,"tags":52,"__hash__":55},"blog\u002Fblog\u002Falert-fatigue-is-a-design-problem.md","Alert fatigue is a design problem, not a tuning problem",{"type":8,"value":9,"toc":38},"minimark",[10,14,17,22,25,28,32,35],[11,12,13],"p",{},"Every on-call engineer knows the feeling: a 3am page for something that resolves itself in ninety seconds. Do it enough times and the instinct kicks in — glance at the phone, see it's \"probably nothing,\" go back to sleep. That instinct is exactly how the alert that matters gets missed.",[11,15,16],{},"The usual fix is tuning: raise the threshold, add a longer evaluation window, require three consecutive failures instead of one. That helps, but it's treating the symptom. The actual problem is upstream — most alerting setups don't distinguish between \"something changed\" and \"something is broken.\"",[18,19,21],"h2",{"id":20},"two-different-questions","Two different questions",[11,23,24],{},"\"Is this metric outside its normal range?\" is a monitoring question. \"Does a human need to act on this right now?\" is an alerting question. They're not the same question, and treating every anomaly as page-worthy is what causes fatigue in the first place.",[11,26,27],{},"A CPU spike at 2am might be a real problem or a scheduled batch job. A single failed health check might be a real outage or a network blip. The alert that matters is the one correlated with actual user impact — requests failing, latency crossing a threshold users would notice, a dependency actually being unreachable.",[18,29,31],{"id":30},"what-we-optimize-for","What we optimize for",[11,33,34],{},"This is the design question behind Reliable Uptime's alerting: not \"how sensitive can we make the check,\" but \"how do we only wake someone up when it's real.\" Retries before declaring something down, checks from multiple regions before trusting a single failed probe, and alert routing that matches severity to urgency instead of treating every check the same way.",[11,36,37],{},"None of this is a novel idea — it's standard SRE practice. It's just surprising how often monitoring tools skip it in favor of a simpler \"threshold crossed, send alert\" model that looks fine in a demo and generates fatigue within a month of real production traffic.",{"title":39,"searchDepth":40,"depth":40,"links":41},"",2,[42,43],{"id":20,"depth":40,"text":21},{"id":30,"depth":40,"text":31},"2026-07-08","Most teams respond to alert fatigue by tuning thresholds. That treats the symptom. The real fix is deciding what actually deserves a page.","md",{},true,"\u002Fblog\u002Falert-fatigue-is-a-design-problem",{"title":6,"description":45},"blog\u002Falert-fatigue-is-a-design-problem",[53,54],"monitoring","engineering","QEK_02Ledenjejm6TjdGzXbz_bHD9bLGo2X6fQkkIHo",{"id":57,"title":58,"body":59,"date":216,"description":217,"extension":46,"meta":218,"navigation":48,"path":219,"seo":220,"stem":221,"tags":222,"__hash__":224},"blog\u002Fblog\u002Fwhy-gload-is-yaml-first.md","Why Gload is YAML-first",{"type":8,"value":60,"toc":211},[61,64,67,71,182,185,189,192,196,207],[11,62,63],{},"Most load testing tools ask you to write a script before you can run a test. That's the right choice for complex, branching scenarios — but most load tests aren't complex. Most are: hit this endpoint, at this rate, for this long, and tell me what broke.",[11,65,66],{},"Gload starts from that second case.",[18,68,70],{"id":69},"a-test-is-data-not-a-program","A test is data, not a program",[72,73,77],"pre",{"className":74,"code":75,"language":76,"meta":39,"style":39},"language-yaml shiki shiki-themes github-light github-dark","scenario: checkout-flow\ntarget: api.example.com\nduration: 30s\nvus: 50\n\nstages:\n  - ramp: 10s\n    to: 50\n  - hold: 20s\n","yaml",[78,79,80,97,107,118,130,136,145,159,169],"code",{"__ignoreMap":39},[81,82,85,89,93],"span",{"class":83,"line":84},"line",1,[81,86,88],{"class":87},"s9eBZ","scenario",[81,90,92],{"class":91},"sVt8B",": ",[81,94,96],{"class":95},"sZZnC","checkout-flow\n",[81,98,99,102,104],{"class":83,"line":40},[81,100,101],{"class":87},"target",[81,103,92],{"class":91},[81,105,106],{"class":95},"api.example.com\n",[81,108,110,113,115],{"class":83,"line":109},3,[81,111,112],{"class":87},"duration",[81,114,92],{"class":91},[81,116,117],{"class":95},"30s\n",[81,119,121,124,126],{"class":83,"line":120},4,[81,122,123],{"class":87},"vus",[81,125,92],{"class":91},[81,127,129],{"class":128},"sj4cs","50\n",[81,131,133],{"class":83,"line":132},5,[81,134,135],{"emptyLinePlaceholder":48},"\n",[81,137,139,142],{"class":83,"line":138},6,[81,140,141],{"class":87},"stages",[81,143,144],{"class":91},":\n",[81,146,148,151,154,156],{"class":83,"line":147},7,[81,149,150],{"class":91},"  - ",[81,152,153],{"class":87},"ramp",[81,155,92],{"class":91},[81,157,158],{"class":95},"10s\n",[81,160,162,165,167],{"class":83,"line":161},8,[81,163,164],{"class":87},"    to",[81,166,92],{"class":91},[81,168,129],{"class":128},[81,170,172,174,177,179],{"class":83,"line":171},9,[81,173,150],{"class":91},[81,175,176],{"class":87},"hold",[81,178,92],{"class":91},[81,180,181],{"class":95},"20s\n",[11,183,184],{},"That's a complete load test. No imports, no boilerplate, nothing to compile. If you can read a YAML file, you can read what this test does — which matters as much for code review as it does for running it yourself.",[18,186,188],{"id":187},"inspired-by-k6-not-cloning-it","Inspired by k6, not cloning it",[11,190,191],{},"k6's scripting model is genuinely good for the scenarios that need it — multi-step flows, custom logic, complex assertions. We're not trying to replace that. Gload is for the far more common case where you don't need a scripting language at all, and shouldn't have to reach for one to get started.",[18,193,195],{"id":194},"where-we-are","Where we are",[11,197,198,199,206],{},"Gload is early and in active development — the example above shows the direction, not a finished feature set. We'll post here as pieces land. If you want to follow along, we're on ",[200,201,205],"a",{"href":202,"rel":203},"https:\u002F\u002Fgithub.com\u002Finfwrite",[204],"nofollow","GitHub",".",[208,209,210],"style",{},"html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":39,"searchDepth":40,"depth":40,"links":212},[213,214,215],{"id":69,"depth":40,"text":70},{"id":187,"depth":40,"text":188},{"id":194,"depth":40,"text":195},"2026-06-29","Load testing tools tend to make you choose between power and simplicity. We don't think that's a real tradeoff.",{},"\u002Fblog\u002Fwhy-gload-is-yaml-first",{"title":58,"description":217},"blog\u002Fwhy-gload-is-yaml-first",[223,54],"gload","YCXMKZ6eLS8HfExFVw0iwQCdAEv_McOdaKcJ3G0ELEA",{"id":226,"title":227,"body":228,"date":279,"description":280,"extension":46,"meta":281,"navigation":48,"path":282,"seo":283,"stem":284,"tags":285,"__hash__":287},"blog\u002Fblog\u002Fintroducing-infwrite.md","Introducing Infwrite",{"type":8,"value":229,"toc":275},[230,233,237,240,243,253,262,266,269,272],[11,231,232],{},"Infwrite is not a product. It's the brand behind a small, focused set of tools for software reliability, monitoring and performance engineering.",[18,234,236],{"id":235},"why-an-umbrella-brand","Why an umbrella brand",[11,238,239],{},"Most developer tool companies start with one product and bolt on adjacent features as they grow. We're doing the opposite: building a set of focused products that each solve one problem well, under one brand that stands for a consistent bar of quality.",[11,241,242],{},"Right now that's two products:",[11,244,245,252],{},[246,247,248],"strong",{},[200,249,251],{"href":250},"\u002Fproducts\u002Freliable-uptime","Reliable Uptime"," is our commercial platform — uptime, HTTP and SSL monitoring, incident alerts and status pages. It's the business.",[11,254,255,261],{},[246,256,257],{},[200,258,260],{"href":259},"\u002Fproducts\u002Fgload","Gload"," is open source — a YAML-first load testing tool inspired by k6, built for developer experience from the start.",[18,263,265],{"id":264},"what-holds-them-together","What holds them together",[11,267,268],{},"Not a shared codebase or a shared dashboard. A shared standard: every product we ship has to be reliable, easy to operate, and honest about what it does. No dark patterns, no growth hacks, no feature bloat to justify a pricing tier.",[11,270,271],{},"If that sounds like a low bar, it's surprising how few tools actually clear it.",[11,273,274],{},"We'll use this space to write about what we're building and why — not to announce funding rounds or hiring sprees, just the actual engineering decisions behind the products.",{"title":39,"searchDepth":40,"depth":40,"links":276},[277,278],{"id":235,"depth":40,"text":236},{"id":264,"depth":40,"text":265},"2026-06-18","Why we're building a focused ecosystem around software reliability, instead of another single-purpose tool.",{},"\u002Fblog\u002Fintroducing-infwrite",{"title":227,"description":280},"blog\u002Fintroducing-infwrite",[286],"announcement","ROnxewXoEqpQu6ir1BRW6CUKyADY9A2e4mjvZ3zhv-c",1783640616912]