A repeatable, human-executed checklist for keeping this project's npm dependencies current and its security advisories resolved. No bots, no CI — just this runbook, once a month.
chore/dep-updates-YYYY-MM (e.g. chore/dep-updates-2026-07), cut from latest main.chore(deps): bump patch versions YYYY-MMchore(deps): bump minor versions YYYY-MMchore(deps)!: bump <pkg> to v<N> — one commit per majorchore(security): npm audit fix YYYY-MMchore(deps): monthly dependency updates YYYY-MM, merged to main after the final visual check passes.For each row in npm outdated, compare Current / Wanted (max version satisfying the package.json range) / Latest (newest published):
Wanted shares the same major.minor as Current → target Wanted.Wanted is a higher minor within the same major as Current → target Wanted.Latest is a higher major than Current → first reach Wanted (in the patch or minor phase, as appropriate for that dep), then target Latest in the major phase, one dep at a time.Install commands:
npm install <pkg>@<Wanted> (use the Wanted version from npm outdated).npm install <pkg>@latest (the Latest version), one dep at a time.git checkout main && git pull --ff-onlygit checkout -b chore/dep-updates-YYYY-MMnpm outdated → for each dep, record Current / Wanted / Latest and tier it per the rule above.npm audit --omit=dev → note the severity and count of open advisories.npm install <pkg>@<Wanted>npm run build → must succeed with no errors.chore(deps): bump patch versions YYYY-MMnpm install <pkg>@<Wanted>npm run build → must succeed.chore(deps): bump minor versions YYYY-MMFor each major-tier dep, one at a time:
npm install <pkg>@latestnpm run build → must succeed.npm run dev → visual check across the Visual check pages.git checkout package.json package-lock.json && npm ci
Note the deferral with reason in the PR, and move on. Do not force a stuck major.chore(deps)!: bump <pkg> to v<N>npm audit --omit=dev → see what remains after the version bumps.npm audit fix → apply safe fixes.npm run build → must succeed.chore(security): npm audit fix YYYY-MM--force or hand-edit the lockfile.npm run dev → full visual check across the Visual check pages.git fetch origin && git rebase origin/main (CloudCannon may have pushed content meanwhile).npm run build → must pass after the rebase.chore(deps): monthly dependency updates YYYY-MM. PR body contains:
npm audit fixmain.After npm run dev, visit each of these in your browser and confirm layout, Tailwind styling, and Alpine interactions work as expected:
/ — home/properties/ — listing index/property-in-victoria/ (or /nadur/, /gharb/, /xaghra/) — a location page/search/ — search page (Alpine-driven)/favourites/ — favourites page (Alpine-driven)/contact-us//buying-guide/What to look for: page renders without errors, Tailwind classes applied (colors, spacing, container width), Alpine-powered interactions work (search filtering, favourites toggle), no broken layouts or missing styles.
git revert <commit>
orgit reset --hard <previous-phase-commit>
CSS-first config. Migration touches the current PostCSS-based setup:
@import "tailwindcss"; replaces the @tailwind base; @tailwind components; @tailwind utilities; directives in css/tailwind.css.@tailwindcss/postcss plugin replaces the current tailwindcss plugin in postcss.config.js.tailwind.config.js becomes optional / legacy; v4 prefers CSS @theme blocks. The current config has custom emerald colors, container settings, variants.extend, and the @tailwindcss/aspect-ratio plugin — all of which need porting to the v4 format.npm run dev and npm run build scripts invoke tailwindcss via npx tailwindcss ...; v4's CLI behavior differs and may require script changes.The build will likely break the postcss.config.js / css/tailwind.css setup on first bump. This is realistic to defer to a dedicated session rather than attempt inside the monthly runbook. The defer escape hatch in Phase 3 exists precisely for this case.
Check the changelog at bump time for stage / preset / breaking option changes. Lower risk than Tailwind v4, but verify CSS output is unchanged by the visual check.
Monthly, first week of the month. No calendar automation — this runbook is the process. Git history and the monthly PR description serve as the update log.