Add custom nodes, Civitai loras (LFS), and vast.ai setup script
Some checks failed
Python Linting / Run Ruff (push) Has been cancelled
Python Linting / Run Pylint (push) Has been cancelled
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.10, [self-hosted Linux], stable) (push) Has been cancelled
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.11, [self-hosted Linux], stable) (push) Has been cancelled
Full Comfy CI Workflow Runs / test-stable (12.1, , linux, 3.12, [self-hosted Linux], stable) (push) Has been cancelled
Full Comfy CI Workflow Runs / test-unix-nightly (12.1, , linux, 3.11, [self-hosted Linux], nightly) (push) Has been cancelled
Execution Tests / test (macos-latest) (push) Has been cancelled
Execution Tests / test (ubuntu-latest) (push) Has been cancelled
Execution Tests / test (windows-latest) (push) Has been cancelled
Test server launches without errors / test (push) Has been cancelled
Unit Tests / test (macos-latest) (push) Has been cancelled
Unit Tests / test (ubuntu-latest) (push) Has been cancelled
Unit Tests / test (windows-2022) (push) Has been cancelled

Includes 30 custom nodes committed directly, 7 Civitai-exclusive
loras stored via Git LFS, and a setup script that installs all
dependencies and downloads HuggingFace-hosted models on vast.ai.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-09 00:55:26 +00:00
parent 2b70ab9ad0
commit f09734b0ee
2274 changed files with 748556 additions and 3 deletions

View File

@@ -0,0 +1,156 @@
:not(#fakeid) .rgthree-button-reset {
position: relative;
appearance: none;
cursor: pointer;
border: 0;
background: transparent;
color: inherit;
padding: 0;
margin: 0;
}
$borderRadius: 0.33rem;
:not(#fakeid) .rgthree-button {
--padding-top: 7px;
--padding-bottom: 9px;
--padding-x: 16px;
position: relative;
cursor: pointer;
border: 0;
border-radius: $borderRadius;
background: rgba(0, 0, 0, 0.5);
color: white;
font-family: system-ui, sans-serif;
font-size: calc(16rem / 16);
line-height: 1;
white-space: nowrap;
text-decoration: none;
margin: 0.25rem;
box-shadow: 0px 0px 2px rgb(0, 0, 0);
background: #212121;
transition: all 0.1s ease-in-out;
padding: var(--padding-top) var(--padding-x) var(--padding-bottom);
display: inline-flex;
flex-direction: row;
align-items: center;
justify-content: center;
&::before,
&::after {
content: "";
display: block;
position: absolute;
border-radius: $borderRadius;
left: 0;
top: 0;
width: 100%;
height: 100%;
box-shadow:
inset 1px 1px 0px rgba(255, 255, 255, 0.12),
inset -1px -1px 0px rgba(0, 0, 0, 0.75);
background: linear-gradient(to bottom, rgba(255, 255, 255, 0.06), rgba(0, 0, 0, 0.15));
mix-blend-mode: screen;
}
&::after {
mix-blend-mode: multiply;
}
&:hover {
background: #303030;
}
&:active {
box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);
background: #121212;
padding: calc(var(--padding-top) + 1px) calc(var(--padding-x) - 1px)
calc(var(--padding-bottom) - 1px) calc(var(--padding-x) + 1px);
}
&:active::before,
&:active::after {
box-shadow:
1px 1px 0px rgba(255, 255, 255, 0.15),
inset 1px 1px 0px rgba(0, 0, 0, 0.5),
inset 1px 3px 5px rgba(0, 0, 0, 0.33);
}
&.-blue {
background: #346599 !important;
}
&.-blue:hover {
background: #3b77b8 !important;
}
&.-blue:active {
background: #1d5086 !important;
}
&.-green {
background: linear-gradient(to bottom, rgba(255, 255, 255, 0.06), rgba(0, 0, 0, 0.15)), #14580b;
}
&.-green:hover {
background: linear-gradient(to bottom, rgba(255, 255, 255, 0.06), rgba(0, 0, 0, 0.15)), #1a6d0f;
}
&.-green:active {
background: linear-gradient(to bottom, rgba(0, 0, 0, 0.15), rgba(255, 255, 255, 0.06)), #0f3f09;
}
&[disabled] {
box-shadow: none;
background: #666 !important;
color: #aaa;
pointer-events: none;
}
&[disabled]::before,
&[disabled]::after {
display: none;
}
}
:not(#fakeid) .rgthree-comfybar-top-button-group {
font-size: 0;
flex: 1 1 auto;
display: flex;
align-items: stretch;
.rgthree-comfybar-top-button {
margin: 0;
flex: 1 1;
height: 36px;
padding: 0 12px;
border-radius: 0;
background: var(--p-button-secondary-background);
color: var(--p-button-secondary-color);
&.-primary {
background: var(--p-button-primary-background);
color: var(--p-button-primary-color);
}
&::before,
&::after {
border-radius: 0;
}
svg {
fill: currentColor;
width: 28px;
height: 28px;
}
}
.rgthree-comfybar-top-button:first-of-type,
.rgthree-comfybar-top-button:first-of-type::before,
.rgthree-comfybar-top-button:first-of-type::after {
border-top-left-radius: 0.33rem;
border-bottom-left-radius: 0.33rem;
}
.rgthree-comfybar-top-button:last-of-type,
.rgthree-comfybar-top-button:last-of-type::before,
.rgthree-comfybar-top-button:last-of-type::after {
border-top-right-radius: 0.33rem;
border-bottom-right-radius: 0.33rem;
}
}

