Majoor Assets Manager for ComfyUI
Majoor Assets Manager is an advanced asset browser for ComfyUI that provides a comprehensive solution for managing, organizing, and viewing your generated assets. It integrates directly into ComfyUI, offering features like full-text search, metadata extraction, rating and tagging systems, and advanced viewing capabilities.
User Guide - Complete documentation with features, installation, and usage instructions. Documentation Index - All docs (install, viewer, metadata, settings, etc).
GitHub
- Repository: https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager
- Author: MajoorWaldi
License
Copyright (c) 2026 Ewald ALOEBOETOE (MajoorWaldi).
Licensed under the GNU General Public License v3.0. See LICENSE.
Optional attribution request (non-binding): see NOTICE.
Key Features
Performance & Scalability (New)
- Virtual Scrolling Engine: Seamlessly handles grid views with 10,000+ assets with zero UI lag.
- GPU-Accelerated Video: WebGL-based video player for real-time grading (Exposure/Gamma/Zebra) of 4K content.
- Non-Blocking Indexing: Background scanning and metadata parsing (using worker threads) ensures the ComfyUI server remains responsive.
- Database Optimization: SQLite WAL mode + Connection Pooling for high-concurrency access.
Search & Filtering
- Full-text search powered by SQLite FTS5 (BM25 ranking).
- Scope: Outputs, Inputs, Custom roots, Collections.
- Filters: kind, min rating, workflow-only, date filters, sorting.
- Optional: hide PNG siblings of video previews.
- Summary line: total assets + selected count + current context.
Metadata & Viewer
- Extracts generation info from PNG/WEBP/video (ExifTool/FFprobe; degrades gracefully).
- Viewer modes: single, A/B compare, side-by-side.
- Navigation: zoom/pan, 1:1 pixel zoom, quick next/prev navigation.
- Tools: exposure (EV), gamma, channel view (RGB/R/G/B/Alpha/Luma), analysis (false color, zebra).
- Video Grading: Real-time color adjustments using WebGL (Hardware Accelerated).
- Scopes (optional): downscaled RGB histogram + luma waveform.
- Overlays: grid (thirds/center/safe/golden), pixel probe, loupe.
- Compare: wipe (slider) and difference mode.
- Export: save current frame to PNG + copy to clipboard (best-effort).
- Generation Info panel: prompt/model/sampling/image parameters + workflow minimap, with loading/error feedback and retry for transient failures.
- Video: loops by default; player bar provides seek, In/Out range, loop/once, frame stepping, and FPS/step controls.
- Context menu: tags, rating, add to collection, open in folder, rename, delete.
Ratings, Tags, Collections
- Ratings/tags stored in the index DB and (optionally) synced into files when enabled.
- Collections: create, add items (duplicates skipped and reported), remove items, open as a view. Large collections are capped for safety (configurable).
Drag & Drop
- Drag an asset onto the ComfyUI canvas: stage to input, inject paths into compatible nodes.
- Drag out to the OS (Explorer/Desktop): uses
DownloadURL/text/uri-listand supports multi-selection ZIP (flat ZIP; folders excluded).
UX Details
- Filename collision indicator: if multiple assets share the same filename, the extension badge shows
EXT+(e.g.PNG+). - Context menus: add/remove collection, open viewer, open in folder, copy path, etc.
Installation
ComfyUI Manager (recommended)
Install via the ComfyUI Manager UI.
Manual
cd ComfyUI/custom_nodes
git clone https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager ComfyUI-Majoor-AssetsManager
pip install -r ComfyUI-Majoor-AssetsManager/requirements.txt
Restart ComfyUI.
If dependencies are missing at startup, the extension may attempt a best-effort pip install -r requirements.txt automatically (can be disabled with MJR_AM_NO_AUTO_PIP=1).
Note: The native folder browser feature requires tkinter, which is included with most Python installations but may be missing in minimal Python distributions like embedded Python. If tkinter is not available, the system will fall back to manual path input.
For Embedded Python Environments (like ComfyUI's python_embeded):
- Tkinter is typically not available in embedded Python distributions
- The system will automatically fall back to manual path input
- The
tkpackage from PyPI is NOT equivalent to the built-intkintermodule - Even after installing
pip install tk, the actual GUI libraries may still be missing - The extension will work fully with manual input fallback when tkinter is unavailable
- Solutions for native folder browser:
- Switch to a full Python installation that includes tkinter
- Use the manual input method (fully functional alternative)
- The extension works identically in both scenarios, just with different UI for folder selection
Optional (recommended): install ExifTool + FFprobe (metadata extraction)
The Assets Manager works without these tools, but metadata extraction (generation info, media probe) and tag/rating sync to files are best-effort and will be degraded if the tools are missing.
Verify they are available in your PATH:
exiftool -ver
ffprobe -version
If they are not in PATH, set MAJOOR_EXIFTOOL_PATH and/or MAJOOR_FFPROBE_PATH (see Environment Variables below).
Windows
Option A (Scoop):
scoop install ffmpeg exiftool
Option B (Chocolatey):
choco install -y ffmpeg exiftool
Option C (WinGet):
winget install -e --id Gyan.FFmpeg
winget install -e --id PhilHarvey.ExifTool
If the IDs differ on your machine, use winget search ffmpeg / winget search exiftool.
Option D (manual download):
- FFprobe is included with FFmpeg builds: install FFmpeg and ensure the
bin/folder is in yourPATH. - ExifTool: download from
https://exiftool.org/and pointMAJOOR_EXIFTOOL_PATHtoexiftool.exeif needed.
macOS
brew install ffmpeg exiftool
Linux
Debian/Ubuntu:
sudo apt-get update
sudo apt-get install -y ffmpeg exiftool
Package names can vary by distro (e.g. perl-Image-ExifTool on some).
Usage
- Open the Assets Manager panel/tab.
- Pick a scope (Outputs / Inputs / Custom / Collections).
- Use search + filters; right-click cards for actions; double-click to open the viewer.
- Use Collections to save sets of files and browse them later.
- Drag assets:
- to the ComfyUI canvas (staging/inject path),
- or to your OS (single file or a ZIP for multi-selection).
Hotkeys (high level)
Hotkeys are ignored while typing inside inputs.
Ctrl/Cmd+S: trigger an index scan for the current scope.D: toggle details sidebar for the current selection.0-5: set rating for the current selection (when interacting with the grid).- Viewer:
- Viewer hotkeys are consumed (don’t leak to ComfyUI/global handlers).
Esc: close viewer0-5: set rating (single view)Shift+Arrow: step video frames (single video)F: false color toggleZ: zebra toggleG: grid cycle (off -> thirds -> center -> safe -> golden)I: pixel probe toggleL: loupe toggleC: copy last probed color hexAlt+1: toggle 1:1 zoom
Settings
Settings are stored under the mjrSettings key in localStorage (browser-side).
Backend persistence is currently limited to probeBackend.mode (stored in the SQLite metadata table). It uses a version bump so changes propagate quickly even with multiple backend instances. Other settings are intentionally browser-local and won't sync across machines/browsers.
- Page size (assets per request)
- Auto-scan (on open / on startup)
- Status poll interval
- Sidebar position (left/right)
- Hide PNG siblings (video previews)
- Sync rating/tags to files (best-effort; requires tools)
- Media probe backend (auto/exiftool/ffprobe/both)
- Observability (request logging)
- Tags cache TTL (ms)
- Workflow minimap display toggles
Environment Variables (backend)
MAJOOR_OUTPUT_DIRECTORY- override output directoryMAJOOR_EXIFTOOL_PATH/MAJOOR_EXIFTOOL_BIN- ExifTool pathMAJOOR_FFPROBE_PATH/MAJOOR_FFPROBE_BIN- FFprobe pathMAJOOR_MEDIA_PROBE_BACKEND-auto|exiftool|ffprobe|bothMAJOOR_ENABLE_FILE_WATCHER- auto reindexing (defaultfalse)MAJOOR_WATCHER_INTERVAL/MAJOOR_WATCHER_JOIN_TIMEOUT/MAJOOR_WATCHER_PATHSMAJOOR_DB_TIMEOUT/MAJOOR_DB_MAX_CONNECTIONS/MAJOOR_DB_QUERY_TIMEOUTMAJOOR_TO_THREAD_TIMEOUT- timeout (seconds) forasyncio.to_thread(...)work in HTTP handlers (default30)MAJOOR_MAX_METADATA_JSON_BYTES- max metadata JSON size stored in DB/cache (default2097152)MJR_AM_NO_AUTO_PIP- set to1to disable best-effort dependency auto-install on startupMJR_COLLECTION_MAX_ITEMS- max items per collection JSON (default50000)MJR_ALLOW_SYMLINKS- allow symlink/junction custom roots (defaultoff)MAJOOR_TRUSTED_PROXIES- comma-separated IPs/CIDRs allowed to supplyX-Forwarded-For/X-Real-IP(default127.0.0.1,::1)MAJOOR_API_TOKEN(orMJR_API_TOKEN) - optional token to authorize write operations (send viaX-MJR-TokenorAuthorization: Bearer <token>)MAJOOR_REQUIRE_AUTH- set to1to requireMAJOOR_API_TOKENeven for localhostMAJOOR_ALLOW_REMOTE_WRITE- set to1to allow write operations from non-local clients without a token (unsafe)MAJOOR_SAFE_MODE- set to0to disable Safe Mode (default enabled)MAJOOR_ALLOW_WRITE- set to1to allow rating/tags writes while Safe Mode is enabledMAJOOR_ALLOW_DELETE- set to1to enable asset deletion (disabled by default)MAJOOR_ALLOW_RENAME- set to1to enable asset renaming (disabled by default)MAJOOR_ALLOW_OPEN_IN_FOLDER- set to1to enable/mjr/am/open-in-folder(disabled by default)
Security Model (high level)
- CSRF: state-changing endpoints require
X-Requested-With: XMLHttpRequest(orX-CSRF-Token) and validateOriginvsHostwhen present. - Rate limiting: in-memory per-client limits exist on expensive endpoints (search/scan/metadata/batch-zip). Client identity is based on IP;
X-Forwarded-Foris only honored when the connection comes fromMAJOOR_TRUSTED_PROXIES. - Path safety: file operations validate root containment for output/input/custom roots and reject paths outside allowed roots (symlink/junction handling is opt-in).
- Write access: destructive actions are loopback-only by default unless a token is configured.
- Safe Mode: write operations are disabled by default unless explicitly enabled via environment variables.
- Batch ZIP: ZIP building streams from an open file handle (avoids TOCTOU rename/replace races).
Files & Storage
- Index DB:
<output>/_mjr_index/assets.sqlite - Custom roots store:
<output>/_mjr_index/custom_roots.json - Collections store:
<output>/_mjr_index/collections/*.json - Temporary drag-out ZIPs:
<output>/_mjr_batch_zips/(auto-cleaned)
Development
python -m pytest -q
Tests (Windows)
Batch runners generate both JUnit XML and a styled HTML report in tests/__reports__/:
- Full suite:
run_tests.bat(ortests/run_tests_all.bat) - Quick suite (skips the long Comfy output scan):
run_tests_quick.bat - Metadata / parser suite:
run_tests_parser.bat(runstests/metadata/)
Open the report index:
tests/__reports__/index.html
Test runtime DB artifacts (*.db, *.db-wal, *.db-shm, etc.) are created under:
tests/__pytest_tmp__/
Parser samples scan (metadata suite):
- Put sample files under
tests/parser/(subfolders supported), or setMJR_TEST_PARSER_DIRto an external folder.
Release (zip)
On Windows, build a clean drop-in zip (excludes .git/, caches, etc.):
pwsh -File scripts/make_release_zip.ps1
Architecture
backend/- Python backend (routes + features)features/index(scan/search),features/metadata(extract),features/tags(sync),features/collectionsroutes/handlers(HTTP),routes/core(security/paths/response)
js/- frontend extensionfeatures/grid,features/panel,features/viewer,features/dndcomponents(Card/Viewer/Sidebar/menus),app(settings/bootstrap),theme
Viewer Roadmap (bigger items)
- GPU grade (WebGL2): exposure/gamma/channels/zebra/false color.
- OffscreenCanvas + Worker fallback for heavy processing.
- Cache processed frame while paused (instant grade tweaks).
