Compare commits

...

10 Commits

Author SHA1 Message Date
Will Miao
908464bc0a docs: remove inline release notes from README (now maintained via GitHub Releases) 2026-05-06 22:40:06 +08:00
willmiao
0ffee3a854 docs: auto-update supporters list in README 2026-05-06 10:29:43 +00:00
Will Miao
8aa9739c44 data: refresh supporters from license server (739 supporters, includes Patreon data) 2026-05-06 18:29:21 +08:00
Will Miao
50739bbb43 fix(css): remove dead CSS properties causing Biome errors
- batch-import-modal.css: add generic font family fallback to Font Awesome
- card.css: remove dead margin-left overridden by shorthand margin: 0
- shared.css: remove duplicate position: absolute overridden by position: fixed
2026-05-06 09:33:15 +08:00
Will Miao
e849303763 fix(header): eliminate search input focus layout shift and reduce focus ring size
- Remove transform: translateY(-1px) that caused layout shift on focus
- Reduce box-shadow focus ring from 2px to 1px for subtler appearance
- Tone down drop-shadow from 4px/16px to 2px/8px (matches base state)
2026-05-06 09:33:04 +08:00
Will Miao
241b2e15d2 docs: update extension image URL 2026-05-05 22:26:40 +08:00
Will Miao
88da754504 docs: migrate wiki-images to wiki repo, remove stale docs
Moved wiki-images to the wiki repo (willmiao/ComfyUI-Lora-Manager.wiki). Updated README.md image reference to use wiki raw URL. Removed docs/LM-Extension-Wiki.md (superseded by wiki pages).
2026-05-05 22:20:19 +08:00
Will Miao
b4a706651f feat(delete-model-version): add GET endpoint to delete a model version by version ID 2026-05-05 21:25:08 +08:00
pixelpaws
ff7cc6d9bb Merge pull request #921 from 1756141021/fix/drag-strength-notify-setValue
fix: commit dragged strength through options.setValue at drag end
2026-05-05 16:20:48 +08:00
hein
454210a47c fix: commit dragged strength through options.setValue at drag end
During drag, handleStrengthDrag is called with updateWidget=false, which
mutates widgetValue in-place via parseLoraValue's direct array reference,
bypassing widget.value setter and options.setValue entirely.

