corpus.blog
Most cited
Talked about
Blogs
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
Ship Node.js applications as a single executable
original ↗
18 Sept 2026
Start with semantic HTML
original ↗
12 Sept 2026
Make resource lifetime explicit with using
original ↗
6 Sept 2026
Comments are not a substitute for design
original ↗
29 Aug 2026
Runtime validation is a boundary concern
original ↗
22 Aug 2026
Not every test double is a mock
original ↗
15 Aug 2026
Fire and forget still needs an owner
original ↗
8 Aug 2026
Translations belong to the user interface
original ↗
1 Aug 2026
Don't log at the leaf. Log at the root
original ↗
26 Jul 2026
Boring code is a feature
original ↗
18 Jul 2026
Time is an external dependency
original ↗
11 Jul 2026
Bugs are not backlog items
original ↗
3 Jul 2026
Clean Architecture protects the happy zone
original ↗
27 Jun 2026
Don't test what you don't control
original ↗
19 Jun 2026
DevOps is a skill, not a role
original ↗
13 Jun 2026
Prefer process.exitCode over process.exit() in Node.js
original ↗
4 Jun 2026
Chrome DOM breakpoints: pause where the DOM actually changes
original ↗
23 May 2026
Write good Git commit messages
original ↗
16 May 2026
Application performance is a product requirement
original ↗
10 May 2026
Developer experience is a performance feature
original ↗
9 May 2026
Pattern matching in TypeScript today
original ↗
1 May 2026
Stop using barrel exports in JavaScript
original ↗
25 Apr 2026
Why you should not access browser globals directly
original ↗
18 Apr 2026
Stop adding console.log: use logpoints instead
original ↗
11 Apr 2026
Why Testing Library is not unit testing
original ↗
5 Apr 2026
Why you should not ship test IDs to production
original ↗
4 Apr 2026
Git LFS is useful, but it is not a free storage upgrade
original ↗
29 Mar 2026
Why git bisect is one of Git's most underrated features
original ↗
27 Mar 2026
Why I do not use enums in TypeScript
original ↗
22 Mar 2026
High coverage is not enough: mutation testing in TypeScript with Stryker
original ↗
19 Mar 2026
Avoid truthy and falsy checks in TypeScript
original ↗
14 Mar 2026
Prefer Task over Promise in TypeScript
original ↗
7 Mar 2026
Avoid throwing for expected failures in TypeScript
original ↗
7 Mar 2026
The Billion-Dollar Mistake: Avoid "null" in TypeScript
original ↗
4 Mar 2026
Dependency injection without frameworks in TypeScript
original ↗
1 Mar 2026
Why your unit tests feel fragile
original ↗
1 Mar 2026
Why I started this Blog
original ↗
28 Feb 2026