Hussaini Marsidi
Main page
22 February 20252 minutes read

Husky is a convenience, it meant to give developers faster feedback loop - formatting, linting and even commit message checks. But somewhere along the way, the projects grows and we start piling up with full type checks, tests or even build because "we have to catch the issue early".

Sure, but at the same time "early" also forces developers to sits idle in every commits burning time and productivity, at some cases group of developers may even use --no-verify then the whole setup becomes meaningless.

The magic is in CI

Continuous Integration (CI) is built for enforcement. It’s the final gate for all code before it gets merged. Type safety checks, tests, build validation—mumbo jumbo, you name it.

It lets us offload misplaced responsibilities from our local machines to a more capable, less disruptive platform. You open a PR, CI takes over, and you move on with your work.


Use tools for what they are meant to do

  • Husky should run fast, local check keep it minimal
  • CI should do full check that guarantee code integrity

Discipline isnt about overloading the tool but about applying the right pressure at the right place. Otherwise, you’re sitting through 30 seconds commits, and your mind starts wandering to anything but the code.

Where do we draw the line

TaskRun in HuskyRun in CI
PrettierOptional
ESLint (staged files)
Commit message validationOptional
TypeScript (full)
Unit/integration tests
Build validation

The final words

Husky is your early warning system. CI is the fortress wall. We should not confuse convenience with enforcement so we don't burden every dev's laptop with production safety checks.

© 2026 Hussaini Marsidi. Made in Malaysia 🇲🇾.