Know exactly what's in your project.
Never break it by accident.

BranchPy's Media Validation scans your Ren'Py project in VS Code, classifies every media file, and protects the assets your engine depends on — before you ever touch a delete button.

✓ Media inventory 🛡️ Protected-path safety ❌ Missing asset detection 🔍 Reference validation

The Ren'Py asset problem other tools get wrong

Most media scanners flag every file that isn't explicitly referenced in a script as "unused." In Ren'Py, that's dangerous. Your game/gui/ folder contains dozens of images the engine needs at runtime — none of them appear in script.rpy. Auto-deleting them silently breaks your game.

BranchPy classifies files before showing them to you. Engine-managed paths are marked PROTECTED and removed from any selectable action set — not just visually, but programmatically.

Four statuses. One honest picture.

Every file in your project gets exactly one classification:

USED

Referenced in Scripts

Found in at least one .rpy file via image, show, play, or similar. Confirmed present on disk.

PROTECTED

Engine-Managed or Policy-Protected

Lives in gui/, renpy/, common/, launcher/, or fonts/. Never offered for deletion — regardless of script references.

UNREFERENCED

Unreferenced by Current Scan

Not detected in this scan pass. May still be dynamically loaded. Shown for review, not for automated cleanup. Reason shown per file.

MISSING

Missing on Disk

Your script references this file but it doesn't exist. A runtime error waiting to happen. Highlighted immediately for action.

Example file states in the media browser

The same folder can contain all three types simultaneously. BranchPy distinguishes them before showing you anything.

🛡️ gui/window.png
PROTECTED
Ren'Py engine-managed: GUI system
No checkbox — protected from selection
images/bg_unused.png
UNREFERENCED
No explicit references found in script scan
Review before any action
⚠️ missing/ghost.png
MISSING
Referenced in script.rpy — not found on disk
Will cause a runtime error on this label

PROTECTED files show a shield icon in place of a checkbox. UNREFERENCED files are selectable. MISSING files are surface immediately — no hunting required.

🛡️ Two-layer protection for engine-managed files

A visual indicator alone isn't enough. BranchPy enforces protected-file safety at two independent layers:

  1. No checkbox rendered. Protected files in the Unreferenced tab show a shield icon instead of a selection checkbox. There is no DOM element to select.
  2. Delete handler validation. Even if a future code change accidentally exposed a checkbox, the delete confirmation handler independently strips any protected path from the file set before it is sent to the extension host. A warning is logged if anything is stripped.

A single layer failure cannot cause a protected file to be deleted. Phase 3 will add a quarantine layer as a third gate.

Which paths are protected by default?

BranchPy recognises two protection classes:

PathClassWhy
game/gui/** & gui/**Engine-managedRen'Py GUI system — required at runtime
game/renpy/** & renpy/**Engine-managedRen'Py core internals
game/common/** & common/**Engine-managedRen'Py common library
game/launcher/** & launcher/**Engine-managedRen'Py launcher assets
game/fonts/** & fonts/**Policy-protectedFont assets — may be loaded via config.font_*

The engine-managed prefixes are non-negotiable. Removing them breaks any standard Ren'Py project. The fonts/ prefix is policy-protected with a distinct classification, leaving room for finer-grained review in a future release. User-defined overrides are now available via branchpy.config.json (protectedPaths), shipped in Phase 2A.

What you get right now

Media Validation is available in BranchPy for Ren'Py Free and above.

📊
Media inventory

Total files on disk, by type (image / audio / video), with referenced + unreferenced breakdown.

🔍
Reference scanning

Scans image, show, scene, play, voice, and Python API calls across all .rpy files.

Missing asset detection

Files referenced in scripts but absent from disk are flagged immediately — before they become runtime errors.

🛡️
Protected-path awareness

Engine-managed files are classified and visually distinguished — with enforcement to prevent accidental inclusion in any delete action.

What's coming next

Phase 1 — Current Inventory · Reference scanning · Missing detection · Protected-path safety · Reason per file ✓ Done
Phase 2A — Current Confidence scoring · Needs Review / Cleanup Candidate / Dynamic Risk tiers · Rename-candidate surfacing · User-defined overrides via branchpy.config.json ✓ Done
Phase 2B Symbol-index traversal · Folder co-occurrence analysis · Smarter dynamic-load confidence Upcoming
Phase 3 Quarantine workflow — move to holding area, restore, then optionally delete · Manifest trail Planned

Ready to know what's actually in your project?

Install BranchPy for VS Code. Open Media Validation. See everything in under a minute.

Get BranchPy Read the docs