From Scan Report to Fix: A Guide to Node.js Package CVE Remediation
How I work through scan paths, dependency trees, and version ranges to choose a remediation strategy for CVEs in direct and transitive Node.js dependencies.
Documenting discoveries in development and sharing the process of understanding problems.
Newest first · 22 / 22 posts
How I work through scan paths, dependency trees, and version ranges to choose a remediation strategy for CVEs in direct and transitive Node.js dependencies.
How I use Trivy to scan Docker images locally, find and fix vulnerabilities during development, and verify fixes without waiting for DevOps reports. Includes the script I use, jq filters, and ways to pinpoint vulnerabilities with Class and PkgPath.
A practical look at clsx, tailwind-merge, tw-animate-css, CVA, and components.json for conditional styles, class conflicts, animations, component variants, and registries.
A walkthrough of shadcn/ui’s index.css or globals.css: @theme inline, @custom-variant, @layer, and two ways to implement light and dark themes with CSS variables.
Use TailwindCSS v4’s @theme to define design tokens and generate utilities for colors, radii, fonts, and spacing, including shadcn/ui’s semantic color system.
A practical reference to TailwindCSS v4 utilities for colors, typography, spacing, layout, and responsive design, with examples to prepare for learning shadcn/ui.
How TailwindCSS turns utility classes into CSS: the JIT engine, the PostCSS pipeline, and configuration in Vite and Next.js projects.
A look at the rise of TailwindCSS and shadcn/ui, and how to start learning TailwindCSS as a longtime MUI user.
What I learned about Semantic Versioning after a major upgrade broke my project: choosing major, minor, or patch releases, common misconceptions, and examples from component libraries.
Writing clear, structured changelogs with Keep a Changelog, generating them with commit-and-tag-version, and making practical adjustments to improve the maintenance workflow.
How to validate commit messages with Commitlint and automate the checks with Husky. Includes configurations with and without Gitmoji, so your commit messages consistently follow the chosen convention.
How I put together a consistent commit message workflow with Commitizen and Gitmoji, why Conventional Commits matter, and how cz-conventional-changelog, @commitlint/cz-commitlint, and cz-customizable compare.
A closer look at how Koa and Express differ in middleware execution, error handling, and framework design, with examples of what those differences mean in practice and how they affect the choice of framework.
How I added internationalization to a React + TypeScript project, from choosing tools and working out the requirements to installing and configuring i18next and react-i18next for language switching.
A detailed comparison of Vite and Webpack, covering their architecture, configuration, development servers, HMR, production builds, and the tradeoffs that affect where each tool fits.
How to publish and install private npm packages with GitLab Package Registry, including registry basics, authentication, permissions, and package.json settings.
A closer look at the claim that everything in JavaScript is an object. Primitive values and objects are fundamentally different; primitives can sometimes behave like objects because JavaScript temporarily wraps them.
How to install and configure React, TypeScript, Jest, React Testing Library, and MSW (Mock Service Worker) together, building a testing environment from scratch.
A look at how file uploads work in web applications, using React and Express as an example. I use react-dropzone to build the frontend upload interface and multer to handle uploaded files on the Express backend.
The development environment I set up on my work MacBook after starting a web engineering job in 2023, including everyday apps, developer tools, Homebrew, iTerm2, Oh My Zsh, and Powerlevel10k.
How I set up ESLint, Prettier, Husky, and lint-staged in a project with a frontend and backend.
A record of how I troubleshot an NVIDIA driver problem on Ubuntu, from working out the cause to trying different ways to reinstall the driver.