endDrag only called renderFunction for a DOM refresh, but never flushed the
mutation through options.setValue. Any external observer that wraps
options.setValue (e.g. ComfyUI Mirror Panel's bidirectional sync) would
therefore never see the dragged value and would treat the widget as unchanged.

Fix: replace the explicit renderFunction call with widget.value = widget.value.
This flushes the in-place mutation through the setter (options.setValue), which
re-renders the DOM internally AND notifies all setValue wrappers. Also fire
widget.callback for parity with the updateWidget=true path in handleStrengthDrag.

Applies the same fix to initHeaderDrag (proportional all-LoRA header drag).
2026-05-04 22:40:30 +08:00
25 changed files with 421 additions and 580 deletions

136
README.md

File diff suppressed because one or more lines are too long

View File

@@ -12,33 +12,39 @@
"2018cfh", "2018cfh",
"W+K+White", "W+K+White",
"wackop", "wackop",
"Takkan", "Phil",
"Carl G.", "Carl G.",
"Arlecchino Shion",
"stone9k",
"$MetaSamsara", "$MetaSamsara",
"itismyelement", "itismyelement",
"Gingko Biloba",
"onesecondinosaur", "onesecondinosaur",
"stone9k", "Takkan",
"Charles Blakemore",
"Rob Williams",
"Rosenthal", "Rosenthal",
"Francisco Tatis", "Francisco Tatis",
"Tobi_Swagg",
"Andrew Wilson", "Andrew Wilson",
"Greybush", "Greybush",
"Gooohokrbe",
"Ricky Carter", "Ricky Carter",
"JongWon Han", "JongWon Han",
"OldBones",
"VantAI", "VantAI",
"runte3221", "runte3221",
"Illrigger",
"FreelancerZ", "FreelancerZ",
"Edgar Tejeda", "Edgar Tejeda",
"Jorge Hussni",
"Liam MacDougal", "Liam MacDougal",
"Fraser Cross", "Fraser Cross",
"Polymorphic Indeterminate", "Polymorphic Indeterminate",
"Birdy",
"Marc Whiffen", "Marc Whiffen",
"Jorge Hussni", "Birdy",
"Kiba",
"Skalabananen", "Skalabananen",
"Kiba",
"Reno Lam", "Reno Lam",
"Mozzel",
"sig", "sig",
"Christian Byrne", "Christian Byrne",
"DM", "DM",
@@ -46,39 +52,41 @@
"Estragon", "Estragon",
"J\\B/ 8r0wns0n", "J\\B/ 8r0wns0n",
"Snaggwort", "Snaggwort",
"Arlecchino Shion",
"Charles Blakemore",
"Rob Williams",
"ClockDaemon", "ClockDaemon",
"Jonathan Ross",
"KD", "KD",
"Omnidex", "Omnidex",
"Nazono_hito",
"Tyler Trebuchon", "Tyler Trebuchon",
"Release Cabrakan", "Release Cabrakan",
"Tobi_Swagg", "contrite831",
"SG", "SG",
"carozzz", "carozzz",
"James Dooley", "James Dooley",
"zenbound", "zenbound",
"Buzzard", "Buzzard",
"jmack", "jmack",
"Adam Shaw",
"Mark Corneglio", "Mark Corneglio",
"SarcasticHashtag", "SarcasticHashtag",
"Cosmosis", "Anthony Rizzo",
"iamresist", "iamresist",
"Gooohokrbe",
"RedrockVP", "RedrockVP",
"Wolffen", "Wolffen",
"FloPro4Sho",
"James Todd", "James Todd",
"OldBones",
"Steven Pfeiffer", "Steven Pfeiffer",
"Tim", "Tim",
"Timmy",
"Johnny",
"Lisster", "Lisster",
"Michael Wong", "Michael Wong",
"Illrigger", "whudunit",
"Tom Corrigan", "Tom Corrigan",
"dl0901dm",
"JackieWang", "JackieWang",
"fnkylove", "fnkylove",
"Julian V",
"Steven Owens",
"Yushio", "Yushio",
"Vik71it", "Vik71it",
"Echo", "Echo",
@@ -86,147 +94,137 @@
"Robert Stacey", "Robert Stacey",
"PM", "PM",
"Todd Keck", "Todd Keck",
"Mozzel", "Briton Heilbrun",
"Gingko Biloba", "Aleksander Wujczyk",
"Sterilized",
"BadassArabianMofo", "BadassArabianMofo",
"Sterilized",
"Pascal Dahle", "Pascal Dahle",
"quarz", "quarz",
"Greg",
"Penfore", "Penfore",
"Greg",
"JSST", "JSST",
"esthe",
"lmsupporter", "lmsupporter",
"IamAyam", "zounic",
"wfpearl", "wfpearl",
"Baekdoosixt", "Baekdoosixt",
"Jonathan Ross",
"Jack B Nimble", "Jack B Nimble",
"Nazono_hito",
"Melville Parrish", "Melville Parrish",
"daniel dove", "daniel dove",
"Lustre", "Lustre",
"JW Sin", "JW Sin",
"contrite831",
"Alex", "Alex",
"bh", "bh",
"confiscated Zyra",
"Marlon Daniels", "Marlon Daniels",
"Starkselle", "Starkselle",
"Aaron Bleuer", "Aaron Bleuer",
"LacesOut!", "LacesOut!",
"greebles", "greebles",
"Adam Shaw", "Cosmosis",
"Tee Gee",
"Anthony Rizzo",
"tarek helmi",
"M Postkasse", "M Postkasse",
"FloPro4Sho",
"ASLPro3D", "ASLPro3D",
"Jacob Hoehler", "Jacob Hoehler",
"FinalyFree", "FinalyFree",
"Weasyl", "Weasyl",
"Timmy", "Lex Song",
"Johnny",
"Cory Paza", "Cory Paza",
"Tak", "Tak",
"Gonzalo Andre Allendes Lopez", "Gonzalo Andre Allendes Lopez",
"Zach Gonser", "Zach Gonser",
"Big Red", "Big Red",
"whudunit", "Jimmy Ledbetter",
"Luc Job", "Luc Job",
"dl0901dm",
"Philip Hempel", "Philip Hempel",
"corde", "corde",
"Nick Walker", "Nick Walker",
"lh qwe", "Julian V",
"Steven Owens",
"Bishoujoker", "Bishoujoker",
"conner",
"aai", "aai",
"Briton Heilbrun",
"Tori", "Tori",
"wildnut", "wildnut",
"Princess Bright Eyes",
"AbstractAss",
"Felipe dos Santos",
"ViperC",
"jean jahren", "jean jahren",
"Aleksander Wujczyk",
"AM Kuro", "AM Kuro",
"Markus", "ViperC",
"S Sang", "Ran C",
"Sangheili460",
"MagnaInsomnia",
"Karl P.", "Karl P.",
"Akira_HentAI", "Akira_HentAI",
"MagnaInsomnia",
"Gordon Cole", "Gordon Cole",
"yuxz69", "yuxz69",
"Douglas Gaspar", "esthe",
"AlexDuKaNa",
"George",
"andrew.tappan", "andrew.tappan",
"dw",
"N/A", "N/A",
"The Spawn", "The Spawn",
"Phil",
"graysock", "graysock",
"Pozadine1",
"Greenmoustache", "Greenmoustache",
"zounic",
"fancypants", "fancypants",
"IamAyam",
"Eldithor",
"Joboshy",
"Digital", "Digital",
"JaxMax", "JaxMax",
"takyamtom", "takyamtom",
"奚明 刘", "Bohemian Corporal",
"Dan",
"confiscated Zyra",
"Jwk0205", "Jwk0205",
"Bro Xie", "Bro Xie",
"준희 김", "yer fey",
"batblue", "batblue",
"carey6409", "carey6409",
"Olive", "Olive",
"太郎 ゲーム", "太郎 ゲーム",
"Tee Gee",
"Some Guy Named Barry", "Some Guy Named Barry",
"jinxedx",
"tarek helmi",
"Max Marklund", "Max Marklund",
"Tomohiro Baba",
"David Ortega",
"AELOX", "AELOX",
"Dankin",
"Nicfit23", "Nicfit23",
"Noora",
"wamekukyouzin", "wamekukyouzin",
"drum matthieu", "drum matthieu",
"Dogmaster", "Dogmaster",
"Matt Wenzel", "Matt Wenzel",
"Mattssn", "Frank Nitty",
"Lex Song", "Pronredn",
"John Saveas",
"Christopher Michel", "Christopher Michel",
"Serge Bekenkamp", "Serge Bekenkamp",
"Jimmy Ledbetter", "DougPeterson",
"LeoZero", "LeoZero",
"Antonio Pontes", "Antonio Pontes",
"ApathyJones", "ApathyJones",
"nahinahi9", "nahinahi9",
"lh qwe",
"Kevin John Duck",
"conner",
"Dustin Chen", "Dustin Chen",
"dan", "dan",
"Yaboi", "Blackfish95",
"Mouthlessman", "Mouthlessman",
"Steam Steam", "Princess Bright Eyes",
"Damon Cunliffe", "Paul Kroll",
"CryptoTraderJK", "AbstractAss",
"Davaitamin",
"otaku fra", "otaku fra",
"Ran C", "Felipe dos Santos",
"tedcor", "Bas Imagineer",
"Fotek Design", "Markus",
"MiraiKuriyamaSy",
"Adam Taylor", "Adam Taylor",
"Douglas Gaspar",
"Weird_With_A_Beard", "Weird_With_A_Beard",
"MadSpin", "AlexDuKaNa",
"Pozadine1", "George",
"dw",
"Qarob", "Qarob",
"AIGooner", "AIGooner",
"inbijiburu",
"Luc", "Luc",
"ProtonPrince", "ProtonPrince",
"DiffDuck", "DiffDuck",
"elu3199", "elu3199",
"Nick “Loadstone” D",
"Hasturkun", "Hasturkun",
"Jon Sandman", "Jon Sandman",
"Ubivis", "Ubivis",
@@ -234,54 +232,45 @@
"thesoftwaredruid", "thesoftwaredruid",
"wundershark", "wundershark",
"mr_dinosaur", "mr_dinosaur",
"Tyrswood",
"linnfrey", "linnfrey",
"Gamalonia",
"Vir",
"Pkrsky", "Pkrsky",
"Joboshy", "奚明 刘",
"Bohemian Corporal",
"Dan",
"Josef Lanzl", "Josef Lanzl",
"Seth Christensen", "Nerezza",
"Griffin Dahlberg", "Griffin Dahlberg",
"Draven T", "준희 김",
"yer fey",
"Error_Rule34_Not_found", "Error_Rule34_Not_found",
"Gerald Welly", "Gerald Welly",
"Roslynd", "Roslynd",
"Geolog", "Geolog",
"jinxedx",
"Neco28", "Neco28",
"Aquatic Coffee", "Tomohiro Baba",
"Dankin", "David Ortega",
"ethanfel", "Noora",
"Cristian Vazquez", "Cristian Vazquez",
"Frank Nitty", "Mattssn",
"Magic Noob", "Magic Noob",
"Focuschannel",
"DougPeterson",
"Jeff", "Jeff",
"Bruce", "Bruce",
"Kevin John Duck",
"Anthony Faxlandez",
"Kevin Christopher", "Kevin Christopher",
"Ouro Boros", "Ouro Boros",
"Blackfish95", "Chad Idk",
"Yaboi",
"dd", "dd",
"Paul Kroll", "Steam Steam",
"MiraiKuriyamaSy", "CryptoTraderJK",
"semicolon drainpipe", "Davaitamin",
"Thesharingbrother", "Dušan Ryban",
"Bas Imagineer", "tedcor",
"Pat Hen", "Fotek Design",
"sjon kreutz",
"John Statham", "John Statham",
"ResidentDeviant", "MadSpin",
"Nihongasuki", "Metryman55",
"JC", "inbijiburu",
"Prompt Pirate",
"uwutismxd",
"decoy", "decoy",
"Tyrswood", "Nick “Loadstone” D",
"Ray Wing", "Ray Wing",
"Ranzitho", "Ranzitho",
"Gus", "Gus",
@@ -290,6 +279,7 @@
"David LaVallee", "David LaVallee",
"ae", "ae",
"Tr4shP4nda", "Tr4shP4nda",
"Gamalonia",
"WRL_SPR", "WRL_SPR",
"capn", "capn",
"Joseph", "Joseph",
@@ -302,77 +292,60 @@
"Moon Knight", "Moon Knight",
"몽타주", "몽타주",
"Kland", "Kland",
"zenobeus", "Hailshem",
"Jackthemind", "kudari",
"ryoma", "Naomi Hale Danchi",
"Stryker", "dc7431",
"raf8osz", "Vir",
"ElitaSSJ4",
"blikkies",
"Chris",
"Brian M", "Brian M",
"Nerezza",
"sanborondon", "sanborondon",
"Seth Christensen",
"Draven T",
"Taylor Funk", "Taylor Funk",
"aezin", "aezin",
"Thought2Form", "Thought2Form",
"jcay015", "jcay015",
"Kevin Picco", "Kevin Picco",
"Erik Lopez", "Erik Lopez",
"Shock Shockor",
"Mateo Curić", "Mateo Curić",
"Goldwaters", "Aquatic Coffee",
"Zude",
"Eris3D", "Eris3D",
"m", "m",
"ethanfel",
"Pierce McBride", "Pierce McBride",
"Joshua Gray", "Joshua Gray",
"Kyler", "Focuschannel",
"Mikko Hemilä", "Mikko Hemilä",
"aRtFuL_DodGeR",
"Jamie Ogletree", "Jamie Ogletree",
"a _", "a _",
"James Coleman", "James Coleman",
"CrimsonDX",
"Martial", "Martial",
"Anthony Faxlandez",
"battu", "battu",
"Emil Andersson", "Emil Andersson",
"Chad Idk",
"DarkSunset",
"Billy Gladky",
"Yuji Kaneko", "Yuji Kaneko",
"Probis", "Pat Hen",
"Dušan Ryban", "semicolon drainpipe",
"ItsGeneralButtNaked",
"Jordan Shaw", "Jordan Shaw",
"Rops Alot", "Rops Alot",
"Thesharingbrother",
"Sam", "Sam",
"sjon kreutz",
"Nimess",
"SRDB",
"Ace Ventura", "Ace Ventura",
"g unit", "ResidentDeviant",
"Youguang", "Nihongasuki",
"Metryman55", "JC",
"andrewzpong", "Prompt Pirate",
"FrxzenSnxw", "uwutismxd",
"BossGame",
"lrdchs",
"momokai", "momokai",
"Hailshem", "zenobeus",
"kudari",
"Naomi Hale Danchi",
"dc7431",
"ken", "ken",
"Inversity",
"AIVORY3D",
"epicgamer0020690", "epicgamer0020690",
"Joshua Porrata", "Joshua Porrata",
"keemun", "keemun",
"SuBu", "SuBu",
"RedPIXel", "RedPIXel",
"Kevinj",
"Wind", "Wind",
"Jackthemind",
"Nexus", "Nexus",
"Ramneek“Guy”Ashok", "Ramneek“Guy”Ashok",
"squid_actually", "squid_actually",
@@ -385,80 +358,81 @@
"emyth", "emyth",
"chriphost", "chriphost",
"KitKatM", "KitKatM",
"ryoma",
"socrasteeze", "socrasteeze",
"ResidentDeviant", "OrganicArtifact",
"Stryker",
"MudkipMedkitz",
"gzmzmvp", "gzmzmvp",
"Welkor", "raf8osz",
"John Martin", "ElitaSSJ4",
"Richard", "Richard",
"blikkies",
"Andrew", "Andrew",
"Chris",
"Robert Wegemund", "Robert Wegemund",
"Littlehuggy", "Littlehuggy",
"moranqianlong",
"Gregory Kozhemiak", "Gregory Kozhemiak",
"mrjuan", "mrjuan",
"Brian Buie", "Brian Buie",
"Shock Shockor",
"Sadlip", "Sadlip",
"Haru Yotu", "Goldwaters",
"Eric Whitney", "Eric Whitney",
"Joey Callahan", "Joey Callahan",
"Zude",
"Ivan Tadic", "Ivan Tadic",
"Mike Simone", "Mike Simone",
"John J Linehan",
"Kyler",
"Elliot E",
"Morgandel", "Morgandel",
"Kyron Mahan", "Theerat Jiramate",
"Matura Arbeit", "aRtFuL_DodGeR",
"Noah", "Noah",
"Jacob McDaniel", "Jacob McDaniel",
"X", "X",
"Sloan Steddy", "Sloan Steddy",
"TBitz33",
"Anonym dkjglfleeoeldldldlkf",
"Temikus", "Temikus",
"Artokun", "Artokun",
"Michael Taylor", "Michael Taylor",
"SendingRavens",
"Derek Baker", "Derek Baker",
"CrimsonDX",
"Michael Anthony Scott", "Michael Anthony Scott",
"DarkSunset",
"Atilla Berke Pekduyar", "Atilla Berke Pekduyar",
"Michael Docherty",
"Nathan", "Nathan",
"Billy Gladky",
"NICHOLAS BAXLEY",
"Decx _", "Decx _",
"Paul Hartsuyker", "Probis",
"elitassj", "Ed Wang",
"Jacob Winter", "ItsGeneralButtNaked",
"Nimess",
"SRDB",
"g unit",
"Distortik", "Distortik",
"David", "Youguang",
"Meilo",
"Pen Bouryoung",
"四糸凜音", "四糸凜音",
"shinonomeiro", "Saya",
"Snille", "andrewzpong",
"MaartenAlbers", "FrxzenSnxw",
"khanh duy", "BossGame",
"xybrightsummer", "lrdchs",
"jreedatchison",
"PhilW",
"Tree Tagger", "Tree Tagger",
"Janik", "Inversity",
"Crocket", "Crocket",
"Cruel", "AIVORY3D",
"MRBlack", "Kevinj",
"Mitchell Robson", "Mitchell Robson",
"Kiyoe",
"humptynutz",
"michael.isaza",
"Kalnei",
"Whitepinetrader", "Whitepinetrader",
"OrganicArtifact", "ResidentDeviant",
"Scott",
"MudkipMedkitz",
"deanbrian", "deanbrian",
"POPPIN", "POPPIN",
"Alex Wortman", "Alex Wortman",
"Cody", "Cody",
"Raku", "Raku",
"smart.edge5178", "smart.edge5178",
"emadsultan",
"InformedViewz", "InformedViewz",
"CHKeeho80", "CHKeeho80",
"Bubbafett", "Bubbafett",
@@ -466,76 +440,152 @@
"Menard", "Menard",
"Skyfire83", "Skyfire83",
"Adam Rinehart", "Adam Rinehart",
"D",
"Pitpe11", "Pitpe11",
"TheD1rtyD03", "TheD1rtyD03",
"moonpetal", "moonpetal",
"SomeDude", "SomeDude",
"g9p0o", "g9p0o",
"nanana",
"TheHolySheep", "TheHolySheep",
"Monte Won", "Monte Won",
"SpringBootisTrash", "SpringBootisTrash",
"carsten", "carsten",
"ikok", "ikok",
"Nathen+Choi",
"T",
"LarsesFPC",
"cocona",
"sfasdfasfdsa",
"Buecyb99", "Buecyb99",
"4IXplr0r3r", "Welkor",
"dfklsjfkljslfjd", "David Schenck",
"hayden", "John Martin",
"ahoystan",
"Leland Saunders",
"Wolfe7D1", "Wolfe7D1",
"Ink Temptation", "Ink Temptation",
"Bob Barker", "moranqianlong",
"edk",
"Kalli Core", "Kalli Core",
"Aeternyx",
"elleshar666", "elleshar666",
"YOU SINWOO", "ACTUALLY_the_Real_Willem_Dafoe",
"ja s", "Haru Yotu",
"Doug Mason",
"Kauffy", "Kauffy",
"Jeremy Townsend",
"EpicElric", "EpicElric",
"Sean voets", "Kyron Mahan",
"Owen Gwosdz",
"John J Linehan",
"Elliot E",
"Thomas Wanner",
"Theerat Jiramate",
"Edward Kennedy", "Edward Kennedy",
"Justin Blaylock", "Justin Blaylock",
"Devil Lude", "Matura Arbeit",
"Nick Kage", "Nick Kage",
"kevin stoddard", "TBitz33",
"Jack Dole", "Anonym dkjglfleeoeldldldlkf",
"Vane Holzer", "Vane Holzer",
"psytrax", "psytrax",
"Cyrus Fett",
"Ezokewn", "Ezokewn",
"SendingRavens",
"hexxish", "hexxish",
"CptNeo",
"notedfakes", "notedfakes",
"Maso", "Michael Docherty",
"Eric Ketchum",
"NICHOLAS BAXLEY",
"Michael Scott", "Michael Scott",
"Kevin Wallace", "Paul Hartsuyker",
"Matheus Couto", "elitassj",
"Saya", "Jacob Winter",
"ChicRic",
"mercur",
"J C",
"Ed Wang",
"Ryan Presley Ng", "Ryan Presley Ng",
"Wes Sims", "Wes Sims",
"Donor4115", "Donor4115",
"Lyavph",
"David",
"Meilo",
"Filippo Ferrari",
"Pen Bouryoung",
"shinonomeiro",
"Snille",
"MaartenAlbers",
"khanh duy",
"xybrightsummer",
"jreedatchison",
"PhilW",
"Janik",
"Cruel",
"MRBlack",
"Kiyoe",
"humptynutz",
"michael.isaza",
"Kalnei",
"Scott",
"Muratoraccio",
"Ginnie",
"emadsultan",
"D",
"nanana",
"Fthehappy",
"rsamerica",
"Alan+Cano",
"FeralOpticsAI",
"Pavlaki",
"generic404",
"Doug+Rintoul",
"Noor",
"Yorunai",
"quantenmecha",
"abattoirblues",
"Jason+Nash",
"BillyBoy84",
"zounik",
"DarkRoast",
"letzte",
"Nasty+Hobbit",
"Sora+Yori",
"lrdchs2",
"Duk3+Rand0m",
"4IXplr0r3r",
"hayden",
"ahoystan",
"Leland Saunders",
"Bob Barker",
"edk",
"JBsuede",
"Time Valentine",
"Aeternyx",
"YOU SINWOO",
"りん あめ",
"ja s",
"Михал Михалыч",
"Matt",
"Doug Mason",
"Jeremy Townsend",
"Frogmilk",
"Sean voets",
"Owen Gwosdz",
"SPJ",
"Thomas Wanner",
"Bryan Rutkowski",
"Devil Lude",
"David Murcko",
"kevin stoddard",
"Jack Dole",
"max blo",
"Xenon Xue",
"CptNeo",
"JackJohnnyJim",
"Dmitry Ryzhov",
"Maso",
"Edward Ten Eyck",
"Eric Ketchum",
"Kevin Wallace",
"Matheus Couto",
"ChicRic",
"Henrique Faiolli",
"mercur",
"Solixer",
"J C",
"jinksta187",
"Andrew Wilkinson",
"Manu Thetug",
"Karlanx",
"Yves Poezevara", "Yves Poezevara",
"operationancut",
"Teriak47", "Teriak47",
"Just me", "Just me",
"Raf Stahelin", "Raf Stahelin",
"Вячеслав Маринин", "Вячеслав Маринин",
"Lyavph",
"Filippo Ferrari",
"Cola Matthew", "Cola Matthew",
"OniNoKen", "OniNoKen",
"Iain Wisely", "Iain Wisely",
@@ -576,98 +626,121 @@
"dg", "dg",
"Maarten Harms", "Maarten Harms",
"Israel", "Israel",
"Muratoraccio",
"SelfishMedic", "SelfishMedic",
"Ginnie",
"adderleighn", "adderleighn",
"EnragedAntelope", "EnragedAntelope",
"Alan+Cano", "lighthawke",
"FeralOpticsAI", "Terraformer",
"Pavlaki", "GDS+DEV",
"generic404", "4rt+r3d",
"low9",
"Winged",
"you+halo9",
"YassineKhaled",
"YK12",
"MatteKey",
"Flob",
"ShiroSenpai",
"Somebody",
"Inkognito",
"Somebody",
"Gramer+Gumbyte",
"Crescent~San",
"Tan+Huynh",
"AiGirlTS",
"D",
"datasl4ve",
"Somebody",
"Dark_Pest",
"Aza",
"Jacky+Ho",
"koopa990",
"Karru",
"ChaChanoKo",
"null",
"bo",
"The+Forgetful+Dev",
"redcarrot",
"powerbot99",
"Mateusz+Kosela", "Mateusz+Kosela",
"Doug+Rintoul",
"Noor",
"Yorunai",
"Bula", "Bula",
"quantenmecha",
"abattoirblues",
"Jason+Nash",
"BillyBoy84",
"DarkRoast",
"zounik",
"letzte",
"Nasty+Hobbit",
"SgtFluffles",
"lrdchs2",
"Duk3+Rand0m",
"KUJYAKU", "KUJYAKU",
"NathenChoi",
"Thomas+Reck",
"Larses",
"cocona",
"Coeur+de+cochon", "Coeur+de+cochon",
"David Schenck",
"han b", "han b",
"Nico", "Nico",
"Banana Joe", "Banana Joe",
"_ G3n", "_ G3n",
"Donovan Jenkins", "Donovan Jenkins",
"JBsuede", "Tú Nguyễn Lý Hoàng",
"Michael Eid", "Michael Eid",
"beersandbacon", "beersandbacon",
"Maximilian Pyko", "Maximilian Pyko",
"Invis", "Invis",
"Justin Houston", "Bob barker",
"Time Valentine", "Ben D",
"Garrett Wood",
"Ronan Delevacq",
"james", "james",
"Christian Schäfer",
"OrochiNights", "OrochiNights",
"Michael Zhu", "Michael Zhu",
"ACTUALLY_the_Real_Willem_Dafoe",
"gonzalo", "gonzalo",
"Seraphy", "Seraphy",
"Михал Михалыч",
"雨の心 落", "雨の心 落",
"Matt",
"AllTimeNoobie", "AllTimeNoobie",
"jumpd", "jumpd",
"John C", "John C",
"Rim", "Rim",
"Dave Abraham",
"Joaquin Hierrezuelo",
"Dismem", "Dismem",
"Frogmilk", "Locrospiel",
"SPJ", "Jairus Knudsen",
"Jarrid Lee",
"Xan Dionysus", "Xan Dionysus",
"Nathan lee", "Nathan lee",
"Kor",
"Joseph Hanson",
"Mewtora", "Mewtora",
"Middo", "Middo",
"Forbidden Atelier", "Forbidden Atelier",
"Bryan Rutkowski", "John Rednoulf",
"Spire",
"Adictedtohumping", "Adictedtohumping",
"Boba Smith",
"Towelie", "Towelie",
"Cyrus Fett", "MR.Bear",
"dsffsdfsdfsdfsdfsdf",
"Jean-françois SEMA", "Jean-françois SEMA",
"Kurt", "Kurt",
"max blo", "ivistorm",
"Xenon Xue", "Sauv",
"JackJohnnyJim", "Steven",
"Edward Ten Eyck", "TenaciousD",
"Khánh Đặng",
"Chase Kwon", "Chase Kwon",
"Ted Cart",
"Inyoshu", "Inyoshu",
"Goober719", "Goober719",
"Chad Barnes", "Chad Barnes",
"Person Y",
"David Spearing",
"James Ming", "James Ming",
"vanditking", "vanditking",
"kripitonga", "kripitonga",
"Rizzi", "Rizzi",
"nimin", "nimin",
"OMAR LUCIANO", "OMAR LUCIANO",
"Ken+Suzuki",
"hannibal", "hannibal",
"Jo+Example", "Jo+Example",
"BrentBertram", "BrentBertram",
"Tigon",
"eumelzocker", "eumelzocker",
"dxjaymz", "dxjaymz",
"L C", "L C",
"Dude" "Dude",
"CK"
], ],
"totalCount": 666 "totalCount": 739
} }