View File

@@ -0,0 +1,129 @@
.rgthree-dialog {
outline: 0;
border: 0;
border-radius: 6px;
background: #414141;
color: #fff;
box-shadow:
inset 1px 1px 0px rgba(255, 255, 255, 0.05),
inset -1px -1px 0px rgba(0, 0, 0, 0.5),
2px 2px 20px rgb(0, 0, 0);
max-width: 800px;
box-sizing: border-box;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-size: 1rem;
padding: 0;
max-height: calc(100% - 32px);
*, *::before, *::after {
box-sizing: inherit;
}
}
.rgthree-dialog-container {
// padding: 16px;
> * {
padding: 8px 16px;
&:first-child {
padding-top: 16px;
}
&:last-child {
padding-bottom: 16px;
}
}
}
.rgthree-dialog.-iconed::after {
content: "";
font-size: 276px;
position: absolute;
right: 0px;
bottom: 0px;
opacity: 0.15;
display: block;
width: 237px;
overflow: hidden;
height: 186px;
line-height: 1;
pointer-events: none;
z-index: -1;
}
.rgthree-dialog.-iconed.-help::after {
content: "🛟";
}
.rgthree-dialog.-iconed.-settings::after {
content: "⚙️";
}
@media (max-width: 832px) {
.rgthree-dialog {
max-width: calc(100% - 32px);
}
}
.rgthree-dialog-container-title {
display: flex;
flex-direction: row;
align-items: center;
justify-content: start;
}
.rgthree-dialog-container-title > svg:first-child {
width: 36px;
height: 36px;
margin-right: 16px;
}
.rgthree-dialog-container-title h2 {
font-size: calc(22rem / 16);
margin: 0;
font-weight: bold;
}
.rgthree-dialog-container-title h2 small {
font-size: calc(13rem / 16);
font-weight: normal;
opacity: 0.75;
}
.rgthree-dialog-container-content {
overflow: auto;
max-height: calc(100vh - 200px); /* Arbitrary height to copensate for margin, title, and footer.*/
}
.rgthree-dialog-container-content p {
font-size: calc(13rem / 16);
margin-top: 0;
}
.rgthree-dialog-container-content ul li p {
margin-bottom: 4px;
}
.rgthree-dialog-container-content ul li p + p {
margin-top: 0.5em;
}
.rgthree-dialog-container-content ul li ul {
margin-top: 0.5em;
margin-bottom: 1em;
}
.rgthree-dialog-container-content p code {
display: inline-block;
padding: 2px 4px;
margin: 0px 2px;
border: 1px solid rgba(255, 255, 255, 0.25);
border-radius: 3px;
background: rgba(255, 255, 255, 0.1);
}
.rgthree-dialog-container-footer {
display: flex;
align-items: center;
justify-content: center;
}
body.rgthree-dialog-open > *:not(.rgthree-dialog):not(.rgthree-top-messages-container) {
filter: blur(5px);
}

View File

