ForgeApps Monorepo / Repo Simplification Audit / July 2, 2026
Ranked wins toward Essentialism, Minimalism, and Clarity. Every item below was found by a dedicated scan, then independently re-verified against the live repo before making the list.
The forgeapps monorepo is healthy at its core but carries heavy sediment: committed binary scratch (screenshots, renders, concept art), dead Python remnants from a pre-TypeScript era, auto-generated doc stubs that violate the repo's own documentation policy, and unbounded log-style files that grow every month. Almost every top win is a deletion — the code that ships is fine. The ten picks below remove roughly 150 MB of tracked weight and about 800 tracked files, fix two self-perpetuating leaks (a doc-stub reseeding bug and a scaffold template that clones violations into every new app), and bound the one file that grows 200 KB a month. All are verified low-risk and git-recoverable.
Remove 24 throwaway Blender render iterations (v16 through v32, plus final/textured renders and a scene file), along with the one broken HTML viewer that points at them. The single largest tracked-weight win found — the pipeline that produced these was retired with the Python purge, so nothing can regenerate or consume them.
Verified evidence53.6 MB across 24 files: apps/jd/scripts/valley-*.png + valley-scene.glb. Only the .glb is LFS; the 23 PNGs are raw blobs. Sole reference: apps/jd/scripts/valley-slider.html. Generating scripts deleted in 3bc09b148; last touched 2026-06-10.
First stepsgit rm 'apps/jd/scripts/valley-comparison*.png' 'apps/jd/scripts/valley-render-*.png' apps/jd/scripts/valley-mcp-viewport.png apps/jd/scripts/valley-scene.glb apps/jd/scripts/valley-slider.html pnpm --filter jd build && commit
Risk: Low. Delete the slider viewer in the same commit or it becomes a blank page. Everything stays recoverable from git history.
Fifteen apps/ directories contain nothing but placeholder files and auto-generated doc stubs — no package.json, no source, no deploy config. They landed accidentally in a stash-restore commit three weeks ago and inflate the app catalog; every tool that enumerates apps has to skip them.
Verified evidence15 apps × 4 stub files = 60 tracked files (30 are CLAUDE.md), all created 2026-06-10 in commit 428dc7002. Bare-name grep across all tracked files: zero references except one maintenance-log line. Tracked app dirs drop 77 → 62.
First stepsgit rm -r apps/forgedeck apps/forgedeploy apps/forgegoals apps/forgehire apps/forgemeet apps/forgenews apps/forgeplan apps/forgeprice apps/forgepulse apps/forgereport apps/forgeship apps/forgesocial apps/forgestack apps/forgeteam apps/forgetest
Risk: Very low. Nothing imports, tests, deploys, or requires these; git restores any of them trivially if one was actually planned.
The repo-root downloads/ folder is committed one-off evidence — Playwright verification screenshots, one day's hourly shop-verification captures, and a March terrain-tile experiment. No code reads it, and repo policy sends large media to ForgeMedia, not git. Gitignore the path so future browser drops stay untracked.
Verified evidence68 tracked files, 25 MB (53 root screenshots + 2 generated images + 13 terrain tiles). Plain blobs, not LFS, so the saving is real. Last content commit 2026-06-10 was a deploy retrigger, not new material.
First stepsgit rm -r downloads/ echo '/downloads/' >> .gitignore # ROOT-ANCHORED — bare 'downloads/' would silently ignore 16 other downloads dirs incl. apps/jd/downloads (531 tracked files)
Risk: Low, one footgun: the gitignore entry must be root-anchored. Optionally upload the meshy terrain reference image to ForgeMedia first.
Upload the five AI-generated slot-machine concept renders to ForgeMedia, then delete them from forgemedia's downloads folder; delete forgebooks' 38 research-session screenshots outright. Together they are 73% of all app-local downloads bloat, and both were accidentally converted from LFS pointers back to raw git blobs in June.
Verified evidenceapps/forgemedia/downloads/slot-machine-concepts/: 5 PNGs, 28.8 MB (raw blobs since d452281f0). apps/forgebooks/downloads/: 38 PNGs, 15.7 MB, zero references. Cross-app scan: 12 apps carry 60.9 MB of tracked downloads; these two are 73%.
First steps1) Upload the 5 slot-machine PNGs via the forgemedia skill — delete only after the upload verifiably succeeds 2) git rm -r apps/forgemedia/downloads/slot-machine-concepts/ apps/forgebooks/downloads/ 3) pnpm --filter forgebooks build as a guard; later repeat on the 10 smaller apps/*/downloads dirs
Risk: Low. The ForgeMedia upload needs a Doppler token and must succeed before deletion or provenance is lost.
Keep only each retired routine's spec (ROUTINE.md) and delete the leftover working artifacts — logs, error files, dashboards, run histories — for 24 routines that will never fire again. Git history already preserves every byte; this is 2.2% of all tracked files removed with zero behavior change.
Verified evidence579 tracked files under crons/routines/_archive/; excluding ROUTINE/CLAUDE/README.md leaves 554 files at 8.2 MB. Sole code consumer (forgeboard's sync-routines-from-markdown.mjs) only needs dir presence and tolerates missing logs. 24 archived dirs; 2 (adamobook-health-check, social-media-manager) have no ROUTINE.md.
First steps1) git rm the non-spec files — but FIRST add a stub ROUTINE.md in the 2 dirs lacking one, so those dirs survive fresh checkouts 2) Update the 'Archiving a routine' section in crons/routines/CLAUDE.md in the same commit 3) Verify all 24 dirs still enumerate via a dry read of discoverRoutines() — don't run the live Supabase sync as verification
Risk: One must-fix: emptying the two spec-less dirs would make git drop them on fresh clones, and a later catalog sync could cascade-delete their Supabase run history. Accepted loss: archived run logs become git-archaeology only.
Split entries older than the newest month into per-month files under docs/changelog/, leave the current entries plus a pointer at the root, and teach the maintaining cron to rotate monthly. The file grew from 2.4 KB to 723 KB in three months, and its own header tells every agent to scan it before starting work — so every reader pays for 2,329 lines to get the top thirty.
Verified evidence723,469 bytes / 2,329 lines; 2,449 bytes three months ago, 502,739 one month ago. 55 uniformly delimited '## [YYYY.MM.DD.N]' entries, zero non-conforming. Live maintainer is adamobook-maintenance ROUTINE.md step 12a; its script anchors date math on the top header only.
First steps1) mkdir docs/changelog; move pre-June sections into CHANGELOG-2026-MM.md files (entries split cleanly on '## [' headers) 2) Keep at least the newest entry in root CHANGELOG.md — zero July entries exist today, so 'current month only' would leave it empty and break the cron's anchor 3) SAME commit: update adamobook-maintenance ROUTINE.md step 12a with the rotation rule
Risk: The file is load-bearing for a live hourly cron with deletion-detection that restores removed blocks. Both hazards are neutralized by keeping the newest entry in root and updating the spec in the same commit.
Delete the 25 Python packaging manifests sitting in skill directories that contain zero Python source, the foreign-project config/python/ directory (a pytest config targeting a package that doesn't exist), and two one-off JD report generators. The repo is TypeScript-only by rule; these files advertise tooling that was already deleted — one even recommends the banned dotenv package.
Verified evidence28 tracked packaging files with zero .py in their trees (25 in .forgebot/skills/, plus config/python/). config/python/pytest.ini targets nonexistent packages/teamcity-lib. Zero tracked .py under apps/ or packages/. .openclaw/workspace/build_jd_report_v3.py + jd_phase3_cost_table.py = 738 lines idle since 2026-06-08.
First steps1) Re-run the zero-py enumeration; git rm the 25 skill manifests + config/python + the two workspace scripts 2) Remove the python/ row from config/CLAUDE.md; grep owning SKILL.md files for stale 'pip install' instructions 3) Delete or rewrite the stale pytest guide docs under the testing subskill
Risk: The skills tree was bulk-restored from an external copy on 2026-06-30 — confirm no external mirror re-syncs the deleted manifests. Do NOT extend the sweep to the live keep-list Python in adamobook-maintenance.
Remove the four 7-line template stubs under packages/ and change one comparison in the docs-maintenance sweep and seeder so the tooling stops recreating files the written policy forbids. This is an active tug-of-war: a human deleted these stubs on June 10 and the routine reseeded them 90 minutes later.
Verified evidence4 stubs, each exactly 7 template lines, duplicating the allowed 135-line packages/CLAUDE.md. Off-by-one verified: 'parts.length > 2' should be '>= 2' at claude_quality_sweep.ts:184 and seed_missing_claude.ts:93. Reseed cycle documented in commits 0ea07fe9d → ff55a124a → f17247efa.
First steps1) Change 'parts.length > 2' to '>= 2' in the packages branch of both files 2) Add a regression test for the packages/<pkg> exclusion — no such test exists, which is why the reseeding went unnoticed twice 3) git rm the four stubs and run the sweep test
Risk: Low — single-character change in a coverage carve-out. Counter-risk of skipping it: the stubs propagate into app node_modules via workspace links, violating another policy rule.
Copy the byte-identical formatting config that 33 apps each carry into a single root file, delete the copies, and remove the orphaned conflicting config under config/linting/. Prettier resolves config by walking up the tree, so this is a byte-exact no-op for the 33 apps — and gives the ~46 unconfigured apps house style for free.
Verified evidence33 apps/*/.prettierrc files, all one md5 (4a2ddbb0...). No root prettier config of any form; no package.json prettier field anywhere. config/linting/.prettierrc.json referenced by nothing and contradicts the majority style. Nothing runs prettier automatically: no CI, hooks disabled.
First stepscp apps/ally/.prettierrc .prettierrc git rm $(git ls-files 'apps/*/.prettierrc') config/linting/.prettierrc.json npx prettier --check apps/ally/src # spot-check outcomes unchanged
Risk: Zero behavior change for the 33 apps. Intended change for the rest: future manual prettier runs switch from defaults to house style — cosmetic diffs only.
Remove every CLAUDE.md inside __tests__ directories and the three buried at depth four or deeper, hoisting the handful of unique test-strategy paragraphs into parent docs first. The set includes the two template copies in apps/example — which closes the vector that stamps this violation into every newly scaffolded app.
Verified evidence67 files match __tests__ across 37 apps; sweep + seeder already exclude these paths (claude_quality_sweep.ts:22, seed_missing_claude.ts:15), so deletions are stable. 7 of the 67 postdate the rule because create-app.ts clones apps/example wholesale. Depth-4+ set is exactly 3 pure stubs, none referenced.
First steps1) git ls-files '*CLAUDE.md' | grep -E '(^|/)__tests__/' for the list; fold any non-boilerplate Purpose paragraph into the parent CLAUDE.md first (7 apps have one) 2) git rm the 67 + the 3 depth-4+ files 3) Commit with exact pathspecs
Risk: Low. Nothing reads these programmatically; the seeder won't regenerate them. Use exact pathspecs around apps/forgeboard/__tests__ — another agent has in-flight test edits there right now.
forgebench's 16-dep phantom CLI/server stack (with knip suppressions telling the dead-code tool to lie), 31 template-leftover deps across 19 apps, and policy-violating dotenv declarations in forgebooks and kando/adamabot. All zero-reference by word-boundary grep; one pnpm install plus affected-app builds verifies.
working/ is 59 MB of gitignored, self-declared regeneratable creative-brief scratch idle since June 8. Upload JD_XR Options A and B to ForgeMedia before trashing (they exist nowhere else; C is already uploaded byte-identical), and use trash not rm — the Tadano deal is active with a July client review.
The archive self-declares reference-only and its TypeScript replacements are live. Update the 5 external doc pointers; also removes the last 2 orphaned Python packaging files not covered by pick #7.
24.3 MB of podcast MP3, infographics, and RFI scrape dump plus two stray 9.5 MB PNGs ship with every forgesales deploy and are publicly fetchable today. Relocate to ForgeMedia rather than delete — these are concluded-deal business records.
CONTEXT-MAP.md was mistakenly quarantined while two docs still expect it at root — move it back. Then relocate 4.8 MB of Walmart VR images to ForgeMedia and trash the 14 MB untracked dist/ plus old logs.
Seven stray one-off files (including a self-described delete-me verification memo) plus the 16-file scheduled-tasks/ dir whose two tasks were disabled at the scheduler in May. Verified inert.
Method. Ten parallel scan agents each swept one dimension — Python remnants, root clutter, CLAUDE.md sprawl, config duplication, dead apps, dependency hygiene, docs sprawl, crons/channels/scripts, git binary bloat, and code duplication — producing 50 candidate refactors. Every candidate was then handed to an independent adversarial verifier instructed to refute it: re-run the evidence commands, grep for load-bearing references, check git history for signs of life. 14 candidates were refuted or downgraded (notably: naive ESLint consolidation breaks 4 apps with error-level failures, and a proposed bulk deletion of 1,022 generated doc stubs conflicts with the seeder that would recreate them). A synthesis pass deduped the 36 survivors and ranked by ease × impact.
All ranks 1–10 are executable independently, in any order, each in one commit. Numbers cited were re-verified against the working tree on July 2, 2026.