add files

This commit is contained in:
frostydad 2022-09-24 21:25:08 -06:00
parent 8c9a9c2501
commit 7b6ee08b2f
16 changed files with 12735 additions and 0 deletions

View File

@ -0,0 +1,79 @@
name: Generate Static HTML
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
schedule:
- cron: '0 0,12 * * *' # 00:00 and 12:00 UTC
workflow_dispatch:
permissions:
contents: write
pages: write
id-token: write
# Allow one concurrent deployment
concurrency:
group: "pages"
cancel-in-progress: true
jobs:
generate:
runs-on: ubuntu-latest
steps:
- name: Setup
uses: BSFishy/pip-action@v1
with:
packages: |
requests
huggingface_hub
pillow
bs4
- name: Checkout
uses: actions/checkout@v3
with:
repository: ${{ github.repository }}
- name: Generate Models Webpage
run: python ${{ github.workspace }}/generate_tx_models_html.py ${{ github.workspace }}/site/index.html
shell: sh
- name: Commit Changes
uses: devops-infra/action-commit-push@master
with:
github_token: "${{ secrets.GITHUB_TOKEN }}"
add_timestamp: false
commit_prefix: "[AUTO] "
commit_message: "Update static page"
force: false
deploy:
needs: generate
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
with:
# Need this to force it to get the latest commit (always the one created by the generate job above).
# Otherwise it will always publish the previous job's output.
ref: 'main'
# Alternative solution to the previous job issue?
# - name: Pull latest changes
# run: git pull --no-rebase
- name: Upload artifact
uses: actions/upload-pages-artifact@v1
with:
path: 'site'
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v1

View File

@ -0,0 +1,20 @@
name: Delete old workflow runs
on:
workflow_dispatch:
inputs:
days:
description: 'Number of days.'
required: true
default: "20"
jobs:
del_runs:
runs-on: ubuntu-latest
steps:
- name: Delete workflow runs
uses: Mattraks/delete-workflow-runs@main
with:
token: ${{ secrets.TOKEN_GITHUB }}
repository: ${{ github.repository }}
retain_days: ${{ github.event.inputs.days }}
keep_minimum_runs: 3

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
stable-diffusion-textual-inversion-models.html

9
README.md Normal file
View File