@@ -0,0 +1,161 @@
.rgthree-lora-chooser-dialog {
max-width: 100%;
.rgthree-dialog-container-title {
display: flex;
flex-direction: column;
}
.rgthree-dialog-container-title h2 {
display: flex;
width: 100%;
}
.rgthree-lora-chooser-search {
margin-left: auto;
border-radius: 50px;
width: 50%;
max-width: 170px;
padding: 2px 8px;
}
.rgthree-lora-chooser-header {
display: flex;
flex-direction: row;
}
.rgthree-lora-filters-container {
svg {width: 16px; height: 16px;}
}
.rgthree-dialog-container-content {
width: 80vw;
height: 80vh;
}
.rgthree-button-reset {
width: 32px;
height: 32px;
> svg {width: 100%; height: 100%;}
}
ul.rgthree-lora-chooser-list {
list-style: none;
margin: 0;
padding: 0;
position: relative;
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-items: start;
justify-content: space-around;
> li {
position: relative;
flex: 0 0 auto;
width: 170px;
max-width: 100%;
margin: 8px 8px 16px;
label {
position: absolute;
display: block;
inset: 0;
z-index: 3;
cursor: pointer;
}
input[type="checkbox"] {
position: absolute;
right: 8px;
top: 8px;
margin: 0;
z-index: 2;
appearance: none;
background-color: #fff;
width: 48px;
height: 48px;
border-radius: 4px;
border: 1px solid rgba(120,120,120,1);
opacity: 0;
transition: opacity 0.15s ease-in-out;
&:checked {
opacity: 1;
background: #0060df;
&::before {
content: "";
display: block;
width: 100%;
height: 100%;
box-shadow: inset 100px 100px #fff;
clip-path: polygon(40.13% 68.39%, 23.05% 51.31%, 17.83% 48.26%, 12.61% 49.57%, 9.57% 53.04%, 8% 60%, 34.13% 85.87%, 39.82% 89.57%, 45.88% 86.73%, 90.66% 32.39%, 88.92% 26.1%, 83.03% 22.17%, 76.94% 22.62%)
}
}
}
figure {
position: relative;
display: block;
margin: 0 0 8px;
padding: 0;
border: 1px solid rgba(120, 120, 120, .8);
background: rgba(120, 120, 120, .5);
width: 100%;
padding-top: 120%;
transition: box-shadow 0.15s ease-in-out;
opacity: 0.75;
&::after {
content: '';
display: block;
position: absolute;
inset: 0;
}
&:empty {
&::before {
content: 'No image.';
color: rgba(200, 200, 200, .8);
position: absolute;
display: block;
inset: 0;
font-size: 1.2em;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
}
}
> img, > video {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
object-fit: cover;
}
}
div {
word-wrap: break-word;
font-size: 0.8rem;
opacity: 0.75;
}
&:hover figure::after{
box-shadow: 0px 2px 6px rgba(0,0,0,0.75);
}
:checked ~ figure::after {
box-shadow: 0 0 5px #fff, 0px 0px 15px rgba(49, 131, 255, 0.88), inset 0 0 3px #fff, inset 0px 0px 5px rgba(49, 131, 255, 0.88)
}
&:hover *,
&:hover input[type="checkbox"],
:checked ~ * {
opacity: 1
}
}
}
}

View File

