41554 blogs · [ { "id": "01a08c62-db1c-734a-b2c3-0841a83b1ad7", "title": "That Test isn't Flaky. It's Broken.", "url": "https://will-keleher.com/posts/its-broken-not-flaky/", "published_at": "2026-08-12T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841a8a1bfdb", "title": "Backfills should fail in minutes, not days", "url": "https://will-keleher.com/posts/backfills-should-fail-in-minutes-not-days/", "published_at": "2026-06-22T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841a95ad44c", "title": "Your dashes suggest which model you're copy-pasting from", "url": "https://will-keleher.com/posts/your-dashes-suggest-which-model-youre-copy-pasting-from/", "published_at": "2026-05-26T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841a9c7c1c1", "title": "An Opinionated Guide to Post-mortems", "url": "https://will-keleher.com/posts/an-opinionated-guide-to-post-mortems/", "published_at": "2026-05-21T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841a9ef3d67", "title": "ChatGPT Images 2.0 Still Can't Draw the Seven-legged Spider I Want", "url": "https://will-keleher.com/posts/chatgpt-image-2-still-cant-draw-a-seven-legged-spider/", "published_at": "2026-04-23T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841aaece338", "title": "You should read at least one job-related book a year", "url": "https://will-keleher.com/posts/one-book-a-year/", "published_at": "2026-04-23T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841abbc4c85", "title": "Telling a Computer to Do Things", "url": "https://will-keleher.com/posts/telling-your-computer-to-do-things/", "published_at": "2026-04-16T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841ac60ff72", "title": "Don't Forget to Set EDITOR and VISUAL", "url": "https://will-keleher.com/posts/dont-forget-to-set-editor-and-visual/", "published_at": "2026-04-15T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841acd6cf5c", "title": "The Post-mortem Spectrum", "url": "https://will-keleher.com/posts/the-post-mortem-spectrum/", "published_at": "2026-04-10T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841adcc0528", "title": "Small Programming Tricks", "url": "https://will-keleher.com/posts/small-programming-tricks-matter/", "published_at": "2026-03-19T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841ae2e4f53", "title": "You're already running canary servers", "url": "https://will-keleher.com/posts/nary-an-error-with-canary/", "published_at": "2026-03-18T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841aea173d8", "title": "and these screenshots prove i did it", "url": "https://will-keleher.com/posts/and-these-screenshots-prove-i-did-it/", "published_at": "2026-03-16T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841af9186f5", "title": "this css proves me human", "url": "https://will-keleher.com/posts/this-css-makes-me-human/", "published_at": "2026-03-06T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841afb5a65c", "title": "Ratcheting SQL Queries: reducing a database's load by 1/4th with a simple change", "url": "https://will-keleher.com/posts/ratcheting-sql-queries/", "published_at": "2026-03-05T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b01c51c3", "title": "Script Your Code Migrations", "url": "https://will-keleher.com/posts/script-your-code-migrations/", "published_at": "2026-03-05T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b0beb7c6", "title": "An Elegy for my Beloved Slow Query Logs", "url": "https://will-keleher.com/posts/augment-your-slow-query-logs/", "published_at": "2026-03-04T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b10e249c", "title": "Store Every Request", "url": "https://will-keleher.com/posts/store-every-request/", "published_at": "2026-02-27T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b1ce8161", "title": "More Shell Patterns I Use Weekly", "url": "https://will-keleher.com/posts/more-shell-patterns-i-use-weekly/", "published_at": "2026-02-27T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b1d5799d", "title": "Nano Banana 2 Partially Passes the Seven-legged Spider Test", "url": "https://will-keleher.com/posts/nano-banana-2-partially-passes-the-spider-test/", "published_at": "2026-02-26T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b23dfa4c", "title": "(Almost) Every table needs `request_uuid`", "url": "https://will-keleher.com/posts/you-should-store-request_uuids-in-tables/", "published_at": "2026-02-25T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b3170926", "title": "CSS Tweaks for This Site That Make Me Happy", "url": "https://will-keleher.com/posts/css-tweaks-for-this-blog-that-make-me-happy/", "published_at": "2026-02-24T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b33bb96d", "title": "Literal and Optional Parameters Can Make Code Hard to Read (in TypeScript)", "url": "https://will-keleher.com/posts/i-hate-literal-arguments/", "published_at": "2026-02-12T21:11:40+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b3a6bf1d", "title": "How I Review LLM-generated Code", "url": "https://will-keleher.com/posts/reviewing-llm-generated-code/", "published_at": "2026-02-05T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b4707986", "title": "It's 2026, and I'm still leery of using LLMs to generate code", "url": "https://will-keleher.com/posts/leery-of-using-ai-to-generate-code/", "published_at": "2026-02-04T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b50c9b98", "title": "You probably don't need `find`", "url": "https://will-keleher.com/posts/you-probably-dont-need-find/", "published_at": "2026-02-04T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c87c7bde", "title": "How I Code Review LLM-generated Code", "url": "https://will-keleher.com/posts/reviewing-llm-generated-code.html", "published_at": "2026-02-04T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c9670e11", "title": "It's 2026, and I'm still leery of using LLMs to generate code", "url": "https://will-keleher.com/posts/leery-of-using-ai-to-generate-code.html", "published_at": "2026-02-03T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c9bc33df", "title": "You probably don't need `find`", "url": "https://will-keleher.com/posts/you-probably-dont-need-find.html", "published_at": "2026-02-02T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b575f762", "title": "Three Technical Tricks for Non-technical Writers in Google Docs", "url": "https://will-keleher.com/posts/three-technical-tricks-for-non-technical-writers/", "published_at": "2026-01-30T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841caad7c30", "title": "Three Technical Tricks for Non-technical Writers in Google Docs", "url": "https://will-keleher.com/posts/three-technical-tricks-for-non-technical-writers.html", "published_at": "2026-01-30T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b61dcce5", "title": "Useless shell commands", "url": "https://will-keleher.com/posts/useless-shell-commands/", "published_at": "2026-01-28T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841cb460a15", "title": "Useless shell commands", "url": "https://will-keleher.com/posts/useless-shell-commands.html", "published_at": "2026-01-28T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b62d519e", "title": "Why doesn't MySQL's query planner rewrite some `ORDER BY.. LIMIT` queries to use a `UNION` strategy? No clue.", "url": "https://will-keleher.com/posts/mysql-degenerate-query-plan/", "published_at": "2025-11-22T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841cc107162", "title": "Why doesn't MySQL's query planner rewrite some `ORDER BY.. LIMIT` queries to use a `UNION` strategy? No clue.", "url": "https://will-keleher.com/posts/mysql-degenerate-query-plan.html", "published_at": "2025-11-22T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b6685f9e", "title": "A one-table SQL query will often use a single index", "url": "https://will-keleher.com/posts/sql-queries-rarely-use-multiple-indexes/", "published_at": "2025-10-08T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841cc5f0f49", "title": "A one-table SQL query will often use a single index", "url": "https://will-keleher.com/posts/sql-queries-rarely-use-multiple-indexes.html", "published_at": "2025-10-08T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b6e5cb06", "title": "You should lint your TODOs", "url": "https://will-keleher.com/posts/you-should-lint-your-todos/", "published_at": "2025-09-22T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841cc9ace7f", "title": "You should lint your TODOs", "url": "https://will-keleher.com/posts/You-should-lint-your-todos.html", "published_at": "2025-09-22T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b7b7f772", "title": "You probably want some parts of Lodash", "url": "https://will-keleher.com/posts/you-probably-want-lodash/", "published_at": "2025-09-21T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841ccf4de23", "title": "You probably want some parts of Lodash", "url": "https://will-keleher.com/posts/you-probably-want-lodash.html", "published_at": "2025-09-21T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b88ac15f", "title": "Draw a Silhouette of a Spider Missing its Front Left Leg", "url": "https://will-keleher.com/posts/draw-a-silhouette-of-a-spider-missing-its-front-left-leg/", "published_at": "2025-06-24T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841cd31353e", "title": "Draw a Silhouette of a Spider Missing its Front Left Leg", "url": "https://will-keleher.com/posts/Draw-a-silhouette-of-a-spider-missing-its-front-left-leg.html", "published_at": "2025-06-24T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b938ed89", "title": "Brownbags shouldn't be lectures", "url": "https://will-keleher.com/posts/how-to-create-effective-learning-materials-at-engineering-orgs/", "published_at": "2025-04-04T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841cdd3e875", "title": "Don't lecture when teaching software engineering", "url": "https://will-keleher.com/posts/how-to-create-effective-learning-materials-at-engineering-orgs.html", "published_at": "2025-04-04T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841b9fc683e", "title": "I avoid easy things I haven't tried", "url": "https://will-keleher.com/posts/i-avoid-easy-things-i-havent-tried/", "published_at": "2025-04-03T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841ce20c587", "title": "I avoid easy things I haven't tried", "url": "https://will-keleher.com/posts/I-avoid-easy-things-I-havent-tried.html", "published_at": "2025-04-03T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841baaf20e5", "title": "Why I avoid test stubs in TypeScript", "url": "https://will-keleher.com/posts/why-i-dislike-stubs/", "published_at": "2025-04-01T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841ce7bf633", "title": "Why I avoid test stubs in TypeScript", "url": "https://will-keleher.com/posts/why-I-dislike-stubs.html", "published_at": "2025-04-01T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841bb33e077", "title": "Most engineers have git aliases; what are yours?", "url": "https://will-keleher.com/posts/what-are-your-git-aliases/", "published_at": "2025-03-26T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841cf639579", "title": "Most engineers have git aliases; what are yours?", "url": "https://will-keleher.com/posts/what-are-your-git-aliases.html", "published_at": "2025-03-26T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841bb97b745", "title": "When helping elves, you should use complex numbers to navigate in 2D", "url": "https://will-keleher.com/posts/2d-navigation-with-imaginary-numbers-is-better/", "published_at": "2024-12-21T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841cf6519ae", "title": "When helping elves, you should use complex numbers to navigate in 2D", "url": "https://will-keleher.com/posts/2d-navigation-with-imaginary-numbers-is-better.html", "published_at": "2024-12-21T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841bbc389a0", "title": "18,957 tests in under 6 minutes: ClassDojo's approach to backend testing", "url": "https://will-keleher.com/posts/classdojos-approach-to-backend-testing/", "published_at": "2024-12-13T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841bbeb79db", "title": "XKCD's \\\"Is It Worth the Time?\\\" Considered Harmful", "url": "https://will-keleher.com/posts/its-not-worth-the-time-yet/", "published_at": "2024-12-13T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841cfcc8b11", "title": "18,957 tests in under 6 minutes: ClassDojo's approach to backend testing", "url": "https://will-keleher.com/posts/ClassDojos-approach-to-backend-testing.html", "published_at": "2024-12-13T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d08fa995", "title": "XKCD's \"Is It Worth the Time?\" Considered Harmful", "url": "https://will-keleher.com/posts/its-not-worth-the-time-yet.html", "published_at": "2024-12-13T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841bc34b101", "title": "Python patterns I learned during last year's Advent of Code", "url": "https://will-keleher.com/posts/small-python-things-i-learned-during-advent-of-code/", "published_at": "2024-11-13T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d1516a5d", "title": "Python patterns I learned during last year's Advent of Code", "url": "https://will-keleher.com/posts/small-python-things-I-learned-during-advent-of-code.html", "published_at": "2024-11-13T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841bccd27a0", "title": "Indexes are sorted arrays (sort of)", "url": "https://will-keleher.com/posts/indexes_are_like_sorted_arrays/", "published_at": "2023-08-14T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d20694f1", "title": "Indexes are sorted arrays (sort of)", "url": "https://will-keleher.com/posts/Indexes_are_like_sorted_arrays.html", "published_at": "2023-08-14T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841bdb4b3f4", "title": "JSDoc comments can make fixtures easier to work with", "url": "https://will-keleher.com/posts/jsdoc-comments-on-fixtures/", "published_at": "2023-07-23T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d21185b4", "title": "JSDoc comments can make fixtures easier to work with", "url": "https://will-keleher.com/posts/JSDoc-Comments-on-Fixtures.html", "published_at": "2023-07-23T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841bea460dc", "title": "So, what can you do with a process ID?", "url": "https://will-keleher.com/posts/what-can-you-do-with-a-pid/", "published_at": "2022-12-10T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841bee87be7", "title": "Why does `zip(*[iter(s)]*n)` chunk s into n chunks in Python?", "url": "https://will-keleher.com/posts/chunking-in-python/", "published_at": "2022-12-10T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d279e664", "title": "Why does `zip(*[iter(s)]*n)` chunk s into n chunks in Python?", "url": "https://will-keleher.com/posts/chunking-in-python.html", "published_at": "2022-12-10T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d3118a5a", "title": "So, what can you do with a process ID?", "url": "https://will-keleher.com/posts/What-can-you-do-with-a-pid.html", "published_at": "2022-12-10T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841bfcaf3b6", "title": "Culling Containers with a Leaky Bucket", "url": "https://will-keleher.com/posts/cullingcontainerswithaleakybucket/", "published_at": "2022-10-24T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d394057a", "title": "Culling Containers with a Leaky Bucket", "url": "https://will-keleher.com/posts/CullingContainersWithALeakyBucket.html", "published_at": "2022-10-24T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c08f1ede", "title": "Setting up Image Previews using Puppeteer, Make, and CSS transforms", "url": "https://will-keleher.com/posts/setting-up-image-previews/", "published_at": "2022-10-20T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d3b555e9", "title": "Setting up Image Previews using Puppeteer, Make, and CSS transforms", "url": "https://will-keleher.com/posts/Setting-up-Image-Previews.html", "published_at": "2022-10-20T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c0dddec8", "title": "Writing FizzBuzz in MySQL 5.7 for no good reason", "url": "https://will-keleher.com/posts/fizzbuzz-in-mysql-5.7/", "published_at": "2022-07-07T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d3e6a551", "title": "Writing FizzBuzz in MySQL 5.7 for no good reason", "url": "https://will-keleher.com/posts/FizzBuzz-in-MySQL-5.7.html", "published_at": "2022-07-07T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c122a35d", "title": "Using NodeJS's AsyncLocalStorage to Instrument a Webserver", "url": "https://will-keleher.com/posts/asynclocalstorage_in_detail/", "published_at": "2022-05-30T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d48ec8af", "title": "Using NodeJS's AsyncLocalStorage to Instrument a Webserver", "url": "https://will-keleher.com/posts/AsyncLocalStorage_in_Detail.html", "published_at": "2022-05-30T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c216e7ee", "title": "Large Analytics SQL Queries are a Code Smell", "url": "https://will-keleher.com/posts/large-sql-queries-are-bad/", "published_at": "2022-05-11T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c23c5cf6", "title": "Shell Patterns for Easy Automated Code Migrations", "url": "https://will-keleher.com/posts/tricks-for-automated-code-migrations/", "published_at": "2022-05-11T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d4bf0df0", "title": "Shell Patterns for Easy Automated Code Migrations", "url": "https://will-keleher.com/posts/tricks-for-automated-code-migrations.html", "published_at": "2022-05-11T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d529c52b", "title": "Large Analytics SQL Queries are a Code Smell", "url": "https://will-keleher.com/posts/large-SQL-queries-are-bad.html", "published_at": "2022-05-11T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c2e1a094", "title": "Red and Blue Function Mistakes in JavaScript", "url": "https://will-keleher.com/posts/red-blue-function-mistakes-in-js/", "published_at": "2022-03-25T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d5b50f52", "title": "Red and Blue Function Mistakes in JavaScript", "url": "https://will-keleher.com/posts/red-blue-function-mistakes-in-JS.html", "published_at": "2022-03-25T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c3b2f459", "title": "Slack is the Worst Info-Radiator", "url": "https://will-keleher.com/posts/slack_is_the_worst_info_radiator/", "published_at": "2021-12-06T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d612d4e7", "title": "Slack is the Worst Info-Radiator", "url": "https://will-keleher.com/posts/Slack_is_the_worst_Info_Radiator.html", "published_at": "2021-12-06T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c40db3d9", "title": "Bash Patterns I Use Weekly", "url": "https://will-keleher.com/posts/4-useful-bash-patterns/", "published_at": "2021-11-22T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d6b49164", "title": "Bash Patterns I Use Weekly", "url": "https://will-keleher.com/posts/4-Useful-Bash-Patterns.html", "published_at": "2021-11-22T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c4fd8203", "title": "Canary Containers at ClassDojo in Too Much Detail", "url": "https://will-keleher.com/posts/canary-containers-at-classdojo-in-too-much-detail/", "published_at": "2021-11-02T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d79f1e18", "title": "Canary Containers at ClassDojo in Too Much Detail", "url": "https://will-keleher.com/posts/Canary-containers-at-ClassDojo-in-too-much-detail.html", "published_at": "2021-11-02T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c50c9d5f", "title": "MongoDB Performance is Disk-graceful", "url": "https://will-keleher.com/posts/mongo_performance_is_disk-graceful/", "published_at": "2021-10-22T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c525b28e", "title": "Node's `AsyncLocalStorage` Makes the Commons Legible", "url": "https://will-keleher.com/posts/asynclocalstorage_makes_the_commons_legible/", "published_at": "2021-08-18T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d892fdb7", "title": "Node's `AsyncLocalStorage` Makes the Commons Legible", "url": "https://will-keleher.com/posts/AsyncLocalStorage_Makes_the_Commons_Legible.html", "published_at": "2021-08-18T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c5fa2cdc", "title": "The 3 things I didn't understand about TypeScript", "url": "https://will-keleher.com/posts/3-typescript-misunderstandings/", "published_at": "2021-08-10T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d9865560", "title": "The 3 things I didn't understand about TypeScript", "url": "https://will-keleher.com/posts/3-Typescript-misunderstandings.html", "published_at": "2021-08-10T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c648c863", "title": "HyperLogLog-orrhea: how do HyperLogsLogs work?", "url": "https://will-keleher.com/posts/hyperloglog-orrhea/", "published_at": "2021-07-14T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841d9b46f7b", "title": "HyperLogLog-orrhea: how do HyperLogsLogs work?", "url": "https://will-keleher.com/posts/HyperLogLog-orrhea.html", "published_at": "2021-07-14T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c7095137", "title": "ERROR, WARN, and INFO aren't actionable logging levels", "url": "https://will-keleher.com/posts/your_logging_taxonomy_should_be_actionable/", "published_at": "2021-07-13T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841da718aa4", "title": "ERROR, WARN, and INFO aren't actionable logging levels", "url": "https://will-keleher.com/posts/Your_Logging_Taxonomy_should_be_Actionable.html", "published_at": "2021-07-13T00:00:00+00:00" }, { "id": "01a08c62-db1c-734a-b2c3-0841c7bdbfe4", "title": "Graceful server shutdowns behind HAProxy", "url": "https://will-keleher.com/posts/graceful_web-server_shutdowns_behind_haproxy/", "published_at": "2021-07-12T00:00:00+00:00" } ] posts Claim your blog
Back to Will Keleher – Engineering legibility, observability, & writing
Blog · corpus.blog/blogs/will-keleher.com/posts

Will Keleher – Engineering legibility, observability, & writing

will-keleher.com

2026

2025

2024

2023

2022

2021