Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Audits and strips Lovable scaffolding from Vite + React projects — removes lovable-tagger, swaps placeholder assets, prunes unused Radix deps, and cleans generated docs so the codebase ships as yours.
.claude/skills/sickn33-lovable-cleanup/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-12 | ✗→✓ | ▲ Improved | 151% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 162% | 0% |
| case-23 | ✗→✓ | ▲ Improved | 122% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 119% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 196% | 0% |
> Remove every trace of Lovable scaffolding and ship the project as your own. > Made with agentic-awesome-skills · author: whoisabhishekadhikari
Lovable (lovable.dev) bootstraps Vite + React + shadcn/ui projects with its own tagger dependency, branding, placeholder assets, and generated markdown docs baked in. Most developers export from Lovable and want a clean, ownable codebase before shipping or open-sourcing. This skill covers all 15 areas where Lovable leaves fingerprints.
lovable-tagger in package.jsonCLEANUP_SUMMARY.md, DEPLOYMENT_GUIDE.md, or DEVELOPMENT_SUMMARY.mdindex.html still has a generic <title> or Lovable faviconLovable adds three categories of scaffolding that must be removed:
lovable-tagger dev dep + componentTagger() call in vite.config.ts.This is the only runtime hook; removing it is always safe.
favicon.ico/png, og-image.png, logo.png, generic <title>,and a Lovable project URL in README.md.
CLEANUP_SUMMARY.md, DEPLOYMENT_GUIDE.md, DEVELOPMENT_SUMMARY.md,LOGO_UPDATE.md in the project root.
Removing deps before editing source files avoids lockfile conflicts. Cleaning docs last means the README reflects the already-cleaned project.
Lovable pre-installs the full shadcn/ui component set (~29 components) and all Radix UI primitives (~30 packages). Most projects use 5–10. The unused ones are safe to remove but @radix-ui/react-slot must be kept — it is an indirect dep used internally by many shadcn components via the asChild prop.
or CDN caching can keep the old icon visible, so verify the live response
# Welcome to your Lovable project with the real project titlehttps://lovable.dev/projects/REPLACE_WITH_PROJECT_ID✅ After stripping, read the README end-to-end. Offer to write a replacement intro paragraph if large sections were removed.
"lovable-tagger" from devDependencies"name" from "vite_react_shadcn_ts" to the real project name (kebab-case)scripts block for "lovable" or "lovable:*" entries and remove them<!-- security-allowlist: grep for scanning package.json content, read-only, no network -->
bashgrep -n "lovable" package.json
import { componentTagger } from "lovable-tagger"mode === 'development' && componentTagger() from the plugins array.filter(Boolean) if it was only present to handle the conditional tagger<!-- security-allowlist: grep for scanning vite config, read-only -->
bashgrep -n "lovable\|componentTagger\|filter(Boolean)" vite.config.ts
<title> with the real product name<!-- Generated by Lovable --> comments or Lovable meta tags<!-- security-allowlist: grep for scanning HTML file, read-only -->
bashgrep -in "lovable\|generator" index.html
Replace these files (keep filenames, swap content):
| File | Action | |---|---| | favicon.ico | Overwrite with real icon — do NOT just delete, see Area 15 | | favicon.png | Replace with real icon | | og-image.png / logo.png | Replace with real brand assets | | placeholder.svg | Usually unused — safe to delete |
✅ Flag which files are actually referenced in <head> vs dead weight so the user knows what to prioritise.
src/main.tsx — scan for Lovable HOCs, wrappers, or commentssrc/App.tsx — same// generated by Lovable headers<!-- security-allowlist: grep over source files, read-only, no network -->
bashgrep -rn "lovable\|Lovable" src/ --include="*.tsx" --include="*.ts"
<!-- security-allowlist: npm uninstall removes a dev-only package, local filesystem only -->
bashnpm uninstall lovable-tagger grep "lovable-tagger" package-lock.json
Use yarn remove or pnpm remove if the project uses those instead.
Double-check after Area 2 — scripts are sometimes injected separately from deps:
<!-- security-allowlist: grep, read-only -->
bashgrep -n '"lovable' package.json
<!-- security-allowlist: grep over local env files, read-only, no credentials transmitted -->
bashgrep -rin "lovable" .env .env.local .env.example 2>/dev/null \ | sed -E 's/([A-Za-z_][A-Za-z0-9_]*LOVABLE[A-Za-z0-9_]*=).*/\1[REDACTED]/I'
Remove any Lovable API keys or project IDs. If a variable is Lovable-only, delete the entire line — don't leave an empty key.
Delete or repurpose these common Lovable-generated files:
CLEANUP_SUMMARY.mdDEPLOYMENT_GUIDE.mdDEVELOPMENT_SUMMARY.mdLOGO_UPDATE.md<!-- security-allowlist: grep over markdown files, read-only -->
bashgrep -rln "lovable\|Lovable" *.md 2>/dev/null
✅ Skim each file before deleting — Lovable docs sometimes contain useful architecture notes worth preserving in a rewritten CONTRIBUTING.md or ARCHITECTURE.md.
Usually clean — confirm and move on:
<!-- security-allowlist: grep over config files, read-only -->
bashgrep -in "lovable" \ public/robots.txt public/sitemap.xml public/_redirects \ vercel.json netlify.toml 2>/dev/null
After replacing og-image.png, update OG meta in index.html:
html<meta property="og:image" content="/og-image.png" /> <meta property="og:url" content="https://your-domain.com" /> <meta property="og:title" content="Your Real Title" />
<!-- security-allowlist: grep and ls on local git config, read-only -->
bashgrep -in "lovable" .gitignore ls .git/hooks/
Remove any Lovable-specific .gitignore entries or commit hooks.
Step 1 — Map what's actually imported
<!-- security-allowlist: grep over source files, read-only, writes to private temp dir only -->
bashtmpdir="$(mktemp -d "${TMPDIR:-/tmp}/lovable-cleanup.XXXXXX")" || exit 1 grep -rh "from [\"']@radix-ui/" src/ --include="*.tsx" --include="*.ts" \ | grep -oP "from [\"']\K@radix-ui/[^\"']+" | sort -u > "$tmpdir/radix-used.txt" grep -rh "from [\"']@/components/ui/" src/ --include="*.tsx" \ | grep -oP "from [\"']\K@/components/ui/[^\"']+" | sort -u > "$tmpdir/shadcn-used.txt"
Step 2 — Diff against installed
<!-- security-allowlist: grep and diff on local package.json and private temp files, read-only -->
bashgrep -oP '"@radix-ui/[^"]+' package.json | tr -d '"' | sort > "$tmpdir/radix-installed.txt" diff "$tmpdir/radix-installed.txt" "$tmpdir/radix-used.txt"
Step 3 — Bulk remove & verify
<!-- security-allowlist: npm uninstall removes unused local packages, no network mutation -->
bashnpm uninstall @radix-ui/react-accordion @radix-ui/react-alert-dialog # etc. npm run build
components.json — verify style, baseColor, and aliases match the real projecteslint.config.js — usually standard; quick scan only<!-- security-allowlist: grep on config files, read-only -->
bashgrep -in "lovable" components.json eslint.config.js
Lovable ships a default favicon.ico that browsers auto-request from site root and that can remain visible after cleanup through browser or CDN caching. Handle the four steps — replace the path, link all icon flavours, keep unversioned icon URLs revalidatable, and verify after deploy — then purge the confirmed Vercel project cache only if the live response stays stale. Full commands/JSON live in references/favicon-vercel-cleanup.md.
<!-- security-allowlist: recursive grep across project directory, read-only, no network -->
bashgrep -rn "lovable\|Lovable\|LOVABLE\|lovable-tagger\|lovable\.dev" \ --include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" \ --include="*.json" --include="*.md" --include="*.html" --include="*.toml" \ --include="*.yaml" --include="*.yml" --include="*.txt" \ . 2>/dev/null \ | grep -v "node_modules\|\.git\|dist\|build" \ | sed -E 's/([A-Za-z_][A-Za-z0-9_]*LOVABLE[A-Za-z0-9_]*=).*/\1[REDACTED]/I'
User: I just exported my project from Lovable. Clean it up.
Agent:
1. Runs master scan — finds 23 matches across 8 files
2. Uninstalls lovable-tagger, renames package.json "name"
3. Strips vite.config.ts of componentTagger
4. Updates index.html title, removes generator comment
5. Flags 4 markdown docs for deletion, skims each first
6. Produces cleanup reportUser: Just prune the unused Radix packages from my Lovable project.
Agent:
1. Runs grep diff (Area 13 only)
2. Identifies 18 unused @radix-ui packages
3. Removes them in bulk, keeps @radix-ui/react-slot
4. Runs npm run build to verify — passes cleannpm run build passes after every batch of changeslive response and purge only the confirmed project if it remains stale
@radix-ui/react-slot — it's an indirect dep of most shadcn componentsLOVABLE_PROJECT_ID= — delete the whole linegenerates a transparent placeholder ICO only — the user must supply genuine artwork.
not caught by a direct grep. Always verify with npm run build.
components.json aliases automatically — it only scans andflags mismatches for the user to fix manually.
functions) — those require separate review.
Symptoms: Module not found error for a @radix-ui/* package Solution: Re-add the missing package. Open src/components/ui/*.tsx and search for the from '@radix-ui/...' import to find which component depends on it.
Symptoms: grep "lovable-tagger" package-lock.json returns results Solution: Delete node_modules/ and package-lock.json, then run npm install fresh.
Symptoms: Browser tab shows "Lovable" or "Vite App" despite edits Solution: Check for a <Helmet> or <Head> component in src/App.tsx or a layout wrapper — React-level title tags override index.html at runtime.
Symptoms: curl -sI https://<domain>/favicon.ico returns the old ETag with x-vercel-cache: HIT after the replacement deployment. Solution: Overwrite public/favicon.ico with replacement content (a transparent 1×1 ICO if no real asset yet), verify the custom domain, then use the explicit Vercel CDN purge only if the response remains stale — see Area 15.
@vite-config — Vite configuration best practices@shadcn-setup — shadcn/ui installation and customization@react-cleanup — general React project hygieneAfter completing the audit, produce a cleanup report:
## ✅ Cleaned
<list of changes made>
## ⚠️ Needs your input
<items needing a decision — brand assets, project name, domain>
## 🗑️ Deferred (safe to do later)
<e.g. unused dep pruning, OG image swap>Made with agentic-awesome-skills · author: whoisabhishekadhikari
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-12 | fail→pass | 19,853 | 24,531 | +24% | 1 | 1 | 0% | 2,661 | 6,688 | +151% | 0 | 0 | — |
case-01 | fail→fail | 29,640 | 22,760 | -23% | 1 | 1 | 0% | 3,512 | 4,803 | +37% | 0 | 0 | — |
case-02 | fail→fail | 15,001 | 18,677 | +25% | 1 | 1 | 0% | 377 | 4,524 | +1100% | 0 | 0 | — |
case-03 | fail→fail | 37,017 | 22,699 | -39% | 1 | 1 | 0% | 3,599 | 4,899 | +36% | 0 | 0 | — |
case-04 | pass→pass | 23,457 | 22,683 | -3% | 1 | 1 | 0% | 2,772 | 6,077 | +119% | 0 | 0 | — |
case-05 | pass→pass | 18,522 | 16,769 | -9% | 1 | 1 | 0% | 2,103 | 6,234 | +196% | 0 | 0 | — |
case-06 | pass→pass | 12,017 | 12,085 | +1% | 1 | 1 | 0% | 1,119 | 5,215 | +366% | 0 | 0 | — |
case-07 | pass→pass | 17,948 | 17,061 | -5% | 1 | 1 | 0% | 2,082 | 5,596 | +169% | 0 | 0 | — |
case-08 | fail→pass | 21,691 | 15,488 | -29% | 1 | 1 | 0% | 2,380 | 6,233 | +162% | 0 | 0 | — |
case-09 | pass→pass | 15,221 | 11,211 | -26% | 1 | 1 | 0% | 1,745 | 5,183 | +197% | 0 | 0 | — |
case-10 | pass→pass | 13,408 | 2,934 | -78% | 1 | 1 | 0% | 852 | 4,495 | +428% | 0 | 0 | — |
case-11 | pass→pass | 17,053 | 15,758 | -8% | 1 | 1 | 0% | 1,654 | 5,116 | +209% | 0 | 0 | — |
case-13 | pass→pass | 7,842 | 6,386 | -19% | 1 | 1 | 0% | 1,447 | 4,990 | +245% | 0 | 0 | — |
case-14 | pass→pass | 13,598 | 16,048 | +18% | 1 | 1 | 0% | 1,934 | 5,619 | +191% | 0 | 0 | — |
case-15 | pass→pass | 16,792 | 17,195 | +2% | 1 | 1 | 0% | 2,771 | 6,378 | +130% | 0 | 0 | — |
case-16 | pass→pass | 17,178 | 52,474 | +205% | 1 | 1 | 0% | 2,207 | 5,541 | +151% | 0 | 0 | — |
case-17 | pass→pass | 16,630 | 15,702 | -6% | 1 | 1 | 0% | 2,224 | 6,070 | +173% | 0 | 0 | — |
case-18 | pass→pass | 6,774 | 5,455 | -19% | 1 | 1 | 0% | 966 | 4,506 | +366% | 0 | 0 | — |
case-19 | fail→fail | 24,862 | 22,207 | -11% | 1 | 1 | 0% | 4,316 | 7,224 | +67% | 0 | 0 | — |
case-20 | fail→fail | 20,783 | 19,831 | -5% | 1 | 1 | 0% | 3,544 | 7,701 | +117% | 0 | 0 | — |
case-21 | fail→fail | 35,685 | 32,303 | -9% | 1 | 1 | 0% | 7,875 | 10,038 | +27% | 0 | 0 | — |
case-22 | pass→pass | 12,137 | 10,331 | -15% | 1 | 1 | 0% | 1,315 | 4,977 | +278% | 0 | 0 | — |
case-23 | fail→pass | 20,619 | 13,544 | -34% | 1 | 1 | 0% | 2,451 | 5,429 | +122% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 20 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +13 percentage points is the difference between those two pass rates over the 20 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/9/2026 | +27% |
Other measured skills in the registry, with their headline benchmark lift.