@@ -0,0 +1,400 @@
.rgthree-info-dialog {
width: 90vw;
max-width: 960px;
.rgthree-info-area {
list-style: none;
padding: 0;
margin: 0;
display: flex;
> li {
display: inline-flex;
margin: 0;
vertical-align: top;
+ li {
margin-left: 6px;
}
&:not(.-link) + li.-link {
margin-left: auto;
}
&.rgthree-info-tag > * {
min-height: 24px;
border-radius: 4px;
line-height: 1;
color: rgba(255,255,255,0.85);
background: rgb(69, 92, 85);;
font-size: 14px;
font-weight: bold;
text-decoration: none;
display: flex;
height: 1.6em;
padding-left: .5em;
padding-right: .5em;
padding-bottom: .1em;
align-content: center;
justify-content: center;
align-items: center;
box-shadow: inset 0px 0px 0 1px rgba(0, 0, 0, 0.5);
> svg {
width: 16px;
height: 16px;
&:last-child {
margin-left: .5em;
}
}
&[href] {
box-shadow: inset 0px 1px 0px rgba(255,255,255,0.25), inset 0px -1px 0px rgba(0,0,0,0.66);
}
&:empty {
display: none;
}
}
// &.-civitai > * {
// color: #ddd;
// background: #1b65aa;
// transition: all 0.15s ease-in-out;
// &:hover {
// color: #fff;
// border-color: #1971c2;
// background: #1971c2;
// }
// }
&.-type > * {
background: rgb(73, 54, 94);
color: rgb(228, 209, 248);
}
&.rgthree-info-menu {
margin-left: auto;
:not(#fakeid) & .rgthree-button {
margin: 0;
min-height: 24px;
padding: 0 12px;
}
svg {
width: 16px;
height: 16px;
}
}
}
}
.rgthree-info-table {
border-collapse: collapse;
margin: 16px 0px;
width: 100%;
font-size: 12px;
tr.editable button {
display: flex;
width: 28px;
height: 28px;
align-items: center;
justify-content: center;
svg + svg {display: none;}
}
tr.editable.-rgthree-editing button {
svg {display: none;}
svg + svg {display: inline-block;}
}
td {
position: relative;
border: 1px solid rgba(255,255,255,0.25);
padding: 0;
vertical-align: top;
&:first-child {
background: rgba(255,255,255,0.075);
width: 10px; // Small, so it doesn't adjust.
> *:first-child {
white-space: nowrap;
padding-right: 32px;
}
small {
display: block;
margin-top: 2px;
opacity: 0.75;
> [data-action] {
text-decoration: underline;
cursor: pointer;
&:hover {
text-decoration: none;
}
}
}
}
a, a:hover, a:visited {
color: inherit;
}
svg {
width: 1.3333em;
height: 1.3333em;
vertical-align: -0.285em;
&.logo-civitai {
margin-right: 0.3333em;
}
}
> *:first-child {
display: block;
padding: 6px 10px;
}
> input, > textarea{
padding: 5px 10px;
border: 0;
box-shadow: inset 1px 1px 5px 0px rgba(0,0,0,0.5);
font: inherit;
appearance: none;
background: #fff;
color: #121212;
resize: vertical;
&:only-child {
width: 100%;
}
}
:not(#fakeid) & .rgthree-button[data-action="fetch-civitai"] {
font-size: inherit;
padding: 6px 16px;
margin: 2px;
}
}
tr[data-field-name="userNote"] td > span:first-child {
white-space: pre;
}
tr.rgthree-info-table-break-row td {
border: 0;
background: transparent;
padding: 12px 4px 4px;
font-size: 1.2em;
> small {
font-style: italic;
opacity: 0.66;
}
&:empty {
padding: 4px;
}
}
td .-help {
border: 1px solid currentColor;
position: absolute;
right: 5px;
top: 6px;
line-height: 1;
font-size: 11px;
width: 12px;
height: 12px;
border-radius: 8px;
display: flex;
align-content: center;
justify-content: center;
cursor: help;
&::before {
content: '?';
}
}
td > ul.rgthree-info-trained-words-list {
list-style: none;
padding: 2px 8px;
margin: 0;
display: flex;
flex-direction: row;
flex-wrap: wrap;
max-height: 15vh;
overflow: auto;
> li {
display: inline-flex;
margin: 2px;
vertical-align: top;
border-radius: 4px;
line-height: 1;
color: rgba(255,255,255,0.85);
background: rgb(73, 91, 106);
font-size: 1.2em;
font-weight: 600;
text-decoration: none;
display: flex;
height: 1.6em;
align-content: center;
justify-content: center;
align-items: center;
box-shadow: inset 0px 0px 0 1px rgba(0, 0, 0, 0.5);
cursor: pointer;
white-space: nowrap;
max-width: 183px;
&:hover {
background: rgb(68, 109, 142);
}
> svg {
width: auto;
height: 1.2em;
}
> span {
padding-left: .5em;
padding-right: .5em;
padding-bottom: .1em;
text-overflow: ellipsis;
overflow: hidden;
}
> small {
align-self: stretch;
display: flex;
align-items: center;
justify-content: center;
padding: 0 0.5em;
background: rgba(0,0,0,0.2);
}
&.-rgthree-is-selected {
background: rgb(42, 126, 193);
}
}
}
}
.rgthree-info-images {
list-style:none;
padding:0;
margin:0;
scroll-snap-type: x mandatory;
display:flex;
flex-direction:row;
overflow: auto;
> li {
scroll-snap-align: start;
max-width: 90%;
flex: 0 0 auto;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
overflow: hidden;
padding: 0;
margin: 6px;
font-size: 0;
position: relative;
figure {
margin: 0;
position: static;
video, img {
max-height: 45vh;
}
figcaption {
position: absolute;
left: 0;
width: 100%;
bottom: 0;
padding: 12px;
font-size: 12px;
background: rgba(0,0,0,0.85);
opacity: 0;
transform: translateY(50px);
transition: all 0.25s ease-in-out;
> span {
display: inline-block;
padding: 2px 4px;
margin: 2px;
border-radius: 2px;
border: 1px solid rgba(255,255,255,0.2);
word-break: break-word;
label {
display: inline;
padding: 0;
margin: 0;
opacity: 0.5;
pointer-events: none;
user-select: none;
}
a {
color: inherit;
text-decoration: underline;
&:hover {
text-decoration: none;
}
svg {
height: 10px;
margin-left: 4px;
fill: currentColor;
}
}
}
&:empty {
text-align: center;
&::before {
content: 'No data.';
}
}
}
}
&:hover figure figcaption {
opacity: 1;
transform: translateY(0px);
}
.rgthree-info-table {
width: calc(100% - 16px);
}
}
}
.rgthree-info-civitai-link {
margin: 8px;
color: #eee;
a, a:hover, a:visited {
color: inherit;
text-decoration: none;
}
> svg {
width: 16px;
height: 16px;
margin-right: 8px;
}
}
}

