Code Quality
The full CI suite runs:
pnpm run ci # audit + biome ci + typecheck + decluttercheck
Nullmask uses Biome for linting and formatting.
pnpm lintcheck # Check for issues
pnpm format # Auto-format files
pnpm typecheck # TypeScript type check across all packages
Uses TypeScript 5.9 with strict mode.
Dead Code Detection
pnpm decluttercheck # Runs knip
Knip detects unused exports, dependencies, and files across the monorepo.
All code in apps/ and packages/ must use logger.* from @nullmask/logger
Exception: web/apps/app and web/apps/explorer (frontend apps) may use console.log
For debugging, write to /tmp/ files using writeFileSync
Contract Compilation
After changing Solidity struct definitions:
This prevents stale ABI artifacts from causing silent encoding mismatches.
ABI Regeneration
When contract interfaces change, regenerate the TypeScript ABI:
Compile contracts: npx hardhat compile
Update web/packages/noir/src/generated/nullmask-abi.ts from compiled artifacts
Ensure as const assertion is present for viem type inference
Circuit Bindings
After modifying Noir circuits:
This regenerates:
Solidity verifiers (contracts/contracts/)
TypeScript FFI bindings (web/packages/noir/src/generated/noir_ffi.ts)
Both files are generated — do not edit manually.