@ -0,0 +1,9 @@
# stable-diffusion-textual-inversion-models
_Automated list of Stable Diffusion textual inversion models from sd-concepts-library._
[![Generate and Publish GitHub Pages](https://github.com/Cyberes/stable-diffusion-textual-inversion-models/actions/workflows/generate.yml/badge.svg)](https://github.com/Cyberes/stable-diffusion-textual-inversion-models/actions/workflows/generate.yml)
Using GitHub Actions, every 12 hours the entire [sd-concepts-library](https://huggingface.co/sd-concepts-library) is scraped and a list of all textual inversion models is generated and published to GitHub Pages.
View it here: [https://cyberes.github.io/stable-diffusion-textual-inversion-models/](https://cyberes.github.io/stable-diffusion-textual-inversion-models/)

273
generate_tx_models_html.py Normal file
View File

@ -0,0 +1,273 @@
import argparse
import datetime
import os
import shutil
import sys
from urllib import request as ulreq
from bs4 import BeautifulSoup
import requests
from huggingface_hub import HfApi
from PIL import ImageFile
def getsizes(uri):
# https://stackoverflow.com/a/37709319
# get file size *and* image size (None if not known)
file = ulreq.urlopen(uri)
size = file.headers.get("content-length")
if size:
size = int(size)
p = ImageFile.Parser()
while True:
data = file.read(1024)
if not data:
break
p.feed(data)
if p.image:
return size, p.image.size
break
file.close()
return (size, None)
parser = argparse.ArgumentParser()
parser.add_argument('out_file', nargs='?', help='file to save to', default='stable-diffusion-textual-inversion-models.html')
args = parser.parse_args()
print('Will save to file:', args.out_file)
# Get list of models under the sd-concepts-library organization
api = HfApi()
models_list = []
for model in api.list_models(author="sd-concepts-library"):
models_list.append(model.modelId.replace('sd-concepts-library/', ''))
models_list.sort()
dt = datetime.datetime.now()
tz = dt.astimezone().tzname()
html_struct = f"""
<!DOCTYPE html>
<html lang="en">
<head>
<title>Stable Diffusion Texual Inversion Models</title>
<meta charset="utf-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-u1OknCvxWvY5kfmNBILK2hRnQC3Pr17a+RTT6rIHI7NnikvbZlHgTPOOmMi466C8" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js" integrity="sha512-bLT0Qm9VnAYZDflyKcBaQ2gg0hSYNQrJ8RilYldYQ1FxQYoCLtUjuuRuZo+fjqhx/qtq/1itJ0C2ejDxltZVFg==" crossorigin="anonymous"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-iYQeCzEYFbKjA/T2uDLTpkwGzCiq6soy8tYaI1GyVh/UjpbCx/TYkiZhlZB6+fzT" crossorigin="anonymous">
<link rel="apple-touch-icon" sizes="180x180" href="/stable-diffusion-textual-inversion-models/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/stable-diffusion-textual-inversion-models/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/stable-diffusion-textual-inversion-models/favicon-16x16.png">
<link rel="manifest" href="/stable-diffusion-textual-inversion-models/site.webmanifest">
<link rel="mask-icon" href="/stable-diffusion-textual-inversion-models/safari-pinned-tab.svg" color="#ee9321">
<link rel="shortcut icon" href="favicon.ico">
<meta name="msapplication-TileColor" content="#ee9321">
<meta name="msapplication-config" content="/stable-diffusion-textual-inversion-models/browserconfig.xml">
<meta name="theme-color" content="#ee9321">
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {{
var u = "https://mato.evulid.cc/";
_paq.push(['setTrackerUrl', u + 'matomo.php']);
_paq.push(['setSiteId', '1']);
var d = document,
g = d.createElement('script'),
s = d.getElementsByTagName('script')[0];
g.async = true;
g.src = u + 'matomo.js';
s.parentNode.insertBefore(g, s);
}})();
</script>
<!-- End Matomo Code -->
</head>
<body>
<style>
.thumbnail {{
max-width: 185px;
display: block;
padding-top: 5px;
padding-bottom: 5px;
}}
.model-title {{
margin-top: 100px;
}}
</style>
<div class="container" style="margin-bottom: 180px;">
<div class="jumbotron text-center" style="margin-top: 45px;margin-right: 45px;margin-bottom: 0px;margin-left: 45px;">
<h1>Stable Diffusion Texual Inversion Models</h1>
</div>
<center>
<p style="margin-bottom: 45px;font-size: 8pt;">
<i>Page updates automatically daily. Last updated <a class="btn-link" style="cursor: pointer;text-decoration: none;" data-toggle="tooltip" data-placement="bottom" title="{dt.strftime(f"%m-%d-%Y %H:%M:%S {tz}")}">{datetime.datetime.now().strftime("%A %B %d, %Y")}</a>.</i>
</p>
</center>
<p>
Generated from <a href="https://huggingface.co/sd-concepts-library">huggingface.co/sd-concepts-library</a>
</p>
<p>
Models are downloaded straight from the HuggingFace repositories. There are currently {len(models_list)} textual inversion models in sd-concepts-library. The images displayed are the inputs, not the outputs.
</p>
<p>
Want to quickly test concepts? Try the <a href="https://huggingface.co/spaces/sd-concepts-library/stable-diffusion-conceptualizer">Stable Diffusion Conceptualizer</a> on HuggingFace.
</p>
<p>
<a href="https://github.com/Cyberes/stable-diffusion-textual-inversion-models/actions/workflows/generate_static_html.yml"><img src="https://github.com/Cyberes/stable-diffusion-textual-inversion-models/actions/workflows/generate_static_html.yml/badge.svg"></a>
</p>
<br>
<hr>
<script>
const downloadAs = (url, name) => {{
axios.get(url, {{
headers: {{
"Content-Type": "application/octet-stream"
}},
responseType: "blob"
}})
.then(response => {{
const a = document.createElement("a");
const url = window.URL.createObjectURL(response.data);
a.href = url;
a.download = name;
a.click();
}})
.catch(err => {{
console.log("error", err);
}});
_paq.push(['trackLink', url, 'download']);
}};
</script>
<noscript><p><img src="https://mato.evulid.cc/matomo.php?idsite=1&rec=1&url=https://cyberes.github.io/stable-diffusion-textual-inversion-models" style="border:0;" alt="" /></p></noscript>
"""
i = 1
for model_name in models_list:
# For testing
# if i == 4:
# break
print(f'{i}/{len(models_list)} -> {model_name}')
# Images can be in a few different formats, figure out which one it's in
restricted = False
try:
files = api.list_repo_files(
repo_id=f'sd-concepts-library/{model_name}')
concept_images = [i for i in files if i.startswith('concept_images/')]
# sometimes an author will require you to share your contact info to gain access.
except requests.exceptions.HTTPError:
restricted = True
if restricted:
html_struct = html_struct + f"""
<h3 class="model-title">{model_name}</h3>
<p>
{model_name} is restricted and you must share your contact information to view this repository.
<a type="button" class="btn btn-link" href="https://huggingface.co/sd-concepts-library/{model_name}/">View Repository</a>
</p>
"""
else:
html_struct = html_struct + f"""
<h3 class="model-title">{model_name}</h3>
<p>
<button type="button" class="btn btn-primary" onclick="downloadAs('https://huggingface.co/sd-concepts-library/{model_name}/resolve/main/learned_embeds.bin', '{model_name}.pt')">Download {model_name}.pt</button>
<a type="button" class="btn btn-link" href="https://huggingface.co/sd-concepts-library/{model_name}/">View Repository</a>
</p>
<div class="row">
"""
# Some repos don't have 3 images
img_count = 3
if len(concept_images) < 3:
img_count = len(concept_images)
for x in range(img_count):
html_struct = html_struct + f"""
<div class="col-sm">
<img class="thumbnail mx-auto lazy-load img-fluid" data-src="https://huggingface.co/sd-concepts-library/{model_name}/resolve/main/{concept_images[x]}">
</div>
"""
html_struct = html_struct + '</div>'
i = i + 1
html_struct = html_struct + """
</div>
<script>
document.addEventListener("DOMContentLoaded", function() {
let lazyloadImages;
if ("IntersectionObserver" in window) {
lazyloadImages = document.querySelectorAll(".lazy-load");
let imageObserver = new IntersectionObserver(function(entries, observer) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
let image = entry.target;
image.src = image.dataset.src;
image.classList.remove("lazy-load");
imageObserver.unobserve(image);
}
});
});
lazyloadImages.forEach(function(image) {
imageObserver.observe(image);
});
} else {
let lazyloadThrottleTimeout;
lazyloadImages = document.querySelectorAll(".lazy-load");
function lazyload() {
if (lazyloadThrottleTimeout) {
clearTimeout(lazyloadThrottleTimeout);
}
lazyloadThrottleTimeout = setTimeout(function() {
let scrollTop = window.pageYOffset;
lazyloadImages.forEach(function(img) {
if (img.offsetTop < (window.innerHeight + scrollTop)) {
img.src = img.dataset.src;
img.classList.remove('lazy-load');
}
});
if (lazyloadImages.length == 0) {
document.removeEventListener("scroll", lazyload);
window.removeEventListener("resize", lazyload);
window.removeEventListener("orientationChange", lazyload);
}
}, 20);
}
document.addEventListener("scroll", lazyload);
window.addEventListener("resize", lazyload);
window.addEventListener("orientationChange", lazyload);
}
})
$(function() {
$('[data-toggle="tooltip"]').tooltip({
placement: "bottom"
})
})
</script>
</body>
"""
# Load the HTML into bs4 so we can format it
soup = BeautifulSoup(html_struct, "html.parser")
f = open(args.out_file, 'w', encoding='utf-8')
f.write(str(soup.prettify()))
f.close()

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
site/apple-touch-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

9
site/browserconfig.xml Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/mstile-150x150.png"/>
<TileColor>#ee9321</TileColor>
</tile>
</msapplication>
</browserconfig>

BIN
site/favicon-16x16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

BIN
site/favicon-32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
site/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

12236
site/index.html Normal file

File diff suppressed because it is too large Load Diff

BIN
site/mstile-150x150.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,89 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="1507.000000pt" height="1507.000000pt" viewBox="0 0 1507.000000 1507.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.14, written by Peter Selinger 2001-2017
</metadata>
<g transform="translate(0.000000,1507.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M7197 14233 c-1 -1 -114 -4 -252 -7 -137 -4 -293 -9 -345 -12 -52 -3
-143 -7 -202 -9 -59 -3 -129 -7 -157 -10 -28 -3 -92 -7 -143 -10 -51 -2 -118
-7 -148 -10 -30 -3 -84 -7 -120 -10 -66 -6 -137 -13 -200 -20 -19 -2 -64 -7
-100 -10 -36 -4 -72 -8 -80 -10 -8 -2 -44 -6 -80 -10 -36 -3 -92 -10 -125 -15
-33 -5 -78 -12 -100 -15 -51 -7 -93 -14 -125 -20 -14 -3 -52 -10 -85 -15 -61
-10 -69 -12 -165 -31 -335 -67 -632 -185 -1095 -437 -207 -112 -546 -323 -665
-414 -14 -11 -65 -49 -115 -86 -88 -66 -231 -178 -270 -212 -299 -262 -508
-473 -542 -547 -13 -29 -27 -65 -30 -80 -3 -16 -5 -604 -5 -1308 0 -1205 2
-1340 26 -1450 27 -126 59 -220 110 -325 98 -204 310 -572 505 -874 80 -125
111 -181 101 -184 -7 -3 -24 -16 -37 -30 -23 -25 -25 -37 -26 -144 l0 -58 -51
0 -51 0 -2 42 c-1 30 -9 49 -28 67 -24 25 -30 26 -136 26 -109 0 -111 0 -135
-28 -19 -22 -24 -39 -24 -83 0 -30 -4 -54 -10 -54 -16 0 -41 -58 -47 -108 -3
-26 -8 -50 -12 -54 -5 -6 -149 -48 -163 -48 -4 0 -2 15 3 33 9 29 87 332 94
367 2 8 32 123 66 255 33 132 62 249 63 260 1 14 -17 30 -64 57 -36 21 -72 38
-80 38 -9 0 -29 -24 -46 -52 -17 -29 -118 -201 -224 -383 -106 -181 -203 -348
-215 -370 -13 -22 -76 -130 -140 -240 -126 -215 -143 -245 -176 -302 -12 -21
-74 -128 -139 -238 -127 -217 -267 -458 -284 -490 -7 -11 -24 -39 -39 -62 -15
-24 -27 -44 -27 -47 0 -2 -34 -61 -76 -132 -82 -138 -79 -130 -89 -329 -3 -71
-8 -164 -10 -205 -10 -159 -29 -540 -40 -760 -2 -41 -6 -124 -9 -185 -6 -108
-10 -171 -21 -390 -3 -60 -7 -141 -10 -180 -3 -38 -7 -119 -10 -180 -3 -60 -7
-146 -10 -190 -2 -44 -7 -141 -11 -215 -3 -74 -7 -160 -9 -190 -2 -30 -7 -116
-10 -190 -3 -74 -8 -160 -11 -190 -2 -30 -6 -120 -10 -200 -3 -79 -7 -147 -9
-150 -2 -3 0 -12 5 -20 9 -15 159 -23 181 -10 6 4 13 34 15 66 2 33 6 93 9
134 2 41 7 116 10 165 3 50 8 113 11 142 3 28 7 82 9 120 14 216 24 351 30
423 3 34 26 109 197 630 44 135 99 306 123 380 24 74 87 266 139 425 52 160
107 328 122 375 14 47 30 89 35 94 4 5 22 11 39 13 57 6 117 48 144 102 8 15
38 122 67 237 29 115 55 212 59 217 4 4 22 1 41 -7 35 -15 88 -13 121 5 51 27
78 117 51 171 -12 25 -11 29 31 70 24 24 80 97 124 163 131 199 199 247 396
281 94 16 312 16 381 0 88 -20 131 -41 176 -87 48 -47 48 -48 51 -121 3 -72 4
-73 36 -87 19 -9 32 -22 32 -33 0 -9 10 -24 23 -32 20 -13 62 -15 235 -7 7 1
24 12 37 25 22 23 23 27 19 151 -3 70 -2 137 2 147 3 12 32 31 69 48 34 15 69
37 77 48 13 20 15 19 49 -23 83 -102 266 -300 405 -439 524 -524 1008 -805
1654 -961 110 -26 370 -75 430 -80 19 -2 51 -6 70 -9 52 -8 129 -17 185 -21
28 -2 73 -6 100 -9 67 -7 224 -16 369 -21 65 -2 120 -5 121 -7 1 -2 -4 -28
-11 -58 -72 -291 -174 -715 -178 -733 -2 -13 2 -48 10 -78 8 -30 16 -63 19
-74 2 -11 22 -94 45 -185 38 -151 107 -434 115 -470 2 -8 29 -118 60 -245 31
-126 85 -347 120 -490 35 -143 89 -363 120 -490 75 -305 166 -676 170 -695 5
-20 91 -374 170 -696 35 -144 76 -310 90 -370 15 -59 31 -116 36 -127 14 -24
50 -37 73 -25 11 6 22 6 28 0 13 -13 54 -3 71 17 8 9 22 45 31 81 8 36 54 223
101 415 47 193 92 377 100 410 9 33 17 69 20 80 2 11 11 47 19 80 21 83 66
266 71 288 2 10 7 28 11 39 3 11 8 30 9 41 2 12 9 42 16 67 6 25 13 52 14 60
1 8 5 22 8 30 4 13 128 522 142 585 2 11 22 92 44 180 44 177 90 362 96 385
36 157 185 767 194 795 5 17 13 48 17 70 4 22 8 45 10 50 1 6 12 48 24 95 12
47 26 101 31 120 9 29 4 61 -26 185 -125 521 -148 614 -160 652 -17 53 -11 58
75 68 82 9 98 12 135 19 17 4 49 9 72 11 103 12 384 79 548 132 194 62 508
201 596 264 15 10 30 19 34 19 13 0 251 163 350 240 207 161 478 422 700 675
39 44 72 82 75 85 5 5 189 225 221 265 68 82 66 81 86 64 10 -9 38 -25 63 -36
75 -33 76 -37 68 -213 -7 -147 5 -159 173 -162 117 -3 139 5 139 51 0 34 14
55 33 48 24 -9 37 14 37 65 0 113 83 181 260 214 64 11 232 10 318 -2 231 -34
303 -86 452 -324 19 -30 37 -57 40 -60 3 -3 26 -28 52 -55 l47 -50 -13 -39
c-19 -54 -6 -103 38 -143 20 -18 46 -33 58 -34 45 -2 73 3 96 17 27 18 22 29
68 -156 2 -8 8 -33 14 -55 6 -22 13 -51 16 -65 13 -62 43 -160 58 -188 9 -17
30 -40 47 -52 29 -21 111 -52 126 -47 6 2 26 -56 223 -663 56 -173 117 -360
135 -415 142 -430 259 -794 261 -815 5 -41 23 -286 29 -396 3 -47 5 -84 21
-299 4 -44 8 -102 9 -130 6 -124 18 -231 25 -239 10 -10 144 -14 171 -4 18 7
20 14 15 70 -3 35 -8 113 -11 173 -3 61 -7 146 -10 190 -2 44 -7 139 -11 210
-3 72 -7 159 -9 195 -2 36 -6 117 -9 180 -4 63 -9 151 -12 195 -2 44 -7 132
-9 195 -3 63 -7 143 -10 177 -3 34 -7 119 -11 190 -3 70 -6 155 -8 188 -2 33
-7 121 -11 195 -8 171 -13 254 -19 360 -3 47 -8 139 -11 205 -3 66 -8 156 -10
200 -3 44 -7 125 -10 180 -12 276 -18 342 -32 370 -15 30 -147 256 -253 435
-31 52 -59 102 -63 110 -4 8 -13 24 -20 35 -7 11 -59 101 -116 200 -57 99
-114 197 -127 217 -13 21 -65 108 -115 195 -50 87 -100 172 -110 188 -10 17
-27 46 -37 65 -51 96 -557 957 -571 972 -15 17 -20 16 -86 -19 -39 -20 -73
-40 -76 -45 -5 -8 56 -262 151 -623 17 -66 33 -129 35 -140 3 -11 13 -54 24
-95 11 -41 19 -76 17 -77 -1 -1 -24 4 -51 13 -28 8 -66 19 -85 24 -32 9 -35
13 -38 52 -3 43 -37 128 -51 128 -4 0 -8 17 -8 38 -1 67 -3 73 -29 97 -25 23
-34 25 -135 25 l-107 0 -26 -31 c-18 -21 -26 -42 -26 -70 l0 -39 -53 2 -53 2
1 81 c1 55 -3 88 -13 107 -15 26 -50 48 -77 48 -10 0 9 38 52 107 76 124 89
146 136 228 19 33 45 78 57 100 134 233 221 412 266 550 16 46 44 204 50 274
10 118 11 2513 1 2580 -14 95 -47 147 -179 281 -184 186 -302 293 -513 461
-65 52 -228 173 -285 212 -246 165 -459 299 -615 384 -95 52 -443 226 -520
260 -38 17 -95 42 -125 56 -112 50 -386 127 -575 162 -64 11 -262 44 -300 50
-23 3 -50 7 -61 9 -11 2 -47 7 -79 11 -33 4 -73 9 -88 11 -16 3 -52 7 -80 9
-29 3 -63 7 -77 9 -24 4 -124 15 -199 21 -19 2 -67 6 -105 9 -82 8 -162 14
-261 21 -38 2 -104 7 -145 10 -41 3 -124 8 -185 10 -60 3 -141 7 -180 10 -169
10 -1180 26 -1188 18z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.0 KiB

19
site/site.webmanifest Normal file
View File

@ -0,0 +1,19 @@
{
"name": "Texual Inversion Models",
"short_name": "Texual Inversion Models",
"icons": [
{
"src": "/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#ee9321",
"background_color": "#ee9321",
"display": "standalone"
}