Files
MajoorWaldi-ComfyUI-Majoor-…/user_guide.html
T

4459 lines
216 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="color-scheme" content="dark" />
<title>Majoor Assets Manager - User Guide</title>
<style>
:root{
--bg: #0f1115;
--panel: rgba(21,25,35,0.92);
--text: #e7eaf0;
--muted: rgba(231,234,240,0.68);
--border: rgba(231,234,240,0.10);
--accent: #5fb3ff;
--shadow: 0 18px 45px rgba(0,0,0,0.35);
--radius: 14px;
--mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--sans: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;
}
*{ box-sizing:border-box; }
html,body{ height:100%; }
body{
margin:0;
font-family: var(--sans);
color: var(--text);
background:
radial-gradient(1200px 600px at 20% -20%, rgba(95,179,255,0.18), transparent 60%),
radial-gradient(900px 550px at 100% 0%, rgba(57,217,138,0.12), transparent 55%),
var(--bg);
}
a{ color: var(--accent); text-decoration:none; }
a:hover{ text-decoration: underline; }
mark{ background: rgba(95,179,255,0.22); color: rgba(231,234,240,0.96); padding: 0 2px; border-radius: 4px; }
code{ font-family: var(--mono); font-size: 12px; padding: 2px 6px; border-radius: 8px; border: 1px solid rgba(231,234,240,0.10); background: rgba(16,20,29,0.70); color: rgba(231,234,240,0.92); }
pre{ margin: 10px 0; padding: 12px 12px; border-radius: 12px; border: 1px solid rgba(231,234,240,0.10); background: rgba(16,20,29,0.90); overflow:auto; box-shadow: inset 0 0 0 1px rgba(0,0,0,0.18); }
pre code{ padding:0; border:0; background: transparent; font-size: 12px; }
hr{ border:0; border-top: 1px solid rgba(231,234,240,0.10); margin: 18px 0; }
blockquote{ margin: 10px 0; padding: 10px 12px; border-left: 3px solid rgba(95,179,255,0.55); background: rgba(95,179,255,0.06); border-radius: 12px; color: rgba(231,234,240,0.88); }
.table-wrap{ overflow:auto; border-radius: 12px; border: 1px solid rgba(231,234,240,0.10); background: rgba(16,20,29,0.55); }
table{ width:100%; border-collapse: collapse; }
th, td{ padding: 9px 10px; vertical-align: top; border-top: 1px solid rgba(231,234,240,0.08); }
th{ text-align:left; font-size: 12px; color: var(--muted); font-weight: 700; border-top: 0; }
.wrap{ max-width: 1180px; margin:0 auto; padding: 22px 16px 70px; }
.top{
display:flex; gap:14px; align-items:flex-end; justify-content:space-between;
padding: 16px 18px;
border: 1px solid var(--border);
border-radius: var(--radius);
background: linear-gradient(180deg, rgba(255,255,255,0.04), rgba(255,255,255,0.02));
box-shadow: var(--shadow);
}
.brand{ display:flex; gap: 12px; align-items:center; }
.logo{
width: 36px; height: 36px;
border-radius: 12px;
border: 1px solid rgba(231,234,240,0.12);
background:
radial-gradient(120px 70px at 30% 20%, rgba(95,179,255,0.25), transparent 55%),
rgba(0,0,0,0.25);
display:flex; align-items:center; justify-content:center;
font-size: 18px;
box-shadow: inset 0 0 0 1px rgba(0,0,0,0.15);
}
.logo.icon{ background-image: url('ressources/icon.png'); background-size: cover; background-position: center; font-size: 0; }
.title{ font-size: 20px; font-weight: 800; letter-spacing: 0.2px; }
.subtitle{ color: var(--muted); font-size: 12px; margin-top: 6px; line-height: 1.4; }
.pillrow{ display:flex; gap:10px; flex-wrap:wrap; justify-content:flex-end; }
.pill{
display:inline-flex; gap: 8px; align-items:center;
padding: 7px 10px;
border-radius: 999px;
border: 1px solid var(--border);
background: rgba(255,255,255,0.03);
font-size: 12px;
color: var(--muted);
}
.dot{ width: 9px; height: 9px; border-radius: 999px; background: var(--accent); box-shadow: 0 0 0 3px rgba(95,179,255,0.14); }
.nav{
margin-top: 14px;
border: 1px solid var(--border);
border-radius: var(--radius);
background: rgba(21,25,35,0.75);
box-shadow: var(--shadow);
padding: 10px 10px;
position: sticky;
top: 10px;
z-index: 5;
}
.navrow{ display:flex; align-items:center; justify-content:space-between; gap: 10px; flex-wrap:wrap; }
.search{ flex: 1 1 280px; min-width: 220px; padding: 9px 10px; border-radius: 999px; border: 1px solid rgba(231,234,240,0.12); background: rgba(16,20,29,0.60); color: rgba(231,234,240,0.92); outline:none; }
.search:focus{ border-color: rgba(95,179,255,0.45); box-shadow: 0 0 0 3px rgba(95,179,255,0.12); }
.navlinks{ display:flex; gap: 8px; flex-wrap:wrap; align-items:center; }
.matches{ color: var(--muted); font-size: 12px; padding: 4px 8px; border-radius: 999px; border: 1px solid rgba(231,234,240,0.10); background: rgba(255,255,255,0.02); }
.nav a{
display:inline-block;
padding: 8px 10px;
border-radius: 999px;
border: 1px solid rgba(231,234,240,0.10);
background: rgba(255,255,255,0.02);
color: rgba(231,234,240,0.86);
font-size: 12px;
white-space: nowrap;
}
.nav a:hover{
border-color: rgba(95,179,255,0.35);
background: rgba(95,179,255,0.10);
text-decoration:none;
}
.grid{ display:grid; grid-template-columns: 1fr; gap: 14px; margin-top: 14px; }
.panel{
border: 1px solid var(--border);
border-radius: var(--radius);
background: var(--panel);
box-shadow: var(--shadow);
overflow:hidden;
}
.panel-h{
padding: 12px 14px;
border-bottom: 1px solid var(--border);
background: linear-gradient(180deg, rgba(255,255,255,0.04), rgba(255,255,255,0.01));
display:flex; align-items:center; justify-content:space-between; gap: 10px;
}
.panel-h h2{
margin:0;
font-size: 14px;
letter-spacing: 0.2px;
font-weight: 800;
color: rgba(231,234,240,0.92);
}
.panel-b{ padding: 12px 14px 14px; color: rgba(231,234,240,0.90); }
.panel-b p{ margin: 10px 0; color: rgba(231,234,240,0.86); line-height: 1.55; }
.panel-b ul, .panel-b ol{ margin: 10px 0 10px 18px; color: rgba(231,234,240,0.86); }
.panel-b li{ margin: 6px 0; }
.section{ scroll-margin-top: 12px; }
.section h1{ font-size: 20px; margin: 6px 0 10px; }
.section h2{ font-size: 17px; margin: 18px 0 10px; }
.section h3{ font-size: 14px; margin: 16px 0 8px; color: rgba(231,234,240,0.92); }
.section h4{ font-size: 13px; margin: 14px 0 6px; color: rgba(231,234,240,0.88); }
.toplink{ display:inline-block; margin-top: 10px; font-size: 12px; color: var(--muted); }
.toplink:hover{ color: rgba(231,234,240,0.90); text-decoration:none; }
</style>
</head>
<body>
<div class="wrap">
<header class="top" id="top">
<div class="brand">
<div class="logo icon" aria-hidden="true"> </div>
<div>
<div class="title">🗂️ Majoor Assets Manager — User Guide</div>
<div class="subtitle">Generated from <code>docs/</code> for a readable single-page experience.</div>
</div>
</div>
<div class="pillrow">
<div class="pill"><span class="dot"></span> Docs: 13</div>
<div class="pill"><span class="dot"></span> Updated: January 2026</div>
</div>
</header>
<nav class="nav">
<div class="navrow">
<input id="q" class="search" placeholder="Search (filters + highlights)..." />
<div id="matches" class="matches">Sections: 14</div>
<div class="navlinks">
<a class="navlink" href="#top" data-text="top">Top</a><a class="navlink" href="#documentation_index" data-text="documentation_index.md documentation index (curated list)">DOCUMENTATION_INDEX.md</a><a class="navlink" href="#user_guide" data-text="user_guide.md comprehensive overview and introduction">USER_GUIDE.md</a><a class="navlink" href="#installation" data-text="installation.md detailed installation and setup instructions">INSTALLATION.md</a><a class="navlink" href="#search_filtering" data-text="search_filtering.md full-text search and filtering capabilities">SEARCH_FILTERING.md</a><a class="navlink" href="#metadata_viewer" data-text="metadata_viewer.md metadata extraction and advanced viewer features">METADATA_VIEWER.md</a><a class="navlink" href="#ratings_tags_collections" data-text="ratings_tags_collections.md organization tools (ratings, tags, collections)">RATINGS_TAGS_COLLECTIONS.md</a><a class="navlink" href="#drag_drop" data-text="drag_drop.md drag and drop functionality">DRAG_DROP.md</a><a class="navlink" href="#hotkeys_shortcuts" data-text="hotkeys_shortcuts.md keyboard shortcuts and hotkeys">HOTKEYS_SHORTCUTS.md</a><a class="navlink" href="#settings_configuration" data-text="settings_configuration.md settings and configuration options">SETTINGS_CONFIGURATION.md</a><a class="navlink" href="#security_env_vars" data-text="security_env_vars.md security model and environment variables">SECURITY_ENV_VARS.md</a><a class="navlink" href="#testing" data-text="testing.md running tests and reading reports">TESTING.md</a><a class="navlink" href="#complete_user_guide" data-text="complete_user_guide.md step-by-step user guide with workflows">COMPLETE_USER_GUIDE.md</a><a class="navlink" href="#audit_issues" data-text="audit_issues.md additional documentation">AUDIT_ISSUES.md</a>
</div>
</div>
</nav>
<main class="grid">
<section class="panel section" id="intro">
<div class="panel-h"><h2>Introduction</h2></div>
<div class="panel-b">
<p>Tip: edit <code>docs/DOCUMENTATION_INDEX.md</code> to change the curated order, then regenerate with <code>python scripts/build_user_guide_html.py</code>.</p>
</div>
</section>
<section class="panel section" id="documentation_index">
<div class="panel-h"><h2>DOCUMENTATION_INDEX.md</h2></div>
<div class="panel-b">
<div style="color: var(--muted); font-size: 12px; margin-bottom: 10px;">Documentation index (curated list)</div>
<div class="section"><h1 id="documentation_index-majoor-assets-manager-documentation-index">Majoor Assets Manager - Documentation Index</h1>
<p>Welcome to the comprehensive documentation for the Majoor Assets Manager for ComfyUI. This collection of guides will help you understand and utilize all features of the extension.</p>
<h2 id="documentation_index-documentation-files">Documentation Files</h2>
<h3 id="documentation_index-getting-started">Getting Started</h3>
<ul>
<li><a href="#user_guide">USER_GUIDE.md</a> - Comprehensive overview and introduction</li>
<li><a href="user_guide.html">../user_guide.html</a> - Full HTML user guide (styled)</li>
<li><a href="#installation">INSTALLATION.md</a> - Detailed installation and setup instructions</li>
</ul>
<h3 id="documentation_index-core-features">Core Features</h3>
<ul>
<li><a href="#search_filtering">SEARCH_FILTERING.md</a> - Full-text search and filtering capabilities</li>
<li><a href="#metadata_viewer">METADATA_VIEWER.md</a> - Metadata extraction and advanced viewer features</li>
<li><a href="#ratings_tags_collections">RATINGS_TAGS_COLLECTIONS.md</a> - Organization tools (ratings, tags, collections)</li>
<li><a href="#drag_drop">DRAG_DROP.md</a> - Drag and drop functionality</li>
</ul>
<h3 id="documentation_index-configuration-usage">Configuration &amp; Usage</h3>
<ul>
<li><a href="#hotkeys_shortcuts">HOTKEYS_SHORTCUTS.md</a> - Keyboard shortcuts and hotkeys</li>
<li><a href="#settings_configuration">SETTINGS_CONFIGURATION.md</a> - Settings and configuration options</li>
<li><a href="#security_env_vars">SECURITY_ENV_VARS.md</a> - Security model and environment variables</li>
<li><a href="#testing">TESTING.md</a> - Running tests and reading reports</li>
</ul>
<h3 id="documentation_index-complete-guides">Complete Guides</h3>
<ul>
<li><a href="#complete_user_guide">COMPLETE_USER_GUIDE.md</a> - Step-by-step user guide with workflows</li>
</ul>
<h2 id="documentation_index-quick-start">Quick Start</h2>
<ol>
<li><strong>Install</strong>: Follow the instructions in <a href="#installation">INSTALLATION.md</a></li>
<li><strong>Explore</strong>: Open Assets Manager in ComfyUI and browse your outputs</li>
<li><strong>Organize</strong>: Use ratings, tags, and collections to organize your assets</li>
<li><strong>Search</strong>: Use the powerful search and filtering features</li>
<li><strong>Integrate</strong>: Drag assets directly to your ComfyUI canvas</li>
</ol>
<h2 id="documentation_index-key-features-overview">Key Features Overview</h2>
<ul>
<li><strong>Advanced Asset Browser</strong>: Browse outputs, inputs, custom directories, and collections</li>
<li><strong>Powerful Search</strong>: Full-text search with FTS5 and BM25 ranking</li>
<li><strong>Rich Metadata</strong>: Extract generation info from PNG/WEBP/video files</li>
<li><strong>Advanced Viewer</strong>: With comparison tools, analysis features, and enhancement controls</li>
<li><strong>Organization Tools</strong>: Ratings (0-5 stars), custom tags, and collections</li>
<li><strong>Drag &amp; Drop</strong>: To ComfyUI canvas or to your operating system</li>
<li><strong>Cross-Platform</strong>: Works on Windows, macOS, and Linux</li>
</ul>
<h2 id="documentation_index-optional-dependencies-highly-recommended">Optional Dependencies (Highly Recommended)</h2>
<p>For full functionality including metadata extraction and file tagging:</p>
<ul>
<li><strong>ExifTool</strong>: For comprehensive metadata extraction</li>
<li><strong>FFprobe</strong>: For video/audio metadata extraction</li>
</ul>
<p>See <a href="#installation">INSTALLATION.md</a> for detailed installation instructions.</p>
<h2 id="documentation_index-support">Support</h2>
<p>If you encounter issues:</p>
<ol>
<li>Check the troubleshooting sections in the relevant documentation</li>
<li>Verify your installation and dependencies</li>
<li>Consult the original README.md for additional information</li>
<li>Check the ComfyUI console for error messages</li>
</ol>
<h2 id="documentation_index-contributing">Contributing</h2>
<p>These documentation files are provided as a comprehensive guide to help users make the most of the Majoor Assets Manager. If you find inaccuracies or have suggestions for improvements, please contribute to the community knowledge.</p>
<hr />
<p><em>Documentation Index Version: 1.0</em> <em>Last Updated: January 2026</em></p></div>
<a class="toplink" href="#top">Back to top</a>
<div style="margin-top: 10px; font-size: 12px; color: var(--muted);">
Source: <code>docs/DOCUMENTATION_INDEX.md</code>
</div>
</div>
</section>
<section class="panel section" id="user_guide">
<div class="panel-h"><h2>USER_GUIDE.md</h2></div>
<div class="panel-b">
<div style="color: var(--muted); font-size: 12px; margin-bottom: 10px;">Comprehensive overview and introduction</div>
<div class="section"><h1 id="user_guide-majoor-assets-manager-comprehensive-user-guide">Majoor Assets Manager - Comprehensive User Guide</h1>
<h2 id="user_guide-table-of-contents">Table of Contents</h2>
<ol>
<li><a href="#user_guide-introduction">Introduction</a></li>
<li><a href="#user_guide-installation-setup">Installation &amp;amp; Setup</a></li>
<li><a href="#user_guide-core-features">Core Features</a></li>
<li><a href="#user_guide-search-filtering">Search &amp;amp; Filtering</a></li>
<li><a href="#user_guide-metadata-viewer">Metadata &amp;amp; Viewer</a></li>
<li><a href="#user_guide-ratings-tags-collections">Ratings, Tags &amp;amp; Collections</a></li>
<li><a href="#user_guide-drag-drop-functionality">Drag &amp;amp; Drop Functionality</a></li>
<li><a href="#user_guide-hotkeys-shortcuts">Hotkeys &amp;amp; Shortcuts</a></li>
<li><a href="#user_guide-settings-configuration">Settings &amp;amp; Configuration</a></li>
<li><a href="#user_guide-troubleshooting">Troubleshooting</a></li>
</ol>
<h2 id="user_guide-introduction">Introduction</h2>
<p>The 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.</p>
<h3 id="user_guide-key-benefits">Key Benefits</h3>
<ul>
<li>Browse outputs, inputs, and custom directories directly in ComfyUI</li>
<li>Powerful search with full-text indexing</li>
<li>Rich metadata extraction from generated assets</li>
<li>Rating and tagging systems for organization</li>
<li>Collections for grouping related assets</li>
<li>Advanced viewer with comparison tools</li>
<li>Drag-and-drop integration with ComfyUI canvas</li>
</ul>
<h2 id="user_guide-installation-setup">Installation &amp; Setup</h2>
<h3 id="user_guide-prerequisites">Prerequisites</h3>
<ul>
<li>ComfyUI installation</li>
<li>Python 3.8 or higher</li>
</ul>
<h3 id="user_guide-installation-methods">Installation Methods</h3>
<h4 id="user_guide-method-1-using-comfyui-manager-recommended">Method 1: Using ComfyUI Manager (Recommended)</h4>
<ol>
<li>Open ComfyUI Manager</li>
<li>Search for "Majoor Assets Manager"</li>
<li>Install the extension</li>
<li>Restart ComfyUI</li>
</ol>
<h4 id="user_guide-method-2-manual-installation">Method 2: Manual Installation</h4>
<pre><code class="language-bash">cd ComfyUI/custom_nodes\ngit clone https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager ComfyUI-Majoor-AssetsManager\npip install -r ComfyUI-Majoor-AssetsManager/requirements.txt</code></pre>
<p>Restart ComfyUI.</p>
<h3 id="user_guide-optional-dependencies-highly-recommended">Optional Dependencies (Highly Recommended)</h3>
<p>For enhanced metadata extraction and file tagging capabilities, install these tools:</p>
<h4 id="user_guide-windows">Windows</h4>
<p>Using Scoop:</p>
<pre><code class="language-powershell">scoop install ffmpeg exiftool</code></pre>
<p>Using Chocolatey:</p>
<pre><code class="language-powershell">choco install -y ffmpeg exiftool</code></pre>
<p>Using WinGet:</p>
<pre><code class="language-powershell">winget install -e --id Gyan.FFmpeg\nwinget install -e --id PhilHarvey.ExifTool</code></pre>
<h4 id="user_guide-macos">macOS</h4>
<pre><code class="language-bash">brew install ffmpeg exiftool</code></pre>
<h4 id="user_guide-linux-ubuntudebian">Linux (Ubuntu/Debian)</h4>
<pre><code class="language-bash">sudo apt-get update\nsudo apt-get install -y ffmpeg exiftool</code></pre>
<p>Verify installation:</p>
<pre><code class="language-bash">exiftool -ver\nffprobe -version</code></pre>
<p>If tools are not in PATH, set environment variables:</p>
<ul>
<li><code>MAJOOR_EXIFTOOL_PATH</code> - Path to exiftool executable</li>
<li><code>MAJOOR_FFPROBE_PATH</code> - Path to ffprobe executable</li>
</ul>
<h2 id="user_guide-core-features">Core Features</h2>
<h3 id="user_guide-asset-browser-interface">Asset Browser Interface</h3>
<p>The Assets Manager provides a tabbed interface with four main scopes:</p>
<ul>
<li><strong>Outputs</strong>: Browse your ComfyUI output directory</li>
<li><strong>Inputs</strong>: Browse your ComfyUI input directory</li>
<li><strong>Custom</strong>: Browse user-defined directories</li>
<li><strong>Collections</strong>: Browse saved collections of assets</li>
</ul>
<h3 id="user_guide-initial-setup">Initial Setup</h3>
<ol>
<li>Open the Assets Manager panel in ComfyUI</li>
<li>Select a scope (Outputs, Inputs, Custom, or Collections)</li>
<li>The interface will automatically scan and index assets in the selected scope</li>
<li>Use search and filters to narrow down results</li>
</ol>
<h3 id="user_guide-navigation">Navigation</h3>
<ul>
<li>Click on asset cards to select them</li>
<li>Double-click on asset cards to open the viewer</li>
<li>Right-click on asset cards for context menu options</li>
<li>Use pagination controls to navigate through large result sets</li>
</ul>
<h2 id="user_guide-search-filtering">Search &amp; Filtering</h2>
<h3 id="user_guide-full-text-search">Full-Text Search</h3>
<p>The Assets Manager uses SQLite FTS5 with BM25 ranking for powerful search capabilities:</p>
<ul>
<li>Type any text in the search box to search across all indexed assets</li>
<li>Search looks through filenames, metadata, prompts, and other text fields</li>
<li>Results are ranked by relevance using BM25 algorithm</li>
<li>Search works across all scopes (Outputs, Inputs, Custom, Collections)</li>
</ul>
<h3 id="user_guide-advanced-filters">Advanced Filters</h3>
<h4 id="user_guide-kind-filter">Kind Filter</h4>
<p>Filter by file type:</p>
<ul>
<li>Images (PNG, JPG, WEBP, etc.)</li>
<li>Videos (MP4, MOV, AVI, etc.)</li>
<li>Workflows (JSON, PNG with embedded workflows)</li>
</ul>
<h4 id="user_guide-rating-filter">Rating Filter</h4>
<ul>
<li>Show only assets with minimum rating (1-5 stars)</li>
<li>Useful for quickly finding your best results</li>
</ul>
<h4 id="user_guide-workflow-filter">Workflow Filter</h4>
<ul>
<li>Filter to show only assets with embedded workflow information</li>
<li>Helpful when looking for specific generation parameters</li>
</ul>
<h4 id="user_guide-date-filters">Date Filters</h4>
<ul>
<li>Filter by creation/modification dates</li>
<li>Useful for finding recent or historical assets</li>
</ul>
<h4 id="user_guide-sorting-options">Sorting Options</h4>
<ul>
<li>Sort by name, date, size, rating, or relevance</li>
<li>Toggle ascending/descending order</li>
</ul>
<h3 id="user_guide-search-tips">Search Tips</h3>
<ul>
<li>Use quotes for exact phrase matching: <code>"landscape portrait"</code></li>
<li>Combine multiple terms for broader search: <code>character landscape</code></li>
<li>Use the summary line to see total assets and current selection count</li>
</ul>
<h2 id="user_guide-metadata-viewer">Metadata &amp; Viewer</h2>
<h3 id="user_guide-metadata-extraction">Metadata Extraction</h3>
<p>The Assets Manager extracts rich metadata from your assets:</p>
<h4 id="user_guide-image-metadata">Image Metadata</h4>
<ul>
<li>Generation parameters (prompt, negative prompt, model, sampling parameters)</li>
<li>Workflow information (with minimap preview)</li>
<li>Technical details (resolution, file size, format)</li>
<li>Custom tags and ratings</li>
</ul>
<h4 id="user_guide-video-metadata">Video Metadata</h4>
<ul>
<li>Duration, frame rate, resolution</li>
<li>Audio information if present</li>
<li>Generation parameters if embedded</li>
</ul>
<h4 id="user_guide-extraction-backends">Extraction Backends</h4>
<p>The system uses multiple backends for metadata extraction:</p>
<ul>
<li><strong>ExifTool</strong>: Most comprehensive, handles all formats</li>
<li><strong>FFprobe</strong>: Specialized for video/audio</li>
<li><strong>Built-in</strong>: Basic extraction when external tools unavailable</li>
</ul>
<h3 id="user_guide-advanced-viewer">Advanced Viewer</h3>
<h4 id="user_guide-single-view-mode">Single View Mode</h4>
<ul>
<li>Zoom and pan functionality</li>
<li>1:1 pixel view for detail inspection</li>
<li>Exposure adjustment (EV controls)</li>
<li>Gamma correction</li>
<li>Channel isolation (RGB/R/G/B/Alpha/Luma)</li>
<li>Analysis tools (false color, zebra patterns)</li>
</ul>
<h4 id="user_guide-comparison-modes">Comparison Modes</h4>
<ul>
<li><strong>Side-by-side</strong>: Compare two assets visually</li>
<li><strong>A/B Compare</strong>: Toggle between two assets</li>
<li><strong>Wipe</strong>: Slider to reveal one asset over another</li>
<li><strong>Difference</strong>: Show mathematical difference between assets</li>
</ul>
<h4 id="user_guide-video-player">Video Player</h4>
<ul>
<li>Loop/once playback options</li>
<li>Seek controls with timeline</li>
<li>In/Out point markers for segment playback</li>
<li>Frame-by-frame stepping</li>
<li>Adjustable playback speed</li>
</ul>
<h4 id="user_guide-overlays">Overlays</h4>
<ul>
<li>Grid overlays (thirds, center, safe area, golden ratio)</li>
<li>Pixel probe for color values</li>
<li>Loupe magnification</li>
<li>Histogram and waveform scopes</li>
</ul>
<h4 id="user_guide-export-options">Export Options</h4>
<ul>
<li>Save current frame as PNG</li>
<li>Copy to clipboard (best-effort)</li>
<li>Download original file</li>
</ul>
<h3 id="user_guide-context-menu-actions">Context Menu Actions</h3>
<p>Right-click on any asset to access:</p>
<ul>
<li>Add/remove from collections</li>
<li>Rate the asset (0-5 stars)</li>
<li>Tag the asset</li>
<li>Open in folder</li>
<li>Copy file path</li>
<li>Rename file</li>
<li>Delete file</li>
<li>Refresh metadata</li>
</ul>
<h2 id="user_guide-ratings-tags-collections">Ratings, Tags &amp; Collections</h2>
<h3 id="user_guide-rating-system">Rating System</h3>
<ul>
<li>Rate assets from 0 to 5 stars</li>
<li>Ratings are stored in the index database</li>
<li>Optionally synced to file metadata when external tools are available</li>
<li>Filter by minimum rating to quickly find your best results</li>
</ul>
<h3 id="user_guide-tagging-system">Tagging System</h3>
<ul>
<li>Add custom tags to organize assets</li>
<li>Tags are stored in the index database</li>
<li>Optionally synced to file metadata when external tools are available</li>
<li>Search by tags to find related assets</li>
<li>Bulk tagging for multiple selections</li>
</ul>
<h3 id="user_guide-collections">Collections</h3>
<p>Collections allow you to group related assets:</p>
<h4 id="user_guide-creating-collections">Creating Collections</h4>
<ol>
<li>Select one or more assets</li>
<li>Right-click and choose "Add to Collection"</li>
<li>Choose an existing collection or create a new one</li>
<li>Name your collection appropriately</li>
</ol>
<h4 id="user_guide-managing-collections">Managing Collections</h4>
<ul>
<li>View all collections in the Collections tab</li>
<li>Add or remove items from collections</li>
<li>Rename or delete collections</li>
<li>Collections are stored as JSON files in the index directory</li>
</ul>
<h4 id="user_guide-collection-features">Collection Features</h4>
<ul>
<li>Duplicate items are automatically skipped</li>
<li>Large collections are capped for performance (default 50,000 items)</li>
<li>Collections can span multiple directories</li>
<li>Share collections by sharing the JSON files</li>
</ul>
<h2 id="user_guide-drag-drop-functionality">Drag &amp; Drop Functionality</h2>
<h3 id="user_guide-drag-to-comfyui-canvas">Drag to ComfyUI Canvas</h3>
<ul>
<li>Drag assets directly onto the ComfyUI canvas</li>
<li>Assets are automatically staged to compatible input nodes</li>
<li>File paths are injected into appropriate nodes</li>
<li>Works with single or multiple selections</li>
</ul>
<h3 id="user_guide-drag-to-operating-system">Drag to Operating System</h3>
<ul>
<li>Drag assets to your file explorer/desktop</li>
<li>Single files are opened directly</li>
<li>Multiple selections are packaged into a ZIP file</li>
<li>ZIP files are created on-demand and cleaned up automatically</li>
<li>Supports <code>DownloadURL</code> and <code>text/uri-list</code> protocols</li>
</ul>
<h3 id="user_guide-filename-collision-indicator">Filename Collision Indicator</h3>
<ul>
<li>When multiple assets share the same filename, the extension badge shows <code>EXT+</code> (e.g., <code>PNG+</code>)</li>
<li>Helps identify duplicate filenames in your asset collection</li>
</ul>
<h2 id="user_guide-hotkeys-shortcuts">Hotkeys &amp; Shortcuts</h2>
<h3 id="user_guide-global-hotkeys">Global Hotkeys</h3>
<p>These work throughout the Assets Manager interface:</p>
<ul>
<li><code>Ctrl/Cmd+S</code>: Trigger index scan for current scope</li>
<li><code>D</code>: Toggle details sidebar for current selection</li>
<li><code>0</code>-<code>5</code>: Set rating for current selection (when interacting with grid)</li>
</ul>
<h3 id="user_guide-viewer-hotkeys">Viewer Hotkeys</h3>
<p>These work only when the viewer is open:</p>
<ul>
<li><code>Esc</code>: Close viewer</li>
<li><code>0</code>-<code>5</code>: Set rating (single view)</li>
<li><code>Shift+Arrow</code>: Step video frames (single video)</li>
<li><code>F</code>: Toggle false color analysis</li>
<li><code>Z</code>: Toggle zebra patterns</li>
<li><code>G</code>: Cycle through grid overlays (off → thirds → center → safe → golden)</li>
<li><code>I</code>: Toggle pixel probe</li>
<li><code>L</code>: Toggle loupe magnification</li>
<li><code>C</code>: Copy last probed color hex value</li>
<li><code>Alt+1</code>: Toggle 1:1 zoom</li>
</ul>
<h3 id="user_guide-notes">Notes</h3>
<ul>
<li>Hotkeys are ignored while typing in input fields</li>
<li>Viewer hotkeys are captured and don't leak to ComfyUI or global handlers</li>
</ul>
<h2 id="user_guide-settings-configuration">Settings &amp; Configuration</h2>
<h3 id="user_guide-browser-based-settings">Browser-Based Settings</h3>
<p>Stored in <code>localStorage</code> under <code>mjrSettings</code>:</p>
<h4 id="user_guide-display-settings">Display Settings</h4>
<ul>
<li><strong>Page size</strong>: Number of assets loaded per request</li>
<li><strong>Sidebar position</strong>: Left or right placement</li>
<li><strong>Hide PNG siblings</strong>: Hide PNG files when video previews exist</li>
<li><strong>Auto-scan</strong>: Automatically scan on open/startup</li>
</ul>
<h4 id="user_guide-performance-settings">Performance Settings</h4>
<ul>
<li><strong>Status poll interval</strong>: How often to check background tasks</li>
<li><strong>Tags cache TTL</strong>: Time-to-live for tag caching (milliseconds)</li>
</ul>
<h4 id="user_guide-viewer-settings">Viewer Settings</h4>
<ul>
<li><strong>Media probe backend</strong>: Auto, ExifTool, FFprobe, or both</li>
<li><strong>Workflow minimap display</strong>: Toggle elements in workflow preview</li>
<li><strong>Observability</strong>: Enable request logging</li>
</ul>
<h3 id="user_guide-backend-configuration">Backend Configuration</h3>
<h4 id="user_guide-environment-variables">Environment Variables</h4>
<p>Configure the backend using environment variables:</p>
<pre><code class="language-bash"># Override output directory\nexport MAJOOR_OUTPUT_DIRECTORY="/path/to/output"\n\n# Specify tool paths if not in PATH\nexport MAJOOR_EXIFTOOL_PATH="/path/to/exiftool"\nexport MAJOOR_FFPROBE_PATH="/path/to/ffprobe"\n\n# Set media probe backend\nexport MAJOOR_MEDIA_PROBE_BACKEND="auto" # auto, exiftool, ffprobe, both\n\n# Enable file watcher for auto-reindexing\nexport MAJOOR_ENABLE_FILE_WATCHER=true\n\n# Database tuning\nexport MAJOOR_DB_TIMEOUT=30.0\nexport MAJOOR_DB_MAX_CONNECTIONS=8\nexport MAJOOR_DB_QUERY_TIMEOUT=30.0\n\n# Watcher settings\nexport MAJOOR_WATCHER_INTERVAL=15.0\nexport MAJOOR_WATCHER_JOIN_TIMEOUT=5.0\n\n# Collection limits\nexport MJR_COLLECTION_MAX_ITEMS=50000\n\n# Allow symlinks in custom roots\nexport MJR_ALLOW_SYMLINKS=on</code></pre>
<h2 id="user_guide-troubleshooting">Troubleshooting</h2>
<h3 id="user_guide-common-issues">Common Issues</h3>
<h4 id="user_guide-missing-dependencies">Missing Dependencies</h4>
<p>If you see warnings about missing dependencies:</p>
<ol>
<li>Check that all requirements are installed: <code>pip install -r requirements.txt</code></li>
<li>Install optional tools (ExifTool, FFprobe) for full functionality</li>
<li>Verify tools are in your system PATH or set environment variables</li>
</ol>
<h4 id="user_guide-slow-performance">Slow Performance</h4>
<ul>
<li>Large collections may take time to load</li>
<li>Increase page size for fewer requests</li>
<li>Ensure external tools (ExifTool, FFprobe) are properly installed</li>
<li>Adjust database connection settings if needed</li>
</ul>
<h4 id="user_guide-index-not-updating">Index Not Updating</h4>
<ul>
<li>Use <code>Ctrl/Cmd+S</code> to manually trigger a scan</li>
<li>Enable file watcher for automatic updates</li>
<li>Check permissions on output directory</li>
</ul>
<h4 id="user_guide-metadata-extraction-issues">Metadata Extraction Issues</h4>
<ul>
<li>Verify ExifTool and FFprobe are installed and accessible</li>
<li>Check file permissions for metadata access</li>
<li>Some file formats may not contain embedded metadata</li>
</ul>
<h3 id="user_guide-file-locations">File Locations</h3>
<ul>
<li><strong>Index Database</strong>: <code>&amp;lt;output&amp;gt;/_mjr_index/assets.sqlite</code></li>
<li><strong>Custom Roots</strong>: <code>&amp;lt;output&amp;gt;/_mjr_index/custom_roots.json</code></li>
<li><strong>Collections</strong>: <code>&amp;lt;output&amp;gt;/_mjr_index/collections/*.json</code></li>
<li><strong>Temporary ZIPs</strong>: <code>&amp;lt;output&amp;gt;/_mjr_batch_zips/</code> (auto-cleaned)</li>
</ul>
<h3 id="user_guide-security-considerations">Security Considerations</h3>
<ul>
<li>CSRF protection on state-changing endpoints</li>
<li>Rate limiting on expensive operations</li>
<li>Path validation to prevent directory traversal</li>
<li>Trusted proxy configuration for forwarded headers</li>
</ul>
<h2 id="user_guide-best-practices">Best Practices</h2>
<h3 id="user_guide-organization">Organization</h3>
<ul>
<li>Use collections to group related assets</li>
<li>Apply consistent tagging schemes</li>
<li>Regularly rate your assets to identify quality results</li>
<li>Clean up unused collections periodically</li>
</ul>
<h3 id="user_guide-performance">Performance</h3>
<ul>
<li>Keep collections reasonably sized (under 50,000 items)</li>
<li>Use filters to narrow down large result sets</li>
<li>Periodically optimize the database through the maintenance tools</li>
<li>Monitor index size and rebuild if needed</li>
</ul>
<h3 id="user_guide-workflow-integration">Workflow Integration</h3>
<ul>
<li>Use drag-and-drop to quickly incorporate assets into workflows</li>
<li>Leverage metadata to reproduce good results</li>
<li>Share collections with team members</li>
<li>Use the viewer to compare different generation approaches</li>
</ul>
<hr />
<p><em>Documentation Version: 1.0</em> <em>Last Updated: January 2026</em></p></div>
<a class="toplink" href="#top">Back to top</a>
<div style="margin-top: 10px; font-size: 12px; color: var(--muted);">
Source: <code>docs/USER_GUIDE.md</code>
</div>
</div>
</section>
<section class="panel section" id="installation">
<div class="panel-h"><h2>INSTALLATION.md</h2></div>
<div class="panel-b">
<div style="color: var(--muted); font-size: 12px; margin-bottom: 10px;">Detailed installation and setup instructions</div>
<div class="section"><h1 id="installation-majoor-assets-manager-installation-guide">Majoor Assets Manager - Installation Guide</h1>
<h2 id="installation-overview">Overview</h2>
<p>This guide provides detailed instructions for installing and configuring the Majoor Assets Manager for ComfyUI. Follow these steps to get the extension up and running with all its features.</p>
<h2 id="installation-prerequisites">Prerequisites</h2>
<h3 id="installation-system-requirements">System Requirements</h3>
<ul>
<li>ComfyUI installation</li>
<li>Python 3.8 or higher</li>
<li>At least 500MB free disk space for the extension and dependencies</li>
<li>Administrator privileges (for installation and optional tool installations)</li>
</ul>
<h3 id="installation-supported-platforms">Supported Platforms</h3>
<ul>
<li>Windows 10/11</li>
<li>macOS 10.15 or higher</li>
<li>Linux (Ubuntu 20.04+, Debian 11+, or equivalent)</li>
</ul>
<h2 id="installation-quick-installation-recommended">Quick Installation (Recommended)</h2>
<h3 id="installation-using-comfyui-manager">Using ComfyUI Manager</h3>
<ol>
<li>Open ComfyUI Manager in your browser</li>
<li>Find "Majoor Assets Manager" in the extensions list</li>
<li>Click "Install" next to the extension</li>
<li>Wait for the installation to complete</li>
<li>Restart ComfyUI completely</li>
<li>The extension should now be available in the Assets Manager tab</li>
</ol>
<h2 id="installation-manual-installation">Manual Installation</h2>
<h3 id="installation-step-1-clone-the-repository">Step 1: Clone the Repository</h3>
<p>Open your terminal/command prompt and navigate to your ComfyUI custom_nodes directory:</p>
<pre><code class="language-bash">cd /path/to/your/ComfyUI/custom_nodes</code></pre>
<p>Clone the repository:</p>
<pre><code class="language-bash">git clone https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager ComfyUI-Majoor-AssetsManager</code></pre>
<h3 id="installation-step-2-install-python-dependencies">Step 2: Install Python Dependencies</h3>
<p>Navigate to the extension directory and install the required packages:</p>
<pre><code class="language-bash">cd ComfyUI-Majoor-AssetsManager\npip install -r requirements.txt</code></pre>
<h3 id="installation-step-3-restart-comfyui">Step 3: Restart ComfyUI</h3>
<p>Stop your ComfyUI server completely and restart it to load the new extension.</p>
<h2 id="installation-optional-dependencies-highly-recommended">Optional Dependencies (Highly Recommended)</h2>
<p>For full functionality including metadata extraction and file tagging, install these external tools:</p>
<h3 id="installation-windows-installation">Windows Installation</h3>
<h4 id="installation-option-a-using-scoop-package-manager">Option A: Using Scoop Package Manager</h4>
<ol>
<li>Install Scoop if you don't have it:</li>
</ol>
<pre><code class="language-powershell"> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser\n irm get.scoop.sh | iex</code></pre>
<ol>
<li>Install the required tools:</li>
</ol>
<pre><code class="language-powershell"> scoop install ffmpeg exiftool</code></pre>
<h4 id="installation-option-b-using-chocolatey-package-manager">Option B: Using Chocolatey Package Manager</h4>
<ol>
<li>Install Chocolatey if you don't have it:</li>
</ol>
<pre><code class="language-powershell"> Set-ExecutionPolicy Bypass -Scope Process -Force\n [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072\n iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))</code></pre>
<ol>
<li>Install the required tools:</li>
</ol>
<pre><code class="language-powershell"> choco install -y ffmpeg exiftool</code></pre>
<h4 id="installation-option-c-using-winget">Option C: Using WinGet</h4>
<pre><code class="language-powershell">winget install -e --id Gyan.FFmpeg\nwinget install -e --id PhilHarvey.ExifTool</code></pre>
<h4 id="installation-option-d-manual-installation">Option D: Manual Installation</h4>
<ol>
<li><strong>FFmpeg</strong>: Download from https://www.gyan.dev/ffmpeg/builds/</li>
<ul>
<li>Extract to a folder (e.g., <code>C:\ffmpeg</code>)</li>
<li>Add <code>C:\ffmpeg\bin</code> to your system PATH</li>
</ul>
</ol>
<ol>
<li><strong>ExifTool</strong>: Download from https://exiftool.org/</li>
<ul>
<li>Download <code>exiftool-#.##.zip</code></li>
<li>Extract to a folder (e.g., <code>C:\exiftool</code>)</li>
<li>Add <code>C:\exiftool</code> to your system PATH</li>
</ul>
</ol>
<h3 id="installation-macos-installation">macOS Installation</h3>
<h4 id="installation-using-homebrew-recommended">Using Homebrew (Recommended)</h4>
<ol>
<li>Install Homebrew if you don't have it:</li>
</ol>
<pre><code class="language-bash"> /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"</code></pre>
<ol>
<li>Install the required tools:</li>
</ol>
<pre><code class="language-bash"> brew install ffmpeg exiftool</code></pre>
<h3 id="installation-linux-installation">Linux Installation</h3>
<h4 id="installation-ubuntudebian">Ubuntu/Debian</h4>
<pre><code class="language-bash">sudo apt update\nsudo apt install -y ffmpeg libimage-exiftool-perl</code></pre>
<h4 id="installation-fedorarhel">Fedora/RHEL</h4>
<pre><code class="language-bash">sudo dnf install -y ffmpeg perl-Image-ExifTool</code></pre>
<h4 id="installation-arch-linux">Arch Linux</h4>
<pre><code class="language-bash">sudo pacman -S ffmpeg exiftool</code></pre>
<h2 id="installation-verification-steps">Verification Steps</h2>
<p>After installation, verify everything is working:</p>
<h3 id="installation-step-1-check-extension-loading">Step 1: Check Extension Loading</h3>
<ol>
<li>Start ComfyUI</li>
<li>Look for the Assets Manager tab in the interface</li>
<li>Check the console/logs for any error messages during startup</li>
</ol>
<h3 id="installation-step-2-verify-external-tools-if-installed">Step 2: Verify External Tools (if installed)</h3>
<p>Open a terminal/command prompt and run:</p>
<pre><code class="language-bash">exiftool -ver\nffprobe -version</code></pre>
<p>Both commands should return version information without errors.</p>
<h3 id="installation-step-3-test-basic-functionality">Step 3: Test Basic Functionality</h3>
<ol>
<li>Open the Assets Manager in ComfyUI</li>
<li>Switch between different scopes (Outputs, Inputs, Custom, Collections)</li>
<li>Perform a simple search to verify indexing is working</li>
<li>Try opening the viewer for an asset</li>
</ol>
<h2 id="installation-configuration">Configuration</h2>
<h3 id="installation-environment-variables">Environment Variables</h3>
<p>You can configure the extension using environment variables. Add these to your shell profile or set them before starting ComfyUI:</p>
<pre><code class="language-bash"># Override default output directory\nexport MAJOOR_OUTPUT_DIRECTORY="/path/to/your/output"\n\n# Specify tool paths if not in system PATH\nexport MAJOOR_EXIFTOOL_PATH="/path/to/exiftool"\nexport MAJOOR_FFPROBE_PATH="/path/to/ffprobe"\n\n# Set media probe backend (auto, exiftool, ffprobe, both)\nexport MAJOOR_MEDIA_PROBE_BACKEND="auto"\n\n# Enable file watching for automatic reindexing\nexport MAJOOR_ENABLE_FILE_WATCHER=true\n\n# Set watcher interval (in seconds)\nexport MAJOOR_WATCHER_INTERVAL=15.0</code></pre>
<h3 id="installation-windows-batch-file-example">Windows Batch File Example</h3>
<p>Create a batch file to set environment variables and start ComfyUI:</p>
<pre><code class="language-batch">@echo off\nset MAJOOR_MEDIA_PROBE_BACKEND=auto\nset MAJOOR_ENABLE_FILE_WATCHER=true\nset MAJOOR_WATCHER_INTERVAL=15.0\n\nREM Start ComfyUI with the environment variables\ncd /d "C:\path\to\ComfyUI"\npython main.py --auto-launch\npause</code></pre>
<h2 id="installation-troubleshooting">Troubleshooting</h2>
<h3 id="installation-extension-not-appearing">Extension Not Appearing</h3>
<ul>
<li>Verify the folder is named correctly: <code>ComfyUI-Majoor-AssetsManager</code></li>
<li>Check that all files were downloaded properly</li>
<li>Ensure ComfyUI was restarted after installation</li>
<li>Look for error messages in the ComfyUI console</li>
</ul>
<h3 id="installation-missing-dependencies-error">Missing Dependencies Error</h3>
<p>If you see messages about missing dependencies:</p>
<pre><code class="language-bash"># Navigate to the extension directory\ncd ComfyUI-Majoor-AssetsManager\npip install -r requirements.txt</code></pre>
<h3 id="installation-external-tools-not-found">External Tools Not Found</h3>
<p>If metadata extraction isn't working:</p>
<ol>
<li>Verify tools are installed: <code>exiftool -ver</code> and <code>ffprobe -version</code></li>
<li>Check if tools are in your system PATH</li>
<li>Set environment variables to point to the executables directly</li>
</ol>
<h3 id="installation-permission-errors">Permission Errors</h3>
<ul>
<li>Ensure ComfyUI has read/write access to the output directory</li>
<li>On Windows, run as administrator if needed</li>
<li>On Unix systems, check file permissions with <code>ls -la</code></li>
</ul>
<h3 id="installation-slow-performance">Slow Performance</h3>
<ul>
<li>The first scan may take time for large directories</li>
<li>Subsequent scans will be faster due to incremental indexing</li>
<li>Consider excluding very large directories that don't contain relevant assets</li>
</ul>
<h2 id="installation-post-installation-setup">Post-Installation Setup</h2>
<h3 id="installation-first-time-usage">First-Time Usage</h3>
<ol>
<li>Open ComfyUI and navigate to the Assets Manager tab</li>
<li>The extension will automatically begin indexing your output directory</li>
<li>Wait for the initial scan to complete (progress shown in status bar)</li>
<li>Use the search bar to find assets</li>
<li>Right-click on assets to access context menus</li>
</ol>
<h3 id="installation-adding-custom-directories">Adding Custom Directories</h3>
<ol>
<li>Right-click in the Assets Manager interface</li>
<li>Select "Add Custom Root"</li>
<li>Enter the path to your custom directory</li>
<li>The directory will be added to the Custom scope</li>
</ol>
<h3 id="installation-creating-your-first-collection">Creating Your First Collection</h3>
<ol>
<li>Select one or more assets</li>
<li>Right-click and choose "Add to Collection"</li>
<li>Create a new collection or add to an existing one</li>
<li>Access your collections from the Collections tab</li>
</ol>
<h2 id="installation-updates">Updates</h2>
<h3 id="installation-using-comfyui-manager">Using ComfyUI Manager</h3>
<p>Updates will be available through the ComfyUI Manager interface when released.</p>
<h3 id="installation-manual-updates">Manual Updates</h3>
<pre><code class="language-bash">cd ComfyUI/custom_nodes/ComfyUI-Majoor-AssetsManager\ngit pull origin main\npip install -r requirements.txt --upgrade</code></pre>
<p>Remember to restart ComfyUI after updating.</p>
<h2 id="installation-uninstallation">Uninstallation</h2>
<h3 id="installation-using-comfyui-manager">Using ComfyUI Manager</h3>
<p>Simply click "Uninstall" in the ComfyUI Manager interface.</p>
<h3 id="installation-manual-removal">Manual Removal</h3>
<ol>
<li>Delete the <code>ComfyUI-Majoor-AssetsManager</code> folder from <code>custom_nodes</code></li>
<li>Restart ComfyUI</li>
<li>The extension will be completely removed</li>
</ol>
<hr />
<p><em>Installation Guide Version: 1.0</em> <em>Last Updated: January 2026</em></p></div>
<a class="toplink" href="#top">Back to top</a>
<div style="margin-top: 10px; font-size: 12px; color: var(--muted);">
Source: <code>docs/INSTALLATION.md</code>
</div>
</div>
</section>
<section class="panel section" id="search_filtering">
<div class="panel-h"><h2>SEARCH_FILTERING.md</h2></div>
<div class="panel-b">
<div style="color: var(--muted); font-size: 12px; margin-bottom: 10px;">Full-text search and filtering capabilities</div>
<div class="section"><h1 id="search_filtering-majoor-assets-manager-search-filtering-guide">Majoor Assets Manager - Search &amp; Filtering Guide</h1>
<h2 id="search_filtering-overview">Overview</h2>
<p>The Majoor Assets Manager provides powerful search and filtering capabilities to help you quickly find and organize your assets. This guide explains all the search and filtering features available in the extension.</p>
<h2 id="search_filtering-full-text-search">Full-Text Search</h2>
<h3 id="search_filtering-how-it-works">How It Works</h3>
<p>The Assets Manager uses SQLite FTS5 with BM25 ranking to provide fast and accurate search results. The search indexes:</p>
<ul>
<li>Filenames and file extensions</li>
<li>Embedded metadata (prompts, models, parameters)</li>
<li>Workflow information</li>
<li>Tags and ratings</li>
<li>File content where applicable</li>
</ul>
<h3 id="search_filtering-basic-search">Basic Search</h3>
<ol>
<li>Locate the search bar at the top of the Assets Manager interface</li>
<li>Type any text you want to search for</li>
<li>Press Enter or wait for results to appear automatically</li>
<li>Results are displayed with relevance ranking</li>
</ol>
<h3 id="search_filtering-search-syntax">Search Syntax</h3>
<h4 id="search_filtering-simple-terms">Simple Terms</h4>
<ul>
<li>Type any word or phrase to search for it</li>
<li>Example: <code>landscape</code> finds all assets with "landscape" in their metadata</li>
</ul>
<h4 id="search_filtering-exact-phrases">Exact Phrases</h4>
<ul>
<li>Use quotes to search for exact phrases</li>
<li>Example: <code>"fantasy character"</code> finds assets with that exact phrase</li>
</ul>
<h4 id="search_filtering-multiple-terms">Multiple Terms</h4>
<ul>
<li>Search for multiple terms simultaneously</li>
<li>Results containing more terms rank higher</li>
<li>Example: <code>portrait fantasy digital</code> finds assets matching any or all terms</li>
</ul>
<h3 id="search_filtering-search-scopes">Search Scopes</h3>
<p>Search works across all available scopes:</p>
<ul>
<li><strong>Outputs</strong>: Search in your ComfyUI output directory</li>
<li><strong>Inputs</strong>: Search in your ComfyUI input directory</li>
<li><strong>Custom</strong>: Search in user-defined directories</li>
<li><strong>Collections</strong>: Search within saved collections</li>
</ul>
<h2 id="search_filtering-filtering-options">Filtering Options</h2>
<h3 id="search_filtering-kind-filter">Kind Filter</h3>
<p>Filter assets by file type:</p>
<h4 id="search_filtering-image-formats">Image Formats</h4>
<ul>
<li><strong>PNG</strong>: Portable Network Graphics files</li>
<li><strong>JPG/JPEG</strong>: Joint Photographic Experts Group files</li>
<li><strong>WEBP</strong>: Modern image format with compression</li>
<li><strong>GIF</strong>: Animated or static graphics interchange format</li>
<li><strong>BMP</strong>: Bitmap image files</li>
<li><strong>TIFF/TIF</strong>: Tagged Image File Format</li>
</ul>
<h4 id="search_filtering-video-formats">Video Formats</h4>
<ul>
<li><strong>MP4</strong>: MPEG-4 Part 14 video files</li>
<li><strong>MOV</strong>: Apple QuickTime movie files</li>
<li><strong>AVI</strong>: Audio Video Interleave files</li>
<li><strong>MKV</strong>: Matroska video files</li>
<li><strong>WEBM</strong>: WebM video files</li>
<li><strong>FLV</strong>: Flash video files</li>
</ul>
<h4 id="search_filtering-workflow-formats">Workflow Formats</h4>
<ul>
<li><strong>JSON</strong>: Workflow definition files</li>
<li><strong>PNG</strong>: PNG files with embedded workflows</li>
</ul>
<h3 id="search_filtering-rating-filter">Rating Filter</h3>
<p>Filter by star ratings (0-5 stars):</p>
<ol>
<li>Click the rating filter dropdown</li>
<li>Select minimum rating threshold</li>
<li>Only assets with equal or higher ratings will be displayed</li>
<li>Useful for quickly finding your best results</li>
</ol>
<h3 id="search_filtering-workflow-filter">Workflow Filter</h3>
<p>Toggle to show only assets with embedded workflow information:</p>
<ul>
<li>Shows only assets that contain workflow data</li>
<li>Helpful when looking for specific generation parameters</li>
<li>Particularly useful for reproducible results</li>
</ul>
<h3 id="search_filtering-date-filters">Date Filters</h3>
<p>Filter assets by creation or modification dates:</p>
<ol>
<li>Open the date filter panel</li>
<li>Select date range using calendar pickers</li>
<li>Apply the filter to narrow results</li>
<li>Useful for finding recent work or historical assets</li>
</ol>
<h3 id="search_filtering-advanced-filters">Advanced Filters</h3>
<h4 id="search_filtering-hide-png-siblings">Hide PNG Siblings</h4>
<p>When working with video generations that include PNG previews:</p>
<ul>
<li>Enable this option to hide PNG files when video previews exist</li>
<li>Reduces clutter from duplicate content in different formats</li>
<li>Keeps your view focused on the primary asset type</li>
</ul>
<h4 id="search_filtering-sort-options">Sort Options</h4>
<p>Sort results by various criteria:</p>
<ul>
<li><strong>Relevance</strong>: Based on search term matching (default)</li>
<li><strong>Name</strong>: Alphabetical by filename</li>
<li><strong>Date</strong>: Chronological by creation/modification date</li>
<li><strong>Size</strong>: By file size (ascending/descending)</li>
<li><strong>Rating</strong>: By star rating (ascending/descending)</li>
<li><strong>Kind</strong>: By file type</li>
</ul>
<h2 id="search_filtering-search-tips-best-practices">Search Tips &amp; Best Practices</h2>
<h3 id="search_filtering-effective-search-strategies">Effective Search Strategies</h3>
<ol>
<li><strong>Be Specific</strong>: Use specific terms for better results</li>
<ul>
<li>Instead of: <code>character</code></li>
<li>Try: <code>"fantasy warrior"</code> or <code>"cyberpunk city"</code></li>
</ul>
</ol>
<ol>
<li><strong>Combine Filters</strong>: Use multiple filters together</li>
<ul>
<li>Rating + Date + Kind filters can quickly narrow results</li>
</ul>
</ol>
<ol>
<li><strong>Use Quotes</strong>: For exact phrase matching</li>
<ul>
<li><code>"negative prompt: ugly"</code> finds assets with that exact phrase</li>
</ul>
</ol>
<ol>
<li><strong>Leverage Metadata</strong>: Search for model names, samplers, or parameters</li>
<ul>
<li><code>model:SDXL</code> finds assets generated with SDXL</li>
<li><code>steps:30</code> finds assets with 30 sampling steps</li>
</ul>
</ol>
<h3 id="search_filtering-performance-considerations">Performance Considerations</h3>
<ul>
<li>First search in a scope may take longer as indexing occurs</li>
<li>Subsequent searches are faster due to cached indexes</li>
<li>Very large directories may take time to scan initially</li>
<li>Results are loaded in pages for smooth performance</li>
</ul>
<h3 id="search_filtering-search-result-information">Search Result Information</h3>
<p>Each search result displays:</p>
<ul>
<li><strong>Thumbnail</strong>: Visual preview of the asset</li>
<li><strong>Filename</strong>: Original file name</li>
<li><strong>Extension Badge</strong>: File type with collision indicator (e.g., <code>PNG+</code> for duplicates)</li>
<li><strong>Rating</strong>: Star rating if assigned</li>
<li><strong>Tags</strong>: Preview of assigned tags</li>
<li><strong>Metadata</strong>: Brief generation information when available</li>
</ul>
<h2 id="search_filtering-using-filters-together">Using Filters Together</h2>
<h3 id="search_filtering-sequential-filtering">Sequential Filtering</h3>
<p>Apply filters in sequence for refined results:</p>
<ol>
<li>Start with a broad search term</li>
<li>Apply kind filter to narrow by file type</li>
<li>Use rating filter to show only quality results</li>
<li>Apply date filter to focus on timeframe</li>
<li>Sort results by preference</li>
</ol>
<h3 id="search_filtering-resetting-filters">Resetting Filters</h3>
<ul>
<li>Click the "Clear All Filters" button to reset all active filters</li>
<li>Or individually disable filters using their respective controls</li>
<li>Search terms remain unless cleared separately</li>
</ul>
<h2 id="search_filtering-collections-integration">Collections Integration</h2>
<h3 id="search_filtering-searching-within-collections">Searching Within Collections</h3>
<ul>
<li>Switch to the Collections scope to search within saved collections</li>
<li>Individual collections can be searched independently</li>
<li>Cross-collection searches are also supported</li>
</ul>
<h3 id="search_filtering-adding-filtered-results-to-collections">Adding Filtered Results to Collections</h3>
<ol>
<li>Apply your desired search and filters</li>
<li>Select the results you want to save</li>
<li>Right-click and choose "Add to Collection"</li>
<li>Create a new collection or add to existing one</li>
<li>The filtered results are preserved in the collection</li>
</ol>
<h2 id="search_filtering-troubleshooting-search-issues">Troubleshooting Search Issues</h2>
<h3 id="search_filtering-no-results-found">No Results Found</h3>
<ul>
<li>Check spelling of search terms</li>
<li>Try broader terms or synonyms</li>
<li>Verify the correct scope is selected</li>
<li>Ensure the directory has been scanned (trigger with Ctrl/Cmd+S)</li>
</ul>
<h3 id="search_filtering-too-many-results">Too Many Results</h3>
<ul>
<li>Add more specific search terms</li>
<li>Apply kind filters to narrow by file type</li>
<li>Use rating filters to show only quality results</li>
<li>Apply date filters to focus on recent work</li>
</ul>
<h3 id="search_filtering-slow-search-performance">Slow Search Performance</h3>
<ul>
<li>First search in a large directory takes longer</li>
<li>Subsequent searches are faster with cached indexes</li>
<li>Consider excluding very large directories that don't contain relevant assets</li>
<li>Check system resources and close other applications if needed</li>
</ul>
<h3 id="search_filtering-missing-metadata-in-search">Missing Metadata in Search</h3>
<ul>
<li>Verify external tools (ExifTool, FFprobe) are installed</li>
<li>Check file permissions for metadata access</li>
<li>Some file formats may not contain embeddable metadata</li>
<li>Re-index the directory if metadata should be present</li>
</ul>
<h2 id="search_filtering-advanced-search-techniques">Advanced Search Techniques</h2>
<h3 id="search_filtering-boolean-operations">Boolean Operations</h3>
<p>While direct boolean operators aren't supported, you can achieve similar results:</p>
<ul>
<li>AND: Include multiple terms (results must contain all terms)</li>
<li>OR: Use broader terms that match any of your interests</li>
<li>NOT: Manually exclude unwanted results after searching</li>
</ul>
<h3 id="search_filtering-pattern-recognition">Pattern Recognition</h3>
<ul>
<li>Search for common patterns in your workflow names</li>
<li>Use recurring artist/model names as search terms</li>
<li>Look for specific parameter combinations in metadata</li>
</ul>
<h3 id="search_filtering-workflow-based-searching">Workflow-Based Searching</h3>
<ul>
<li>Search for specific sampler names: <code>euler</code>, <code>ddim</code>, <code>dpm++</code></li>
<li>Find results from particular models: <code>realisticvision</code>, <code>dreamshaper</code></li>
<li>Locate generations with specific settings: <code>cfg_scale:7</code>, <code>steps:40</code></li>
</ul>
<h2 id="search_filtering-search-statistics">Search Statistics</h2>
<h3 id="search_filtering-result-count-display">Result Count Display</h3>
<p>The interface shows:</p>
<ul>
<li>Total assets in current scope</li>
<li>Number of assets matching current filters</li>
<li>Current page and total pages</li>
<li>Time taken for the search operation</li>
</ul>
<h3 id="search_filtering-performance-metrics">Performance Metrics</h3>
<ul>
<li>Search duration is displayed for each query</li>
<li>Indexing status shows when background processes are running</li>
<li>Memory usage indicators help monitor performance</li>
</ul>
<hr />
<p><em>Search &amp; Filtering Guide Version: 1.0</em> <em>Last Updated: January 2026</em></p></div>
<a class="toplink" href="#top">Back to top</a>
<div style="margin-top: 10px; font-size: 12px; color: var(--muted);">
Source: <code>docs/SEARCH_FILTERING.md</code>
</div>
</div>
</section>
<section class="panel section" id="metadata_viewer">
<div class="panel-h"><h2>METADATA_VIEWER.md</h2></div>
<div class="panel-b">
<div style="color: var(--muted); font-size: 12px; margin-bottom: 10px;">Metadata extraction and advanced viewer features</div>
<div class="section"><h1 id="metadata_viewer-majoor-assets-manager-metadata-viewer-guide">Majoor Assets Manager - Metadata &amp; Viewer Guide</h1>
<h2 id="metadata_viewer-overview">Overview</h2>
<p>The Majoor Assets Manager provides comprehensive metadata extraction and an advanced viewer with powerful analysis tools. This guide covers all features related to metadata handling and the advanced viewer capabilities.</p>
<h2 id="metadata_viewer-metadata-extraction">Metadata Extraction</h2>
<h3 id="metadata_viewer-supported-file-types">Supported File Types</h3>
<p>The system extracts metadata from various file formats:</p>
<h4 id="metadata_viewer-image-files">Image Files</h4>
<ul>
<li><strong>PNG</strong>: Full metadata including generation parameters, workflow, and custom tags</li>
<li><strong>JPG/JPEG</strong>: EXIF data, camera information, and embedded generation parameters</li>
<li><strong>WEBP</strong>: Metadata from AI generation tools and standard EXIF data</li>
<li><strong>TIFF</strong>: Professional imaging metadata and generation parameters</li>
</ul>
<h4 id="metadata_viewer-video-files">Video Files</h4>
<ul>
<li><strong>MP4</strong>: Codec information, duration, frame rate, audio tracks</li>
<li><strong>MOV</strong>: QuickTime metadata and generation parameters</li>
<li><strong>AVI</strong>: Container information and basic video properties</li>
<li><strong>MKV</strong>: Full multimedia metadata including embedded generation data</li>
</ul>
<h4 id="metadata_viewer-workflow-files">Workflow Files</h4>
<ul>
<li><strong>JSON</strong>: Complete workflow definitions and node configurations</li>
<li><strong>PNG with embedded workflows</strong>: Extracted workflow data from image files</li>
</ul>
<h3 id="metadata_viewer-extraction-backends">Extraction Backends</h3>
<h4 id="metadata_viewer-exiftool-primary">ExifTool (Primary)</h4>
<ul>
<li>Most comprehensive metadata extraction</li>
<li>Supports hundreds of file formats</li>
<li>Handles custom tags and ratings</li>
<li>Provides detailed technical information</li>
</ul>
<h4 id="metadata_viewer-ffprobe-videoaudio-focus">FFprobe (Video/Audio Focus)</h4>
<ul>
<li>Specialized for video and audio files</li>
<li>Detailed codec and stream information</li>
<li>Frame-level metadata for video analysis</li>
<li>Audio track information and properties</li>
</ul>
<h4 id="metadata_viewer-built-in-extraction">Built-in Extraction</h4>
<ul>
<li>Basic metadata when external tools unavailable</li>
<li>Filename and filesystem metadata</li>
<li>Size, creation date, and modification time</li>
<li>Format-specific basic information</li>
</ul>
<h3 id="metadata_viewer-metadata-categories">Metadata Categories</h3>
<h4 id="metadata_viewer-generation-information">Generation Information</h4>
<ul>
<li><strong>Prompt</strong>: Full positive prompt used for generation</li>
<li><strong>Negative Prompt</strong>: Negative prompt applied during generation</li>
<li><strong>Model</strong>: Base model used for generation</li>
<li><strong>Sampler</strong>: Sampling algorithm employed</li>
<li><strong>Steps</strong>: Number of sampling steps</li>
<li><strong>CFG Scale</strong>: Classifier-Free Guidance scale value</li>
<li><strong>Seed</strong>: Random seed used for generation</li>
<li><strong>Width/Height</strong>: Output dimensions</li>
<li><strong>Clip Skip</strong>: CLIP model layer skipping value</li>
</ul>
<h4 id="metadata_viewer-technical-parameters">Technical Parameters</h4>
<ul>
<li><strong>Resolution</strong>: Width and height of the generated image</li>
<li><strong>File Size</strong>: On-disk size of the file</li>
<li><strong>Format</strong>: File format and compression details</li>
<li><strong>Color Profile</strong>: Color space and profile information</li>
<li><strong>Compression</strong>: Compression algorithm and settings</li>
</ul>
<h4 id="metadata_viewer-workflow-data">Workflow Data</h4>
<ul>
<li><strong>Node Configuration</strong>: Complete workflow node setup</li>
<li><strong>Connection Map</strong>: Input/output connections between nodes</li>
<li><strong>Parameter Values</strong>: All node parameter settings</li>
<li><strong>Workflow Minimap</strong>: Visual representation of the workflow</li>
</ul>
<h2 id="metadata_viewer-advanced-viewer">Advanced Viewer</h2>
<h3 id="metadata_viewer-viewer-access">Viewer Access</h3>
<ul>
<li>Double-click on any asset card to open the viewer</li>
<li>Right-click and select "Open in Viewer" from context menu</li>
<li>Use keyboard shortcut when asset is selected</li>
</ul>
<h3 id="metadata_viewer-single-view-mode">Single View Mode</h3>
<h4 id="metadata_viewer-navigation-controls">Navigation Controls</h4>
<ul>
<li><strong>Pan</strong>: Click and drag to move around the image</li>
<li><strong>Zoom</strong>: Mouse wheel to zoom in/out</li>
<li><strong>Fit to Screen</strong>: Automatically scales image to fit window</li>
<li><strong>Actual Size</strong>: View image at 1:1 pixel ratio (Alt+1)</li>
</ul>
<h4 id="metadata_viewer-image-enhancement-tools">Image Enhancement Tools</h4>
<h5 id="metadata_viewer-exposure-adjustment-ev">Exposure Adjustment (EV)</h5>
<ul>
<li>Adjust exposure compensation from -5 to +5 EV</li>
<li>Real-time preview of exposure changes</li>
<li>Useful for evaluating details in shadows/highlights</li>
<li>Preserves color relationships while adjusting brightness</li>
</ul>
<h5 id="metadata_viewer-gamma-correction">Gamma Correction</h5>
<ul>
<li>Adjust gamma curve from 0.25 to 4.0</li>
<li>Alters midtone brightness without affecting highlights/shadows as much</li>
<li>Useful for fine-tuning contrast in specific tonal ranges</li>
<li>Real-time application with live preview</li>
</ul>
<h5 id="metadata_viewer-channel-isolation">Channel Isolation</h5>
<ul>
<li><strong>RGB</strong>: View all color channels combined</li>
<li><strong>R</strong>: View only red channel information</li>
<li><strong>G</strong>: View only green channel information</li>
<li><strong>B</strong>: View only blue channel information</li>
<li><strong>Alpha</strong>: View transparency/alpha channel</li>
<li><strong>Luma</strong>: View luminance information only</li>
</ul>
<h4 id="metadata_viewer-analysis-tools">Analysis Tools</h4>
<h5 id="metadata_viewer-false-color-mode-f">False Color Mode (F)</h5>
<ul>
<li>Visualizes overexposed and underexposed areas</li>
<li>Highlights clipped highlights (typically white/magenta)</li>
<li>Shows blocked shadows (typically blue/black)</li>
<li>Helps evaluate dynamic range and exposure</li>
</ul>
<h5 id="metadata_viewer-zebra-patterns-z">Zebra Patterns (Z)</h5>
<ul>
<li>Displays 100% IRE (95% for Rec.2020) areas as zebra stripes</li>
<li>Helps identify areas approaching clipping</li>
<li>Adjustable threshold levels</li>
<li>Useful for maintaining highlight detail</li>
</ul>
<h3 id="metadata_viewer-comparison-modes">Comparison Modes</h3>
<h4 id="metadata_viewer-side-by-side-comparison">Side-by-Side Comparison</h4>
<ul>
<li>View two assets next to each other</li>
<li>Independent zoom and pan for each image</li>
<li>Synchronized zoom/pan option available</li>
<li>Perfect for comparing different generation parameters</li>
</ul>
<h4 id="metadata_viewer-ab-toggle-mode">A/B Toggle Mode</h4>
<ul>
<li>Quickly switch between two assets</li>
<li>Single view area showing one asset at a time</li>
<li>Instant toggle between assets</li>
<li>Useful for subtle difference evaluation</li>
</ul>
<h4 id="metadata_viewer-wipe-comparison-slider">Wipe Comparison (Slider)</h4>
<ul>
<li>Overlay one image over another with adjustable slider</li>
<li>Reveal one asset over another progressively</li>
<li>Clear visualization of differences</li>
<li>Adjustable transition line</li>
</ul>
<h4 id="metadata_viewer-difference-mode">Difference Mode</h4>
<ul>
<li>Mathematical difference between two assets</li>
<li>Highlights all variations between images</li>
<li>Positive differences in one color, negative in another</li>
<li>Excellent for identifying subtle changes</li>
</ul>
<h3 id="metadata_viewer-video-player-features">Video Player Features</h3>
<h4 id="metadata_viewer-playback-controls">Playback Controls</h4>
<ul>
<li><strong>Play/Pause</strong>: Standard play/pause functionality</li>
<li><strong>Loop/Once</strong>: Toggle between continuous and single playback</li>
<li><strong>Speed Control</strong>: Adjustable playback speed (0.25x to 4x)</li>
<li><strong>Frame Stepping</strong>: Precise frame-by-frame navigation (Shift+Arrow keys)</li>
</ul>
<h4 id="metadata_viewer-timeline-features">Timeline Features</h4>
<ul>
<li><strong>Seek Bar</strong>: Drag to jump to specific points in video</li>
<li><strong>Current Time</strong>: Display of current playback position</li>
<li><strong>Duration</strong>: Total video duration display</li>
<li><strong>Frame Counter</strong>: Current frame number display</li>
</ul>
<h4 id="metadata_viewer-inout-points">In/Out Points</h4>
<ul>
<li><strong>Set In Point</strong>: Mark start of desired segment (I key)</li>
<li><strong>Set Out Point</strong>: Mark end of desired segment (O key)</li>
<li><strong>Segment Playback</strong>: Play only the marked segment</li>
<li><strong>Clear Points</strong>: Remove In/Out markers</li>
</ul>
<h3 id="metadata_viewer-visual-overlays">Visual Overlays</h3>
<h4 id="metadata_viewer-grid-overlays-g">Grid Overlays (G)</h4>
<p>Cycle through different grid types:</p>
<ul>
<li><strong>Off</strong>: No grid overlay</li>
<li><strong>Thirds</strong>: Rule of thirds grid lines</li>
<li><strong>Center</strong>: Center crosshair</li>
<li><strong>Safe Area</strong>: TV broadcast safe area guides</li>
<li><strong>Golden Ratio</strong>: Golden ratio composition guides</li>
</ul>
<h4 id="metadata_viewer-pixel-probe-i">Pixel Probe (I)</h4>
<ul>
<li>Hover to see exact pixel coordinates</li>
<li>Display RGB/RGBA values at cursor position</li>
<li>Hex color code display</li>
<li>Luminance value information</li>
<li>Copy color value to clipboard (C key)</li>
</ul>
<h4 id="metadata_viewer-loupe-magnification-l">Loupe Magnification (L)</h4>
<ul>
<li>Magnified view of area around cursor</li>
<li>Adjustable magnification level</li>
<li>Shows fine detail at pixel level</li>
<li>Helpful for quality assessment</li>
</ul>
<h4 id="metadata_viewer-scopes">Scopes</h4>
<ul>
<li><strong>Histogram</strong>: RGB histogram showing tonal distribution</li>
<li><strong>Waveform</strong>: Luminance waveform for exposure evaluation</li>
<li><strong>Vectorscope</strong>: Color information display</li>
<li>Real-time updates as you pan/zoom</li>
</ul>
<h3 id="metadata_viewer-export-capabilities">Export Capabilities</h3>
<h4 id="metadata_viewer-save-current-frame">Save Current Frame</h4>
<ul>
<li>Capture current video frame as PNG</li>
<li>Preserves full resolution and quality</li>
<li>Saves to default output directory</li>
<li>Includes generation metadata if available</li>
</ul>
<h4 id="metadata_viewer-copy-to-clipboard">Copy to Clipboard</h4>
<ul>
<li>Copy current view to system clipboard</li>
<li>Best-effort format selection</li>
<li>May not work on all platforms</li>
<li>Useful for quick sharing</li>
</ul>
<h4 id="metadata_viewer-download-original">Download Original</h4>
<ul>
<li>Download the original asset file</li>
<li>Maintains original format and quality</li>
<li>Preserves embedded metadata</li>
<li>Safe file transfer protocol</li>
</ul>
<h3 id="metadata_viewer-viewer-hotkeys">Viewer Hotkeys</h3>
<p>All viewer hotkeys are captured and don't affect ComfyUI or browser:</p>
<ul>
<li><strong>Esc</strong>: Close viewer</li>
<li><strong>0-5</strong>: Set rating (single view)</li>
<li><strong>Shift+Arrow</strong>: Step video frames (single video)</li>
<li><strong>F</strong>: Toggle false color analysis</li>
<li><strong>Z</strong>: Toggle zebra patterns</li>
<li><strong>G</strong>: Cycle through grid overlays</li>
<li><strong>I</strong>: Toggle pixel probe</li>
<li><strong>L</strong>: Toggle loupe magnification</li>
<li><strong>C</strong>: Copy last probed color hex value</li>
<li><strong>Alt+1</strong>: Toggle 1:1 zoom</li>
</ul>
<h2 id="metadata_viewer-metadata-panel">Metadata Panel</h2>
<h3 id="metadata_viewer-generation-info-section">Generation Info Section</h3>
<p>Detailed information about how the asset was created:</p>
<h4 id="metadata_viewer-prompt-information">Prompt Information</h4>
<ul>
<li><strong>Positive Prompt</strong>: Full text of generation prompt</li>
<li><strong>Negative Prompt</strong>: Negative conditioning text</li>
<li><strong>Prompt Weights</strong>: Attention weights and emphasis</li>
<li><strong>Prompt Scheduling</strong>: Temporal prompt changes if applicable</li>
</ul>
<h4 id="metadata_viewer-model-sampling">Model &amp; Sampling</h4>
<ul>
<li><strong>Base Model</strong>: Primary model used for generation</li>
<li><strong>VAE</strong>: Variational Autoencoder used for decoding</li>
<li><strong>Sampler</strong>: Algorithm used for denoising</li>
<li><strong>Scheduler</strong>: Noise schedule type</li>
<li><strong>Steps</strong>: Number of denoising iterations</li>
<li><strong>CFG Scale</strong>: Guidance strength parameter</li>
</ul>
<h4 id="metadata_viewer-image-parameters">Image Parameters</h4>
<ul>
<li><strong>Dimensions</strong>: Width and height of output</li>
<li><strong>Seed</strong>: Random seed value used</li>
<li><strong>ControlNet</strong>: Applied ControlNet configurations</li>
<li><strong>LoRA</strong>: Active LoRA models and strengths</li>
<li><strong>T2I Adapter</strong>: Applied adapter models</li>
</ul>
<h4 id="metadata_viewer-technical-details">Technical Details</h4>
<ul>
<li><strong>File Format</strong>: Container and compression details</li>
<li><strong>Color Space</strong>: Working color space during generation</li>
<li><strong>Precision</strong>: Bit depth and floating-point precision</li>
<li><strong>Hardware Used</strong>: GPU/CPU information if available</li>
</ul>
<h3 id="metadata_viewer-workflow-visualization">Workflow Visualization</h3>
<ul>
<li><strong>Node Graph</strong>: Visual representation of the workflow</li>
<li><strong>Connection Lines</strong>: Input/output relationships</li>
<li><strong>Node Types</strong>: Different colors for different node categories</li>
<li><strong>Parameter Values</strong>: Key parameters displayed on nodes</li>
<li><strong>Zoom/Pan</strong>: Interactive workflow exploration</li>
</ul>
<h3 id="metadata_viewer-metadata-refresh">Metadata Refresh</h3>
<ul>
<li><strong>Manual Refresh</strong>: Force reload of metadata</li>
<li><strong>Retry Failed Loads</strong>: Attempt to recover from errors</li>
<li><strong>Error Details</strong>: Information about extraction failures</li>
<li><strong>Fallback Handling</strong>: Graceful degradation when tools unavailable</li>
</ul>
<h2 id="metadata_viewer-context-menu-actions">Context Menu Actions</h2>
<h3 id="metadata_viewer-rating-tagging">Rating &amp; Tagging</h3>
<ul>
<li><strong>Rate Asset</strong>: Assign 0-5 star rating</li>
<li><strong>Edit Tags</strong>: Add/remove custom tags</li>
<li><strong>Quick Tags</strong>: Predefined tag suggestions</li>
</ul>
<h3 id="metadata_viewer-collection-management">Collection Management</h3>
<ul>
<li><strong>Add to Collection</strong>: Add to existing or new collection</li>
<li><strong>Remove from Collection</strong>: Remove from current collection</li>
<li><strong>Show in Collection</strong>: Navigate to containing collection</li>
</ul>
<h3 id="metadata_viewer-file-operations">File Operations</h3>
<ul>
<li><strong>Open in Folder</strong>: Reveal file in system file browser</li>
<li><strong>Copy Path</strong>: Copy file path to clipboard</li>
<li><strong>Rename File</strong>: Change filename with validation</li>
<li><strong>Delete File</strong>: Remove file with confirmation</li>
<li><strong>Move File</strong>: Relocate to different directory</li>
</ul>
<h3 id="metadata_viewer-export-options">Export Options</h3>
<ul>
<li><strong>Save Current Frame</strong>: Capture current view as image</li>
<li><strong>Export Metadata</strong>: Save metadata as JSON file</li>
<li><strong>Share Link</strong>: Generate shareable link if supported</li>
</ul>
<h2 id="metadata_viewer-performance-optimization">Performance Optimization</h2>
<h3 id="metadata_viewer-loading-strategies">Loading Strategies</h3>
<ul>
<li><strong>Progressive Loading</strong>: Thumbnails load first, full data follows</li>
<li><strong>Lazy Loading</strong>: Metadata loaded only when viewed</li>
<li><strong>Caching</strong>: Frequently accessed data kept in memory</li>
<li><strong>Background Processing</strong>: Non-critical tasks run asynchronously</li>
</ul>
<h3 id="metadata_viewer-resource-management">Resource Management</h3>
<ul>
<li><strong>Memory Limits</strong>: Prevents excessive memory consumption</li>
<li><strong>Threading</strong>: CPU-intensive tasks run on background threads</li>
<li><strong>Timeout Handling</strong>: Prevents hanging on problematic files</li>
<li><strong>Error Recovery</strong>: Graceful handling of corrupted files</li>
</ul>
<h2 id="metadata_viewer-troubleshooting">Troubleshooting</h2>
<h3 id="metadata_viewer-metadata-extraction-issues">Metadata Extraction Issues</h3>
<ul>
<li><strong>Missing Tools</strong>: Install ExifTool and FFprobe for full functionality</li>
<li><strong>Permission Errors</strong>: Check file permissions for metadata access</li>
<li><strong>Corrupted Files</strong>: Some files may have damaged metadata sections</li>
<li><strong>Unsupported Formats</strong>: Some proprietary formats may not extract well</li>
</ul>
<h3 id="metadata_viewer-viewer-problems">Viewer Problems</h3>
<ul>
<li><strong>Slow Performance</strong>: Large files may take time to load</li>
<li><strong>Memory Issues</strong>: Close other applications if experiencing problems</li>
<li><strong>Codec Problems</strong>: Install appropriate codecs for video files</li>
<li><strong>Browser Compatibility</strong>: Ensure using supported browsers</li>
</ul>
<h3 id="metadata_viewer-common-solutions">Common Solutions</h3>
<ul>
<li><strong>Refresh Index</strong>: Use Ctrl/Cmd+S to rescan and refresh metadata</li>
<li><strong>Clear Cache</strong>: Clear browser cache if interface seems stuck</li>
<li><strong>Check Logs</strong>: Look at ComfyUI console for detailed error messages</li>
<li><strong>Update Tools</strong>: Ensure ExifTool and FFprobe are current versions</li>
</ul>
<h2 id="metadata_viewer-best-practices">Best Practices</h2>
<h3 id="metadata_viewer-metadata-management">Metadata Management</h3>
<ul>
<li>Regularly refresh metadata when tools are updated</li>
<li>Use consistent tagging schemes for better organization</li>
<li>Maintain backup copies of important metadata</li>
<li>Verify metadata accuracy periodically</li>
</ul>
<h3 id="metadata_viewer-viewer-usage">Viewer Usage</h3>
<ul>
<li>Use comparison modes for parameter evaluation</li>
<li>Leverage analysis tools for quality assessment</li>
<li>Take advantage of export features for sharing</li>
<li>Use keyboard shortcuts for efficiency</li>
</ul>
<h3 id="metadata_viewer-performance-tips">Performance Tips</h3>
<ul>
<li>Close viewer tabs when not actively using them</li>
<li>Use lower resolution previews when possible</li>
<li>Organize assets into collections to reduce load times</li>
<li>Keep frequently accessed assets in smaller collections</li>
</ul>
<hr />
<p><em>Metadata &amp; Viewer Guide Version: 1.0</em> <em>Last Updated: January 2026</em></p></div>
<a class="toplink" href="#top">Back to top</a>
<div style="margin-top: 10px; font-size: 12px; color: var(--muted);">
Source: <code>docs/METADATA_VIEWER.md</code>
</div>
</div>
</section>
<section class="panel section" id="ratings_tags_collections">
<div class="panel-h"><h2>RATINGS_TAGS_COLLECTIONS.md</h2></div>
<div class="panel-b">
<div style="color: var(--muted); font-size: 12px; margin-bottom: 10px;">Organization tools (ratings, tags, collections)</div>
<div class="section"><h1 id="ratings_tags_collections-majoor-assets-manager-ratings-tags-collections-guide">Majoor Assets Manager - Ratings, Tags &amp; Collections Guide</h1>
<h2 id="ratings_tags_collections-overview">Overview</h2>
<p>The Majoor Assets Manager provides powerful organizational tools including ratings, tags, and collections to help you manage and organize your generated assets. This guide covers all features related to asset organization and categorization.</p>
<h2 id="ratings_tags_collections-rating-system">Rating System</h2>
<h3 id="ratings_tags_collections-understanding-ratings">Understanding Ratings</h3>
<p>The rating system allows you to assign star ratings from 0 to 5 stars to your assets:</p>
<ul>
<li><strong>0 Stars</strong>: Poor quality or unusable</li>
<li><strong>1 Star</strong>: Below average quality</li>
<li><strong>2 Stars</strong>: Average quality</li>
<li><strong>3 Stars</strong>: Good quality</li>
<li><strong>4 Stars</strong>: Very good quality</li>
<li><strong>5 Stars</strong>: Excellent quality</li>
</ul>
<h3 id="ratings_tags_collections-setting-ratings">Setting Ratings</h3>
<h4 id="ratings_tags_collections-via-context-menu">Via Context Menu</h4>
<ol>
<li>Right-click on an asset card</li>
<li>Select "Rate" from the context menu</li>
<li>Choose the desired star rating (0-5)</li>
<li>The rating is saved immediately</li>
</ol>
<h4 id="ratings_tags_collections-via-keyboard-shortcuts">Via Keyboard Shortcuts</h4>
<ol>
<li>Select an asset card</li>
<li>Press the corresponding number key (0-5)</li>
<li>The rating is applied instantly</li>
</ol>
<h4 id="ratings_tags_collections-via-rating-editor">Via Rating Editor</h4>
<ol>
<li>Click on the rating stars directly on the asset card</li>
<li>Select the desired number of stars</li>
<li>The rating is saved automatically</li>
</ol>
<h3 id="ratings_tags_collections-rating-features">Rating Features</h3>
<h4 id="ratings_tags_collections-bulk-rating">Bulk Rating</h4>
<ul>
<li>Select multiple assets using Ctrl/Cmd+click or Shift+click</li>
<li>Apply the same rating to all selected assets</li>
<li>Right-click and choose "Rate" to apply to all selections</li>
</ul>
<h4 id="ratings_tags_collections-rating-filters">Rating Filters</h4>
<ul>
<li>Filter assets by minimum rating threshold</li>
<li>Show only assets rated 3 stars or higher</li>
<li>Quickly find your best results using rating filters</li>
</ul>
<h4 id="ratings_tags_collections-rating-persistence">Rating Persistence</h4>
<ul>
<li>Ratings are stored in the SQLite index database</li>
<li>Ratings persist between ComfyUI sessions</li>
<li>Ratings can be synchronized to file metadata (when external tools available)</li>
</ul>
<h3 id="ratings_tags_collections-rating-synchronization">Rating Synchronization</h3>
<p>When ExifTool is available, ratings can be synced to file metadata:</p>
<ul>
<li>Ratings stored in file metadata for portability</li>
<li>Maintains ratings when files are moved/copied</li>
<li>Compatible with other applications that read ratings</li>
<li>Enabled/disabled via settings</li>
</ul>
<h2 id="ratings_tags_collections-tagging-system">Tagging System</h2>
<h3 id="ratings_tags_collections-understanding-tags">Understanding Tags</h3>
<p>Tags are customizable keywords that help categorize and organize your assets:</p>
<ul>
<li>Free-form text labels (e.g., "character", "landscape", "fantasy")</li>
<li>Multiple tags per asset</li>
<li>Hierarchical tagging support (e.g., "style:anime", "color:warm")</li>
<li>Searchable across all assets</li>
</ul>
<h3 id="ratings_tags_collections-adding-tags">Adding Tags</h3>
<h4 id="ratings_tags_collections-via-context-menu">Via Context Menu</h4>
<ol>
<li>Right-click on an asset card</li>
<li>Select "Edit Tags" from the context menu</li>
<li>Type tags separated by commas or spaces</li>
<li>Press Enter to save</li>
</ol>
<h4 id="ratings_tags_collections-via-tags-editor">Via Tags Editor</h4>
<ol>
<li>Click on an asset to select it</li>
<li>Open the details sidebar (press 'D')</li>
<li>Find the tags section</li>
<li>Add or remove tags as needed</li>
</ol>
<h4 id="ratings_tags_collections-bulk-tagging">Bulk Tagging</h4>
<ol>
<li>Select multiple assets</li>
<li>Right-click and choose "Edit Tags"</li>
<li>Add tags that apply to all selected assets</li>
<li>Tags are applied to all selected items</li>
</ol>
<h3 id="ratings_tags_collections-managing-tags">Managing Tags</h3>
<h4 id="ratings_tags_collections-tag-suggestions">Tag Suggestions</h4>
<ul>
<li>System suggests previously used tags</li>
<li>Intelligent autocomplete for faster tagging</li>
<li>Recently used tags appear at the top of suggestions</li>
</ul>
<h4 id="ratings_tags_collections-tag-validation">Tag Validation</h4>
<ul>
<li>Prevents duplicate tags on the same asset</li>
<li>Validates tag format and content</li>
<li>Sanitizes special characters when needed</li>
</ul>
<h4 id="ratings_tags_collections-tag-search">Tag Search</h4>
<ul>
<li>Search for assets by specific tags</li>
<li>Combine tag searches with other filters</li>
<li>Use partial tag names for broader results</li>
</ul>
<h3 id="ratings_tags_collections-tag-features">Tag Features</h3>
<h4 id="ratings_tags_collections-tag-hierarchy">Tag Hierarchy</h4>
<ul>
<li>Use colons to create hierarchical tags: "subject:person:face"</li>
<li>Organize tags in logical groups</li>
<li>Facilitate more granular categorization</li>
</ul>
<h4 id="ratings_tags_collections-tag-colors">Tag Colors</h4>
<ul>
<li>Visual indication of different tag types</li>
<li>Customizable tag appearance</li>
<li>Consistent color coding across the interface</li>
</ul>
<h4 id="ratings_tags_collections-tag-statistics">Tag Statistics</h4>
<ul>
<li>View tag frequency across your collection</li>
<li>Identify most commonly used tags</li>
<li>Analyze your tagging patterns</li>
</ul>
<h3 id="ratings_tags_collections-tag-synchronization">Tag Synchronization</h3>
<p>When ExifTool is available, tags can be synced to file metadata:</p>
<ul>
<li>Tags stored in file metadata for portability</li>
<li>Maintains tags when files are moved/copied</li>
<li>Compatible with other applications that read tags</li>
<li>Enabled/disabled via settings</li>
</ul>
<h2 id="ratings_tags_collections-collections-system">Collections System</h2>
<h3 id="ratings_tags_collections-understanding-collections">Understanding Collections</h3>
<p>Collections are user-created groups of assets that can span multiple directories:</p>
<ul>
<li>Named groups of related assets</li>
<li>Can include assets from different scopes (Outputs, Inputs, Custom)</li>
<li>Persistent storage in JSON format</li>
<li>Shareable between users</li>
</ul>
<h3 id="ratings_tags_collections-creating-collections">Creating Collections</h3>
<h4 id="ratings_tags_collections-from-selected-assets">From Selected Assets</h4>
<ol>
<li>Select one or more assets</li>
<li>Right-click and choose "Add to Collection"</li>
<li>Select an existing collection or create a new one</li>
<li>Name your new collection appropriately</li>
<li>Assets are added to the collection</li>
</ol>
<h4 id="ratings_tags_collections-from-search-results">From Search Results</h4>
<ol>
<li>Apply search and filters to find desired assets</li>
<li>Select all results (Ctrl+A or Cmd+A)</li>
<li>Right-click and choose "Add to Collection"</li>
<li>Create a new collection for the filtered results</li>
</ol>
<h4 id="ratings_tags_collections-empty-collections">Empty Collections</h4>
<ol>
<li>Right-click in the Collections tab</li>
<li>Choose "Create New Collection"</li>
<li>Name your collection</li>
<li>Add assets later as needed</li>
</ol>
<h3 id="ratings_tags_collections-managing-collections">Managing Collections</h3>
<h4 id="ratings_tags_collections-collection-operations">Collection Operations</h4>
<ul>
<li><strong>Rename</strong>: Change collection name via context menu</li>
<li><strong>Delete</strong>: Remove entire collection (doesn't delete assets)</li>
<li><strong>Clear</strong>: Remove all items from collection (doesn't delete assets)</li>
<li><strong>Export</strong>: Save collection as JSON file for sharing</li>
<li><strong>Import</strong>: Load collection from JSON file</li>
</ul>
<h4 id="ratings_tags_collections-item-management">Item Management</h4>
<ul>
<li><strong>Add Items</strong>: Add assets to existing collections</li>
<li><strong>Remove Items</strong>: Remove specific assets from collections</li>
<li><strong>Bulk Operations</strong>: Add/remove multiple items at once</li>
<li><strong>Duplicate Prevention</strong>: Automatic detection of duplicates</li>
</ul>
<h3 id="ratings_tags_collections-collection-features">Collection Features</h3>
<h4 id="ratings_tags_collections-smart-collections">Smart Collections</h4>
<ul>
<li>Dynamic collections based on criteria</li>
<li>Automatically updated as new assets match criteria</li>
<li>Based on tags, ratings, date ranges, or other attributes</li>
</ul>
<h4 id="ratings_tags_collections-nested-collections">Nested Collections</h4>
<ul>
<li>Collections within collections (hierarchical)</li>
<li>Organize large collections into subcategories</li>
<li>Flexible organization structures</li>
</ul>
<h4 id="ratings_tags_collections-collection-sharing">Collection Sharing</h4>
<ul>
<li>Export collections as JSON files</li>
<li>Import collections from other users</li>
<li>Share curated sets of assets</li>
<li>Collaborative collection building</li>
</ul>
<h3 id="ratings_tags_collections-collection-limits">Collection Limits</h3>
<ul>
<li>Maximum 50,000 items per collection (configurable)</li>
<li>Performance optimization for large collections</li>
<li>Warning when approaching limits</li>
<li>Suggestions for splitting large collections</li>
</ul>
<h3 id="ratings_tags_collections-collection-views">Collection Views</h3>
<h4 id="ratings_tags_collections-grid-view">Grid View</h4>
<ul>
<li>Thumbnail display of collection contents</li>
<li>Visual browsing of assets</li>
<li>Consistent with main interface design</li>
</ul>
<h4 id="ratings_tags_collections-list-view">List View</h4>
<ul>
<li>Detailed information display</li>
<li>Sortable columns (name, date, size, rating)</li>
<li>More information per asset</li>
</ul>
<h4 id="ratings_tags_collections-compact-view">Compact View</h4>
<ul>
<li>Dense layout for many items</li>
<li>Efficient space utilization</li>
<li>Quick scanning of large collections</li>
</ul>
<h2 id="ratings_tags_collections-integration-with-other-features">Integration with Other Features</h2>
<h3 id="ratings_tags_collections-search-integration">Search Integration</h3>
<ul>
<li>Search within specific collections</li>
<li>Cross-collection search capability</li>
<li>Filter search results by collection membership</li>
<li>Search for assets across all collections</li>
</ul>
<h3 id="ratings_tags_collections-filtering-integration">Filtering Integration</h3>
<ul>
<li>Filter by collection membership</li>
<li>Combine collection filters with other filters</li>
<li>Show only assets from specific collections</li>
<li>Exclude assets from certain collections</li>
</ul>
<h3 id="ratings_tags_collections-viewer-integration">Viewer Integration</h3>
<ul>
<li>View collection context in viewer</li>
<li>Navigate between collection items</li>
<li>Show collection information in metadata panel</li>
<li>Maintain collection context during comparisons</li>
</ul>
<h3 id="ratings_tags_collections-rating-and-tag-integration">Rating and Tag Integration</h3>
<ul>
<li>Apply ratings/tags to entire collections</li>
<li>Filter collections by ratings/tags</li>
<li>Bulk operations on collection contents</li>
<li>Maintain rating/tag statistics per collection</li>
</ul>
<h2 id="ratings_tags_collections-best-practices">Best Practices</h2>
<h3 id="ratings_tags_collections-rating-best-practices">Rating Best Practices</h3>
<ul>
<li>Establish consistent rating criteria</li>
<li>Use ratings consistently across similar assets</li>
<li>Regularly review and adjust ratings as needed</li>
<li>Use rating filters to quickly find quality assets</li>
</ul>
<h3 id="ratings_tags_collections-tagging-best-practices">Tagging Best Practices</h3>
<ul>
<li>Develop a consistent tagging vocabulary</li>
<li>Use specific but not overly granular tags</li>
<li>Maintain tag hierarchy for organization</li>
<li>Regularly review and consolidate similar tags</li>
<li>Use tags that will be meaningful later</li>
</ul>
<h3 id="ratings_tags_collections-collection-best-practices">Collection Best Practices</h3>
<ul>
<li>Create collections based on clear criteria</li>
<li>Use descriptive names for collections</li>
<li>Regularly clean up unused collections</li>
<li>Split large collections into more manageable groups</li>
<li>Share valuable collections with others</li>
</ul>
<h2 id="ratings_tags_collections-performance-considerations">Performance Considerations</h2>
<h3 id="ratings_tags_collections-large-collections">Large Collections</h3>
<ul>
<li>Collections with many items may take longer to load</li>
<li>Interface remains responsive during loading</li>
<li>Pagination helps manage large collections</li>
<li>Consider splitting very large collections</li>
</ul>
<h3 id="ratings_tags_collections-tag-performance">Tag Performance</h3>
<ul>
<li>Many tags per asset don't significantly impact performance</li>
<li>Tag search remains fast regardless of quantity</li>
<li>Regular cleanup of unused tags improves performance</li>
</ul>
<h3 id="ratings_tags_collections-rating-performance">Rating Performance</h3>
<ul>
<li>Rating operations are nearly instantaneous</li>
<li>Rating filters apply quickly to large datasets</li>
<li>Bulk rating operations are optimized</li>
</ul>
<h2 id="ratings_tags_collections-troubleshooting">Troubleshooting</h2>
<h3 id="ratings_tags_collections-rating-issues">Rating Issues</h3>
<ul>
<li><strong>Ratings not saving</strong>: Check database permissions</li>
<li><strong>Ratings not displaying</strong>: Refresh the view or rescan</li>
<li><strong>Sync issues</strong>: Verify ExifTool installation for file sync</li>
</ul>
<h3 id="ratings_tags_collections-tagging-issues">Tagging Issues</h3>
<ul>
<li><strong>Tags not appearing</strong>: Check for typos or special characters</li>
<li><strong>Tag search not working</strong>: Ensure proper tag format</li>
<li><strong>Sync issues</strong>: Verify ExifTool installation for file sync</li>
</ul>
<h3 id="ratings_tags_collections-collection-issues">Collection Issues</h3>
<ul>
<li><strong>Collection not saving</strong>: Check write permissions to index directory</li>
<li><strong>Items not adding</strong>: Verify collection limits haven't been reached</li>
<li><strong>Collection not loading</strong>: Check JSON file integrity</li>
</ul>
<h3 id="ratings_tags_collections-common-solutions">Common Solutions</h3>
<ul>
<li><strong>Refresh Index</strong>: Use Ctrl/Cmd+S to rescan and refresh</li>
<li><strong>Clear Cache</strong>: Clear browser cache if interface seems stuck</li>
<li><strong>Check Logs</strong>: Look at ComfyUI console for detailed error messages</li>
<li><strong>Database Maintenance</strong>: Run optimization tools periodically</li>
</ul>
<h2 id="ratings_tags_collections-advanced-features">Advanced Features</h2>
<h3 id="ratings_tags_collections-tag-expressions">Tag Expressions</h3>
<ul>
<li>Complex tag queries using boolean logic</li>
<li>Combine tags with AND/OR operations</li>
<li>Parentheses for complex expressions</li>
<li>Negation operators for exclusions</li>
</ul>
<h3 id="ratings_tags_collections-rating-statistics">Rating Statistics</h3>
<ul>
<li>View rating distributions across collections</li>
<li>Track rating trends over time</li>
<li>Identify most/least rated assets</li>
<li>Generate reports on rating patterns</li>
</ul>
<h3 id="ratings_tags_collections-collection-analytics">Collection Analytics</h3>
<ul>
<li>View collection usage statistics</li>
<li>Track most accessed collections</li>
<li>Identify underutilized collections</li>
<li>Analyze collection overlap and relationships</li>
</ul>
<h3 id="ratings_tags_collections-automation-possibilities">Automation Possibilities</h3>
<ul>
<li>Script-based tag assignment</li>
<li>Automated rating based on criteria</li>
<li>Scheduled collection maintenance</li>
<li>Integration with external tools</li>
</ul>
<h2 id="ratings_tags_collections-security-privacy">Security &amp; Privacy</h2>
<h3 id="ratings_tags_collections-local-storage">Local Storage</h3>
<ul>
<li>Ratings and tags stored locally</li>
<li>No external data transmission</li>
<li>Full control over your organizational data</li>
<li>Backup your index database regularly</li>
</ul>
<h3 id="ratings_tags_collections-file-metadata">File Metadata</h3>
<ul>
<li>Optional synchronization to file metadata</li>
<li>Controlled via settings</li>
<li>Respects file permissions</li>
<li>Preserves existing file metadata</li>
</ul>
<hr />
<p><em>Ratings, Tags &amp; Collections Guide Version: 1.0</em> <em>Last Updated: January 2026</em></p></div>
<a class="toplink" href="#top">Back to top</a>
<div style="margin-top: 10px; font-size: 12px; color: var(--muted);">
Source: <code>docs/RATINGS_TAGS_COLLECTIONS.md</code>
</div>
</div>
</section>
<section class="panel section" id="drag_drop">
<div class="panel-h"><h2>DRAG_DROP.md</h2></div>
<div class="panel-b">
<div style="color: var(--muted); font-size: 12px; margin-bottom: 10px;">Drag and drop functionality</div>
<div class="section"><h1 id="drag_drop-majoor-assets-manager-drag-drop-guide">Majoor Assets Manager - Drag &amp; Drop Guide</h1>
<h2 id="drag_drop-overview">Overview</h2>
<p>The Majoor Assets Manager provides seamless drag and drop functionality that integrates with both ComfyUI and your operating system. This guide covers all aspects of drag and drop operations within the extension.</p>
<h2 id="drag_drop-drag-to-comfyui-canvas">Drag to ComfyUI Canvas</h2>
<h3 id="drag_drop-basic-drag-operation">Basic Drag Operation</h3>
<ol>
<li>Select one or more assets in the Assets Manager</li>
<li>Click and hold on an asset card</li>
<li>Drag the asset onto the ComfyUI canvas</li>
<li>Release the mouse button to drop the asset</li>
</ol>
<h3 id="drag_drop-single-asset-drag">Single Asset Drag</h3>
<ul>
<li>Drag any single asset to the canvas</li>
<li>The asset path is automatically injected into compatible nodes</li>
<li>Compatible nodes include LoadImage, LoadLatent, and similar input nodes</li>
<li>The asset is staged for immediate use in your workflow</li>
</ul>
<h3 id="drag_drop-multiple-asset-drag">Multiple Asset Drag</h3>
<ul>
<li>Select multiple assets using Ctrl/Cmd+click or Shift+click</li>
<li>Drag any selected asset to the canvas</li>
<li>Multiple file paths are handled appropriately</li>
<li>Some nodes support multiple inputs, others will use the first path</li>
</ul>
<h3 id="drag_drop-node-compatibility">Node Compatibility</h3>
<p>The system intelligently identifies compatible nodes:</p>
<h4 id="drag_drop-image-input-nodes">Image Input Nodes</h4>
<ul>
<li><strong>LoadImage</strong>: Accepts image file paths</li>
<li><strong>LoadImageMask</strong>: For mask images</li>
<li><strong>PreviewImage</strong>: For direct preview</li>
<li><strong>LoadLatent</strong>: For latent files</li>
</ul>
<h4 id="drag_drop-video-input-nodes">Video Input Nodes</h4>
<ul>
<li><strong>LoadVideo</strong>: For video file paths</li>
<li><strong>VideoLoad</strong>: For various video formats</li>
</ul>
<h4 id="drag_drop-workflow-input-nodes">Workflow Input Nodes</h4>
<ul>
<li><strong>LoadWorkflow</strong>: For workflow files</li>
<li><strong>ImportWorkflow</strong>: For external workflow files</li>
</ul>
<h3 id="drag_drop-staging-mechanism">Staging Mechanism</h3>
<ul>
<li>Assets are staged temporarily when dragged to canvas</li>
<li>Paths are injected into appropriate input fields</li>
<li>No permanent changes to workflow until execution</li>
<li>Allows for experimentation without committing to changes</li>
</ul>
<h2 id="drag_drop-drag-to-operating-system">Drag to Operating System</h2>
<h3 id="drag_drop-single-file-drag">Single File Drag</h3>
<ol>
<li>Select an asset in the Assets Manager</li>
<li>Click and drag the asset outside the browser window</li>
<li>Drop onto your file explorer, desktop, or another application</li>
<li>The original file is transferred to the destination</li>
</ol>
<h3 id="drag_drop-multiple-file-drag">Multiple File Drag</h3>
<ol>
<li>Select multiple assets using Ctrl/Cmd+click or Shift+click</li>
<li>Drag any selected asset outside the browser window</li>
<li>A ZIP file is automatically created containing all selected assets</li>
<li>Drop the ZIP file onto your destination</li>
</ol>
<h3 id="drag_drop-zip-creation-process">ZIP Creation Process</h3>
<ul>
<li>ZIP files are created on-demand when dragging multiple items</li>
<li>Files are streamed directly from disk (no temporary copies)</li>
<li>ZIPs are flat (no directory structure maintained)</li>
<li>ZIP files are automatically cleaned up after transfer</li>
</ul>
<h3 id="drag_drop-protocol-support">Protocol Support</h3>
<p>The system supports multiple drag protocols:</p>
<h4 id="drag_drop-downloadurl-protocol">DownloadURL Protocol</h4>
<ul>
<li>Used for single file transfers</li>
<li>Direct file download to destination</li>
<li>Maintains original filename and extension</li>
</ul>
<h4 id="drag_drop-texturi-list-protocol">text/uri-list Protocol</h4>
<ul>
<li>Used for multiple file transfers</li>
<li>Properly formatted URI list for operating system</li>
<li>Compatible with most file managers and applications</li>
</ul>
<h2 id="drag_drop-drag-operations">Drag Operations</h2>
<h3 id="drag_drop-starting-a-drag">Starting a Drag</h3>
<ul>
<li>Click and hold on any asset card for a moment</li>
<li>A visual indicator appears showing the drag is active</li>
<li>The cursor changes to indicate drag operation</li>
<li>Selection remains active during drag</li>
</ul>
<h3 id="drag_drop-drag-indicators">Drag Indicators</h3>
<ul>
<li><strong>Visual Outline</strong>: Selected assets show a highlighted border</li>
<li><strong>Cursor Change</strong>: Cursor changes to indicate drag capability</li>
<li><strong>Preview</strong>: Small preview of dragged asset(s) follows cursor</li>
<li><strong>Count Display</strong>: For multiple selections, shows number of items</li>
</ul>
<h3 id="drag_drop-drag-targets">Drag Targets</h3>
<p>The system recognizes different drag targets:</p>
<h4 id="drag_drop-valid-targets">Valid Targets</h4>
<ul>
<li>ComfyUI canvas area</li>
<li>Compatible input nodes</li>
<li>Browser address bar (downloads)</li>
<li>File explorer windows</li>
<li>Desktop</li>
<li>Email attachments</li>
<li>Other applications accepting files</li>
</ul>
<h4 id="drag_drop-invalid-targets">Invalid Targets</h4>
<ul>
<li>Text input fields (unless specifically designed for file drops)</li>
<li>Non-compatible areas of the interface</li>
<li>Applications that don't accept the file type</li>
</ul>
<h2 id="drag_drop-file-transfer-mechanisms">File Transfer Mechanisms</h2>
<h3 id="drag_drop-direct-file-transfer">Direct File Transfer</h3>
<ul>
<li>Single files are transferred directly</li>
<li>Maintains original file properties</li>
<li>Preserves embedded metadata</li>
<li>No quality loss during transfer</li>
</ul>
<h3 id="drag_drop-batch-zip-transfer">Batch ZIP Transfer</h3>
<ul>
<li>Multiple files are packaged into a ZIP archive</li>
<li>ZIP created dynamically during drag operation</li>
<li>No temporary files written to disk</li>
<li>Automatic cleanup after transfer completion</li>
</ul>
<h3 id="drag_drop-streaming-transfer">Streaming Transfer</h3>
<ul>
<li>Files are streamed directly from disk</li>
<li>No intermediate copies created</li>
<li>Memory efficient for large files</li>
<li>Maintains file integrity during transfer</li>
</ul>
<h2 id="drag_drop-filename-collision-indicator">Filename Collision Indicator</h2>
<h3 id="drag_drop-understanding-the-indicator">Understanding the Indicator</h3>
<ul>
<li>When multiple assets share the same filename, the extension badge shows <code>EXT+</code></li>
<li>For example: <code>image.png</code> becomes <code>PNG+</code> when duplicates exist</li>
<li>Helps identify potential conflicts during drag operations</li>
</ul>
<h3 id="drag_drop-handling-collisions">Handling Collisions</h3>
<ul>
<li>Collisions don't prevent drag operations</li>
<li>ZIP files handle duplicate names automatically</li>
<li>Individual file drops may require manual renaming</li>
<li>Consider renaming files to avoid confusion</li>
</ul>
<h2 id="drag_drop-drag-performance">Drag Performance</h2>
<h3 id="drag_drop-optimizations">Optimizations</h3>
<ul>
<li>Lightweight preview during drag</li>
<li>Asynchronous file operations</li>
<li>Memory-efficient streaming</li>
<li>Responsive interface during drag operations</li>
</ul>
<h3 id="drag_drop-performance-considerations">Performance Considerations</h3>
<ul>
<li>Large files may take time to initiate transfer</li>
<li>Multiple large files in ZIP may take longer to create</li>
<li>Network drives may affect performance</li>
<li>System resources impact drag responsiveness</li>
</ul>
<h2 id="drag_drop-advanced-drag-features">Advanced Drag Features</h2>
<h3 id="drag_drop-drag-preview">Drag Preview</h3>
<ul>
<li>Live preview of dragged assets</li>
<li>Shows thumbnail of the primary dragged item</li>
<li>Displays count for multiple selections</li>
<li>Updates in real-time during drag</li>
</ul>
<h3 id="drag_drop-drag-validation">Drag Validation</h3>
<ul>
<li>Validates target compatibility before allowing drop</li>
<li>Provides visual feedback for valid/invalid targets</li>
<li>Prevents invalid operations</li>
<li>Shows appropriate cursors for different states</li>
</ul>
<h3 id="drag_drop-drag-cancellation">Drag Cancellation</h3>
<ul>
<li>Cancel drag by releasing over invalid target</li>
<li>Escape key cancels active drag operation</li>
<li>Clicking elsewhere cancels drag</li>
<li>Drag automatically cancels if window loses focus</li>
</ul>
<h2 id="drag_drop-integration-with-other-features">Integration with Other Features</h2>
<h3 id="drag_drop-selection-integration">Selection Integration</h3>
<ul>
<li>Drag operations work with current selection</li>
<li>Multiple selections enable batch operations</li>
<li>Selection filters apply to drag operations</li>
<li>Search results can be dragged directly</li>
</ul>
<h3 id="drag_drop-collection-integration">Collection Integration</h3>
<ul>
<li>Assets from collections can be dragged normally</li>
<li>Entire collections can be exported via drag</li>
<li>Collection organization preserved in transfers</li>
<li>Cross-collection drags work seamlessly</li>
</ul>
<h3 id="drag_drop-ratingtag-integration">Rating/Tag Integration</h3>
<ul>
<li>Rated and tagged assets maintain metadata during drag</li>
<li>Tags and ratings preserved in file transfers (when supported)</li>
<li>Filtered views can be dragged directly</li>
<li>Quality indicators visible during drag</li>
</ul>
<h2 id="drag_drop-troubleshooting">Troubleshooting</h2>
<h3 id="drag_drop-common-drag-issues">Common Drag Issues</h3>
<h4 id="drag_drop-drag-not-initiating">Drag Not Initiating</h4>
<ul>
<li>Ensure you're clicking and holding long enough</li>
<li>Check that the asset is properly selected</li>
<li>Verify no JavaScript errors in console</li>
<li>Try refreshing the Assets Manager</li>
</ul>
<h4 id="drag_drop-drag-target-not-recognized">Drag Target Not Recognized</h4>
<ul>
<li>Ensure target application accepts file drops</li>
<li>Check if target area is actually droppable</li>
<li>Verify file type compatibility with target</li>
<li>Try dragging to a different application</li>
</ul>
<h4 id="drag_drop-zip-creation-failure">ZIP Creation Failure</h4>
<ul>
<li>Check available disk space</li>
<li>Verify write permissions to temporary directory</li>
<li>Ensure no antivirus interference</li>
<li>Try dragging fewer files at once</li>
</ul>
<h4 id="drag_drop-file-transfer-problems">File Transfer Problems</h4>
<ul>
<li>Large files may timeout during transfer</li>
<li>Network drives may cause delays</li>
<li>Antivirus software may interfere</li>
<li>Check file permissions at destination</li>
</ul>
<h3 id="drag_drop-browser-specific-issues">Browser-Specific Issues</h3>
<h4 id="drag_drop-chromechromium">Chrome/Chromium</h4>
<ul>
<li>May require specific security settings for file downloads</li>
<li>Extensions might interfere with drag operations</li>
<li>Incognito mode may behave differently</li>
</ul>
<h4 id="drag_drop-firefox">Firefox</h4>
<ul>
<li>Security settings may restrict file operations</li>
<li>Enhanced Tracking Protection might interfere</li>
<li>Check privacy settings for file handling</li>
</ul>
<h4 id="drag_drop-safari">Safari</h4>
<ul>
<li>May require additional permissions for file access</li>
<li>Security restrictions could limit functionality</li>
<li>Check website permissions for file handling</li>
</ul>
<h3 id="drag_drop-operating-system-issues">Operating System Issues</h3>
<h4 id="drag_drop-windows">Windows</h4>
<ul>
<li>UAC (User Account Control) may interfere</li>
<li>Antivirus software may block operations</li>
<li>File permissions may restrict transfers</li>
</ul>
<h4 id="drag_drop-macos">macOS</h4>
<ul>
<li>Gatekeeper may restrict file operations</li>
<li>Privacy settings may limit access</li>
<li>Sandboxing could affect functionality</li>
</ul>
<h4 id="drag_drop-linux">Linux</h4>
<ul>
<li>File permissions are strictly enforced</li>
<li>Desktop environment may affect drag behavior</li>
<li>Security modules might restrict operations</li>
</ul>
<h2 id="drag_drop-security-considerations">Security Considerations</h2>
<h3 id="drag_drop-file-access-security">File Access Security</h3>
<ul>
<li>Drag operations respect file system permissions</li>
<li>No files can be accessed that the user can't read</li>
<li>Temporary files are created with restricted permissions</li>
<li>ZIP files are cleaned up automatically</li>
</ul>
<h3 id="drag_drop-cross-origin-security">Cross-Origin Security</h3>
<ul>
<li>Drag operations confined to same origin</li>
<li>No cross-site data leakage possible</li>
<li>File system access limited to allowed directories</li>
<li>Path validation prevents directory traversal</li>
</ul>
<h3 id="drag_drop-malicious-file-protection">Malicious File Protection</h3>
<ul>
<li>No automatic execution of dragged files</li>
<li>Files transferred in their original form</li>
<li>No modification during drag operations</li>
<li>Integrity preserved throughout transfer</li>
</ul>
<h2 id="drag_drop-performance-optimization">Performance Optimization</h2>
<h3 id="drag_drop-large-file-handling">Large File Handling</h3>
<ul>
<li>Stream large files instead of loading entirely</li>
<li>Progress indicators for long operations</li>
<li>Asynchronous operations to maintain interface responsiveness</li>
<li>Memory management for multiple large files</li>
</ul>
<h3 id="drag_drop-multiple-file-optimization">Multiple File Optimization</h3>
<ul>
<li>Efficient ZIP creation algorithms</li>
<li>Parallel processing where possible</li>
<li>Memory buffering for optimal performance</li>
<li>Cleanup operations scheduled appropriately</li>
</ul>
<h3 id="drag_drop-interface-responsiveness">Interface Responsiveness</h3>
<ul>
<li>Drag operations don't block UI thread</li>
<li>Smooth animations during drag</li>
<li>Immediate feedback for user actions</li>
<li>Graceful degradation for slower systems</li>
</ul>
<h2 id="drag_drop-best-practices">Best Practices</h2>
<h3 id="drag_drop-efficient-drag-operations">Efficient Drag Operations</h3>
<ul>
<li>Use multiple selection for batch operations</li>
<li>Organize assets in collections for easier access</li>
<li>Use search and filters to find assets quickly</li>
<li>Verify target compatibility before initiating drag</li>
</ul>
<h3 id="drag_drop-file-organization">File Organization</h3>
<ul>
<li>Maintain consistent naming conventions</li>
<li>Use collections to group related assets</li>
<li>Apply tags for easy retrieval</li>
<li>Regular cleanup of unused assets</li>
</ul>
<h3 id="drag_drop-workflow-integration">Workflow Integration</h3>
<ul>
<li>Use drag operations to accelerate workflow creation</li>
<li>Stage frequently used assets in collections</li>
<li>Leverage drag to canvas for rapid prototyping</li>
<li>Combine with other Assets Manager features</li>
</ul>
<h3 id="drag_drop-performance-tips">Performance Tips</h3>
<ul>
<li>Close unnecessary browser tabs during large operations</li>
<li>Ensure sufficient system resources</li>
<li>Use wired connections for network drives</li>
<li>Regular maintenance of index database</li>
</ul>
<h2 id="drag_drop-advanced-usage">Advanced Usage</h2>
<h3 id="drag_drop-scripted-operations">Scripted Operations</h3>
<ul>
<li>Combine drag operations with automation scripts</li>
<li>Use collections for automated workflows</li>
<li>Integrate with external tools via file operations</li>
<li>Batch processing using drag interfaces</li>
</ul>
<h3 id="drag_drop-power-user-techniques">Power User Techniques</h3>
<ul>
<li>Master keyboard shortcuts with drag operations</li>
<li>Use multiple monitors for efficient transfers</li>
<li>Leverage search and filters for precise selection</li>
<li>Combine collections with drag for complex operations</li>
</ul>
<hr />
<p><em>Drag &amp; Drop Guide Version: 1.0</em> <em>Last Updated: January 2026</em></p></div>
<a class="toplink" href="#top">Back to top</a>
<div style="margin-top: 10px; font-size: 12px; color: var(--muted);">
Source: <code>docs/DRAG_DROP.md</code>
</div>
</div>
</section>
<section class="panel section" id="hotkeys_shortcuts">
<div class="panel-h"><h2>HOTKEYS_SHORTCUTS.md</h2></div>
<div class="panel-b">
<div style="color: var(--muted); font-size: 12px; margin-bottom: 10px;">Keyboard shortcuts and hotkeys</div>
<div class="section"><h1 id="hotkeys_shortcuts-majoor-assets-manager-hotkeys-keyboard-shortcuts-guide">Majoor Assets Manager - Hotkeys &amp; Keyboard Shortcuts Guide</h1>
<h2 id="hotkeys_shortcuts-overview">Overview</h2>
<p>The Majoor Assets Manager includes numerous keyboard shortcuts to enhance productivity and streamline your workflow. This guide covers all available hotkeys and keyboard shortcuts organized by functionality.</p>
<h2 id="hotkeys_shortcuts-global-hotkeys">Global Hotkeys</h2>
<h3 id="hotkeys_shortcuts-asset-grid-navigation">Asset Grid Navigation</h3>
<p>These hotkeys work when interacting with the asset grid:</p>
<h4 id="hotkeys_shortcuts-selection-controls">Selection Controls</h4>
<ul>
<li><strong>Ctrl+A</strong> / <strong>Cmd+A</strong>: Select all visible assets</li>
<li><strong>Ctrl+Click</strong> / <strong>Cmd+Click</strong>: Add/remove individual asset from selection</li>
<li><strong>Shift+Click</strong>: Select range from last selected to clicked asset</li>
<li><strong>Escape</strong>: Clear current selection</li>
</ul>
<h4 id="hotkeys_shortcuts-rating-controls">Rating Controls</h4>
<ul>
<li><strong>0</strong>: Set rating to 0 stars</li>
<li><strong>1</strong>: Set rating to 1 star</li>
<li><strong>2</strong>: Set rating to 2 stars</li>
<li><strong>3</strong>: Set rating to 3 stars</li>
<li><strong>4</strong>: Set rating to 4 stars</li>
<li><strong>5</strong>: Set rating to 5 stars</li>
</ul>
<h4 id="hotkeys_shortcuts-navigation">Navigation</h4>
<ul>
<li><strong>Up Arrow</strong>: Move selection up one row</li>
<li><strong>Down Arrow</strong>: Move selection down one row</li>
<li><strong>Left Arrow</strong>: Move selection left one column</li>
<li><strong>Right Arrow</strong>: Move selection right one column</li>
<li><strong>Page Up</strong>: Move selection up one page</li>
<li><strong>Page Down</strong>: Move selection down one page</li>
<li><strong>Home</strong>: Move to first asset in grid</li>
<li><strong>End</strong>: Move to last asset in grid</li>
</ul>
<h3 id="hotkeys_shortcuts-interface-controls">Interface Controls</h3>
<ul>
<li><strong>Ctrl+S</strong> / <strong>Cmd+S</strong>: Trigger index scan for current scope</li>
<li><strong>D</strong>: Toggle details sidebar for current selection</li>
<li><strong>Enter</strong>: Open viewer for selected asset</li>
<li><strong>Delete</strong> / <strong>Backspace</strong>: Delete selected asset(s) (with confirmation)</li>
<li><strong>F2</strong>: Rename selected asset</li>
<li><strong>Ctrl+F</strong> / <strong>Cmd+F</strong>: Focus search input field</li>
</ul>
<h2 id="hotkeys_shortcuts-viewer-hotkeys">Viewer Hotkeys</h2>
<h3 id="hotkeys_shortcuts-viewer-controls">Viewer Controls</h3>
<p>These hotkeys only work when the viewer is open and focused:</p>
<h4 id="hotkeys_shortcuts-viewer-management">Viewer Management</h4>
<ul>
<li><strong>Escape</strong>: Close viewer and return to grid</li>
<li><strong>Tab</strong>: Cycle focus between viewer controls</li>
<li><strong>Space</strong>: Toggle play/pause (for video content)</li>
</ul>
<h4 id="hotkeys_shortcuts-rating-controls-in-viewer">Rating Controls (in Viewer)</h4>
<ul>
<li><strong>0</strong>: Set rating to 0 stars</li>
<li><strong>1</strong>: Set rating to 1 star</li>
<li><strong>2</strong>: Set rating to 2 stars</li>
<li><strong>3</strong>: Set rating to 3 stars</li>
<li><strong>4</strong>: Set rating to 4 stars</li>
<li><strong>5</strong>: Set rating to 5 stars</li>
</ul>
<h4 id="hotkeys_shortcuts-video-controls">Video Controls</h4>
<ul>
<li><strong>Shift+Left Arrow</strong>: Step backward one frame</li>
<li><strong>Shift+Right Arrow</strong>: Step forward one frame</li>
<li><strong>Shift+Up Arrow</strong>: Increase playback speed</li>
<li><strong>Shift+Down Arrow</strong>: Decrease playback speed</li>
<li><strong>I</strong>: Set In point for segment playback</li>
<li><strong>O</strong>: Set Out point for segment playback</li>
<li><strong>P</strong>: Toggle loop/once playback mode</li>
</ul>
<h4 id="hotkeys_shortcuts-image-enhancement">Image Enhancement</h4>
<ul>
<li><strong>F</strong>: Toggle false color analysis mode</li>
<li><strong>Z</strong>: Toggle zebra pattern overlay</li>
<li><strong>G</strong>: Cycle through grid overlays (off → thirds → center → safe → golden)</li>
<li><strong>I</strong>: Toggle pixel probe overlay</li>
<li><strong>L</strong>: Toggle loupe magnification</li>
<li><strong>C</strong>: Copy last probed color hex value to clipboard</li>
<li><strong>H</strong>: Toggle histogram display</li>
<li><strong>W</strong>: Toggle waveform display</li>
</ul>
<h4 id="hotkeys_shortcuts-zoom-controls">Zoom Controls</h4>
<ul>
<li><strong>+</strong> / <strong>=</strong>: Zoom in</li>
<li><strong>-</strong>: Zoom out</li>
<li><strong>0</strong>: Fit image to screen</li>
<li><strong>1</strong> / <strong>Alt+1</strong>: Toggle 1:1 pixel view</li>
<li><strong>R</strong>: Reset zoom and pan position</li>
<li><strong>Mouse Wheel</strong>: Zoom in/out while hovering over image</li>
</ul>
<h4 id="hotkeys_shortcuts-pan-controls">Pan Controls</h4>
<ul>
<li><strong>Arrow Keys</strong>: Pan image in corresponding direction (small increments)</li>
<li><strong>Shift+Arrow Keys</strong>: Pan image in corresponding direction (larger increments)</li>
<li><strong>Click and Drag</strong>: Pan image while holding mouse button</li>
<li><strong>Middle Click and Drag</strong>: Pan image with middle mouse button</li>
</ul>
<h3 id="hotkeys_shortcuts-comparison-mode-controls">Comparison Mode Controls</h3>
<ul>
<li><strong>Left Arrow</strong>: Switch to previous asset in comparison</li>
<li><strong>Right Arrow</strong>: Switch to next asset in comparison</li>
<li><strong>T</strong>: Toggle between comparison modes</li>
<li><strong>M</strong>: Toggle wipe/difference mode</li>
</ul>
<h2 id="hotkeys_shortcuts-search-and-filter-hotkeys">Search and Filter Hotkeys</h2>
<h3 id="hotkeys_shortcuts-search-controls">Search Controls</h3>
<ul>
<li><strong>Ctrl+K</strong> / <strong>Cmd+K</strong>: Focus search input field</li>
<li><strong>Ctrl+H</strong> / <strong>Cmd+H</strong>: Clear search field</li>
<li><strong>Enter</strong>: Submit search (when in search field)</li>
<li><strong>Up Arrow</strong>: Navigate search history (when in search field)</li>
<li><strong>Down Arrow</strong>: Navigate search history (when in search field)</li>
</ul>
<h3 id="hotkeys_shortcuts-filter-controls">Filter Controls</h3>
<ul>
<li><strong>Ctrl+R</strong> / <strong>Cmd+R</strong>: Reset all filters</li>
<li><strong>Ctrl+D</strong> / <strong>Cmd+D</strong>: Toggle date filter panel</li>
<li><strong>Ctrl+T</strong> / <strong>Cmd+T</strong>: Toggle tag filter panel</li>
<li><strong>Ctrl+N</strong> / <strong>Cmd+N</strong>: Toggle kind (file type) filter panel</li>
</ul>
<h2 id="hotkeys_shortcuts-context-menu-alternatives">Context Menu Alternatives</h2>
<h3 id="hotkeys_shortcuts-keyboard-accessible-actions">Keyboard-Accessible Actions</h3>
<p>When an asset is selected, these hotkeys provide quick access to context menu functions:</p>
<h4 id="hotkeys_shortcuts-collection-operations">Collection Operations</h4>
<ul>
<li><strong>Ctrl+E</strong> / <strong>Cmd+E</strong>: Add to collection</li>
<li><strong>Ctrl+Shift+E</strong>: Remove from collection</li>
<li><strong>Ctrl+U</strong> / <strong>Cmd+U</strong>: Open in folder</li>
<li><strong>Ctrl+P</strong> / <strong>Cmd+P</strong>: Copy file path to clipboard</li>
</ul>
<h4 id="hotkeys_shortcuts-asset-management">Asset Management</h4>
<ul>
<li><strong>Ctrl+R</strong> / <strong>Cmd+R</strong>: Rename selected asset</li>
<li><strong>Ctrl+D</strong> / <strong>Cmd+D</strong>: Delete selected asset(s)</li>
<li><strong>Ctrl+T</strong> / <strong>Cmd+T</strong>: Edit tags for selected asset(s)</li>
<li><strong>Ctrl+I</strong> / <strong>Cmd+I</strong>: Show asset information</li>
</ul>
<h2 id="hotkeys_shortcuts-browser-specific-behavior">Browser-Specific Behavior</h2>
<h3 id="hotkeys_shortcuts-hotkey-restrictions">Hotkey Restrictions</h3>
<ul>
<li>Hotkeys are disabled when typing in text input fields</li>
<li>Hotkeys don't activate when focus is on form elements</li>
<li>Some browser extensions may intercept hotkeys</li>
<li>Fullscreen mode may affect hotkey behavior</li>
</ul>
<h3 id="hotkeys_shortcuts-platform-differences">Platform Differences</h3>
<p>Hotkeys are optimized for each platform:</p>
<h4 id="hotkeys_shortcuts-windowslinux">Windows/Linux</h4>
<ul>
<li>Uses Ctrl modifier for most shortcuts</li>
<li>Ctrl+S for scan triggering</li>
<li>Ctrl+F for search focus</li>
</ul>
<h4 id="hotkeys_shortcuts-macos">macOS</h4>
<ul>
<li>Uses Cmd modifier instead of Ctrl</li>
<li>Cmd+S for scan triggering</li>
<li>Cmd+F for search focus</li>
<li>Native feel with standard macOS shortcuts</li>
</ul>
<h2 id="hotkeys_shortcuts-advanced-hotkey-techniques">Advanced Hotkey Techniques</h2>
<h3 id="hotkeys_shortcuts-combining-hotkeys">Combining Hotkeys</h3>
<ul>
<li>Use selection hotkeys followed by rating hotkeys for bulk operations</li>
<li>Combine navigation with rating for quick review sessions</li>
<li>Use filter hotkeys with selection hotkeys for targeted operations</li>
</ul>
<h3 id="hotkeys_shortcuts-power-user-sequences">Power User Sequences</h3>
<ul>
<li><strong>Ctrl+A, 5</strong>: Select all and rate everything 5 stars</li>
<li><strong>Ctrl+F, [search term], Enter, Ctrl+A, Ctrl+E</strong>: Search, select all, add to collection</li>
<li><strong>D, [adjust filters], Enter</strong>: Toggle details, adjust filters, apply</li>
</ul>
<h3 id="hotkeys_shortcuts-workflow-acceleration">Workflow Acceleration</h3>
<ul>
<li>Learn rating hotkeys for quick asset evaluation</li>
<li>Master navigation hotkeys for efficient browsing</li>
<li>Combine search and selection for targeted operations</li>
</ul>
<h2 id="hotkeys_shortcuts-customization-options">Customization Options</h2>
<h3 id="hotkeys_shortcuts-current-limitations">Current Limitations</h3>
<ul>
<li>Hotkeys are currently hardcoded and not user-configurable</li>
<li>All users receive the same hotkey mappings</li>
<li>No profile-specific hotkey settings</li>
</ul>
<h3 id="hotkeys_shortcuts-potential-future-enhancements">Potential Future Enhancements</h3>
<ul>
<li>User-configurable hotkey mappings</li>
<li>Profile-specific hotkey sets</li>
<li>Import/export hotkey configurations</li>
<li>Conflict detection with browser/system hotkeys</li>
</ul>
<h2 id="hotkeys_shortcuts-troubleshooting-hotkeys">Troubleshooting Hotkeys</h2>
<h3 id="hotkeys_shortcuts-common-issues">Common Issues</h3>
<h4 id="hotkeys_shortcuts-hotkeys-not-working">Hotkeys Not Working</h4>
<ul>
<li>Check if focus is on a text input field</li>
<li>Verify no browser extensions are intercepting keys</li>
<li>Ensure Assets Manager interface is active</li>
<li>Try refreshing the browser page</li>
</ul>
<h4 id="hotkeys_shortcuts-conflicting-hotkeys">Conflicting Hotkeys</h4>
<ul>
<li>Some browser extensions may conflict with hotkeys</li>
<li>Other web applications in tabs may intercept keys</li>
<li>System-level hotkeys may interfere</li>
<li>Try using a different browser for testing</li>
</ul>
<h4 id="hotkeys_shortcuts-platform-specific-issues">Platform-Specific Issues</h4>
<ul>
<li>Mac users should use Cmd instead of Ctrl</li>
<li>Some hotkeys may not work in certain browsers</li>
<li>Browser security settings may restrict hotkey functionality</li>
<li>Accessibility features may affect hotkey behavior</li>
</ul>
<h3 id="hotkeys_shortcuts-browser-compatibility">Browser Compatibility</h3>
<p>Hotkeys work across major browsers but may have slight variations:</p>
<h4 id="hotkeys_shortcuts-chromechromium">Chrome/Chromium</h4>
<ul>
<li>Full hotkey support</li>
<li>May conflict with browser extensions</li>
<li>Works in both regular and incognito mode</li>
</ul>
<h4 id="hotkeys_shortcuts-firefox">Firefox</h4>
<ul>
<li>Full hotkey support</li>
<li>Enhanced Tracking Protection usually doesn't affect hotkeys</li>
<li>May require accessibility settings adjustments</li>
</ul>
<h4 id="hotkeys_shortcuts-safari">Safari</h4>
<ul>
<li>Full hotkey support</li>
<li>May require website permissions for full functionality</li>
<li>Works with standard macOS shortcuts</li>
</ul>
<h4 id="hotkeys_shortcuts-edge">Edge</h4>
<ul>
<li>Full hotkey support</li>
<li>Similar to Chrome behavior</li>
<li>May inherit Windows system hotkeys</li>
</ul>
<h2 id="hotkeys_shortcuts-productivity-tips">Productivity Tips</h2>
<h3 id="hotkeys_shortcuts-learning-hotkeys-effectively">Learning Hotkeys Effectively</h3>
<ul>
<li>Start with basic navigation and rating hotkeys</li>
<li>Practice one category of hotkeys at a time</li>
<li>Use hotkeys consistently to build muscle memory</li>
<li>Focus on hotkeys that match your most frequent actions</li>
</ul>
<h3 id="hotkeys_shortcuts-efficiency-improvements">Efficiency Improvements</h3>
<ul>
<li>Use selection hotkeys to operate on multiple assets</li>
<li>Combine search with hotkeys for targeted operations</li>
<li>Learn viewer hotkeys for detailed asset examination</li>
<li>Master the rating system for quick quality assessment</li>
</ul>
<h3 id="hotkeys_shortcuts-workflow-integration">Workflow Integration</h3>
<ul>
<li>Integrate hotkeys into your regular asset management routine</li>
<li>Use hotkeys to speed up repetitive tasks</li>
<li>Combine with other Assets Manager features for maximum efficiency</li>
<li>Share hotkey knowledge with team members for consistency</li>
</ul>
<h2 id="hotkeys_shortcuts-reference-summary">Reference Summary</h2>
<h3 id="hotkeys_shortcuts-essential-hotkeys">Essential Hotkeys</h3>
<div class="table-wrap"><table>
<thead><tr><th>Action</th><th>Windows/Linux</th><th>macOS</th></tr></thead>
<tbody>
<tr><td>Scan current scope</td><td>Ctrl+S</td><td>Cmd+S</td></tr>
<tr><td>Toggle details sidebar</td><td>D</td><td>D</td></tr>
<tr><td>Rate 5 stars</td><td>5</td><td>5</td></tr>
<tr><td>Select all</td><td>Ctrl+A</td><td>Cmd+A</td></tr>
<tr><td>Focus search</td><td>Ctrl+K</td><td>Cmd+K</td></tr>
<tr><td>Close viewer</td><td>Esc</td><td>Esc</td></tr>
<tr><td>Toggle false color</td><td>F</td><td>F</td></tr>
<tr><td>Toggle zebra</td><td>Z</td><td>Z</td></tr>
<tr><td>Toggle grid</td><td>G</td><td>G</td></tr>
<tr><td>Toggle pixel probe</td><td>I</td><td>I</td></tr>
<tr><td>Toggle loupe</td><td>L</td><td>L</td></tr>
<tr><td>Copy color</td><td>C</td><td>C</td></tr>
<tr><td>Actual size</td><td>Alt+1</td><td>Alt+1</td></tr>
</tbody></table></div>
<h3 id="hotkeys_shortcuts-viewer-hotkeys">Viewer Hotkeys</h3>
<div class="table-wrap"><table>
<thead><tr><th>Action</th><th>Hotkey</th></tr></thead>
<tbody>
<tr><td>Close viewer</td><td>Esc</td></tr>
<tr><td>Play/pause video</td><td>Space</td></tr>
<tr><td>Step frame back</td><td>Shift+Left</td></tr>
<tr><td>Step frame forward</td><td>Shift+Right</td></tr>
<tr><td>Set In point</td><td>I</td></tr>
<tr><td>Set Out point</td><td>O</td></tr>
<tr><td>Toggle loop</td><td>P</td></tr>
<tr><td>Zoom in</td><td>+ or =</td></tr>
<tr><td>Zoom out</td><td>-</td></tr>
<tr><td>Fit to screen</td><td>0</td></tr>
<tr><td>Actual size</td><td>1 or Alt+1</td></tr>
<tr><td>Reset view</td><td>R</td></tr>
<tr><td>Toggle false color</td><td>F</td></tr>
<tr><td>Toggle zebra</td><td>Z</td></tr>
<tr><td>Cycle grids</td><td>G</td></tr>
<tr><td>Toggle pixel probe</td><td>I</td></tr>
<tr><td>Toggle loupe</td><td>L</td></tr>
<tr><td>Copy color</td><td>C</td></tr>
<tr><td>Toggle histogram</td><td>H</td></tr>
<tr><td>Toggle waveform</td><td>W</td></tr>
</tbody></table></div>
<hr />
<p><em>Hotkeys &amp; Keyboard Shortcuts Guide Version: 1.0</em> <em>Last Updated: January 2026</em></p></div>
<a class="toplink" href="#top">Back to top</a>
<div style="margin-top: 10px; font-size: 12px; color: var(--muted);">
Source: <code>docs/HOTKEYS_SHORTCUTS.md</code>
</div>
</div>
</section>
<section class="panel section" id="settings_configuration">
<div class="panel-h"><h2>SETTINGS_CONFIGURATION.md</h2></div>
<div class="panel-b">
<div style="color: var(--muted); font-size: 12px; margin-bottom: 10px;">Settings and configuration options</div>
<div class="section"><h1 id="settings_configuration-majoor-assets-manager-settings-configuration-guide">Majoor Assets Manager - Settings &amp; Configuration Guide</h1>
<h2 id="settings_configuration-overview">Overview</h2>
<p>The Majoor Assets Manager offers extensive configuration options to customize the interface, performance, and functionality to match your workflow. This guide covers all available settings and configuration options.</p>
<h2 id="settings_configuration-browser-based-settings">Browser-Based Settings</h2>
<h3 id="settings_configuration-storage-location">Storage Location</h3>
<p>Browser-based settings are stored in <code>localStorage</code> under the <code>mjrSettings</code> key:</p>
<ul>
<li>Settings persist between browser sessions</li>
<li>Settings are specific to each browser/computer</li>
<li>Settings don't sync across different browsers or devices</li>
<li>Settings are tied to the specific domain where ComfyUI is hosted</li>
</ul>
<h3 id="settings_configuration-accessing-settings">Accessing Settings</h3>
<p>Settings are primarily adjusted through the user interface:</p>
<ol>
<li>Open the Assets Manager in ComfyUI</li>
<li>Look for settings icons or configuration panels</li>
<li>Adjust settings as needed</li>
<li>Settings are saved automatically</li>
</ol>
<h2 id="settings_configuration-display-settings">Display Settings</h2>
<h3 id="settings_configuration-page-size">Page Size</h3>
<ul>
<li><strong>Purpose</strong>: Controls how many assets are loaded per request</li>
<li><strong>Default</strong>: Usually 50-100 assets per page</li>
<li><strong>Range</strong>: Typically 10-500 assets per page</li>
<li><strong>Impact</strong>: Larger pages mean fewer requests but more memory usage</li>
<li><strong>Recommendation</strong>: Adjust based on your system resources and usage patterns</li>
</ul>
<h3 id="settings_configuration-sidebar-position">Sidebar Position</h3>
<ul>
<li><strong>Options</strong>: Left or Right</li>
<li><strong>Default</strong>: Usually Right</li>
<li><strong>Purpose</strong>: Controls where the details sidebar appears</li>
<li><strong>Impact</strong>: Affects layout and workflow depending on screen orientation</li>
<li><strong>Recommendation</strong>: Choose based on your screen setup and preferences</li>
</ul>
<h3 id="settings_configuration-hide-png-siblings">Hide PNG Siblings</h3>
<ul>
<li><strong>Purpose</strong>: Hide PNG files when video previews exist</li>
<li><strong>Default</strong>: Usually Off/Disabled</li>
<li><strong>Function</strong>: Reduces clutter from duplicate content in different formats</li>
<li><strong>Impact</strong>: Cleaner interface when working with video generations that include PNG previews</li>
<li><strong>Recommendation</strong>: Enable if you frequently work with video generations</li>
</ul>
<h2 id="settings_configuration-performance-settings">Performance Settings</h2>
<h3 id="settings_configuration-auto-scan-options">Auto-Scan Options</h3>
<ul>
<li><strong>Auto-scan on Open</strong>: Automatically scan when opening the Assets Manager</li>
<li><strong>Auto-scan on Startup</strong>: Automatically scan when ComfyUI starts</li>
<li><strong>Default</strong>: Usually Disabled to save resources</li>
<li><strong>Impact</strong>: Ensures fresh index but uses system resources</li>
<li><strong>Recommendation</strong>: Enable for frequently updated directories</li>
</ul>
<h3 id="settings_configuration-status-poll-interval">Status Poll Interval</h3>
<ul>
<li><strong>Purpose</strong>: How often to check background tasks and status</li>
<li><strong>Default</strong>: Usually 1-5 seconds</li>
<li><strong>Range</strong>: 0.5-30 seconds</li>
<li><strong>Impact</strong>: More frequent polling provides more responsive status updates but uses more resources</li>
<li><strong>Recommendation</strong>: 1-2 seconds for good balance of responsiveness and resource usage</li>
</ul>
<h3 id="settings_configuration-tags-cache-ttl">Tags Cache TTL</h3>
<ul>
<li><strong>Purpose</strong>: Time-to-live for tag caching in milliseconds</li>
<li><strong>Default</strong>: Usually 30,000ms (30 seconds)</li>
<li><strong>Range</strong>: 1,000ms to 300,000ms (1 second to 5 minutes)</li>
<li><strong>Impact</strong>: Longer TTL means fewer requests but potentially stale data</li>
<li><strong>Recommendation</strong>: 30,000ms (30 seconds) for good balance</li>
</ul>
<h2 id="settings_configuration-metadata-viewer-settings">Metadata &amp; Viewer Settings</h2>
<h3 id="settings_configuration-media-probe-backend">Media Probe Backend</h3>
<ul>
<li><strong>Auto</strong>: Automatically choose the best available backend</li>
<li><strong>ExifTool</strong>: Use ExifTool exclusively for metadata extraction</li>
<li><strong>FFprobe</strong>: Use FFprobe exclusively (especially for video)</li>
<li><strong>Both</strong>: Use both tools when available</li>
<li><strong>Default</strong>: Auto</li>
<li><strong>Impact</strong>: Affects metadata extraction speed and completeness</li>
<li><strong>Recommendation</strong>: Keep as Auto unless troubleshooting specific issues</li>
</ul>
<h3 id="settings_configuration-workflow-minimap-display">Workflow Minimap Display</h3>
<ul>
<li><strong>Show Node Labels</strong>: Display text labels on workflow minimap</li>
<li><strong>Show Connection Lines</strong>: Display connections between nodes</li>
<li><strong>Show Parameter Values</strong>: Display parameter values on nodes</li>
<li><strong>Minimap Size</strong>: Adjust the size of the workflow minimap</li>
<li><strong>Default</strong>: Varies by preference</li>
<li><strong>Impact</strong>: Affects readability of workflow previews</li>
<li><strong>Recommendation</strong>: Enable based on your need for workflow detail</li>
</ul>
<h3 id="settings_configuration-observability">Observability</h3>
<ul>
<li><strong>Request Logging</strong>: Enable detailed logging of API requests</li>
<li><strong>Performance Metrics</strong>: Track timing and performance data</li>
<li><strong>Debug Information</strong>: Enable additional debugging output</li>
<li><strong>Default</strong>: Usually Disabled</li>
<li><strong>Impact</strong>: Provides detailed information for troubleshooting but increases log volume</li>
<li><strong>Recommendation</strong>: Enable only when troubleshooting issues</li>
</ul>
<h2 id="settings_configuration-file-system-settings">File System Settings</h2>
<h3 id="settings_configuration-file-watching">File Watching</h3>
<ul>
<li><strong>Enable File Watcher</strong>: Automatically reindex when files change</li>
<li><strong>Watcher Interval</strong>: How often to check for file changes</li>
<li><strong>Join Timeout</strong>: Time to wait before processing multiple changes together</li>
<li><strong>Watched Paths</strong>: Which directories to monitor for changes</li>
<li><strong>Default</strong>: Usually Disabled to save resources</li>
<li><strong>Impact</strong>: Keeps index current but uses system resources</li>
<li><strong>Recommendation</strong>: Enable for actively used output directories</li>
</ul>
<h3 id="settings_configuration-custom-roots">Custom Roots</h3>
<ul>
<li><strong>Adding Custom Directories</strong>: Add additional directories to browse</li>
<li><strong>Path Validation</strong>: Ensures paths are valid and accessible</li>
<li><strong>Symlink Support</strong>: Allow symbolic links in custom roots (if enabled)</li>
<li><strong>Access Permissions</strong>: Respects file system permissions</li>
<li><strong>Default</strong>: None initially</li>
<li><strong>Impact</strong>: Expands browsing capabilities beyond standard directories</li>
<li><strong>Recommendation</strong>: Add directories you frequently access</li>
</ul>
<h2 id="settings_configuration-database-settings">Database Settings</h2>
<h3 id="settings_configuration-connection-management">Connection Management</h3>
<ul>
<li><strong>Max Connections</strong>: Maximum simultaneous database connections</li>
<li><strong>Connection Timeout</strong>: Time to wait for database operations</li>
<li><strong>Query Timeout</strong>: Maximum time for individual queries</li>
<li><strong>Default</strong>: Usually 8 connections, 30-second timeouts</li>
<li><strong>Impact</strong>: Affects performance with concurrent operations</li>
<li><strong>Recommendation</strong>: Adjust based on system resources and usage patterns</li>
</ul>
<h3 id="settings_configuration-optimization">Optimization</h3>
<ul>
<li><strong>Auto-Optimize</strong>: Automatically optimize database periodically</li>
<li><strong>Manual Optimization</strong>: Run optimization tools manually</li>
<li><strong>Maintenance Schedule</strong>: When optimization occurs</li>
<li><strong>Default</strong>: Usually Manual</li>
<li><strong>Impact</strong>: Improves performance but requires temporary locking</li>
<li><strong>Recommendation</strong>: Schedule during low-usage periods</li>
</ul>
<h2 id="settings_configuration-advanced-configuration">Advanced Configuration</h2>
<h3 id="settings_configuration-environment-variables-backend">Environment Variables (Backend)</h3>
<h4 id="settings_configuration-directory-configuration">Directory Configuration</h4>
<ul>
<li><strong>MAJOOR_OUTPUT_DIRECTORY</strong>: Override default output directory</li>
<ul>
<li>Default: ComfyUI's output directory</li>
<li>Format: Full path to directory</li>
<li>Impact: Changes where the indexer looks for assets</li>
<li>Example: <code>MAJOOR_OUTPUT_DIRECTORY=/path/to/my/output</code></li>
</ul>
</ul>
<h4 id="settings_configuration-external-tool-paths">External Tool Paths</h4>
<ul>
<li><strong>MAJOOR_EXIFTOOL_PATH</strong> / <strong>MAJOOR_EXIFTOOL_BIN</strong>: Path to ExifTool executable</li>
<ul>
<li>Default: <code>exiftool</code> (assumes in PATH)</li>
<li>Format: Full path to exiftool executable</li>
<li>Impact: Used for metadata extraction and file tagging</li>
<li>Example: <code>MAJOOR_EXIFTOOL_PATH=/usr/local/bin/exiftool</code></li>
</ul>
</ul>
<ul>
<li><strong>MAJOOR_FFPROBE_PATH</strong> / <strong>MAJOOR_FFPROBE_BIN</strong>: Path to FFprobe executable</li>
<ul>
<li>Default: <code>ffprobe</code> (assumes in PATH)</li>
<li>Format: Full path to ffprobe executable</li>
<li>Impact: Used for video/audio metadata extraction</li>
<li>Example: <code>MAJOOR_FFPROBE_PATH=/usr/local/bin/ffprobe</code></li>
</ul>
</ul>
<h4 id="settings_configuration-media-processing">Media Processing</h4>
<ul>
<li><strong>MAJOOR_MEDIA_PROBE_BACKEND</strong>: Media extraction backend selection</li>
<ul>
<li>Options: <code>auto</code>, <code>exiftool</code>, <code>ffprobe</code>, <code>both</code></li>
<li>Default: <code>auto</code></li>
<li>Impact: Determines which tools are used for metadata extraction</li>
<li>Example: <code>MAJOOR_MEDIA_PROBE_BACKEND=both</code></li>
</ul>
</ul>
<h4 id="settings_configuration-file-watching">File Watching</h4>
<ul>
<li><strong>MAJOOR_ENABLE_FILE_WATCHER</strong>: Enable automatic reindexing</li>
<ul>
<li>Options: <code>true</code>, <code>false</code>, <code>1</code>, <code>0</code></li>
<li>Default: <code>false</code></li>
<li>Impact: Automatically updates index when files change</li>
<li>Example: <code>MAJOOR_ENABLE_FILE_WATCHER=true</code></li>
</ul>
</ul>
<ul>
<li><strong>MAJOOR_WATCHER_INTERVAL</strong>: File watching interval in seconds</li>
<ul>
<li>Default: 15.0</li>
<li>Range: 1.0 to 300.0</li>
<li>Impact: How frequently the system checks for changes</li>
<li>Example: <code>MAJOOR_WATCHER_INTERVAL=10.0</code></li>
</ul>
</ul>
<ul>
<li><strong>MAJOOR_WATCHER_JOIN_TIMEOUT</strong>: Coalescing timeout for file events</li>
<ul>
<li>Default: 5.0 seconds</li>
<li>Range: 0.1 to 60.0</li>
<li>Impact: Time to wait before processing grouped file changes</li>
<li>Example: <code>MAJOOR_WATCHER_JOIN_TIMEOUT=3.0</code></li>
</ul>
</ul>
<ul>
<li><strong>MAJOOR_WATCHER_PATHS</strong>: Directories to watch (colon-separated on Unix, semicolon on Windows)</li>
<ul>
<li>Default: Output directory</li>
<li>Format: Path separators depend on OS</li>
<li>Impact: Which directories are monitored for changes</li>
<li>Example: <code>MAJOOR_WATCHER_PATHS=/path/to/output:/path/to/inputs</code></li>
</ul>
</ul>
<h4 id="settings_configuration-database-tuning">Database Tuning</h4>
<ul>
<li><strong>MAJOOR_DB_TIMEOUT</strong>: Database operation timeout in seconds</li>
<ul>
<li>Default: 30.0</li>
<li>Range: 1.0 to 300.0</li>
<li>Impact: Maximum time to wait for database operations</li>
<li>Example: <code>MAJOOR_DB_TIMEOUT=60.0</code></li>
</ul>
</ul>
<ul>
<li><strong>MAJOOR_DB_MAX_CONNECTIONS</strong>: Maximum database connections</li>
<ul>
<li>Default: 8</li>
<li>Range: 1 to 50</li>
<li>Impact: Concurrency level for database operations</li>
<li>Example: <code>MAJOOR_DB_MAX_CONNECTIONS=12</code></li>
</ul>
</ul>
<ul>
<li><strong>MAJOOR_DB_QUERY_TIMEOUT</strong>: Maximum query execution time</li>
<ul>
<li>Default: 30.0 seconds</li>
<li>Range: 1.0 to 300.0</li>
<li>Impact: Prevents long-running queries from blocking</li>
<li>Example: <code>MAJOOR_DB_QUERY_TIMEOUT=45.0</code></li>
</ul>
</ul>
<h4 id="settings_configuration-performance-tuning">Performance Tuning</h4>
<ul>
<li><strong>MAJOOR_TO_THREAD_TIMEOUT</strong>: Timeout for background thread operations</li>
<ul>
<li>Default: 30 seconds</li>
<li>Range: 10 to 600 seconds</li>
<li>Impact: Maximum time for background operations</li>
<li>Example: <code>MAJOOR_TO_THREAD_TIMEOUT=60</code></li>
</ul>
</ul>
<ul>
<li><strong>MAJOOR_MAX_METADATA_JSON_BYTES</strong>: Maximum metadata JSON size</li>
<ul>
<li>Default: 2097152 (2MB)</li>
<li>Range: 1024 to 104857600 (100MB)</li>
<li>Impact: Limits memory usage for metadata storage</li>
<li>Example: <code>MAJOOR_MAX_METADATA_JSON_BYTES=4194304</code></li>
</ul>
</ul>
<h4 id="settings_configuration-collection-management">Collection Management</h4>
<ul>
<li><strong>MJR_COLLECTION_MAX_ITEMS</strong>: Maximum items per collection</li>
<ul>
<li>Default: 50000</li>
<li>Range: 1000 to 1000000</li>
<li>Impact: Prevents extremely large collections from impacting performance</li>
<li>Example: <code>MJR_COLLECTION_MAX_ITEMS=100000</code></li>
</ul>
</ul>
<h4 id="settings_configuration-security-networking">Security &amp; Networking</h4>
<ul>
<li><strong>MJR_ALLOW_SYMLINKS</strong>: Allow symbolic links in custom roots</li>
<ul>
<li>Options: <code>on</code>, <code>off</code>, <code>true</code>, <code>false</code></li>
<li>Default: <code>off</code></li>
<li>Impact: Enables browsing of linked directories</li>
<li>Example: <code>MJR_ALLOW_SYMLINKS=on</code></li>
</ul>
</ul>
<ul>
<li><strong>MAJOOR_TRUSTED_PROXIES</strong>: IPs/CIDRs allowed for forwarded headers</li>
<ul>
<li>Default: <code>127.0.0.1,::1</code></li>
<li>Format: Comma-separated IP addresses or CIDR blocks</li>
<li>Impact: Security setting for proxy environments</li>
<li>Example: <code>MAJOOR_TRUSTED_PROXIES=127.0.0.1,192.168.1.0/24</code></li>
</ul>
</ul>
<h4 id="settings_configuration-dependency-management">Dependency Management</h4>
<ul>
<li><strong>MJR_AM_NO_AUTO_PIP</strong>: Disable automatic dependency installation</li>
<ul>
<li>Options: <code>1</code>, <code>true</code>, <code>yes</code>, <code>on</code> to disable</li>
<li>Default: Automatic installation enabled</li>
<li>Impact: Prevents automatic pip installs at startup</li>
<li>Example: <code>MJR_AM_NO_AUTO_PIP=1</code></li>
</ul>
</ul>
<h2 id="settings_configuration-setting-up-environment-variables">Setting Up Environment Variables</h2>
<h3 id="settings_configuration-windows">Windows</h3>
<p>Create a batch file to set environment variables:</p>
<pre><code class="language-batch">@echo off\nset MAJOOR_MEDIA_PROBE_BACKEND=auto\nset MAJOOR_ENABLE_FILE_WATCHER=true\nset MAJOOR_WATCHER_INTERVAL=15.0\nset MAJOOR_DB_TIMEOUT=60.0\n\nREM Start ComfyUI with the environment variables\ncd /d "C:\path\to\ComfyUI"\npython main.py --auto-launch\npause</code></pre>
<h3 id="settings_configuration-unixlinuxmacos">Unix/Linux/macOS</h3>
<p>Create a shell script to set environment variables:</p>
<pre><code class="language-bash">#!/bin/bash\nexport MAJOOR_MEDIA_PROBE_BACKEND=auto\nexport MAJOOR_ENABLE_FILE_WATCHER=true\nexport MAJOOR_WATCHER_INTERVAL=15.0\nexport MAJOOR_DB_TIMEOUT=60.0\n\n# Start ComfyUI with the environment variables\ncd /path/to/ComfyUI\npython main.py --auto-launch</code></pre>
<p>Or add to your shell profile (<code>.bashrc</code>, <code>.zshrc</code>, etc.):</p>
<pre><code class="language-bash">export MAJOOR_MEDIA_PROBE_BACKEND=auto\nexport MAJOOR_ENABLE_FILE_WATCHER=true\nexport MAJOOR_WATCHER_INTERVAL=15.0\nexport MAJOOR_DB_TIMEOUT=60.0</code></pre>
<h2 id="settings_configuration-configuration-best-practices">Configuration Best Practices</h2>
<h3 id="settings_configuration-performance-optimization">Performance Optimization</h3>
<ul>
<li>Adjust page size based on your system's RAM</li>
<li>Enable file watching only for actively used directories</li>
<li>Set appropriate timeouts based on your storage speed</li>
<li>Monitor database performance and adjust connections as needed</li>
</ul>
<h3 id="settings_configuration-security-considerations">Security Considerations</h3>
<ul>
<li>Keep default security settings unless you have specific requirements</li>
<li>Only enable symlink support if you trust the linked directories</li>
<li>Configure trusted proxies appropriately in networked environments</li>
<li>Regularly update external tools (ExifTool, FFprobe) for security</li>
</ul>
<h3 id="settings_configuration-resource-management">Resource Management</h3>
<ul>
<li>Monitor memory usage with large collections</li>
<li>Adjust cache settings based on available RAM</li>
<li>Set appropriate timeouts for your storage system</li>
<li>Consider SSD storage for better database performance</li>
</ul>
<h3 id="settings_configuration-backup-and-recovery">Backup and Recovery</h3>
<ul>
<li>Regularly backup the index database (<code>assets.sqlite</code>)</li>
<li>Backup custom root configurations</li>
<li>Maintain copies of important collections</li>
<li>Document your configuration settings for recovery</li>
</ul>
<h2 id="settings_configuration-troubleshooting-configuration-issues">Troubleshooting Configuration Issues</h2>
<h3 id="settings_configuration-common-problems">Common Problems</h3>
<h4 id="settings_configuration-settings-not-saving">Settings Not Saving</h4>
<ul>
<li>Clear browser cache and cookies</li>
<li>Check browser localStorage quota</li>
<li>Verify no browser extensions are interfering</li>
<li>Try a different browser</li>
</ul>
<h4 id="settings_configuration-performance-issues">Performance Issues</h4>
<ul>
<li>Reduce page size if experiencing slowdowns</li>
<li>Disable auto-scan if not needed</li>
<li>Adjust database connection settings</li>
<li>Check system resources (RAM, disk space)</li>
</ul>
<h4 id="settings_configuration-external-tool-issues">External Tool Issues</h4>
<ul>
<li>Verify tools are in PATH or set explicit paths</li>
<li>Check tool permissions and access rights</li>
<li>Ensure tools are properly installed</li>
<li>Test tools independently before using with Assets Manager</li>
</ul>
<h4 id="settings_configuration-file-watching-problems">File Watching Problems</h4>
<ul>
<li>Check directory permissions</li>
<li>Verify the watched directories exist and are accessible</li>
<li>Monitor system resources (file watching can be resource-intensive)</li>
<li>Adjust intervals if causing performance issues</li>
</ul>
<h3 id="settings_configuration-diagnostic-steps">Diagnostic Steps</h3>
<ol>
<li>Check ComfyUI console for error messages</li>
<li>Verify all required dependencies are installed</li>
<li>Test external tools independently</li>
<li>Review environment variable settings</li>
<li>Try default settings to isolate configuration issues</li>
</ol>
<h2 id="settings_configuration-migration-and-updates">Migration and Updates</h2>
<h3 id="settings_configuration-settings-preservation">Settings Preservation</h3>
<ul>
<li>Browser settings are preserved across updates</li>
<li>Environment variables need to be reapplied after system restarts</li>
<li>Custom root configurations are stored in the index directory</li>
<li>Collections are preserved as JSON files</li>
</ul>
<h3 id="settings_configuration-configuration-updates">Configuration Updates</h3>
<ul>
<li>New settings are added with sensible defaults</li>
<li>Old settings remain unchanged during updates</li>
<li>Review new settings after updates to optimize functionality</li>
<li>Check release notes for configuration changes</li>
</ul>
<hr />
<p><em>Settings &amp; Configuration Guide Version: 1.0</em> <em>Last Updated: January 2026</em></p></div>
<a class="toplink" href="#top">Back to top</a>
<div style="margin-top: 10px; font-size: 12px; color: var(--muted);">
Source: <code>docs/SETTINGS_CONFIGURATION.md</code>
</div>
</div>
</section>
<section class="panel section" id="security_env_vars">
<div class="panel-h"><h2>SECURITY_ENV_VARS.md</h2></div>
<div class="panel-b">
<div style="color: var(--muted); font-size: 12px; margin-bottom: 10px;">Security model and environment variables</div>
<div class="section"><h1 id="security_env_vars-majoor-assets-manager-security-model-environment-variables-guide">Majoor Assets Manager - Security Model &amp; Environment Variables Guide</h1>
<h2 id="security_env_vars-overview">Overview</h2>
<p>The Majoor Assets Manager implements a comprehensive security model to protect your system while providing powerful asset management capabilities. This guide covers the security architecture, threat models, and security-related environment variables.</p>
<h2 id="security_env_vars-security-architecture">Security Architecture</h2>
<h3 id="security_env_vars-defense-layers">Defense Layers</h3>
<p>The Assets Manager employs multiple layers of security:</p>
<h4 id="security_env_vars-application-layer-security">Application Layer Security</h4>
<ul>
<li>Input validation and sanitization</li>
<li>Path containment and validation</li>
<li>File type verification</li>
<li>Access control mechanisms</li>
</ul>
<h4 id="security_env_vars-network-layer-security">Network Layer Security</h4>
<ul>
<li>CSRF protection on state-changing endpoints</li>
<li>Origin validation for sensitive requests</li>
<li>Rate limiting on expensive operations</li>
<li>Secure communication protocols</li>
</ul>
<h4 id="security_env_vars-file-system-security">File System Security</h4>
<ul>
<li>Root containment validation</li>
<li>Path traversal prevention</li>
<li>Permission checking</li>
<li>Symlink handling controls</li>
</ul>
<h3 id="security_env_vars-trust-model">Trust Model</h3>
<ul>
<li><strong>User Input</strong>: All user input is validated and sanitized</li>
<li><strong>File System</strong>: Only allowed directories are accessible</li>
<li><strong>External Tools</strong>: Tools run with limited privileges</li>
<li><strong>Network</strong>: Requests validated against origin policies</li>
</ul>
<h2 id="security_env_vars-authentication-authorization">Authentication &amp; Authorization</h2>
<h3 id="security_env_vars-session-management">Session Management</h3>
<ul>
<li>No persistent authentication required</li>
<li>All operations happen within ComfyUI session</li>
<li>No external accounts or credentials needed</li>
<li>Access limited to ComfyUI user permissions</li>
</ul>
<h3 id="security_env_vars-access-control">Access Control</h3>
<ul>
<li>File access limited to ComfyUI's allowed directories</li>
<li>No direct access to system files outside allowed paths</li>
<li>Permission inheritance from ComfyUI's file system access</li>
<li>No elevation of privileges possible</li>
</ul>
<h2 id="security_env_vars-csrf-protection">CSRF Protection</h2>
<h3 id="security_env_vars-request-validation">Request Validation</h3>
<p>All state-changing endpoints require additional validation:</p>
<h4 id="security_env_vars-xmlhttprequest-header">XMLHttpRequest Header</h4>
<ul>
<li>Requests must include <code>X-Requested-With: XMLHttpRequest</code></li>
<li>Prevents simple form submissions from external sites</li>
<li>Standard technique for AJAX endpoint protection</li>
</ul>
<h4 id="security_env_vars-csrf-token-alternative">CSRF Token Alternative</h4>
<ul>
<li>Alternative validation using <code>X-CSRF-Token</code> header</li>
<li>Provides fallback for different client implementations</li>
<li>Tokens validated against session state</li>
</ul>
<h3 id="security_env_vars-origin-validation">Origin Validation</h3>
<ul>
<li>When <code>Origin</code> header is present, it's validated against <code>Host</code></li>
<li>Prevents cross-origin requests from unauthorized domains</li>
<li>Protects against certain types of cross-site attacks</li>
</ul>
<h2 id="security_env_vars-rate-limiting">Rate Limiting</h2>
<h3 id="security_env_vars-per-client-limits">Per-Client Limits</h3>
<p>Rate limiting is implemented on expensive endpoints:</p>
<h4 id="security_env_vars-affected-endpoints">Affected Endpoints</h4>
<ul>
<li>Search operations (<code>/mjr/am/search</code>)</li>
<li>Index scanning (<code>/mjr/am/scan</code>)</li>
<li>Metadata extraction (<code>/mjr/am/metadata</code>)</li>
<li>Batch ZIP operations (<code>/mjr/am/batch-zip</code>)</li>
</ul>
<h4 id="security_env_vars-limit-configuration">Limit Configuration</h4>
<ul>
<li>Implemented in-memory per-client</li>
<li>Client identity based on IP address</li>
<li>Configurable thresholds for different operations</li>
<li>Resets after specified time intervals</li>
</ul>
<h4 id="security_env_vars-trusted-proxy-support">Trusted Proxy Support</h4>
<ul>
<li><code>X-Forwarded-For</code> header honored only from trusted proxies</li>
<li>Controlled by <code>MAJOOR_TRUSTED_PROXIES</code> environment variable</li>
<li>Prevents IP spoofing in proxy environments</li>
</ul>
<h2 id="security_env_vars-path-safety-containment">Path Safety &amp; Containment</h2>
<h3 id="security_env_vars-root-validation">Root Validation</h3>
<p>All file operations validate root containment:</p>
<h4 id="security_env_vars-allowed-roots">Allowed Roots</h4>
<ul>
<li>ComfyUI output directory</li>
<li>ComfyUI input directory</li>
<li>Custom roots defined by user</li>
<li>Collections directory</li>
</ul>
<h4 id="security_env_vars-path-validation-process">Path Validation Process</h4>
<ol>
<li>Normalize the requested path</li>
<li>Resolve to absolute path</li>
<li>Verify path starts with allowed root</li>
<li>Reject if outside allowed boundaries</li>
</ol>
<h3 id="security_env_vars-symlink-handling">Symlink Handling</h3>
<ul>
<li>Symlinks are handled carefully to prevent directory traversal</li>
<li>Optional symlink support via <code>MJR_ALLOW_SYMLINKS</code> environment variable</li>
<li>Disabled by default for security</li>
<li>When enabled, still validates final resolved path</li>
</ul>
<h3 id="security_env_vars-path-traversal-prevention">Path Traversal Prevention</h3>
<ul>
<li>Input paths are normalized to prevent <code>../</code> attacks</li>
<li>Absolute path resolution ensures final location is verified</li>
<li>Multiple validation layers prevent bypass attempts</li>
</ul>
<h2 id="security_env_vars-file-operation-security">File Operation Security</h2>
<h3 id="security_env_vars-safe-file-operations">Safe File Operations</h3>
<ul>
<li>All file operations go through security validation</li>
<li>Read operations limited to allowed directories</li>
<li>Write operations limited to index and temporary directories</li>
<li>Delete operations require additional confirmation</li>
</ul>
<h3 id="security_env_vars-batch-zip-security">Batch ZIP Security</h3>
<ul>
<li>ZIP building streams directly from file handles</li>
<li>Prevents TOCTOU (Time-of-Check-Time-of-Use) race conditions</li>
<li>No temporary file copies created during ZIP building</li>
<li>Automatic cleanup of temporary ZIP files</li>
</ul>
<h3 id="security_env_vars-file-type-validation">File Type Validation</h3>
<ul>
<li>File types validated before processing</li>
<li>Dangerous file types blocked from certain operations</li>
<li>MIME type checking where possible</li>
<li>Extension validation for security-sensitive operations</li>
</ul>
<h2 id="security_env_vars-network-security">Network Security</h2>
<h3 id="security_env_vars-http-security-headers">HTTP Security Headers</h3>
<p>Applied to Majoor API endpoints only:</p>
<h4 id="security_env_vars-content-security-policy">Content Security Policy</h4>
<ul>
<li><code>Content-Security-Policy: default-src 'none'</code></li>
<li>Prevents execution of injected content</li>
<li>Applies only to API responses</li>
</ul>
<h4 id="security_env_vars-content-type-options">Content Type Options</h4>
<ul>
<li><code>X-Content-Type-Options: nosniff</code></li>
<li>Prevents MIME-type confusion attacks</li>
<li>Ensures content is treated as declared type</li>
</ul>
<h4 id="security_env_vars-frame-options">Frame Options</h4>
<ul>
<li><code>X-Frame-Options: DENY</code></li>
<li>Prevents embedding in iframes</li>
<li>Protects against clickjacking</li>
</ul>
<h4 id="security_env_vars-referrer-policy">Referrer Policy</h4>
<ul>
<li><code>Referrer-Policy: strict-origin-when-cross-origin</code></li>
<li>Limits referrer information leakage</li>
<li>Balances privacy with functionality</li>
</ul>
<h3 id="security_env_vars-api-versioning-security">API Versioning Security</h3>
<ul>
<li>Versioned routes redirect to canonical endpoints</li>
<li><code>/mjr/am/v1/...</code> redirects to <code>/mjr/am/...</code> using 308</li>
<li>Maintains security headers across versions</li>
<li>Preserves method and query parameters</li>
</ul>
<h2 id="security_env_vars-external-tool-security">External Tool Security</h2>
<h3 id="security_env_vars-tool-execution-safety">Tool Execution Safety</h3>
<ul>
<li>External tools (ExifTool, FFprobe) run with limited privileges</li>
<li>Input validation before passing to external tools</li>
<li>Timeout enforcement to prevent hanging operations</li>
<li>Output validation after tool execution</li>
</ul>
<h3 id="security_env_vars-path-validation-for-tools">Path Validation for Tools</h3>
<ul>
<li>File paths validated before passing to external tools</li>
<li>No direct shell execution, only tool invocation</li>
<li>Input sanitization for all tool parameters</li>
<li>Tool output parsing with validation</li>
</ul>
<h3 id="security_env_vars-tool-location-security">Tool Location Security</h3>
<ul>
<li>Tools can be specified via environment variables</li>
<li>Default to system PATH for security</li>
<li>No arbitrary tool execution possible</li>
<li>Tool paths validated at startup</li>
</ul>
<h2 id="security_env_vars-environment-variable-security">Environment Variable Security</h2>
<h3 id="security_env_vars-secure-configuration">Secure Configuration</h3>
<p>Environment variables provide secure configuration without code changes:</p>
<h4 id="security_env_vars-configuration-validation">Configuration Validation</h4>
<ul>
<li>Environment variables validated at startup</li>
<li>Invalid values fall back to defaults safely</li>
<li>No unsafe defaults used</li>
<li>Clear error messages for invalid configurations</li>
</ul>
<h3 id="security_env_vars-sensitive-information-handling">Sensitive Information Handling</h3>
<ul>
<li>No passwords or secrets stored in environment</li>
<li>File paths validated for security</li>
<li>No direct system command execution via environment</li>
<li>Configuration changes logged appropriately</li>
</ul>
<h3 id="security_env_vars-trusted-proxy-configuration">Trusted Proxy Configuration</h3>
<ul>
<li><code>MAJOOR_TRUSTED_PROXIES</code> controls proxy trust</li>
<li>Default: <code>127.0.0.1,::1</code> (localhost only)</li>
<li>Prevents IP spoofing in proxy environments</li>
<li>Critical for rate limiting effectiveness</li>
</ul>
<h2 id="security_env_vars-threat-model">Threat Model</h2>
<h3 id="security_env_vars-identified-threats">Identified Threats</h3>
<h4 id="security_env_vars-information-disclosure">Information Disclosure</h4>
<ul>
<li>Unauthorized access to file metadata</li>
<li>Exposure of file system structure</li>
<li>Leakage of generation parameters</li>
<li><strong>Mitigation</strong>: Path validation, access controls</li>
</ul>
<h4 id="security_env_vars-path-traversal">Path Traversal</h4>
<ul>
<li>Access to files outside allowed directories</li>
<li>Reading system files or other users' data</li>
<li>Writing to unauthorized locations</li>
<li><strong>Mitigation</strong>: Path containment, normalization</li>
</ul>
<h4 id="security_env_vars-resource-exhaustion">Resource Exhaustion</h4>
<ul>
<li>Denial of service through expensive operations</li>
<li>Memory exhaustion via large metadata</li>
<li>Database locking through concurrent operations</li>
<li><strong>Mitigation</strong>: Rate limiting, timeouts, resource limits</li>
</ul>
<h4 id="security_env_vars-code-execution">Code Execution</h4>
<ul>
<li>Arbitrary command execution through file operations</li>
<li>Injection through file names or paths</li>
<li>Malicious file content processing</li>
<li><strong>Mitigation</strong>: Input validation, sandboxing</li>
</ul>
<h4 id="security_env_vars-cross-site-attacks">Cross-Site Attacks</h4>
<ul>
<li>CSRF attacks on API endpoints</li>
<li>XSS through metadata injection</li>
<li>Clickjacking of interface elements</li>
<li><strong>Mitigation</strong>: CSRF tokens, security headers</li>
</ul>
<h3 id="security_env_vars-attack-vectors">Attack Vectors</h3>
<h4 id="security_env_vars-direct-api-access">Direct API Access</h4>
<ul>
<li>Unauthorized access to HTTP endpoints</li>
<li>Brute force attempts on protected endpoints</li>
<li><strong>Protection</strong>: Origin validation, rate limiting</li>
</ul>
<h4 id="security_env_vars-file-system-manipulation">File System Manipulation</h4>
<ul>
<li>Creation of malicious file names</li>
<li>Symlink attacks in custom roots</li>
<li><strong>Protection</strong>: Path validation, containment</li>
</ul>
<h4 id="security_env_vars-input-injection">Input Injection</h4>
<ul>
<li>Malformed metadata in files</li>
<li>Special characters in file names</li>
<li><strong>Protection</strong>: Input sanitization, validation</li>
</ul>
<h2 id="security_env_vars-security-monitoring">Security Monitoring</h2>
<h3 id="security_env_vars-request-logging">Request Logging</h3>
<ul>
<li>Optional request logging via observability settings</li>
<li>Logs include client IP, endpoint, and timestamp</li>
<li>Sensitive data not logged (file contents, metadata)</li>
<li>Helpful for detecting unusual access patterns</li>
</ul>
<h3 id="security_env_vars-error-handling">Error Handling</h3>
<ul>
<li>Secure error messages that don't leak system information</li>
<li>Internal errors logged but not exposed to users</li>
<li>Validation errors provide guidance without revealing internals</li>
<li>Stack traces hidden from end users</li>
</ul>
<h3 id="security_env_vars-audit-trail">Audit Trail</h3>
<ul>
<li>File operations logged with appropriate detail</li>
<li>Configuration changes tracked where applicable</li>
<li>Access patterns monitored for anomalies</li>
<li>Retention policies for security logs</li>
</ul>
<h2 id="security_env_vars-security-best-practices">Security Best Practices</h2>
<h3 id="security_env_vars-deployment-security">Deployment Security</h3>
<h4 id="security_env_vars-network-isolation">Network Isolation</h4>
<ul>
<li>Run ComfyUI behind appropriate firewalls</li>
<li>Limit network access to trusted users</li>
<li>Use VPN or other secure access methods</li>
<li>Monitor network traffic for anomalies</li>
</ul>
<h4 id="security_env_vars-file-system-permissions">File System Permissions</h4>
<ul>
<li>Run ComfyUI with minimal required privileges</li>
<li>Restrict file system permissions appropriately</li>
<li>Regular permission audits</li>
<li>Separate user accounts for different functions</li>
</ul>
<h4 id="security_env_vars-regular-updates">Regular Updates</h4>
<ul>
<li>Keep Assets Manager updated to latest version</li>
<li>Update external tools (ExifTool, FFprobe) regularly</li>
<li>Apply security patches promptly</li>
<li>Test updates in non-production environments first</li>
</ul>
<h3 id="security_env_vars-configuration-security">Configuration Security</h3>
<h4 id="security_env_vars-principle-of-least-privilege">Principle of Least Privilege</h4>
<ul>
<li>Grant only necessary file system access</li>
<li>Disable unnecessary features</li>
<li>Use restrictive default settings</li>
<li>Regular security configuration reviews</li>
</ul>
<h4 id="security_env_vars-environment-hardening">Environment Hardening</h4>
<ul>
<li>Secure environment variable storage</li>
<li>Validate all configuration inputs</li>
<li>Use secure defaults where possible</li>
<li>Regular security configuration audits</li>
</ul>
<h3 id="security_env_vars-operational-security">Operational Security</h3>
<h4 id="security_env_vars-access-control">Access Control</h4>
<ul>
<li>Limit access to authorized users</li>
<li>Regular access reviews</li>
<li>Session management best practices</li>
<li>Audit user activities appropriately</li>
</ul>
<h4 id="security_env_vars-monitoring-and-detection">Monitoring and Detection</h4>
<ul>
<li>Monitor for unusual access patterns</li>
<li>Alert on security-relevant events</li>
<li>Regular security log reviews</li>
<li>Incident response procedures</li>
</ul>
<h2 id="security_env_vars-security-related-environment-variables">Security-Related Environment Variables</h2>
<h3 id="security_env_vars-trusted-proxy-configuration">Trusted Proxy Configuration</h3>
<ul>
<li><strong>MAJOOR_TRUSTED_PROXIES</strong></li>
<ul>
<li>Purpose: IPs/CIDRs allowed to supply <code>X-Forwarded-For</code>/<code>X-Real-IP</code></li>
<li>Default: <code>127.0.0.1,::1</code></li>
<li>Format: Comma-separated IPs or CIDR blocks</li>
<li>Security Impact: Controls which proxies can affect rate limiting</li>
<li>Example: <code>MAJOOR_TRUSTED_PROXIES=127.0.0.1,192.168.1.0/24,10.0.0.0/8</code></li>
</ul>
</ul>
<h3 id="security_env_vars-symlink-controls">Symlink Controls</h3>
<ul>
<li><strong>MJR_ALLOW_SYMLINKS</strong></li>
<ul>
<li>Purpose: Allow symlink/junction custom roots</li>
<li>Default: <code>off</code> (disabled)</li>
<li>Options: <code>on</code>, <code>off</code>, <code>true</code>, <code>false</code></li>
<li>Security Impact: Controls directory traversal risk</li>
<li>Example: <code>MJR_ALLOW_SYMLINKS=on</code></li>
</ul>
</ul>
<h3 id="security_env_vars-database-security">Database Security</h3>
<ul>
<li><strong>MAJOOR_DB_TIMEOUT</strong></li>
<ul>
<li>Purpose: Database operation timeout</li>
<li>Default: 30.0 seconds</li>
<li>Security Impact: Prevents resource exhaustion</li>
<li>Example: <code>MAJOOR_DB_TIMEOUT=60.0</code></li>
</ul>
</ul>
<ul>
<li><strong>MAJOOR_DB_QUERY_TIMEOUT</strong></li>
<ul>
<li>Purpose: Maximum query execution time</li>
<li>Default: 30.0 seconds</li>
<li>Security Impact: Prevents long-running queries</li>
<li>Example: <code>MAJOOR_DB_QUERY_TIMEOUT=45.0</code></li>
</ul>
</ul>
<h3 id="security_env_vars-resource-limits">Resource Limits</h3>
<ul>
<li><strong>MAJOOR_MAX_METADATA_JSON_BYTES</strong></li>
<ul>
<li>Purpose: Maximum metadata JSON size stored in DB/cache</li>
<li>Default: 2097152 (2MB)</li>
<li>Security Impact: Prevents memory exhaustion</li>
<li>Example: <code>MAJOOR_MAX_METADATA_JSON_BYTES=4194304</code></li>
</ul>
</ul>
<ul>
<li><strong>MJR_COLLECTION_MAX_ITEMS</strong></li>
<ul>
<li>Purpose: Max items per collection JSON</li>
<li>Default: 50000</li>
<li>Security Impact: Prevents resource exhaustion</li>
<li>Example: <code>MJR_COLLECTION_MAX_ITEMS=100000</code></li>
</ul>
</ul>
<h3 id="security_env_vars-dependency-management">Dependency Management</h3>
<ul>
<li><strong>MJR_AM_NO_AUTO_PIP</strong></li>
<ul>
<li>Purpose: Disable best-effort dependency auto-install on startup</li>
<li>Default: Auto-install enabled</li>
<li>Security Impact: Controls external package installation</li>
<li>Options: <code>1</code>, <code>true</code>, <code>yes</code>, <code>on</code> to disable</li>
<li>Example: <code>MJR_AM_NO_AUTO_PIP=1</code></li>
</ul>
</ul>
<h2 id="security_env_vars-security-testing">Security Testing</h2>
<h3 id="security_env_vars-self-assessment-checklist">Self-Assessment Checklist</h3>
<p>Regularly verify security configuration:</p>
<h4 id="security_env_vars-access-controls">Access Controls</h4>
<ul>
<li>[ ] File system access limited to intended directories</li>
<li>[ ] Custom roots validated and secure</li>
<li>[ ] No unauthorized file access possible</li>
</ul>
<h4 id="security_env_vars-network-security">Network Security</h4>
<ul>
<li>[ ] CSRF protection active on state-changing endpoints</li>
<li>[ ] Rate limiting functioning properly</li>
<li>[ ] Security headers applied correctly</li>
</ul>
<h4 id="security_env_vars-input-validation">Input Validation</h4>
<ul>
<li>[ ] Path traversal prevented</li>
<li>[ ] File type validation working</li>
<li>[ ] External tool inputs sanitized</li>
</ul>
<h3 id="security_env_vars-penetration-testing-considerations">Penetration Testing Considerations</h3>
<p>When performing security testing:</p>
<h4 id="security_env_vars-authorized-testing-only">Authorized Testing Only</h4>
<ul>
<li>Ensure proper authorization before testing</li>
<li>Test in isolated environments when possible</li>
<li>Document and report findings appropriately</li>
</ul>
<h4 id="security_env_vars-testing-areas">Testing Areas</h4>
<ul>
<li>Path traversal attempts</li>
<li>Input validation bypasses</li>
<li>Authentication bypasses</li>
<li>Resource exhaustion attacks</li>
<li>Cross-site scripting attempts</li>
</ul>
<h2 id="security_env_vars-incident-response">Incident Response</h2>
<h3 id="security_env_vars-security-event-classification">Security Event Classification</h3>
<ul>
<li><strong>Low Risk</strong>: Minor configuration issues</li>
<li><strong>Medium Risk</strong>: Potential information disclosure</li>
<li><strong>High Risk</strong>: System compromise or data breach</li>
<li><strong>Critical Risk</strong>: Active exploitation in progress</li>
</ul>
<h3 id="security_env_vars-response-procedures">Response Procedures</h3>
<ol>
<li>Isolate affected systems</li>
<li>Document the incident</li>
<li>Assess scope and impact</li>
<li>Apply immediate mitigations</li>
<li>Investigate root cause</li>
<li>Implement permanent fixes</li>
<li>Communicate appropriately</li>
<li>Review and improve procedures</li>
</ol>
<hr />
<p><em>Security Model &amp; Environment Variables Guide Version: 1.0</em> <em>Last Updated: January 2026</em></p></div>
<a class="toplink" href="#top">Back to top</a>
<div style="margin-top: 10px; font-size: 12px; color: var(--muted);">
Source: <code>docs/SECURITY_ENV_VARS.md</code>
</div>
</div>
</section>
<section class="panel section" id="testing">
<div class="panel-h"><h2>TESTING.md</h2></div>
<div class="panel-b">
<div style="color: var(--muted); font-size: 12px; margin-bottom: 10px;">Running tests and reading reports</div>
<div class="section"><h1 id="testing-testing">Testing</h1>
<p>This project uses <code>pytest</code>. On Windows, batch runners are provided for convenience and generate both:</p>
<ul>
<li>JUnit XML (<code>.xml</code>)</li>
<li>a styled HTML report (<code>.html</code>)</li>
</ul>
<p>Reports are written to:</p>
<ul>
<li><code>tests/__reports__/</code></li>
</ul>
<p>Open the index:</p>
<ul>
<li><code>tests/__reports__/index.html</code></li>
</ul>
<h2 id="testing-quick-commands">Quick commands</h2>
<p>From the repo root:</p>
<pre><code class="language-bash">python -m pytest -q</code></pre>
<p>Run a single folder:</p>
<pre><code class="language-bash">python -m pytest tests/metadata -q</code></pre>
<h2 id="testing-batch-runners-windows">Batch runners (Windows)</h2>
<p>From the repo root:</p>
<ul>
<li>Full suite: <code>run_tests.bat</code> (delegates to <code>tests/run_tests_all.bat</code>)</li>
<li>Quick suite (skips <code>test_comfy_output</code>): <code>run_tests_quick.bat</code></li>
<li>Metadata / parser suite: <code>run_tests_parser.bat</code></li>
</ul>
<p>Category runners:</p>
<ul>
<li><code>tests/config/run_tests_config.bat</code></li>
<li><code>tests/core/run_tests_core.bat</code></li>
<li><code>tests/database/run_tests_database.bat</code></li>
<li><code>tests/features/run_tests_features.bat</code></li>
<li><code>tests/metadata/run_tests_metadata.bat</code></li>
<li><code>tests/rating_tags/run_tests_rating_tags.bat</code></li>
<li><code>tests/regressions/run_tests_regressions.bat</code></li>
</ul>
<p>All batch runners support <code>/nopause</code> for non-interactive runs:</p>
<pre><code class="language-bat">run_tests_quick.bat /nopause</code></pre>
<h2 id="testing-test-artifacts-dbwalshm">Test artifacts (DB/WAL/SHM)</h2>
<p>Some tests create SQLite files. Pytest temp files are stored under:</p>
<ul>
<li><code>tests/__pytest_tmp__/</code></li>
</ul>
<p>This includes <code><em>.db</code>, <code></em>.db-wal</code>, <code>*.db-shm</code>, and other runtime artifacts.</p>
<h2 id="testing-parser-samples-metadata-extraction">Parser samples (metadata extraction)</h2>
<p><code>tests/metadata/test_parser_folder_scan.py</code> scans <strong>every file</strong> under:</p>
<ul>
<li><code>tests/parser/</code> (recursive)</li>
</ul>
<p>If you don't want to commit large samples, you can point the test to an external folder:</p>
<pre><code class="language-powershell">$env:MJR_TEST_PARSER_DIR = "C:\path\to\parser"\npython -m pytest tests/metadata/test_parser_folder_scan.py -q</code></pre></div>
<a class="toplink" href="#top">Back to top</a>
<div style="margin-top: 10px; font-size: 12px; color: var(--muted);">
Source: <code>docs/TESTING.md</code>
</div>
</div>
</section>
<section class="panel section" id="complete_user_guide">
<div class="panel-h"><h2>COMPLETE_USER_GUIDE.md</h2></div>
<div class="panel-b">
<div style="color: var(--muted); font-size: 12px; margin-bottom: 10px;">Step-by-step user guide with workflows</div>
<div class="section"><h1 id="complete_user_guide-majoor-assets-manager-complete-user-guide">Majoor Assets Manager - Complete User Guide</h1>
<h2 id="complete_user_guide-table-of-contents">Table of Contents</h2>
<ol>
<li><a href="#complete_user_guide-getting-started">Getting Started</a></li>
<li><a href="#complete_user_guide-basic-operations">Basic Operations</a></li>
<li><a href="#complete_user_guide-advanced-features">Advanced Features</a></li>
<li><a href="#complete_user_guide-workflow-integration">Workflow Integration</a></li>
<li><a href="#complete_user_guide-organization-strategies">Organization Strategies</a></li>
<li><a href="#complete_user_guide-troubleshooting">Troubleshooting</a></li>
<li><a href="#complete_user_guide-tips-tricks">Tips &amp;amp; Tricks</a></li>
</ol>
<h2 id="complete_user_guide-getting-started">Getting Started</h2>
<h3 id="complete_user_guide-prerequisites">Prerequisites</h3>
<p>Before starting with the Majoor Assets Manager, ensure you have:</p>
<ul>
<li>ComfyUI installed and running</li>
<li>The Majoor Assets Manager extension installed</li>
<li>(Optional but recommended) ExifTool and FFprobe installed for full metadata functionality</li>
</ul>
<h3 id="complete_user_guide-first-launch">First Launch</h3>
<ol>
<li>Start ComfyUI as usual</li>
<li>Open your browser and navigate to the ComfyUI interface</li>
<li>Look for the "Assets Manager" tab or panel</li>
<li>Click on the Assets Manager tab to open the interface</li>
</ol>
<h3 id="complete_user_guide-initial-interface-overview">Initial Interface Overview</h3>
<p>When you first open the Assets Manager, you'll see:</p>
<ul>
<li><strong>Top Navigation</strong>: Tabs for Outputs, Inputs, Custom, and Collections</li>
<li><strong>Search Bar</strong>: For searching across all assets</li>
<li><strong>Filter Panel</strong>: For applying filters and sorting</li>
<li><strong>Asset Grid</strong>: Main display area showing asset thumbnails</li>
<li><strong>Status Bar</strong>: Showing current status and scan progress</li>
</ul>
<h3 id="complete_user_guide-initial-scan">Initial Scan</h3>
<p>The first time you open each scope (Outputs, Inputs, Custom), the system will automatically begin scanning:</p>
<ol>
<li>Wait for the initial scan to complete (shown in status bar)</li>
<li>The asset grid will populate with thumbnails</li>
<li>Use the search bar to find specific assets</li>
<li>Apply filters to narrow down results</li>
</ol>
<h2 id="complete_user_guide-basic-operations">Basic Operations</h2>
<h3 id="complete_user_guide-browsing-assets">Browsing Assets</h3>
<h4 id="complete_user_guide-switching-between-scopes">Switching Between Scopes</h4>
<ol>
<li>Click on the "Outputs" tab to browse generated outputs</li>
<li>Click on the "Inputs" tab to browse input images</li>
<li>Click on the "Custom" tab to browse custom directories</li>
<li>Click on the "Collections" tab to browse saved collections</li>
</ol>
<h4 id="complete_user_guide-viewing-assets">Viewing Assets</h4>
<ol>
<li>Browse through the asset grid by scrolling</li>
<li>Click on any asset to select it</li>
<li>Double-click on an asset to open the viewer</li>
<li>Use the pagination controls to navigate through pages</li>
</ol>
<h3 id="complete_user_guide-searching-for-assets">Searching for Assets</h3>
<h4 id="complete_user_guide-basic-search">Basic Search</h4>
<ol>
<li>Click in the search bar at the top</li>
<li>Type your search term (e.g., "landscape", "character")</li>
<li>Press Enter or wait for results to appear</li>
<li>Results will be highlighted and ranked by relevance</li>
</ol>
<h4 id="complete_user_guide-advanced-search">Advanced Search</h4>
<ol>
<li>Use quotes for exact phrases: <code>"fantasy warrior"</code></li>
<li>Combine terms for broader search: <code>portrait fantasy</code></li>
<li>Use filters in combination with search for refined results</li>
</ol>
<h3 id="complete_user_guide-applying-filters">Applying Filters</h3>
<h4 id="complete_user_guide-filter-by-file-type">Filter by File Type</h4>
<ol>
<li>Click the "Kind" filter dropdown</li>
<li>Select the file types you want to see (Images, Videos, Workflows)</li>
<li>The asset grid will update to show only selected types</li>
</ol>
<h4 id="complete_user_guide-filter-by-rating">Filter by Rating</h4>
<ol>
<li>Click the "Rating" filter dropdown</li>
<li>Select minimum rating (e.g., "3 stars or higher")</li>
<li>Only assets meeting the rating threshold will be shown</li>
</ol>
<h4 id="complete_user_guide-filter-by-date">Filter by Date</h4>
<ol>
<li>Click the date filter icon</li>
<li>Select a date range using the calendar</li>
<li>Apply the filter to see assets from the selected period</li>
</ol>
<h3 id="complete_user_guide-sorting-results">Sorting Results</h3>
<ol>
<li>Click the sort dropdown (usually shows "Relevance" by default)</li>
<li>Select your preferred sort order (Name, Date, Size, Rating, etc.)</li>
<li>Toggle ascending/descending order if needed</li>
</ol>
<h2 id="complete_user_guide-advanced-features">Advanced Features</h2>
<h3 id="complete_user_guide-using-the-viewer">Using the Viewer</h3>
<h4 id="complete_user_guide-opening-the-viewer">Opening the Viewer</h4>
<ol>
<li>Double-click on any asset in the grid</li>
<li>Or right-click and select "Open in Viewer"</li>
<li>The advanced viewer will open in a modal window</li>
</ol>
<h4 id="complete_user_guide-viewer-navigation">Viewer Navigation</h4>
<ol>
<li>Use mouse wheel to zoom in/out</li>
<li>Click and drag to pan around the image</li>
<li>Press "0" to fit image to screen</li>
<li>Press "1" or "Alt+1" for 1:1 pixel view</li>
</ol>
<h4 id="complete_user_guide-image-analysis-tools">Image Analysis Tools</h4>
<ol>
<li>Press "F" to toggle false color mode</li>
<li>Press "Z" to toggle zebra patterns</li>
<li>Press "G" to cycle through grid overlays</li>
<li>Press "I" to toggle pixel probe</li>
<li>Press "L" to toggle loupe magnification</li>
</ol>
<h4 id="complete_user_guide-video-playback">Video Playback</h4>
<ol>
<li>Use play/pause button to control playback</li>
<li>Drag the timeline slider to seek to specific points</li>
<li>Press "Shift+Left/Right" to step through frames</li>
<li>Set In/Out points with "I" and "O" keys</li>
</ol>
<h3 id="complete_user_guide-rating-and-tagging-assets">Rating and Tagging Assets</h3>
<h4 id="complete_user_guide-rating-an-asset">Rating an Asset</h4>
<ol>
<li>Right-click on an asset</li>
<li>Select "Rate" from the context menu</li>
<li>Choose the number of stars (0-5)</li>
<li>Or press the corresponding number key (0-5) when asset is selected</li>
</ol>
<h4 id="complete_user_guide-adding-tags">Adding Tags</h4>
<ol>
<li>Right-click on an asset</li>
<li>Select "Edit Tags" from the context menu</li>
<li>Type your tags separated by commas</li>
<li>Press Enter to save the tags</li>
</ol>
<h4 id="complete_user_guide-bulk-operations">Bulk Operations</h4>
<ol>
<li>Hold Ctrl/Cmd and click to select multiple assets</li>
<li>Or click one asset, hold Shift, and click another to select a range</li>
<li>Right-click on any selected asset</li>
<li>Apply rating or tags to all selected items</li>
</ol>
<h3 id="complete_user_guide-creating-and-managing-collections">Creating and Managing Collections</h3>
<h4 id="complete_user_guide-creating-a-new-collection">Creating a New Collection</h4>
<ol>
<li>Select one or more assets</li>
<li>Right-click and choose "Add to Collection"</li>
<li>Select "Create New Collection"</li>
<li>Give your collection a name</li>
<li>The collection is created and assets are added</li>
</ol>
<h4 id="complete_user_guide-adding-to-existing-collection">Adding to Existing Collection</h4>
<ol>
<li>Select one or more assets</li>
<li>Right-click and choose "Add to Collection"</li>
<li>Select an existing collection from the list</li>
<li>Assets are added (duplicates are automatically skipped)</li>
</ol>
<h4 id="complete_user_guide-managing-collections">Managing Collections</h4>
<ol>
<li>Switch to the "Collections" tab</li>
<li>Right-click on a collection name</li>
<li>Choose from options like Rename, Delete, or Clear</li>
<li>To view a collection's contents, simply click on its name</li>
</ol>
<h3 id="complete_user_guide-using-drag-and-drop">Using Drag and Drop</h3>
<h4 id="complete_user_guide-dragging-to-comfyui-canvas">Dragging to ComfyUI Canvas</h4>
<ol>
<li>Select one or more assets</li>
<li>Click and hold on an asset thumbnail</li>
<li>Drag the asset onto the ComfyUI canvas</li>
<li>Release to drop - the asset path will be injected into compatible nodes</li>
</ol>
<h4 id="complete_user_guide-dragging-to-operating-system">Dragging to Operating System</h4>
<ol>
<li>Select one or more assets</li>
<li>Click and drag an asset outside the browser window</li>
<li>For single files: drops the original file</li>
<li>For multiple files: creates and drops a ZIP file</li>
</ol>
<h2 id="complete_user_guide-workflow-integration">Workflow Integration</h2>
<h3 id="complete_user_guide-integrating-assets-into-workflows">Integrating Assets into Workflows</h3>
<h4 id="complete_user_guide-loading-assets-into-nodes">Loading Assets into Nodes</h4>
<ol>
<li>Find the asset you want to use in Assets Manager</li>
<li>Drag it directly onto the ComfyUI canvas</li>
<li>The asset path will be automatically injected into compatible nodes</li>
<li>Common compatible nodes: LoadImage, LoadVideo, etc.</li>
</ol>
<h4 id="complete_user_guide-using-collections-for-workflow-elements">Using Collections for Workflow Elements</h4>
<ol>
<li>Create collections for different types of assets (characters, backgrounds, etc.)</li>
<li>Organize assets by project or style</li>
<li>Use collections to quickly access frequently used assets</li>
<li>Share collections with team members</li>
</ol>
<h3 id="complete_user_guide-metadata-driven-workflows">Metadata-Driven Workflows</h3>
<h4 id="complete_user_guide-examining-generation-parameters">Examining Generation Parameters</h4>
<ol>
<li>Open an asset in the viewer</li>
<li>Look at the metadata panel for generation details</li>
<li>Note the model, sampler, steps, CFG scale, etc.</li>
<li>Use this information to recreate or modify results</li>
</ol>
<h4 id="complete_user_guide-reproducing-results">Reproducing Results</h4>
<ol>
<li>Find a result you like in Assets Manager</li>
<li>Note the seed value in the metadata</li>
<li>Use the same parameters with the same seed to reproduce</li>
<li>Or slightly modify parameters for variations</li>
</ol>
<h3 id="complete_user_guide-quality-assessment-workflow">Quality Assessment Workflow</h3>
<h4 id="complete_user_guide-rating-system-for-quality-control">Rating System for Quality Control</h4>
<ol>
<li>Establish consistent rating criteria for your workflow</li>
<li>Rate assets as you review them (0-5 stars)</li>
<li>Use rating filters to quickly find high-quality results</li>
<li>Focus your attention on top-rated assets</li>
</ol>
<h4 id="complete_user_guide-tagging-for-organization">Tagging for Organization</h4>
<ol>
<li>Develop a consistent tagging system</li>
<li>Tag assets by subject, style, quality, or other relevant categories</li>
<li>Use tags to quickly find assets with specific characteristics</li>
<li>Combine tags with other filters for precise searching</li>
</ol>
<h2 id="complete_user_guide-organization-strategies">Organization Strategies</h2>
<h3 id="complete_user_guide-effective-tagging-systems">Effective Tagging Systems</h3>
<h4 id="complete_user_guide-hierarchical-tagging">Hierarchical Tagging</h4>
<ol>
<li>Use colons to create hierarchy: "subject:person:face:portrait"</li>
<li>Organize tags in logical groups</li>
<li>Use consistent terminology across your collection</li>
<li>Create tag templates for common categories</li>
</ol>
<h4 id="complete_user_guide-project-based-tagging">Project-Based Tagging</h4>
<ol>
<li>Tag assets by project: "project:client_name"</li>
<li>Use status tags: "status:approved", "status:rejected", "status:review"</li>
<li>Add version tags: "version:v1", "version:final"</li>
<li>Include collaboration tags: "collaborator:designer_name"</li>
</ol>
<h3 id="complete_user_guide-collection-organization">Collection Organization</h3>
<h4 id="complete_user_guide-thematic-collections">Thematic Collections</h4>
<ol>
<li>Create collections based on themes or subjects</li>
<li>Group similar styles together</li>
<li>Separate experimental work from production assets</li>
<li>Create mood boards as collections</li>
</ol>
<h4 id="complete_user_guide-workflow-collections">Workflow Collections</h4>
<ol>
<li>Create collections for different stages of your workflow</li>
<li>"Reference" collection for inspiration</li>
<li>"To Review" collection for pending evaluation</li>
<li>"Approved" collection for final assets</li>
</ol>
<h4 id="complete_user_guide-clientproject-collections">Client/Project Collections</h4>
<ol>
<li>Create separate collections for each client or project</li>
<li>Use consistent naming conventions</li>
<li>Include version information in collection names</li>
<li>Archive old project collections when appropriate</li>
</ol>
<h3 id="complete_user_guide-rating-strategies">Rating Strategies</h3>
<h4 id="complete_user_guide-consistent-rating-criteria">Consistent Rating Criteria</h4>
<ol>
<li>Define what each star rating means for your work</li>
<li>Apply ratings consistently across similar asset types</li>
<li>Revisit and adjust ratings periodically as needed</li>
<li>Use ratings to identify your most successful techniques</li>
</ol>
<h4 id="complete_user_guide-quality-filtering">Quality Filtering</h4>
<ol>
<li>Use rating filters to focus on high-quality results</li>
<li>Set minimum rating thresholds for different purposes</li>
<li>Regularly review low-rated assets for improvement opportunities</li>
<li>Use ratings to track improvement over time</li>
</ol>
<h2 id="complete_user_guide-troubleshooting">Troubleshooting</h2>
<h3 id="complete_user_guide-common-issues-and-solutions">Common Issues and Solutions</h3>
<h4 id="complete_user_guide-assets-not-appearing">Assets Not Appearing</h4>
<p><strong>Problem</strong>: Assets don't show up in the grid <strong>Solution</strong>:</p>
<ol>
<li>Check if the correct scope is selected (Outputs, Inputs, Custom, Collections)</li>
<li>Trigger a manual scan with Ctrl/Cmd+S</li>
<li>Verify the directory contains assets in supported formats</li>
<li>Check ComfyUI console for error messages</li>
</ol>
<h4 id="complete_user_guide-slow-performance">Slow Performance</h4>
<p><strong>Problem</strong>: Interface is slow or unresponsive <strong>Solution</strong>:</p>
<ol>
<li>Reduce page size in settings</li>
<li>Apply more specific filters to reduce results</li>
<li>Close other browser tabs to free memory</li>
<li>Restart ComfyUI if the issue persists</li>
</ol>
<h4 id="complete_user_guide-metadata-not-loading">Metadata Not Loading</h4>
<p><strong>Problem</strong>: Metadata panel shows "Loading..." indefinitely <strong>Solution</strong>:</p>
<ol>
<li>Verify ExifTool and FFprobe are installed and in PATH</li>
<li>Check file permissions for the asset files</li>
<li>Try refreshing the metadata manually</li>
<li>Check if the file format is supported</li>
</ol>
<h4 id="complete_user_guide-search-not-working">Search Not Working</h4>
<p><strong>Problem</strong>: Search returns no results or unexpected results <strong>Solution</strong>:</p>
<ol>
<li>Wait for initial indexing to complete</li>
<li>Trigger a manual scan with Ctrl/Cmd+S</li>
<li>Try simpler search terms</li>
<li>Check that the correct scope is selected</li>
</ol>
<h3 id="complete_user_guide-advanced-troubleshooting">Advanced Troubleshooting</h3>
<h4 id="complete_user_guide-index-database-issues">Index Database Issues</h4>
<p><strong>Problem</strong>: Assets Manager behaves unexpectedly or shows old data <strong>Solution</strong>:</p>
<ol>
<li>Clear the index database (backup first if needed)</li>
<li>Trigger a full rescan of your directories</li>
<li>Check the index database file permissions</li>
<li>Verify disk space is available</li>
</ol>
<h4 id="complete_user_guide-file-permission-issues">File Permission Issues</h4>
<p><strong>Problem</strong>: Cannot access certain files or directories <strong>Solution</strong>:</p>
<ol>
<li>Check that ComfyUI has read access to the directories</li>
<li>Verify file ownership and permissions</li>
<li>Run ComfyUI with appropriate user privileges</li>
<li>Check for any security software blocking access</li>
</ol>
<h4 id="complete_user_guide-external-tool-issues">External Tool Issues</h4>
<p><strong>Problem</strong>: Metadata extraction or file tagging not working <strong>Solution</strong>:</p>
<ol>
<li>Verify ExifTool and FFprobe are properly installed</li>
<li>Test the tools independently from command line</li>
<li>Set explicit paths using environment variables if needed</li>
<li>Check that the tools have appropriate file access permissions</li>
</ol>
<h2 id="complete_user_guide-tips-tricks">Tips &amp; Tricks</h2>
<h3 id="complete_user_guide-productivity-boosters">Productivity Boosters</h3>
<h4 id="complete_user_guide-keyboard-shortcuts-mastery">Keyboard Shortcuts Mastery</h4>
<ol>
<li>Learn rating shortcuts (0-5 keys) for quick evaluation</li>
<li>Use Ctrl+A to select all visible assets</li>
<li>Master navigation keys (arrows, Page Up/Down) for efficient browsing</li>
<li>Use D key to toggle details sidebar quickly</li>
</ol>
<h4 id="complete_user_guide-search-efficiency">Search Efficiency</h4>
<ol>
<li>Use specific terms rather than generic ones</li>
<li>Combine search with filters for precise results</li>
<li>Use quotes for exact phrase matching</li>
<li>Leverage metadata fields in searches (e.g., "model:SDXL")</li>
</ol>
<h4 id="complete_user_guide-batch-operations">Batch Operations</h4>
<ol>
<li>Select multiple assets using Ctrl/Cmd+click or Shift+click</li>
<li>Apply ratings or tags to multiple assets at once</li>
<li>Drag multiple assets to ComfyUI canvas simultaneously</li>
<li>Use collections for batch operations</li>
</ol>
<h3 id="complete_user_guide-advanced-techniques">Advanced Techniques</h3>
<h4 id="complete_user_guide-power-user-workflow">Power User Workflow</h4>
<ol>
<li>Use Collections to create reusable asset libraries</li>
<li>Develop consistent tagging schemes for your work</li>
<li>Leverage metadata to understand what parameters produce good results</li>
<li>Use the viewer's analysis tools for quality assessment</li>
</ol>
<h4 id="complete_user_guide-integration-with-external-tools">Integration with External Tools</h4>
<ol>
<li>Export collections as JSON for use in other applications</li>
<li>Use drag-and-drop to integrate with design software</li>
<li>Leverage metadata for automated processing pipelines</li>
<li>Share assets and collections with collaborators</li>
</ol>
<h4 id="complete_user_guide-customization-and-optimization">Customization and Optimization</h4>
<ol>
<li>Adjust page size based on your system's capabilities</li>
<li>Configure auto-scan settings for your workflow</li>
<li>Set up custom roots for frequently accessed directories</li>
<li>Fine-tune performance settings based on your hardware</li>
</ol>
<h3 id="complete_user_guide-best-practices">Best Practices</h3>
<h4 id="complete_user_guide-organization-best-practices">Organization Best Practices</h4>
<ol>
<li>Establish consistent naming conventions</li>
<li>Regularly clean up unused collections</li>
<li>Maintain a manageable number of tags</li>
<li>Use hierarchical tags for complex organization</li>
</ol>
<h4 id="complete_user_guide-performance-best-practices">Performance Best Practices</h4>
<ol>
<li>Keep collections reasonably sized (under 50,000 items)</li>
<li>Use filters to narrow down large result sets</li>
<li>Regularly optimize the database through maintenance tools</li>
<li>Monitor index size and rebuild if needed</li>
</ol>
<h4 id="complete_user_guide-collaboration-best-practices">Collaboration Best Practices</h4>
<ol>
<li>Share consistent tagging schemes with team members</li>
<li>Use standardized collection naming conventions</li>
<li>Document your rating criteria for consistency</li>
<li>Export and share valuable collections</li>
</ol>
<h2 id="complete_user_guide-quick-reference">Quick Reference</h2>
<h3 id="complete_user_guide-essential-keyboard-shortcuts">Essential Keyboard Shortcuts</h3>
<ul>
<li><strong>Ctrl+S</strong> / <strong>Cmd+S</strong>: Trigger index scan</li>
<li><strong>D</strong>: Toggle details sidebar</li>
<li><strong>0-5</strong>: Rate selected asset (0-5 stars)</li>
<li><strong>Enter</strong>: Open viewer for selected asset</li>
<li><strong>Ctrl+A</strong> / <strong>Cmd+A</strong>: Select all visible assets</li>
<li><strong>Ctrl+F</strong> / <strong>Cmd+F</strong>: Focus search bar</li>
<li><strong>Escape</strong>: Close viewer or clear selection</li>
</ul>
<h3 id="complete_user_guide-common-tasks-quick-steps">Common Tasks Quick Steps</h3>
<h4 id="complete_user_guide-find-recent-high-quality-assets">Find Recent High-Quality Assets</h4>
<ol>
<li>Click "Outputs" tab</li>
<li>Set rating filter to "4 stars or higher"</li>
<li>Set date filter to last week</li>
<li>Sort by date (descending)</li>
</ol>
<h4 id="complete_user_guide-create-a-mood-board-collection">Create a Mood Board Collection</h4>
<ol>
<li>Browse and select relevant assets</li>
<li>Right-click and choose "Add to Collection"</li>
<li>Create new collection named "Mood Board YYYY-MM-DD"</li>
<li>Continue adding assets as needed</li>
</ol>
<h4 id="complete_user_guide-evaluate-a-batch-of-results">Evaluate a Batch of Results</h4>
<ol>
<li>Apply relevant filters to isolate results</li>
<li>Select all with Ctrl+A</li>
<li>Use rating shortcuts to quickly assess quality</li>
<li>Create a collection of top-rated items</li>
</ol>
<h4 id="complete_user_guide-share-assets-with-others">Share Assets with Others</h4>
<ol>
<li>Create a collection with the assets to share</li>
<li>Export the collection as JSON</li>
<li>Send the JSON file to recipients</li>
<li>They can import the collection to access the assets</li>
</ol>
<hr />
<p><em>Complete User Guide Version: 1.0</em> <em>Last Updated: January 2026</em></p></div>
<a class="toplink" href="#top">Back to top</a>
<div style="margin-top: 10px; font-size: 12px; color: var(--muted);">
Source: <code>docs/COMPLETE_USER_GUIDE.md</code>
</div>
</div>
</section>
<section class="panel section" id="audit_issues">
<div class="panel-h"><h2>AUDIT_ISSUES.md</h2></div>
<div class="panel-b">
<div style="color: var(--muted); font-size: 12px; margin-bottom: 10px;">Additional documentation</div>
<div class="section"><h1 id="audit_issues-comfyui-majoor-assetsmanager-audit-issues">ComfyUI-Majoor-AssetsManager - Audit Issues</h1>
<blockquote>Generated: 2026-01-23 | Version: 2.1.1</blockquote>
<hr />
<h2 id="audit_issues-critical-fix-immediately">CRITICAL (Fix Immediately)</h2>
<h3 id="audit_issues-1-memory-leak-event-handlers-not-cleaned-up">1. Memory Leak - Event Handlers Not Cleaned Up</h3>
<ul>
<li><strong>File:</strong> <code>js/entry.js</code> (lines 149-155)</li>
<li><strong>Issue:</strong> Event handlers stored on <code>api._mjrExecutedHandler</code> and <code>api._mjrRtHandlers</code> are never cleared when extension is destroyed. Multiple reloads cause handler accumulation.</li>
<li><strong>Fix:</strong> Use AbortController or implement cleanup on extension unload.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — runtime AbortController + timer tracking + handler cleanup.</li>
</ul>
<h3 id="audit_issues-2-memory-leak-hydration-queue-global-state">2. Memory Leak - Hydration Queue Global State</h3>
<ul>
<li><strong>File:</strong> <code>js/features/grid/GridView.js</code> (line 26)</li>
<li><strong>Issue:</strong> Global <code>RT_HYDRATE_QUEUE</code> never cleared when grid is destroyed. Stale jobs from destroyed grids could run on new grids.</li>
<li><strong>Fix:</strong> Associate queue with specific grid via WeakMap.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — per-grid WeakMap queue + cleanup on dispose.</li>
</ul>
<h3 id="audit_issues-3-error-message-information-leak">3. Error Message Information Leak</h3>
<ul>
<li><strong>File:</strong> <code>backend/routes/handlers/search.py</code> (lines 668-670)</li>
<li><strong>Issue:</strong> Full exception details exposed in workflow-quick endpoint response.</li>
<li><strong>Fix:</strong> Use <code>safe_error_message()</code> wrapper.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — response uses <code>safe_error_message(...)</code> (logs may still contain exception details, by design).</li>
</ul>
<hr />
<h2 id="audit_issues-high-priority">HIGH PRIORITY</h2>
<h3 id="audit_issues-4-missing-rate-limiting-on-search-endpoints">4. Missing Rate Limiting on Search Endpoints</h3>
<ul>
<li><strong>Files:</strong> <code>backend/routes/handlers/search.py</code></li>
<li><strong>Issue:</strong> <code>/mjr/am/list</code> and <code>/mjr/am/search</code> have NO rate limits - bulk queries could exhaust database.</li>
<li><strong>Fix:</strong> Add rate limiting similar to metadata endpoint (e.g., 50/60s).</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — 50 requests / 60s per endpoint key.</li>
</ul>
<h3 id="audit_issues-5-monolithic-function-videocontrols">5. Monolithic Function - VideoControls</h3>
<ul>
<li><strong>File:</strong> <code>js/components/VideoControls.js</code></li>
<li><strong>Issue:</strong> <code>mountVideoControls</code> function is 1295 lines - impossible to test/maintain.</li>
<li><strong>Fix:</strong> Split into 5-10 smaller functions (state, UI, handlers, etc.).</li>
<li><strong>Status:</strong> FIXED (2026-01-24) — extracted preview + option parsing into helpers and reduced <code>mountVideoControls</code> complexity (manual QA still recommended).</li>
</ul>
<h3 id="audit_issues-6-workflow-cache-unbounded-growth">6. Workflow Cache Unbounded Growth</h3>
<ul>
<li><strong>File:</strong> <code>js/features/dnd/DragDrop.js</code> (lines 34-51)</li>
<li><strong>Issue:</strong> No time-based eviction. Cache cleared only on size limit, not TTL.</li>
<li><strong>Fix:</strong> Add TTL check on cache hit, evict expired entries.</li>
<li><strong>Status:</strong> ALREADY IMPLEMENTED — <code>WORKFLOW_CACHE_TTL_MS</code> + TTL check on hit + eviction on trim.</li>
</ul>
<h3 id="audit_issues-7-on-pagination-performance">7. O(n) Pagination Performance</h3>
<ul>
<li><strong>File:</strong> <code>backend/routes/handlers/filesystem.py</code> (line 360)</li>
<li><strong>Issue:</strong> <code>filtered_entries[offset: offset + limit]</code> is O(offset) - poor for large offsets.</li>
<li><strong>Fix:</strong> Implement keyset/cursor-based pagination.</li>
<li><strong>Status:</strong> MITIGATED (2026-01-23) — builds only the requested page (no full filtered list + slicing); true keyset pagination deferred.</li>
</ul>
<h3 id="audit_issues-8-thread-pool-exhaustion-risk">8. Thread Pool Exhaustion Risk</h3>
<ul>
<li><strong>File:</strong> <code>backend/routes/handlers/scan.py</code> (lines 721-749)</li>
<li><strong>Issue:</strong> Each staged file spawns separate <code>asyncio.to_thread(link_or_copy)</code>.</li>
<li><strong>Fix:</strong> Batch into single thread pool task.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — batched staging operations into one <code>to_thread</code> call.</li>
</ul>
<h3 id="audit_issues-9-error-message-leak-in-tags-handler">9. Error Message Leak in Tags Handler</h3>
<ul>
<li><strong>File:</strong> <code>backend/routes/handlers/assets.py</code> (line 399)</li>
<li><strong>Issue:</strong> <code>f"Failed to update tags: {exc}"</code> exposes exception details.</li>
<li><strong>Fix:</strong> Use <code>safe_error_message(exc, "Failed to update tags")</code>.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — uses safe error message wrapper.</li>
</ul>
<hr />
<h2 id="audit_issues-medium-priority">MEDIUM PRIORITY</h2>
<h3 id="audit_issues-10-output-directory-cache-never-invalidates">10. Output Directory Cache Never Invalidates</h3>
<ul>
<li><strong>File:</strong> <code>js/app/config.js</code> (line 16)</li>
<li><strong>Issue:</strong> Output directory cached forever. If user changes it in ComfyUI, extension won't detect.</li>
<li><strong>Fix:</strong> Add cache TTL or event-driven invalidation.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — TTL cache + <code>invalidateOutputDirectoryCache()</code>.</li>
</ul>
<h3 id="audit_issues-11-race-condition-rapid-rating-clicks">11. Race Condition - Rapid Rating Clicks</h3>
<ul>
<li><strong>File:</strong> <code>js/components/RatingEditor.js</code> (line 44)</li>
<li><strong>Issue:</strong> Multiple rapid clicks trigger concurrent backend requests without locking.</li>
<li><strong>Fix:</strong> Add request-in-flight flag or debounce.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — in-flight lock + disables stars during save.</li>
</ul>
<h3 id="audit_issues-12-timer-memory-leak-in-videocontrols">12. Timer Memory Leak in VideoControls</h3>
<ul>
<li><strong>File:</strong> <code>js/components/VideoControls.js</code> (line 495)</li>
<li><strong>Issue:</strong> <code>_stepFlashTimer</code> could be orphaned if controls destroyed during timeout.</li>
<li><strong>Fix:</strong> Use AbortController for timeout cancellation.</li>
<li><strong>Status:</strong> FIXED (2026-01-24) — timer is abortable (AbortController) and cancelled on destroy; no orphaned timeouts.</li>
</ul>
<h3 id="audit_issues-13-timer-memory-leak-in-tagseditor">13. Timer Memory Leak in TagsEditor</h3>
<ul>
<li><strong>File:</strong> <code>js/components/TagsEditor.js</code> (lines 409-411)</li>
<li><strong>Issue:</strong> setTimeout stored but not cleared if element removed before timeout fires.</li>
<li><strong>Fix:</strong> Store timer reference and clear in cleanup.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — guarded timers + cleanup, plus RAF-based listener binding.</li>
</ul>
<h3 id="audit_issues-14-race-condition-file-statmtime">14. Race Condition - File Stat/Mtime</h3>
<ul>
<li><strong>File:</strong> <code>backend/routes/handlers/assets.py</code> (line 728)</li>
<li><strong>Issue:</strong> <code>stat().st_mtime</code> called after <code>resolve(strict=True)</code> - file could be deleted between operations.</li>
<li><strong>Fix:</strong> Add race condition handling with try/except.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — stat/race handled defensively.</li>
</ul>
<h3 id="audit_issues-15-unbounded-rename-counter">15. Unbounded Rename Counter</h3>
<ul>
<li><strong>File:</strong> <code>backend/routes/handlers/scan.py</code> (line 132)</li>
<li><strong>Issue:</strong> Counter-based rename collision handling has no limit - could loop indefinitely.</li>
<li><strong>Fix:</strong> Add counter limit (e.g., 1000) and return error if exceeded.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — bounded by <code>MJR_MAX_RENAME_ATTEMPTS</code> (default 1000).</li>
</ul>
<h3 id="audit_issues-16-typeerror-treated-as-retryable">16. TypeError Treated as Retryable</h3>
<ul>
<li><strong>File:</strong> <code>js/api/client.js</code> (line 66)</li>
<li><strong>Issue:</strong> TypeError includes code errors, not just network failures - masks actual bugs.</li>
<li><strong>Fix:</strong> Only retry on specific network errors (ECONNREFUSED, etc.).</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — retries only on fetch/network-like TypeError messages.</li>
</ul>
<h3 id="audit_issues-17-missing-tag-input-validation">17. Missing Tag Input Validation</h3>
<ul>
<li><strong>File:</strong> <code>js/components/TagsEditor.js</code> (line 174)</li>
<li><strong>Issue:</strong> No validation of tag content (special chars, length) on frontend.</li>
<li><strong>Fix:</strong> Add length/character restrictions before sending to backend.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — validation + max tags, blocks control chars and separators.</li>
</ul>
<h3 id="audit_issues-18-excessive-dom-updates-on-video-seek">18. Excessive DOM Updates on Video Seek</h3>
<ul>
<li><strong>File:</strong> <code>js/components/VideoControls.js</code> (lines 728-758)</li>
<li><strong>Issue:</strong> Frame labels rebuilt on every seek - O(n) DOM operations for long videos.</li>
<li><strong>Fix:</strong> Use CSS-based positioning or virtual rendering.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — seek labels rebuild is cached by key (skips rebuild when unchanged).</li>
</ul>
<h3 id="audit_issues-19-video-thumbnail-memory-management">19. Video Thumbnail Memory Management</h3>
<ul>
<li><strong>File:</strong> <code>js/components/Card.js</code> (lines 106-135)</li>
<li><strong>Issue:</strong> Up to 6 concurrent videos allowed, but no cleanup on container removal.</li>
<li><strong>Fix:</strong> Implement cleanup in IntersectionObserver disconnect.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — explicit cleanup exported and called from grid disposal.</li>
</ul>
<h3 id="audit_issues-20-duplicated-safecall-utilities">20. Duplicated safeCall Utilities</h3>
<ul>
<li><strong>Files:</strong> <code>js/features/viewer/lifecycle.js</code>, <code>panzoom.js</code>, <code>mediaFactory.js</code></li>
<li><strong>Issue:</strong> safeCall/safeAddListener implemented in multiple files.</li>
<li><strong>Fix:</strong> Extract to shared utility module <code>js/utils/safeCall.js</code>.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — shared <code>js/utils/safeCall.js</code> used by viewer modules.</li>
</ul>
<hr />
<h2 id="audit_issues-low-priority">LOW PRIORITY</h2>
<h3 id="audit_issues-21-unused-metadata_cache-table">21. Unused metadata_cache Table</h3>
<ul>
<li><strong>File:</strong> <code>backend/adapters/db/schema.py</code> (lines 73-79)</li>
<li><strong>Issue:</strong> Table appears unused in codebase - adds maintenance burden.</li>
<li><strong>Fix:</strong> Remove if confirmed unused after testing.</li>
<li><strong>Status:</strong> NOT AN ISSUE — <code>metadata_cache</code> is used by the indexing pipeline (scanner/enricher/helpers) and invalidated on asset ops.</li>
</ul>
<h3 id="audit_issues-22-magic-numbers-throughout-code">22. Magic Numbers Throughout Code</h3>
<ul>
<li><strong>Files:</strong> Multiple</li>
<li><strong>Examples:</strong></li>
<ul>
<li><code>js/entry.js</code> - <code>UI_BOOT_DELAY_MS</code> (default 1500ms) and <code>AUTO_REFRESH_DEBOUNCE_MS</code></li>
<li><code>js/entry.js</code> - <code>RAF_STABILIZE_FRAMES</code> (layout stabilization)</li>
<li><code>js/components/VideoControls.js</code> - <code>MAX_MINOR_TICKS</code> (tick cap)</li>
<li><code>backend/routes/handlers/filesystem.py</code> - <code>BG_SCAN_FAILURE_HISTORY_MAX</code> (default 50) and <code>SCAN_PENDING_MAX</code></li>
</ul>
<li><strong>Fix:</strong> Extract to named constants in config files.</li>
<li><strong>Status:</strong> FIXED (2026-01-24) - extracted thresholds/limits/timeouts into named constants (env-configurable where it makes sense); remaining numeric literals are intentional (UI styling, RGBA values, standard codes).</li>
</ul>
<h3 id="audit_issues-23-inconsistent-asset-id-type">23. Inconsistent Asset ID Type</h3>
<ul>
<li><strong>Files:</strong> Frontend modules</li>
<li><strong>Issue:</strong> assetId sometimes Number, sometimes String. RootId uses <code>root_id</code>, <code>rootId</code>, <code>custom_root_id</code>.</li>
<li><strong>Fix:</strong> Standardize on one type/naming convention throughout.</li>
<li><strong>Status:</strong> FIXED (2026-01-24) — frontend now normalizes IDs via <code>js/utils/ids.js</code> and uses <code>root_id</code> consistently; legacy aliases remain accepted at boundaries.</li>
</ul>
<h3 id="audit_issues-24-z-index-hardcoding">24. Z-Index Hardcoding</h3>
<ul>
<li><strong>File:</strong> <code>js/components/RatingEditor.js</code> (line 163)</li>
<li><strong>Issue:</strong> z-index: 2147483647 (max int32) hardcoded.</li>
<li><strong>Fix:</strong> Use CSS variable or configuration constant.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — uses shared <code>MENU_Z_INDEX</code> constant.</li>
</ul>
<h3 id="audit_issues-25-path-string-comparison-on-windows">25. Path String Comparison on Windows</h3>
<ul>
<li><strong>File:</strong> <code>backend/routes/handlers/search.py</code> (lines 299-301)</li>
<li><strong>Issue:</strong> Manual string comparison for path containment could fail with UNC paths.</li>
<li><strong>Fix:</strong> Use pathlib operations instead of string comparisons.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — uses robust path containment via <code>commonpath</code> / <code>Path</code> normalization.</li>
</ul>
<h3 id="audit_issues-26-inefficient-badge-updates">26. Inefficient Badge Updates</h3>
<ul>
<li><strong>File:</strong> <code>js/features/grid/GridView.js</code> (line 73)</li>
<li><strong>Issue:</strong> Full DOM replacement of rating badge instead of attribute updates.</li>
<li><strong>Fix:</strong> Only update text/visibility of existing badge elements.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — updates in place.</li>
</ul>
<h3 id="audit_issues-27-missing-isconnected-check">27. Missing isConnected Check</h3>
<ul>
<li><strong>File:</strong> <code>js/features/grid/GridView.js</code> (line 67)</li>
<li><strong>Issue:</strong> <code>_updateCardRatingTagsBadges</code> called without checking if card still in DOM.</li>
<li><strong>Fix:</strong> Check <code>card.isConnected</code> before mutation.</li>
<li><strong>Status:</strong> FIXED (2026-01-23) — guards with <code>card.isConnected</code>.</li>
</ul>
<h3 id="audit_issues-28-directory-listing-cache-invalidation">28. Directory Listing Cache Invalidation</h3>
<ul>
<li><strong>File:</strong> <code>backend/routes/handlers/filesystem.py</code> (lines 165-167)</li>
<li><strong>Issue:</strong> Directory mtime_ns check doesn't account for newly added files on some filesystems.</li>
<li><strong>Fix:</strong> Consider inotify/FSEvents for filesystem-based updates.</li>
<li><strong>Status:</strong> FIXED (2026-01-24) — watchdog-based invalidation token prevents stale cache when directory mtime is unreliable.</li>
</ul>
<hr />
<h2 id="audit_issues-testing-gaps">TESTING GAPS</h2>
<h3 id="audit_issues-missing-test-coverage">Missing Test Coverage</h3>
<div class="table-wrap"><table>
<thead><tr><th>Area</th><th>Priority</th></tr></thead>
<tbody>
<tr><td>Concurrent access patterns</td><td>High</td></tr>
<tr><td>Path traversal attack attempts</td><td>High</td></tr>
<tr><td>Frontend unit tests</td><td>High</td></tr>
<tr><td>Large file handling (&gt;500MB)</td><td>Medium</td></tr>
<tr><td>Symlink/junction edge cases</td><td>Medium</td></tr>
<tr><td>Unicode filename handling</td><td>Medium</td></tr>
<tr><td>Malformed request handling</td><td>Low</td></tr>
</tbody></table></div>
<hr />
<h2 id="audit_issues-configuration-recommendations">CONFIGURATION RECOMMENDATIONS</h2>
<h3 id="audit_issues-add-these-environment-variables">Add These Environment Variables</h3>
<pre><code>MJR_MAX_RENAME_ATTEMPTS=1000 # Limit for rename collision handling (implemented)\n# Recommended (not implemented yet): MJR_RATE_LIMIT_WINDOW, MJR_CLEANUP_INTERVAL, MJR_QUERY_TIMEOUT_MS</code></pre>
<hr />
<h2 id="audit_issues-quick-reference">QUICK REFERENCE</h2>
<div class="table-wrap"><table>
<thead><tr><th>Priority</th><th>Count</th><th>Estimated Effort</th></tr></thead>
<tbody>
<tr><td>Critical</td><td>0</td><td>done</td></tr>
<tr><td>High</td><td>0</td><td>done</td></tr>
<tr><td>Medium</td><td>0</td><td>done</td></tr>
<tr><td>Low</td><td>0</td><td>done</td></tr>
<tr><td><strong>Total</strong></td><td><strong>0</strong></td><td>done</td></tr>
</tbody></table></div></div>
<a class="toplink" href="#top">Back to top</a>
<div style="margin-top: 10px; font-size: 12px; color: var(--muted);">
Source: <code>docs/AUDIT_ISSUES.md</code>
</div>
</div>
</section>
<div style="text-align:center; color: var(--muted); font-size: 12px; margin-top: 10px;">
Majoor Assets Manager • Documentation • January 2026
</div>
</main>
</div>
<script>
(function(){
const q = document.getElementById('q');
const links = Array.from(document.querySelectorAll('.navlink'));
const panels = Array.from(document.querySelectorAll('section.panel.section'));
const matchesEl = document.getElementById('matches');
function escapeRegExp(s){
return (s || '').replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
function getTokens(){
const raw = (q && q.value ? q.value : '').trim();
if(!raw) return [];
return raw.split(/\s+/g).filter(Boolean);
}
function makeWordRegex(tokens){
if(!tokens.length) return null;
// Note: JS \b word-boundary is based on [A-Za-z0-9_]. Good enough for typical tags/words.
const parts = tokens.map(t => escapeRegExp(t));
return new RegExp('\\b(?:' + parts.join('|') + ')\\b', 'gi');
}
function panelMatchesAllTokens(panelText, tokens){
if(!tokens.length) return true;
const text = (panelText || '').toLowerCase();
for(const tok of tokens){
// Whole-word match using a boundary approximation.
const r = new RegExp('\\b' + escapeRegExp(tok.toLowerCase()) + '\\b', 'i');
if(!r.test(text)) return false;
}
return true;
}
function clearMarks(root){
const marks = root.querySelectorAll('mark');
for(const m of marks){
const t = document.createTextNode(m.textContent || '');
m.replaceWith(t);
}
}
function markMatches(root, tokens){
const rx = makeWordRegex(tokens);
if(!rx) return 0;
let count = 0;
const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {
acceptNode(node){
if(!node.nodeValue) return NodeFilter.FILTER_REJECT;
const p = node.parentElement;
if(!p) return NodeFilter.FILTER_REJECT;
if(p.closest('pre, code, script, style')) return NodeFilter.FILTER_REJECT;
if(!(p.closest('p, li, blockquote, h1, h2, h3, h4, h5, h6'))) return NodeFilter.FILTER_REJECT;
rx.lastIndex = 0;
return rx.test(node.nodeValue) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
}
});
const toProcess = [];
while(walker.nextNode()){
toProcess.push(walker.currentNode);
if(toProcess.length > 350) break; // safety
}
for(const node of toProcess){
const text = node.nodeValue || '';
rx.lastIndex = 0;
let m;
let last = 0;
const frag = document.createDocumentFragment();
let changed = false;
while((m = rx.exec(text)) !== null){
const start = m.index;
const end = start + (m[0] ? m[0].length : 0);
if(end <= start) break;
if(start > last) frag.appendChild(document.createTextNode(text.slice(last, start)));
const hit = document.createElement('mark');
hit.textContent = text.slice(start, end);
frag.appendChild(hit);
count += 1;
changed = true;
last = end;
if(count > 800) break;
}
if(changed){
if(last < text.length) frag.appendChild(document.createTextNode(text.slice(last)));
node.parentNode.replaceChild(frag, node);
}
if(count > 800) break;
}
return count;
}
function applyFilter(){
const tokens = getTokens();
let visiblePanels = 0;
let marked = 0;
for(const p of panels){
clearMarks(p);
const t = (p.textContent || '');
const ok = panelMatchesAllTokens(t, tokens);
p.style.display = ok ? '' : 'none';
if(ok){
visiblePanels += 1;
if(tokens.length) marked += markMatches(p, tokens);
}
}
for(const a of links){
const href = a.getAttribute('href') || '';
const id = href.startsWith('#') ? href.slice(1) : '';
if(!tokens.length || id === 'top'){
a.style.display = '';
continue;
}
const target = id ? document.getElementById(id) : null;
a.style.display = (target && target.style.display !== 'none') ? '' : 'none';
}
if(matchesEl){
matchesEl.textContent = tokens.length ? ('Matches: ' + marked + ' • Sections: ' + visiblePanels) : ('Sections: ' + panels.length);
}
}
if(q){
q.addEventListener('input', () => {
applyFilter();
});
}
for(const a of links){
a.addEventListener('click', (e) => {
const href = a.getAttribute('href') || '';
if(href.startsWith('#')){
const id = href.slice(1);
const el = document.getElementById(id);
if(el){
e.preventDefault();
el.scrollIntoView({behavior:'smooth', block:'start'});
history.replaceState(null, '', href);
}
}
});
}
// Allow ?q=... deep-linking
try{
const u = new URL(window.location.href);
const qq = (u.searchParams.get('q') || '').trim();
if(q && qq){
q.value = qq;
}
}catch(_){}
applyFilter();
})();
</script>
</body>
</html>