41554 blogs · [ { "id": "01a0c509-d91a-72bd-b592-6f9dc041da07", "title": "Ship Node.js applications as a single executable", "url": "https://www.echooff.dev/blog/ship-nodejs-applications-as-a-single-executable", "published_at": "2026-09-18T18:56:00+00:00" }, { "id": "01a094f4-b2f0-71c4-b5d3-d4f80e5dc1af", "title": "Start with semantic HTML", "url": "https://www.echooff.dev/blog/start-with-semantic-html", "published_at": "2026-09-12T08:09:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a12b0d6c", "title": "Make resource lifetime explicit with using", "url": "https://www.echooff.dev/blog/make-resource-lifetime-explicit-with-using", "published_at": "2026-09-06T07:35:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a15be891", "title": "Comments are not a substitute for design", "url": "https://www.echooff.dev/blog/comments-are-not-a-substitute-for-design", "published_at": "2026-08-29T13:13:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a225e14b", "title": "Runtime validation is a boundary concern", "url": "https://www.echooff.dev/blog/runtime-validation-is-a-boundary-concern", "published_at": "2026-08-22T06:19:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a31e726b", "title": "Not every test double is a mock", "url": "https://www.echooff.dev/blog/not-every-test-double-is-a-mock", "published_at": "2026-08-15T14:53:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a3403ce9", "title": "Fire and forget still needs an owner", "url": "https://www.echooff.dev/blog/fire-and-forget-still-needs-an-owner", "published_at": "2026-08-08T06:29:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a40363e6", "title": "Translations belong to the user interface", "url": "https://www.echooff.dev/blog/translations-belong-to-the-user-interface", "published_at": "2026-08-01T06:41:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a4bd12a3", "title": "Don't log at the leaf. Log at the root", "url": "https://www.echooff.dev/blog/dont-log-at-the-leaf-log-at-the-root", "published_at": "2026-07-26T07:19:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a53e80f2", "title": "Boring code is a feature", "url": "https://www.echooff.dev/blog/boring-code-is-a-feature", "published_at": "2026-07-18T09:07:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a589dae9", "title": "Time is an external dependency", "url": "https://www.echooff.dev/blog/time-is-an-external-dependency", "published_at": "2026-07-11T06:39:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a5a6a1fa", "title": "Bugs are not backlog items", "url": "https://www.echooff.dev/blog/bugs-are-not-backlog-items", "published_at": "2026-07-03T14:48:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a667744a", "title": "Clean Architecture protects the happy zone", "url": "https://www.echooff.dev/blog/clean-architecture-protects-the-happy-zone", "published_at": "2026-06-27T04:58:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a6cd254e", "title": "Don't test what you don't control", "url": "https://www.echooff.dev/blog/dont-test-what-you-dont-control", "published_at": "2026-06-19T16:55:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a6d19f54", "title": "DevOps is a skill, not a role", "url": "https://www.echooff.dev/blog/devops-is-a-skill-not-a-role", "published_at": "2026-06-13T04:47:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a6ecdfe7", "title": "Prefer process.exitCode over process.exit() in Node.js", "url": "https://www.echooff.dev/blog/prefer-process-exitcode-over-process-exit-in-nodejs", "published_at": "2026-06-04T13:09:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a7766632", "title": "Chrome DOM breakpoints: pause where the DOM actually changes", "url": "https://www.echooff.dev/blog/chrome-dom-breakpoints", "published_at": "2026-05-23T07:29:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a845966c", "title": "Write good Git commit messages", "url": "https://www.echooff.dev/blog/write-good-git-commit-messages", "published_at": "2026-05-16T07:16:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a8d4e5c0", "title": "Application performance is a product requirement", "url": "https://www.echooff.dev/blog/application-performance-is-a-product-requirement", "published_at": "2026-05-10T07:10:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a8de40dd", "title": "Developer experience is a performance feature", "url": "https://www.echooff.dev/blog/developer-experience-is-a-performance-feature", "published_at": "2026-05-09T05:22:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3a9c839ab", "title": "Pattern matching in TypeScript today", "url": "https://www.echooff.dev/blog/pattern-matching-in-typescript-today", "published_at": "2026-05-01T07:09:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3aa15e878", "title": "Stop using barrel exports in JavaScript", "url": "https://www.echooff.dev/blog/stop-using-barrel-exports-javascript", "published_at": "2026-04-25T07:32:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3aaa17fdc", "title": "Why you should not access browser globals directly", "url": "https://www.echooff.dev/blog/avoid-direct-browser-globals", "published_at": "2026-04-18T09:30:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3aaaa52d6", "title": "Stop adding console.log: use logpoints instead", "url": "https://www.echooff.dev/blog/stop-adding-console-log-use-logpoints-instead", "published_at": "2026-04-11T06:53:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3ab18cead", "title": "Why Testing Library is not unit testing", "url": "https://www.echooff.dev/blog/why-testing-library-is-not-unit-testing", "published_at": "2026-04-05T14:32:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3ab8af7ea", "title": "Why you should not ship test IDs to production", "url": "https://www.echooff.dev/blog/why-you-should-not-ship-test-ids-to-production-react-testing-library", "published_at": "2026-04-04T06:22:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3ac6fa61a", "title": "Git LFS is useful, but it is not a free storage upgrade", "url": "https://www.echooff.dev/blog/git-lfs-is-useful-but-it-is-not-a-free-storage-upgrade", "published_at": "2026-03-29T10:38:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3ad6b2d94", "title": "Why git bisect is one of Git's most underrated features", "url": "https://www.echooff.dev/blog/git-bisect-underrated-feature", "published_at": "2026-03-27T15:46:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3adde291e", "title": "Why I do not use enums in TypeScript", "url": "https://www.echooff.dev/blog/why-i-do-not-use-enums-in-typescript", "published_at": "2026-03-22T16:49:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3aec7131e", "title": "High coverage is not enough: mutation testing in TypeScript with Stryker", "url": "https://www.echooff.dev/blog/mutation-testing-typescript-stryker", "published_at": "2026-03-19T08:03:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3af5a6e6b", "title": "Avoid truthy and falsy checks in TypeScript", "url": "https://www.echooff.dev/blog/avoid-truthy-falsy-typescript", "published_at": "2026-03-14T06:22:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3af927b34", "title": "Prefer Task over Promise in TypeScript", "url": "https://www.echooff.dev/blog/prefer-task-over-promise-typescript", "published_at": "2026-03-07T09:12:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3b05150c0", "title": "Avoid throwing for expected failures in TypeScript", "url": "https://www.echooff.dev/blog/avoid-throwing-for-expected-failures-typescript", "published_at": "2026-03-07T07:21:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3b0f952ba", "title": "The Billion-Dollar Mistake: Avoid \"null\" in TypeScript", "url": "https://www.echooff.dev/blog/avoid-null-typescript", "published_at": "2026-03-04T07:04:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3b10114d4", "title": "Dependency injection without frameworks in TypeScript", "url": "https://www.echooff.dev/blog/dependency-injection-without-frameworks-in-typescript", "published_at": "2026-03-01T12:13:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3b145793c", "title": "Why your unit tests feel fragile", "url": "https://www.echooff.dev/blog/why-your-unit-tests-feel-fragile", "published_at": "2026-03-01T08:58:00+00:00" }, { "id": "01a08771-3481-724a-892e-d3f3b1a8e285", "title": "Why I started this Blog", "url": "https://www.echooff.dev/blog/why-i-started-this-blog", "published_at": "2026-02-28T11:39:00+00:00" } ] posts Claim your blog
Back to echooff.dev
Blog · corpus.blog/blogs/echooff.dev/posts

echooff.dev

echooff.dev

2026