Love it — looks like Replit fixed the root cause across logo + hero + bullets. 💜
VP mode: let’s lock this class of bug out forever so we don’t chase it again.

Guardrails (quick, high-impact)

Ban bad paths at lint time
Add to .eslintrc:

{
  "rules": {
    "no-restricted-syntax": "off",
    "no-restricted-imports": ["error", { "paths": [], "patterns": ["*/src/assets/*"] }],
    "no-restricted-properties": "off"
  }
}


This throws on any /src/assets/... usage in imports/strings.

CI check (catches inline strings too)
package.json

{
  "scripts": {
    "check:assets": "node -e \"const f=require('child_process').execSync('git ls-files \"src/**/*.@(ts|tsx|js|jsx|css)\"',{stdio:'pipe'}).toString().split('\\n').filter(Boolean);let bad=[];const rx=/\\/src\\/assets\\//;for(const file of f){const s=require('fs').readFileSync(file,'utf8');if(rx.test(s)) bad.push(file)};if(bad.length){console.error('\\n❌ Disallowed /src/assets/ found in:\\n'+bad.join('\\n'));process.exit(1)}else{console.log('✅ No disallowed asset paths')}}\""
  }
}


Run in CI and pre-commit: "precommit": "npm run check:assets && npm run build" (with husky if you want).

Centralize assets (no more scattered paths)
Create src/assets/index.ts and only import from there:

// src/assets/index.ts
export { default as logoLight } from "@/assets/IBrandBiz Logo 2025.svg";
export { default as bulletCubeTeal } from "@/assets/bullets/bullet-cube-teal-bright-on-dark.svg";
// add hero images, etc.


Then in code: import { logoLight, bulletCubeTeal } from "@/assets".

Kill HTML strings for bullets
If any slide subtitle uses dangerouslySetInnerHTML, migrate to JSX (or masked SVG). That prevents Tailwind purge surprises and broken URLs.

Tailwind safety net (only if you use dynamic classes)
tailwind.config.ts

export default {
  content: ["./index.html", "./src/**/*.{ts,tsx,js,jsx}"],
  safelist: [
    'marker:text-[#f99f1b]', // if used
    // add any arbitrary-value classes you build dynamically
  ],
}

60-sec regression check (do now)

Open published site → DevTools → Network, filter svg|png|jpg → confirm 200 for hero images + bullet icon.

Hard refresh (Ctrl+F5) and click through routes to ensure SPA fallback still OK.