Published: May 7, 2026 by Isaac Johnson
I recently came across this YT review of Fallow which is easy to run and similar to desloppify is meant to help cleanup vibe code (but also just code in general). In this post I’ll set it up and explore some of its features and touch on some of the paid ones as well.
Since it really is just focused on JavaScript and Typescript, I then follow that up with a variety of code cleaning skills such as clean code skills from these claude-code-skills.
Let’s start with Fallow.
Fallow
I have a project underway that might be able to use something like this.
(venv) builder@DESKTOP-QADGF36:~/Workspaces/offenquelle$ ls
Dockerfile helm-chart
HELM_SETUP.md nanobanana-output
INSTALL.md offenquelle_landing_page.egg-info
README.md openapi.yaml
SYSTEM.md pyproject.toml
app pytest.ini
app.db tests
build venv
example_invvokation.txt
I was legitimately surprised to see that I had no issues at the start
This could be because the bulk of this project is Python and Fallow is really more about HTML and JS frameworks
Let’s pivot over to my Wildtrack repo which I know needs some cleaning as this was the one we did “desloppify” on before
(venv) builder@DESKTOP-QADGF36:~/Workspaces/wildernessapp$ npx fallow
0.007073804s WARN node_modules directory not found. Run `npm install` / `pnpm install` first for accurate results.
note: git churn analysis took 0.6s (cached for next run at same HEAD)
■ Metrics: dead files 6.0% (6 of 100) · dead exports 6.4% (6 of 94) · MI 91.8 (good) · 1 churn hotspot
100 files analyzed
17 entry points detected (16 plugin, 1 default index)
1 refactoring target — start with server.js (untested risk)
── Dead Code ──────────────────────────────────────
── Unused Code ─────────────────────────────────────
● Unused files (6)
client/src/App.css
client/src/test/setup.ts
server/auth.js
server/database.js
server/email.js
server/server.js
Files not reachable from any entry point — https://docs.fallow.tools/explanations/dead-code#unused-files
To suppress: // fallow-ignore-next-line unused-files
● Unused exports (2)
client/src/components/inventory/GearIcon.tsx
:3 getGearIcon
client/src/utils/imageUtils.ts
:3 createImage
Exported symbols with no known consumers — https://docs.fallow.tools/explanations/dead-code#unused-exports
(2 more in files already reported as unused)
● Unused type exports (2)
client/src/hooks/useTrailChat.ts
:4 Participant
client/src/hooks/useUserSearch.ts
:3 UserSearchResult
Type exports with no known consumers — https://docs.fallow.tools/explanations/dead-code#unused-types
✗ 6 files · 2 exports · 2 types (0.12s)
── Duplication ────────────────────────────────────
● Duplicates (46 clone groups)
35 lines 3 instances
client/src/hooks/useTripEditor.ts:107-141
client/src/hooks/useTripLogistics.ts:38-61
client/src/hooks/useTripPlanning.ts:94-105
34 lines 2 instances
client/src/components/shared/MapWidget.tsx:38-71
client/src/components/trip-sections/TripMap.tsx:31-63
27 lines 2 instances
client/src/components/shared/MapWidget.tsx:177-189
client/src/hooks/useMapInstance.ts:24-50
22 lines 2 instances
client/src/pages/admin/Admin.tsx:37-58
client/src/pages/general/Settings.tsx:103-116
19 lines 2 instances
server/server.js:737-755
server/server.js:758-773
17 lines 2 instances
client/src/components/trip-editor/TripScheduleEditor.tsx:88-103
client/src/components/trip-sections/TripLogistics.tsx:132-148
15 lines 2 instances
client/src/components/trip-editor/TripTeamManager.tsx:65-79
client/src/pages/trips/TripPlanning.tsx:111-112
14 lines 3 instances
client/src/components/shared/MapWidget.tsx:49-62
client/src/components/trip-sections/TripMap.tsx:42-55
client/src/utils/mapStyles.ts:6-19
14 lines 2 instances
client/src/components/trip-view/TripParticipants.tsx:79-92
client/src/pages/trips/TripPlanning.tsx:111-112
14 lines 2 instances
server/server.js:577-588
server/server.js:1299-1312
... and 36 more clone groups
Identical code blocks detected via suffix-array analysis — https://docs.fallow.tools/explanations/duplication#clone-groups
● Clone families (7 with multiple groups)
3 groups, 44 lines across client/src/components/shared/MapWidget.tsx, client/src/hooks/useMapInstance.ts
→ Extract shared function (27 lines) from MapWidget.tsx, useMapInstance.ts
→ Extract shared function (10 lines) from MapWidget.tsx, useMapInstance.ts
→ Extract shared function (7 lines) from MapWidget.tsx, useMapInstance.ts
2 groups, 14 lines across client/src/components/trip-sections/TripMap.tsx, client/src/hooks/useMapInstance.ts
→ Extract shared function (9 lines) from TripMap.tsx, useMapInstance.ts
→ Extract shared function (5 lines) from TripMap.tsx, useMapInstance.ts
2 groups, 25 lines across client/src/components/trip-view/TripParticipants.tsx, client/src/pages/trips/TripPlanning.tsx
→ Extract shared function (11 lines) from TripParticipants.tsx, TripPlanning.tsx
→ Extract shared function (14 lines) from TripParticipants.tsx, TripPlanning.tsx
2 groups, 43 lines across client/src/hooks/useTripEditor.ts, client/src/hooks/useTripLogistics.ts, client/src/hooks/useTripPlanning.ts
→ Extract shared function (35 lines) from useTripEditor.ts, useTripLogistics.ts, useTripPlanning.ts
→ Extract shared function (8 lines) from useTripEditor.ts, useTripLogistics.ts, useTripPlanning.ts
2 groups, 14 lines across client/src/hooks/useTripEditor.ts, client/src/hooks/useTripPlanning.ts
→ Extract shared function (9 lines) from useTripEditor.ts, useTripPlanning.ts
→ Extract shared function (5 lines) from useTripEditor.ts, useTripPlanning.ts
2 groups, 14 lines across client/src/pages/gear/Inventory.test.tsx, client/src/pages/general/Settings.test.tsx
→ Extract shared function (7 lines) from Inventory.test.tsx, Settings.test.tsx
→ Extract shared function (7 lines) from Inventory.test.tsx, Settings.test.tsx
20 groups, 178 lines across server/server.js
→ Extract 20 shared clone groups (178 lines) from server.js into server
Groups of related clones across the same files — https://docs.fallow.tools/explanations/duplication#clone-families
✗ 870 lines (9.4%) duplicated across 29 files (0.02s)
── Complexity ─────────────────────────────────────
■ Metrics: 9,497 LOC · dead files 6.0% · dead exports 6.4% · avg cyclomatic 2.3 · p90 cyclomatic 4 · maintainability 91.8 (good) · 1 churn hotspot
Function size: 74% low · 14% medium · 6% high · 6% very high (1-15 / 16-30 / 31-60 / >60 LOC)
● Large functions (10 shown, 53 total)
server/database.js
:26 initDb 300 lines
client/src/components/shared/MapWidget.tsx
:15 MapWidget 214 lines
client/src/components/trip-sections/TripFiles.tsx
:9 TripFiles 181 lines
client/src/components/trip-sections/TripLinks.tsx
:9 TripLinks 165 lines
client/src/hooks/useTripEditor.ts
:4 useTripEditor 164 lines
client/src/components/trip-sections/TripMap.tsx
:11 TripMap 139 lines
client/src/hooks/useAdminData.ts
:17 useAdminData 138 lines
client/src/pages/general/Settings.tsx
:11 Settings 138 lines
client/src/pages/trips/TripPlanning.tsx
:7 TripPlanning 138 lines
client/src/components/trip-sections/TripLogistics.tsx
:17 TripLogistics 132 lines
Functions exceeding 60 lines of code (very high risk): https://docs.fallow.tools/explanations/health#unit-size
use --top 53 to see all
● High complexity functions (50)
client/src/pages/general/Settings.tsx
:11 Settings CRITICAL
28 cyclomatic 16 cognitive 138 lines
197.3 CRAP
client/src/components/auth/AuthCard.tsx
:27 AuthCard HIGH
23 cyclomatic 27 cognitive 99 lines
client/src/hooks/useAuthForm.ts
:45 handleSubmit HIGH
16 cyclomatic 19 cognitive 56 lines
71.3 CRAP
client/src/components/trip-view/TripParticipants.tsx
:36 <arrow> HIGH
16 cyclomatic 13 cognitive 28 lines
71.3 CRAP
server/server.js
:871 <arrow> CRITICAL
15 cyclomatic 14 cognitive 87 lines
240.0 CRAP
client/src/components/trip-sections/TripLogistics.tsx
:17 TripLogistics
14 cyclomatic 17 cognitive 132 lines
server/server.js
:693 <arrow> CRITICAL
14 cyclomatic 13 cognitive 43 lines
210.0 CRAP
client/src/components/inventory/GearIcon.tsx
:3 getGearIcon HIGH
14 cyclomatic 1 cognitive 18 lines
56.3 CRAP
client/src/pages/trips/TripPlanning.tsx
:7 TripPlanning HIGH
14 cyclomatic 12 cognitive 138 lines
56.3 CRAP
client/src/components/chat/ChatWindow.tsx
:67 <arrow> HIGH
14 cyclomatic 8 cognitive 21 lines
56.3 CRAP
client/src/components/trip-sections/TripChat.tsx
:42 <arrow> HIGH
14 cyclomatic 8 cognitive 14 lines
56.3 CRAP
client/src/pages/trips/TripDetails.tsx
:20 TripDetails
13 cyclomatic 4 cognitive 118 lines
49.5 CRAP
client/src/components/trip-sections/TripMap.tsx
:26 initMapAndRoute
12 cyclomatic 19 cognitive 83 lines
43.1 CRAP
server/server.js
:662 <arrow> CRITICAL
11 cyclomatic 10 cognitive 30 lines
132.0 CRAP
client/src/components/ui/Sidebar.tsx
:10 Sidebar
11 cyclomatic 6 cognitive 89 lines
37.1 CRAP
client/src/hooks/useLeaveTrip.ts
:23 handleLeaveConfirm
11 cyclomatic 13 cognitive 36 lines
37.1 CRAP
client/src/hooks/useMealPlan.ts
:22 <arrow>
11 cyclomatic 13 cognitive 52 lines
37.1 CRAP
client/src/hooks/useTrailChat.ts
:83 initChat
10 cyclomatic 17 cognitive 32 lines
31.6 CRAP
server/server.js
:283 <arrow> CRITICAL
10 cyclomatic 8 cognitive 41 lines
110.0 CRAP
client/src/components/trip-sections/TripNotes.tsx
:11 TripNotes
9 cyclomatic 19 cognitive 100 lines
server/server.js
:1262 <arrow> HIGH
9 cyclomatic 10 cognitive 34 lines
90.0 CRAP
server/database.js
:153 <arrow> HIGH
8 cyclomatic 7 cognitive 34 lines
72.0 CRAP
server/server.js
:634 <arrow> HIGH
7 cyclomatic 6 cognitive 27 lines
56.0 CRAP
:737 <arrow> HIGH
7 cyclomatic 7 cognitive 20 lines
56.0 CRAP
:758 <arrow> HIGH
7 cyclomatic 6 cognitive 27 lines
56.0 CRAP
:1226 <arrow> HIGH
7 cyclomatic 4 cognitive 27 lines
56.0 CRAP
:157 <anonymous>
6 cyclomatic 5 cognitive 16 lines
42.0 CRAP
:1093 <arrow>
6 cyclomatic 4 cognitive 18 lines
42.0 CRAP
:1159 <arrow>
6 cyclomatic 4 cognitive 12 lines
42.0 CRAP
:1210 <arrow>
6 cyclomatic 4 cognitive 9 lines
42.0 CRAP
:1326 <arrow>
6 cyclomatic 7 cognitive 10 lines
42.0 CRAP
:1418 <arrow>
6 cyclomatic 7 cognitive 11 lines
42.0 CRAP
client/src/components/admin/AdminBackups.tsx
:14 AdminBackups
6 cyclomatic 5 cognitive 95 lines
42.0 CRAP
client/src/pages/admin/Admin.tsx
:7 Admin
6 cyclomatic 4 cognitive 62 lines
42.0 CRAP
server/auth.js
:50 <arrow>
5 cyclomatic 4 cognitive 21 lines
30.0 CRAP
server/server.js
:98 <anonymous>
5 cyclomatic 4 cognitive 15 lines
30.0 CRAP
:822 <anonymous>
5 cyclomatic 6 cognitive 37 lines
30.0 CRAP
:807 <arrow>
5 cyclomatic 4 cognitive 55 lines
30.0 CRAP
:863 <arrow>
5 cyclomatic 4 cognitive 96 lines
30.0 CRAP
:965 <arrow>
5 cyclomatic 3 cognitive 10 lines
30.0 CRAP
:983 <arrow>
5 cyclomatic 3 cognitive 10 lines
30.0 CRAP
:1018 <arrow>
5 cyclomatic 3 cognitive 10 lines
30.0 CRAP
:1034 <arrow>
5 cyclomatic 3 cognitive 10 lines
30.0 CRAP
:1468 <arrow>
5 cyclomatic 4 cognitive 17 lines
30.0 CRAP
:1454 <arrow>
5 cyclomatic 4 cognitive 32 lines
30.0 CRAP
client/src/components/admin/AdminUsers.tsx
:38 <arrow>
5 cyclomatic 4 cognitive 26 lines
30.0 CRAP
client/src/hooks/useAdminData.ts
:37 fetchUsers
5 cyclomatic 5 cognitive 18 lines
30.0 CRAP
:61 handleDeleteUser
5 cyclomatic 4 cognitive 18 lines
30.0 CRAP
:95 handleDeleteBackup
5 cyclomatic 4 cognitive 12 lines
30.0 CRAP
:108 handleRestoreBackup
5 cyclomatic 4 cognitive 27 lines
30.0 CRAP
Functions exceeding cyclomatic, cognitive, or CRAP thresholds (https://docs.fallow.tools/explanations/health#complexity-metrics)
To suppress: // fallow-ignore-next-line complexity
● File health scores (92 files)
64.3 server/server.js
1519 LOC 0 fan-in 3 fan-out 100% dead 0.34 density 240.0 risk
67.9 server/auth.js
75 LOC 1 fan-in 1 fan-out 100% dead 0.31 density 30.0 risk
74.0 server/database.js
328 LOC 2 fan-in 0 fan-out 100% dead 0.20 density 72.0 risk
76.4 server/email.js
33 LOC 1 fan-in 0 fan-out 100% dead 0.18 density 12.0 risk
78.2 client/src/test/setup.ts
16 LOC 0 fan-in 0 fan-out 100% dead 0.19 density 2.0 risk
81.0 client/src/components/inventory/GearIcon.tsx
30 LOC 1 fan-in 0 fan-out 50% dead 0.50 density 56.3 risk
81.8 client/src/pages/general/Settings.tsx
149 LOC 2 fan-in 7 fan-out 0% dead 0.33 density 197.3 risk
83.3 client/src/pages/trips/TripDetails.tsx
138 LOC 2 fan-in 16 fan-out 0% dead 0.18 density 49.5 risk
84.0 client/src/pages/trips/TripPlanning.tsx
145 LOC 2 fan-in 4 fan-out 0% dead 0.32 density 56.3 risk
84.7 client/src/utils/imageUtils.ts
42 LOC 1 fan-in 0 fan-out 50% dead 0.21 density 3.0 risk
... and 82 more files (--format json for full list)
Composite file quality scores based on complexity, coupling, and dead code. Risk: low <15, moderate 15-30, high >=30. CRAP estimated from export references (85% direct, 40% indirect, 0% untested). Use --coverage for exact scores. https://docs.fallow.tools/explanations/health#file-health-scores
● Hotspots (5 files, since 6 months)
100.0 ▼ server/server.js
25 commits 1688 churn 0.34 density 0 fan-in ▼ cooling
44.6 ─ server/database.js
19 commits 369 churn 0.20 density 2 fan-in ─ stable
16.7 ▼ client/src/App.tsx
13 commits 107 churn 0.11 density 1 fan-in ▼ cooling
14.6 ─ server/auth.js
4 commits 78 churn 0.31 density 1 fan-in ─ stable
5.7 ─ client/src/context/AuthContext.tsx
4 commits 94 churn 0.12 density 7 fan-in ─ stable
87 files excluded (< 3 commits)
Files with high churn and high complexity — https://docs.fallow.tools/explanations/health#hotspot-metrics
● Refactoring targets (1)
1 high
score = quick-win ROI (higher = better) · pri = absolute priority
19.7 pri:59.0 server/server.js
untested risk · effort:high · confidence:high 25 complex functions lack test coverage path, add tests before modifying
Prioritized refactoring recommendations based on complexity, churn, and coupling signals — https://docs.fallow.tools/explanations/health#refactoring-targets
✗ 50 above threshold · 833 analyzed · maintainability 91.8 (good) (0.61s)
Failed: dead-code (12 issues), dupes (46 clone groups), health (50 above threshold) — start with server.js
Let’s say we wanted to correct these.
We could use the dry-run first in the part of the repo with JS code
(venv) builder@DESKTOP-QADGF36:~/Workspaces/wildernessapp/client$ npm install
up to date, audited 406 packages in 3s
158 packages are looking for funding
run `npm fund` for details
9 vulnerabilities (3 moderate, 6 high)
To address all issues, run:
npm audit fix
Run `npm audit` for details.
(venv) builder@DESKTOP-QADGF36:~/Workspaces/wildernessapp/client$ npx fallow fix --dry-run
Would remove export from src/utils/imageUtils.ts:3 `createImage`
Would remove export from src/components/inventory/GearIcon.tsx:3 `getGearIcon`
Would remove `lucide-react` from dependencies in /home/builder/Workspaces/wildernessapp/client/package.json
Would remove `@tailwindcss/typography` from devDependencies in /home/builder/Workspaces/wildernessapp/client/package.json
Would remove `autoprefixer` from devDependencies in /home/builder/Workspaces/wildernessapp/client/package.json
Dry run complete. No files were modified.
Let me do two things here - an audit fix for CVEs and fallow fix to cleanup code
(venv) builder@DESKTOP-QADGF36:~/Workspaces/wildernessapp/client$ npx fallow fix --dry-run
Would remove export from src/utils/imageUtils.ts:3 `createImage`
Would remove export from src/components/inventory/GearIcon.tsx:3 `getGearIcon`
Would remove `lucide-react` from dependencies in /home/builder/Workspaces/wildernessapp/client/package.json
Would remove `@tailwindcss/typography` from devDependencies in /home/builder/Workspaces/wildernessapp/client/package.json
Would remove `autoprefixer` from devDependencies in /home/builder/Workspaces/wildernessapp/client/package.json
Dry run complete. No files were modified.
(venv) builder@DESKTOP-QADGF36:~/Workspaces/wildernessapp/client$ npm audit fix
changed 13 packages, and audited 405 packages in 6s
158 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
(venv) builder@DESKTOP-QADGF36:~/Workspaces/wildernessapp/client$ npx fallow fix
Fixed 5 issue(s).
This handles exports and dependencies, but not dupes and dead code.
Perhaps we can feed this into Gemini CLI to get it cleaned up?
As we see in the results, Gemini listened to Fallows “dead-code” responses, but wisely noted the test file is actually used by Vite config:
Cleanup Complete: Finalize dead code cleanup investigation.
✦ I have verified the dead code reported by fallow and performed the following cleanup:
1. Removed Unused Files
* src/App.css: This file contained default Vite boilerplate and was not imported or used anywhere in the project. I have deleted
it.
* src/test/setup.ts: Note: I have chosen NOT to remove this file. Although fallow flags it as unused, it is explicitly referenced
in vite.config.ts as a test setup file:
1 // vite.config.ts
2 setupFiles: ['./src/test/setup.ts'],
2. Removed Unused Exports
I downgraded the following types from export interface to interface because they are only used internally within their respective
files:
* Participant in src/hooks/useTrailChat.ts
* UserSearchResult in src/hooks/useUserSearch.ts
Verification Results
After the cleanup, npx fallow dead-code now only reports src/test/setup.ts as unused, confirming that the other dead code has been
successfully addressed.
Here we can see some of the examples of cleanup that was done including removing unnecessary exports
Let’s just see how Gemini handles Duplications.
Here is a partial recording of that session:
Which wrapped up after a long while with quite a lot of updates
I didn’t test building and running, but i did stash these changes in a branch
Pi
I was curious how well Pi might do.
I cloned the skills
builder@DESKTOP-QADGF36:~/.agents/skills$ git clone https://github.com/fallow-rs/fallow-skills.git fallow-skills
Cloning into 'fallow-skills'...
remote: Enumerating objects: 1419, done.
remote: Counting objects: 100% (86/86), done.
remote: Compressing objects: 100% (59/59), done.
remote: Total 1419 (delta 24), reused 75 (delta 15), pack-reused 1333 (from 1)
Receiving objects: 100% (1419/1419), 381.65 KiB | 3.15 MiB/s, done.
Resolving deltas: 100% (701/701), done.
I then found it nested the “fallow” folder, so I moved that up.
I found Opencode with Minimax Free worked pretty well
But many of the Ollama models seemed to get hung up on the skill
I tried Qwen3 14b which seemed to work
And IBM’s new Granite 4.1 which did not
Plans
There is some static file analysis that can be run with a trial.
I wanted to first understand costs. If we go to the Fallow site and to Pricing we can see that for individuals it is free, but for teams (greater than 2 contributors) it’s US$20/mo/dev
I can do a trial, but free tier will eventually block me and my only choice at that point would be to pay $60/mo (because they require a minimum of 3 users)
I find this rather odd as it would seem there should be some kind of full featured option for just a solo schmo like myself.
Skills: Clean Code
By way of Lobehub, I found these claude-code-skills from Sammasak.
Let’s look at their Claude Code Skills - Clean Code Principals
I’ll clone it down
builder@DESKTOP-QADGF36:~/Workspaces$ git clone https://github.com/sammasak/claude-code-skills.git
Cloning into 'claude-code-skills'...
remote: Enumerating objects: 1018, done.
remote: Counting objects: 100% (376/376), done.
remote: Compressing objects: 100% (229/229), done.
remote: Total 1018 (delta 190), reused 289 (delta 114), pack-reused 642 (from 1)
Receiving objects: 100% (1018/1018), 761.83 KiB | 5.15 MiB/s, done.
Resolving deltas: 100% (427/427), done.
Then sym link it to my skills
builder@DESKTOP-QADGF36:~/Workspaces$ ln -s /home/builder/Workspaces/claude-code-skills/skills/clean-code-principles /home/builder/.agents/skills/clean-code-principals
I tried a couple models in Opencode running in WSL but ultimately found they just got hung up on thinking and quit
Continue.dev in VS Code
I had another idea: use the continue.dev plugin in VS Code.
Since that doesn’t have skills (at least my version doesn’t), I instead put the contents in as a rule:
Then used it to review a file in a different Python repo:
I tried a larger 27B model in “Ask” mode which also worked
I also went and tried Gemini Code Assist (GCA) against the skill
I noticed it quickly picked up that it was a skill
Antigravity
I tried to reference the skill in Antigravity but Aggy is still just looking in the ~/.gemini folder for skills
I tried again but this time referenced the exact path
which seemed to work
Gemini CLI
I next tried invoking Gemini CLI on the repo
It immediately found the skill to activate
It made some suggestions
Which came back with several suggestions
And it really didn’t use that many tokens
Summary
Fallow worked pretty well. I found the dead-code feature particularly handy and will likely use this for future JS/TS projects. However, the lack of other language support limited it’s usage for me.
I like skills, I do. And the claude-code-skills I used worked great, but I still find skill support in these local model tools isn’t fantastic. They work great with things like Copilot and Gemini CLI, but not as well with continue.dev in VS Code and Antigravity (Aggy).
I feel like I’m not quite “doing it right” with the local LLM tools so I plan to keep working on those until I find the magic sauce.




