View File

@@ -0,0 +1,122 @@
.rgthree-menu {
list-style: none;
padding: 0;
margin: 0;
position: fixed;
z-index: 999999;
pointer-events: none;
opacity: 0;
transition: opacity 0.08s ease-in-out;
color: #dde;
background-color: #111;
font-size: 12px;
box-shadow: 0 0 10px black !important;
> li {
position: relative;
padding: 4px 6px;
z-index: 9999;
white-space: nowrap;
&[role="button"] {
background-color: var(--comfy-menu-bg) !important;
color: var(--input-text);
cursor: pointer;
&:hover {
filter: brightness(155%);
}
}
}
&[state^="measuring"] {
display: block;
opacity: 0;
}
&[state="open"] {
display: block;
opacity: 1;
pointer-events: all;
}
}
.rgthree-top-menu {
box-sizing: border-box;
white-space: nowrap;
background: var(--content-bg);
color: var(--content-fg);
display: flex;
flex-direction: column;
list-style: none;
padding: 0;
margin: 0;
* {
box-sizing: inherit;
}
> li:not(#fakeid) {
list-style: none;
padding: 0;
margin: 0;
position: relative;
z-index: 2;
> button {
cursor: pointer;
padding: 8px 12px 8px 8px;
width: 100%;
text-align: start;
display: flex;
flex-direction: row;
align-items: center;
justify-content: start;
&:hover {
background-color: var(--comfy-input-bg);
}
svg {
height: 16px;
width: auto;
margin-inline-end: 0.6em;
&.github-star {
fill: rgb(227, 179, 65);
}
}
}
&.rgthree-message {
// ComfyUI's code has strange behavior that that always puts the popupat to if its less than
// 30px... we'll force our message to be at least 32px tall so it won't do that unless it's
// actually on the bottom.
min-height: 32px;
> span {
padding: 8px 12px;
display: block;
width: 100%;
text-align: center;
font-style: italic;
font-size: 12px;
}
}
}
&.-modal::after {
content: '';
display: block;
position: fixed;
z-index: 1;
inset: 0;
background: #0001;
}
}
body.rgthree-modal-menu-open > *:not(.rgthree-menu):not(.rgthree-top-messages-container) {
filter: blur(2px);
}

View File

@@ -0,0 +1,69 @@
html, body {
}
html {
font-size: 100%;
overflow-y: scroll;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
box-sizing: border-box;
}
*, *:before, *:after {
box-sizing: inherit
}
:root {
--header-height: 56px;
--progress-height: 12px;
}
button {
all: unset;
}
.-bevel {
position: relative;
}
.-bevel::before {
content: '';
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
border: 1px solid red;
border-color: rgba(255,255,255,0.15) rgba(255,255,255,0.15) rgba(0,0,0,0.5) rgba(0,0,0,0.5);
z-index: 5;
pointer-events: none;
}
body {
background: #202020;
font-family: Arial, sans-serif;
font-size: calc(16 * 0.0625rem);
font-weight: 400;
margin: 0;
padding-top: calc(var(--header-height) + var(--progress-height));
color: #ffffff;
display: flex;
flex-direction: column;
align-items: center;
justify-content: start;
}
.app-header {
height: var( --header-height);
padding: 0;
position: fixed;
z-index: 99;
top: 0;
left: 0;
width: 100%;
background: #353535;
display: flex;
flex-direction: row;
align-items: center;
justify-content: start;
}