Repository navigation
Tier 0 Observer
Tier 0 is the "look at everything, change nothing" layer. It's designed so the worst possible outcome of running it on a production machine is some JSON files appearing in a folder you chose.
After Effects project
│ (1) scrape — you run the scraper in AE, once per project
▼
MJ_PROJECT_SCRAPE_1.json (a receipt: comps, layers, expressions, effects, fonts, footage)
│ (2) project.ingest — validate + summarize the receipt
│ (3) expression.lint — spell-check every expression
▼
findings + summaries (JSON you can read, diff, or feed to other tools)
Any .aep file ── (4) project.snapshot ──▶ timestamped versioned copies, never overwritten
Any Plug-ins folder ── (5) plugin.audit ──▶ what’s installed, hashed
Steps 2–5 are CLI commands. Step 1 happens inside After Effects (see AE Scraper).
In After Effects: File → Scripts → Run Script File, pick integrations/after-effects/MographJailed_ProjectScraper.jsx, choose where the receipt goes. Full walkthrough: AE Scraper.
mj project.ingest path=/Users/you/AE_Receipts/MyProject.20260929T150000Z.scrape.jsonValidates the receipt against the MJ_PROJECT_SCRAPE_1 schema and returns a summary: comp/layer/expression/effect counts, fonts, footage — plus missing footage (path on disk is gone) and unlinked footage (no path at all). Malformed or hostile JSON fails closed here.
mj expression.lint path=/Users/you/AE_Receipts/MyProject.20260929T150000Z.scrape.jsonStatic analysis over every scraped expression — a spell-checker for AE expressions:
| Code | Severity | Meaning |
|---|---|---|
E001 |
error | References a layer that doesn't exist in the comp |
E002 |
error | References an effect that isn't applied to the layer |
W001 |
warning |
sampleImage() inside a loop (render-time performance trap) |
W002 |
warning | Hard-coded absolute path (breaks on other machines) |
W003 |
warning | Expression over 2,000 characters |
I001 |
info | Uses ExtendScript dynamic evaluation (opaque to analysis) |
It reports; it never fixes. Findings are capped at 200.
mj project.snapshot path=/Users/you/Movies/MyProject.aep output=/Users/you/AE_VersionsHashes the project and saves a timestamped, hash-suffixed copy into your versions folder — using an APFS copy-on-write clone when available, so it's instant and nearly free on disk.
- Unchanged? Skipped, not re-copied (hash comparison).
- Already exists? Refused — it will never overwrite a snapshot.
- Source file? Never touched. Byte-identical before and after.
-
Not an
.aep? Rejected up front.
Every snapshot writes a .snapshot.json receipt next to it, and a <name>.latest.json pointer to the newest version.
mj plugin.audit path="/Applications/Adobe After Effects 2025/Plug-ins"Enumerates one directory level, classifies files/bundles/symlinks, and SHA-256 hashes what it can read. Answers "what's on this machine" without installing or touching anything. Entries capped at 500.
Dashboard gives you the btop-style terminal view over snapshots, vitals, lint findings, and watcher state. Watcher snapshots your .aep files automatically.
- Schema:
docs/MJ_PROJECT_SCRAPE_1.mdin the repo - Full spec:
docs/TIER0_OBSERVER.mdin the repo - Safety model: Safety
Learn