View File

@@ -1,183 +0,0 @@
## Overview
The **LoRA Manager Civitai Extension** is a Browser extension designed to work seamlessly with [LoRA Manager](https://github.com/willmiao/ComfyUI-Lora-Manager) to significantly enhance your browsing experience on [Civitai](https://civitai.com). With this extension, you can:
✅ Instantly see which models are already present in your local library
✅ Download new models with a single click
✅ Manage downloads efficiently with queue and parallel download support
✅ Keep your downloaded models automatically organized according to your custom settings
![Civitai Models page](https://github.com/willmiao/ComfyUI-Lora-Manager/blob/main/wiki-images/civitai-models-page.png)
**Update:** It now also supports browsing on [CivArchive](https://civarchive.com/) (formerly CivitaiArchive).
![CivArchive Models page](https://github.com/willmiao/ComfyUI-Lora-Manager/blob/main/wiki-images/civarchive-models-page.png)
---
## Why Supporter Access?
LoRA Manager is built with love for the Stable Diffusion and ComfyUI communities. Your support makes it possible for me to keep improving and maintaining the tool full-time.
Supporter-exclusive features help ensure the long-term sustainability of LoRA Manager, allowing continuous updates, new features, and better performance for everyone.
Every contribution directly fuels development and keeps the core LoRA Manager free and open-source. In addition to monthly supporters, one-time donation supporters will also receive a license key, with the duration scaling according to the contribution amount. Thank you for helping keep this project alive and growing. ❤️
---
## Installation
### Supported Browsers & Installation Methods
| Browser | Installation Method |
|--------------------|-------------------------------------------------------------------------------------|
| **Google Chrome** | [Chrome Web Store link](https://chromewebstore.google.com/detail/capigligggeijgmocnaflanlbghnamgm?utm_source=item-share-cb) |
| **Microsoft Edge** | Install via Chrome Web Store (compatible) |
| **Brave Browser** | Install via Chrome Web Store (compatible) |
| **Opera** | Install via Chrome Web Store (compatible) |
| **Firefox** | <div id="firefox-install" class="install-ok"><a href="https://github.com/willmiao/lm-civitai-extension-firefox/releases/latest/download/extension.xpi">📦 Install Firefox Extension (reviewed and verified by Mozilla)</a></div> |
For non-Chrome browsers (e.g., Microsoft Edge), you can typically install extensions from the Chrome Web Store by following these steps: open the extensions Chrome Web Store page, click 'Get extension', then click 'Allow' when prompted to enable installations from other stores, and finally click 'Add extension' to complete the installation.
---
## Privacy & Security
I understand concerns around browser extensions and privacy, and I want to be fully transparent about how the **LM Civitai Extension** works:
- **Reviewed and Verified**
This extension has been **manually reviewed and approved by the Chrome Web Store**. The Firefox version uses the **exact same code** (only the packaging format differs) and has passed **Mozillas Add-on review**.
- **Minimal Network Access**
The only external server this extension connects to is:
**`https://willmiao.shop`** — used solely for **license validation**.
It does **not collect, transmit, or store any personal or usage data**.
No browsing history, no user IDs, no analytics, no hidden trackers.
- **Local-Only Model Detection**
Model detection and LoRA Manager communication all happen **locally** within your browser, directly interacting with your local LoRA Manager backend.
I value your trust and are committed to keeping your local setup private and secure. If you have any questions, feel free to reach out!
---
## How to Use
After installing the extension, you'll automatically receive a **7-day trial** to explore all features.
When the extension is correctly installed and your license is valid:
- Open **Civitai**, and you'll see visual indicators added by the extension on model cards, showing:
- ✅ Models already present in your local library
- ⬇️ A download button for models not in your library
Clicking the download button adds the corresponding model version to the download queue, waiting to be downloaded. You can set up to **5 models to download simultaneously**.
### Visual Indicators Appear On:
- **Home Page** — Featured models
- **Models Page**
- **Creator Profiles** — If the creator has set their models to be visible
- **Recommended Resources** — On individual model pages
### Version Buttons on Model Pages
On a specific model page, visual indicators also appear on version buttons, showing which versions are already in your local library.
**Starting from v0.4.8**, model pages use a dedicated download button for better compatibility. When switching to a specific version by clicking a version button:
- The new **dedicated download button** directly triggers download via **LoRA Manager**
- The **original download button** remains unchanged for standard browser downloads
![Civitai Model Page](https://github.com/willmiao/ComfyUI-Lora-Manager/blob/main/wiki-images/civitai-model-page.png)
### Hide Models Already in Library (Beta)
**New in v0.4.8**: A new **Hide models already in library (Beta)** option makes it easier to focus on models you haven't added yet. It can be enabled from Settings, or toggled quickly using **Ctrl + Shift + H** (macOS: **Command + Shift + H**).
### Resources on Image Pages — now shows in-library indicators for image resources plus one-click recipe import
- **One-Click Import Civitai Image as Recipe** — Import any Civitai image as a recipe with a single click in the Resources Used panel.
- **Auto-Queue Missing Assets** — In Settings you can decide if LoRAs or checkpoints referenced by that image should automatically be added to your download queue.
- **More Accurate Metadata** — Importing directly from the page is faster than copying inside LM and keeps on-site tags and other metadata perfectly aligned.
![Civitai Image Page](https://github.com/willmiao/ComfyUI-Lora-Manager/blob/main/wiki-images/civitai-image-page.jpg)
[![alt](url)](https://github.com/user-attachments/assets/41fd4240-c949-4f83-bde7-8f3124c09494)
---
## Model Download Location & LoRA Manager Settings
To use the **one-click download function**, you must first set:
- Your **Default LoRAs Root**
- Your **Default Checkpoints Root**
These are set within LoRA Manager's settings.
When everything is configured, downloaded model files will be placed in:
`<Default_Models_Root>/<Base_Model_of_the_Model>/<First_Tag_of_the_Model>`
### Update: Default Path Customization (2025-07-21)
A new setting to customize the default download path has been added in the nightly version. You can now personalize where models are saved when downloading via the LM Civitai Extension.
![Default Path Customization](https://github.com/willmiao/ComfyUI-Lora-Manager/blob/main/wiki-images/default-path-customization.png)
The previous YAML path mapping file will be deprecated—settings will now be unified in settings.json to simplify configuration.
---
## Backend Port Configuration
If your **ComfyUI** or **LoRA Manager** backend is running on a port **other than the default 8188**, you must configure the backend port in the extension's settings.
After correctly setting and saving the port, you'll see in the extension's header area:
- A **Healthy** status with the tooltip: `Connected to LoRA Manager on port xxxx`
---
## Advanced Usage
### Connecting to a Remote LoRA Manager
If your LoRA Manager is running on another computer, you can still connect from your browser using port forwarding.
> **Why can't you set a remote IP directly?**
>
> For privacy and security, the extension only requests access to `http://127.0.0.1/*`. Supporting remote IPs would require much broader permissions, which may be rejected by browser stores and could raise user concerns.
**Solution: Port Forwarding with `socat`**
On your browser computer, run:
`socat TCP-LISTEN:8188,bind=127.0.0.1,fork TCP:REMOTE.IP.ADDRESS.HERE:8188`
- Replace `REMOTE.IP.ADDRESS.HERE` with the IP of the machine running LoRA Manager.
- Adjust the port if needed.
This lets the extension connect to `127.0.0.1:8188` as usual, with traffic forwarded to your remote server.
_Thanks to user **Temikus** for sharing this solution!_
---
## Roadmap
The extension will evolve alongside **LoRA Manager** improvements. Planned features include:
- [x] Support for **additional model types** (e.g., embeddings)
- [x] One-click **Recipe Import**
- [x] Display of in-library status for all resources in the **Resources Used** section of the image page
- [x] One-click **Auto-organize Models**
- [x] **Hide models already in library (Beta)** - Focus on models you haven't added yet
**Stay tuned — and thank you for your support!**
---

View File

@@ -33,6 +33,7 @@ from ...services.metadata_service import (
update_metadata_providers, update_metadata_providers,
) )
from ...services.service_registry import ServiceRegistry from ...services.service_registry import ServiceRegistry
from ...services.model_lifecycle_service import delete_model_artifacts
from ...services.settings_manager import get_settings_manager from ...services.settings_manager import get_settings_manager
from ...services.websocket_manager import ws_manager from ...services.websocket_manager import ws_manager
from ...services.downloader import get_downloader from ...services.downloader import get_downloader
@@ -2082,6 +2083,78 @@ class ModelLibraryHandler:
) )
return web.json_response({"success": False, "error": str(exc)}, status=500) return web.json_response({"success": False, "error": str(exc)}, status=500)
async def delete_model_version(self, request: web.Request) -> web.Response:
try:
model_version_id_str = request.query.get("modelVersionId")
if not model_version_id_str:
return web.json_response(
{"success": False, "error": "Missing required parameter: modelVersionId"},
status=400,
)
try:
model_version_id = int(model_version_id_str)
except ValueError:
return web.json_response(
{"success": False, "error": "Parameter modelVersionId must be an integer"},
status=400,
)
lora_scanner = await self._service_registry.get_lora_scanner()
checkpoint_scanner = await self._service_registry.get_checkpoint_scanner()
embedding_scanner = await self._service_registry.get_embedding_scanner()
found_type = None
file_path = None
found_cache = None
for model_type, scanner in (
("lora", lora_scanner),
("checkpoint", checkpoint_scanner),
("embedding", embedding_scanner),
):
cache = await scanner.get_cached_data()
if cache and model_version_id in cache.version_index:
found_type = model_type
found_cache = cache
entry = cache.version_index[model_version_id]
file_path = entry.get("file_path")
break
if not file_path:
return web.json_response(
{"success": False, "error": "Model version not found in any scanner cache"},
status=404,
)
target_dir = os.path.dirname(file_path)
base_name = os.path.basename(file_path)
file_name, extension = os.path.splitext(base_name)
await delete_model_artifacts(target_dir, file_name, main_extension=extension)
if found_cache:
found_cache.raw_data = [
item
for item in found_cache.raw_data
if item.get("file_path") != file_path
]
await found_cache.resort()
history_service = await self._get_download_history_service()
await history_service.mark_not_downloaded(found_type, model_version_id)
return web.json_response(
{
"success": True,
"modelType": found_type,
"modelVersionId": model_version_id,
}
)
except Exception as exc:
logger.error(
"Failed to delete model version: %s", exc, exc_info=True
)
return web.json_response({"success": False, "error": str(exc)}, status=500)
async def get_model_versions_status(self, request: web.Request) -> web.Response: async def get_model_versions_status(self, request: web.Request) -> web.Response:
try: try:
model_id_str = request.query.get("modelId") model_id_str = request.query.get("modelId")
@@ -3118,6 +3191,7 @@ class MiscHandlerSet:
"check_models_exist": self.model_library.check_models_exist, "check_models_exist": self.model_library.check_models_exist,
"get_model_version_download_status": self.model_library.get_model_version_download_status, "get_model_version_download_status": self.model_library.get_model_version_download_status,
"set_model_version_download_status": self.model_library.set_model_version_download_status, "set_model_version_download_status": self.model_library.set_model_version_download_status,
"delete_model_version": self.model_library.delete_model_version,
"get_civitai_user_models": self.model_library.get_civitai_user_models, "get_civitai_user_models": self.model_library.get_civitai_user_models,
"download_metadata_archive": self.metadata_archive.download_metadata_archive, "download_metadata_archive": self.metadata_archive.download_metadata_archive,
"remove_metadata_archive": self.metadata_archive.remove_metadata_archive, "remove_metadata_archive": self.metadata_archive.remove_metadata_archive,

View File

@@ -91,6 +91,9 @@ MISC_ROUTE_DEFINITIONS: tuple[RouteDefinition, ...] = (
RouteDefinition( RouteDefinition(
"GET", "/api/lm/base-models/cache-status", "get_base_model_cache_status" "GET", "/api/lm/base-models/cache-status", "get_base_model_cache_status"
), ),
RouteDefinition(
"GET", "/api/lm/delete-model-version", "delete_model_version"
),
) )

View File

@@ -87,7 +87,7 @@
.checkbox-label input[type="checkbox"]:checked + .checkmark::after { .checkbox-label input[type="checkbox"]:checked + .checkmark::after {
content: '\f00c'; content: '\f00c';
font-family: 'Font Awesome 6 Free'; font-family: 'Font Awesome 6 Free', sans-serif;
font-weight: 900; font-weight: 900;
color: var(--lora-text); color: var(--lora-text);
font-size: 12px; font-size: 12px;

View File

@@ -329,7 +329,6 @@
} }
.card-actions i { .card-actions i {
margin-left: var(--space-1);
cursor: pointer; cursor: pointer;
color: white; color: white;
transition: opacity 0.2s, transform 0.15s ease; transition: opacity 0.2s, transform 0.15s ease;

View File

@@ -141,8 +141,7 @@
.header-search .search-container:focus-within { .header-search .search-container:focus-within {
border-color: var(--lora-accent); border-color: var(--lora-accent);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12), 0 0 0 1px var(--lora-accent); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08), 0 0 0 1px var(--lora-accent);
transform: translateY(-1px);
} }
.header-search input { .header-search input {

View File

@@ -67,7 +67,6 @@
.early-access-info { .early-access-info {
display: none; display: none;
position: absolute;
top: 100%; top: 100%;
right: 0; right: 0;
background: var(--card-bg); background: var(--card-bg);
@@ -97,7 +96,6 @@
.local-path { .local-path {
display: none; display: none;
position: absolute;
top: 100%; top: 100%;
right: 0; right: 0;
background: var(--card-bg); background: var(--card-bg);

View File

@@ -232,9 +232,13 @@ export function initDrag(
onDragEnd(); onDragEnd();
} }
// Now do the re-render after drag is complete // Commit final value through options.setValue so external observers are notified.
if (renderFunction) { // During drag, handleStrengthDrag mutates widgetValue in-place (updateWidget=false),
renderFunction(widget.value, widget); // bypassing widget.value setter and options.setValue entirely. This assignment
// flushes the in-place mutation through the setter so any setValue wrappers fire.
widget.value = widget.value;
if (typeof widget.callback === 'function') {
widget.callback(widget.value);
} }
} }
}; };
@@ -349,11 +353,15 @@ export function initHeaderDrag(headerEl, widget, renderFunction) {
document.body.classList.remove('lm-lora-strength-dragging'); document.body.classList.remove('lm-lora-strength-dragging');
// Only re-render if we actually dragged // Only re-render if we actually dragged
if (wasDragging && renderFunction) { if (wasDragging) {
renderFunction(widget.value, widget); // Commit final value through options.setValue so external observers are notified.
widget.value = widget.value;
if (typeof widget.callback === 'function') {
widget.callback(widget.value);
}
} }
}; };
// Handle pointer up to end dragging // Handle pointer up to end dragging
headerEl.addEventListener('pointerup', endDrag); headerEl.addEventListener('pointerup', endDrag);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 597 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 872 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 362 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 639 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 529 KiB