C-Mejlak/property-in-gozo-11ty (11ty static site, CloudCannon CMS, GitHub main)A repeatable, human-executed monthly runbook that keeps the project's npm dependencies current and its dependency security advisories resolved, without breaking the build or the site's appearance.
npm run build plus a manual visual check.| Question | Decision |
|---|---|
| Automation approach | Manual monthly checklist |
| Version range covered | Everything incl. majors |
| Build verification | npm run build + manual visual check |
| Branch workflow | Branch then merge to main |
| Runbook format | Markdown checklist, no scripts |
| Session structure | Risk-tiered phases (patch batch → minor batch → each major individually → audit fix) |
A single new file: docs/dependency-update-runbook.md. No code or config changes outside docs/.
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 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 command per phase:
npm install <pkg>@<Wanted> (the Wanted version from npm outdated).npm install <pkg>@latest (the Latest version), one dep at a time.Current project state, pre-categorized (from npm outdated at design time):
| Dep | Current | Wanted | Latest | Patch | Minor | Major |
|---|---|---|---|---|---|---|
| @11ty/eleventy | 3.1.2 | 3.1.6 | 3.1.6 | →3.1.6 | – | – |
| @11ty/eleventy-upgrade-help | 3.0.1 | 3.0.2 | 3.0.2 | →3.0.2 | – | – |
| alpinejs | 3.15.0 | 3.15.12 | 3.15.12 | →3.15.12 | – | – |
| tailwindcss | 3.4.17 | 3.4.19 | 4.3.3 | →3.4.19 | – | →4.3.3 |
| autoprefixer | 10.4.21 | 10.5.4 | 10.5.4 | – | →10.5.4 | – |
| postcss | 8.5.6 | 8.5.23 | 8.5.23 | →8.5.23 | – | – |
| postcss-preset-env | 10.4.0 | 10.6.1 | 11.3.2 | – | →10.6.1 | →11.3.2 |
This table is illustrative; the runbook re-derives it from a fresh npm outdated each month.
git checkout main && git pull --ff-onlygit checkout -b chore/dep-updates-YYYY-MMnpm outdated → record Current / Wanted / Latest for every dep; tier each row per the rule above.npm audit --omit=dev → record open advisories (severity + advisories count).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:
npm install <pkg>@latestnpm run build → must succeed.npm run dev → visual check across the pages listed below.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.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 pages below.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 and confirm layout, Tailwind styling, and Alpine interactions work:
/ — 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/git revert <commit> or git 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 PostCSS plugin in postcss.config.js.tailwind.config.js becomes optional / legacy; v4 prefers CSS @theme blocks.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 runbook's defer escape hatch 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 (manual by design).
None.