Update README.md
Browse files
README.md
CHANGED
@@ -43,258 +43,10 @@ I wanted to put all the tools I use and love straight into the base model so one
|
|
43 |
|
44 |
## Usage
|
45 |
|
46 |
-
### ComfyUI
|
47 |
|
48 |
-
Flex.2 is supported in ComfyUI with the help of the Flex2 Conditioner node found in [ComfyUI-FlexTools](https://github.com/ostris/ComfyUI-FlexTools). I also recommend using [comfyui_controlnet_aux](https://github.com/Fannovel16/comfyui_controlnet_aux) to generate the control images (pose and depth) This conditioning node handles all of the controls and inpainting conditioning for you, but is also needed for normal T2I generation. So grab and install those first.
|
49 |
|
50 |
-
|
51 |
-
|
52 |
-
<img src="https://ostris.com/wp-content/uploads/2025/04/comfy_workflow.png" alt="ComfyUI Flex.2" style="max-width: 100%; height: auto;"/>
|
53 |
-
|
54 |
-
### Diffusers
|
55 |
-
|
56 |
-
For diffusers, you can use `AutoPipelineForText2Image`. This will load the model with the pipeline located [here](https://huggingface.co/ostris/Flex.2-preview/blob/main/pipeline.py). We will run this example using the `diffusers` library.
|
57 |
-
|
58 |
-
|
59 |
-
<img src="https://ostris.com/wp-content/uploads/2025/04/diffusers_example.jpg" alt="Diffusers Flex.2" style="max-width: 100%; height: auto;"/>
|
60 |
-
|
61 |
-
First install the requirements.
|
62 |
-
|
63 |
-
```bash
|
64 |
-
pip install --upgrade torch accelerate transformers diffusers
|
65 |
-
```
|
66 |
-
|
67 |
-
Then you can load the model and use it like this:
|
68 |
-
|
69 |
-
```python
|
70 |
-
import torch
|
71 |
-
from diffusers import AutoPipelineForText2Image
|
72 |
-
from diffusers.utils import load_image
|
73 |
-
|
74 |
-
name_or_path = "ostris/Flex.2-preview"
|
75 |
-
|
76 |
-
inpaint_image = load_image("https://ostris.com/wp-content/uploads/2025/04/dog.jpg")
|
77 |
-
inpaint_mask = load_image("https://ostris.com/wp-content/uploads/2025/04/dog_mask.jpg")
|
78 |
-
control_image = load_image("https://ostris.com/wp-content/uploads/2025/04/dog_depth.jpg")
|
79 |
-
|
80 |
-
dtype = torch.bfloat16
|
81 |
-
|
82 |
-
pipe = AutoPipelineForText2Image.from_pretrained(
|
83 |
-
name_or_path,
|
84 |
-
custom_pipeline=name_or_path,
|
85 |
-
torch_dtype=dtype
|
86 |
-
).to("cuda")
|
87 |
-
|
88 |
-
image = pipe(
|
89 |
-
prompt="A white friendly robotic dog sitting on a bench",
|
90 |
-
inpaint_image=inpaint_image,
|
91 |
-
inpaint_mask=inpaint_mask,
|
92 |
-
control_image=control_image,
|
93 |
-
control_strength=0.5,
|
94 |
-
control_stop=0.33,
|
95 |
-
height=1024,
|
96 |
-
width=1024,
|
97 |
-
guidance_scale=3.5,
|
98 |
-
num_inference_steps=50,
|
99 |
-
generator=torch.Generator("cpu").manual_seed(42)
|
100 |
-
).images[0]
|
101 |
-
image.save(f"robot_dog.png")
|
102 |
-
|
103 |
-
```
|
104 |
-
|
105 |
-
For consumer cards < 24GB, you can use torchao to
|
106 |
-
|
107 |
-
```bash
|
108 |
-
pip install --upgrade torchao
|
109 |
-
```
|
110 |
-
|
111 |
-
Then you can load the model and use it like this:
|
112 |
-
|
113 |
-
```python
|
114 |
-
import torch
|
115 |
-
from diffusers import AutoPipelineForText2Image
|
116 |
-
from diffusers.utils import load_image
|
117 |
-
from transformers import T5EncoderModel, TorchAoConfig
|
118 |
-
from diffusers import FluxTransformer2DModel
|
119 |
-
|
120 |
-
name_or_path = "ostris/Flex.2-preview"
|
121 |
-
|
122 |
-
inpaint_image = load_image("https://ostris.com/wp-content/uploads/2025/04/dog.jpg")
|
123 |
-
inpaint_mask = load_image("https://ostris.com/wp-content/uploads/2025/04/dog_mask.jpg")
|
124 |
-
control_image = load_image("https://ostris.com/wp-content/uploads/2025/04/dog_depth.jpg")
|
125 |
-
|
126 |
-
dtype = torch.bfloat16
|
127 |
-
|
128 |
-
quant_config = TorchAoConfig("int8_weight_only")
|
129 |
-
|
130 |
-
text_encoder_2 = T5EncoderModel.from_pretrained(
|
131 |
-
name_or_path, subfolder="text_encoder_2", torch_dtype=dtype, quantization_config=quant_config
|
132 |
-
).to("cuda")
|
133 |
-
|
134 |
-
transformer = FluxTransformer2DModel.from_pretrained(
|
135 |
-
name_or_path, subfolder="transformer", torch_dtype=dtype, quantization_config=quant_config
|
136 |
-
).to("cuda")
|
137 |
-
|
138 |
-
|
139 |
-
pipe = AutoPipelineForText2Image.from_pretrained(
|
140 |
-
name_or_path,
|
141 |
-
transformer=transformer,
|
142 |
-
text_encoder_2=text_encoder_2,
|
143 |
-
custom_pipeline=name_or_path,
|
144 |
-
torch_dtype=dtype
|
145 |
-
).to("cuda")
|
146 |
-
|
147 |
-
image = pipe(
|
148 |
-
prompt="A white friendly robotic dog sitting on a bench",
|
149 |
-
inpaint_image=inpaint_image,
|
150 |
-
inpaint_mask=inpaint_mask,
|
151 |
-
control_image=control_image,
|
152 |
-
control_strength=0.5,
|
153 |
-
control_stop=0.33,
|
154 |
-
height=1024,
|
155 |
-
width=1024,
|
156 |
-
guidance_scale=3.5,
|
157 |
-
num_inference_steps=50,
|
158 |
-
generator=torch.Generator("cpu").manual_seed(42)
|
159 |
-
).images[0]
|
160 |
-
image.save(f"robot_dog.png")
|
161 |
-
```
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
## Limitations
|
166 |
-
|
167 |
-
This model is still experimental and under active development. The training for the controls and inpainting was pretty aggressive, and the model currently struggles with a few
|
168 |
-
things such an anatomy and text. The inpainting is also still being worked on. This is just
|
169 |
-
a preview release. I am working on improving these limitations with each new training run.
|
170 |
-
|
171 |
-
## Fine Tuning
|
172 |
-
|
173 |
-
Flex.2 is designed to be fine tunable, though the best pratice for doing so is still highly experimental as a model like
|
174 |
-
this has not really existed before. You can train traditional LoRAs directly on a model that can do controls and inpainting. Flex.1-alpha LoRAs also tento to work well with it. Day 1 support is already live for LoRA training with
|
175 |
-
[AI-Toolkit](https://github.com/ostris/ai-toolkit) with built in functionality to automatically generate the controls and inpainting inputs for your existing datasets. Check out the example config file and read through the comments
|
176 |
-
to see how it works [train_lora_flex2_24gb.yaml](https://github.com/ostris/ai-toolkit/blob/main/config/examples/train_lora_flex2_24gb.yaml)
|
177 |
-
|
178 |
-
You can also make your own controls and teach the model to use them by training a simple LoRA in no more time than it would take to train a normal LoRA.
|
179 |
-
|
180 |
-
## Feedback
|
181 |
-
I would love to hear feedback on the model and on things that need improvement. Please [Join my Discord](https://discord.gg/VXmU2f5WEU). I am also open to suggestions for new features and improvements.
|
182 |
-
|
183 |
-
## Control Implementation
|
184 |
-
The technical stuff for those implementing tools and inference for it. General users can skip this part.
|
185 |
-
|
186 |
-
The control and inpainting implementation work similar to Flux controls, though the inpainting is slightly different. For Flux/Flex has a
|
187 |
-
16 channel latent space that is packed at half the size into a 64 channel latent. The controls can be added before or after packing, but for suimplicity,
|
188 |
-
I will describe them on a 16channel unpacked latent.
|
189 |
-
|
190 |
-
(16ch = Noisy latent) + (16ch = VAE encoded inpainting image) + (1ch = inpainting mask) + (16ch = control input) = 49 channels
|
191 |
-
|
192 |
-
- **16ch Noisy Latent** - This works as it has previously and is the normal input for a Flex/Flux model.
|
193 |
-
- **16ch VAE encoded inpainting image** - The inpainting image is encoded using the VAE without any masking. Once in the latent space. The desirec inpait section is zeroed out by multiplying by the inverted mask.
|
194 |
-
To disable this input, simply feed 0s for these channels to indicate the entire image is inpainted.
|
195 |
-
- **1ch Inpainting mask** - The inpainting mask is a single channel image that indicates which pixels are inpainted. The mask is 0 for pixels in the inpainting image to keep and 1 for the area to inpaint. The mask can just be scaled down directly from the pixel space.
|
196 |
-
To disable this input, along with inpainting, feed 1s for this channel to indicate the entire image is inpainted.
|
197 |
-
- **16ch Control input** - A VAE encoded control input. The model was trained on pose, line, and depth inputs. To disable control, simply feed 0s for these channels to indicate no control input.
|
198 |
-
|
199 |
-
For normal T2I generation without any controls or inputs, you simpley need.
|
200 |
-
```python
|
201 |
-
model_input = torch.cat([
|
202 |
-
latent, # Noisy latent
|
203 |
-
torch.zeros_like(latent), # VAE encoded inpainting image
|
204 |
-
torch.ones_like(latent)[:, 0:1, :, :], # 0 - 1 inpaint mask
|
205 |
-
torch.zeros_like(latent) # VAE encoded control input
|
206 |
-
], dim=1)
|
207 |
-
```
|
208 |
-
|
209 |
-
## Support My Work
|
210 |
|
211 |
If you enjoy my projects or use them commercially, please consider sponsoring me. Every bit helps! 💖
|
212 |
|
213 |
[Sponsor on GitHub](https://github.com/orgs/ostris) | [Support on Patreon](https://www.patreon.com/ostris) | [Donate on PayPal](https://www.paypal.com/donate/?hosted_button_id=9GEFUKC8T9R9W)
|
214 |
-
|
215 |
-
### Current Sponsors
|
216 |
-
|
217 |
-
All of these people / organizations are the ones who selflessly make this project possible. Thank you!!
|
218 |
-
|
219 |
-
_Last updated: 2025-04-23 18:04 UTC_
|
220 |
-
|
221 |
-
<p align="center">
|
222 |
-
<a href="https://github.com/replicate" target="_blank" rel="noopener noreferrer"><img src="https://avatars.githubusercontent.com/u/60410876?v=4" alt="Replicate" width="200" height="200" style="border-radius:8px;margin:5px;display: inline-block;"></a>
|
223 |
-
<a href="https://github.com/josephrocca" target="_blank" rel="noopener noreferrer"><img src="https://avatars.githubusercontent.com/u/1167575?u=92d92921b4cb5c8c7e225663fed53c4b41897736&v=4" alt="josephrocca" width="200" height="200" style="border-radius:8px;margin:5px;display: inline-block;"></a>
|
224 |
-
</p>
|
225 |
-
<hr style="width:100%;border:none;height:2px;background:#ddd;margin:30px 0;">
|
226 |
-
<p align="center">
|
227 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/162524101/81a72689c3754ac5b9e38612ce5ce914/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=3XLSlLFCWAQ-0wd2_vZMikyotdQNSzKOjoyeoJiZEw0%3D" alt="Prasanth Veerina" width="150" height="150" style="border-radius:8px;margin:5px;display: inline-block;">
|
228 |
-
<a href="https://github.com/weights-ai" target="_blank" rel="noopener noreferrer"><img src="https://avatars.githubusercontent.com/u/185568492?v=4" alt="Weights" width="150" height="150" style="border-radius:8px;margin:5px;display: inline-block;"></a>
|
229 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/161471720/dd330b4036d44a5985ed5985c12a5def/eyJ3IjoyMDB9/1.jpeg?token-time=2145916800&token-hash=qkRvrEc5gLPxaXxLvcvbYv1W1lcmOoTwhj4A9Cq5BxQ%3D" alt="Vladimir Sotnikov" width="150" height="150" style="border-radius:8px;margin:5px;display: inline-block;">
|
230 |
-
<img src="https://c8.patreon.com/3/200/33158543" alt="clement Delangue" width="150" height="150" style="border-radius:8px;margin:5px;display: inline-block;">
|
231 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/54890369/45cea21d82974c78bf43956de7fb0e12/eyJ3IjoyMDB9/2.jpeg?token-time=2145916800&token-hash=IK6OT6UpusHgdaC4y8IhK5XxXiP5TuLy3vjvgL77Fho%3D" alt="Eli Slugworth" width="150" height="150" style="border-radius:8px;margin:5px;display: inline-block;">
|
232 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/8654302/b0f5ebedc62a47c4b56222693e1254e9/eyJ3IjoyMDB9/1.jpeg?token-time=2145916800&token-hash=lpeicIh1_S-3Ji3W27gyiRB7iXurp8Bx8HAzDHftOuo%3D" alt="Misch Strotz" width="150" height="150" style="border-radius:8px;margin:5px;display: inline-block;">
|
233 |
-
<img src="https://c8.patreon.com/3/200/93304" alt="Joseph Rocca" width="150" height="150" style="border-radius:8px;margin:5px;display: inline-block;">
|
234 |
-
</p>
|
235 |
-
<hr style="width:100%;border:none;height:2px;background:#ddd;margin:30px 0;">
|
236 |
-
<p align="center">
|
237 |
-
<a href="https://x.com/NuxZoe" target="_blank" rel="noopener noreferrer"><img src="https://pbs.twimg.com/profile_images/1714760743273574400/tdvQjNTl_400x400.jpg" alt="tungsten" width="100" height="100" style="border-radius:8px;margin:5px;display: inline-block;"></a>
|
238 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/2298192/1228b69bd7d7481baf3103315183250d/eyJ3IjoyMDB9/1.jpg?token-time=2145916800&token-hash=1B7dbXy_gAcPT9WXBesLhs7z_9APiz2k1Wx4Vml_-8Q%3D" alt="Mohamed Oumoumad" width="100" height="100" style="border-radius:8px;margin:5px;display: inline-block;">
|
239 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/120239481/49b1ce70d3d24704b8ec34de24ec8f55/eyJ3IjoyMDB9/1.jpeg?token-time=2145916800&token-hash=Dv1NPKwdv9QT8fhYYwbGnQIvfiyqTUlh52bjDW1vYxY%3D" alt="nitish PNR" width="100" height="100" style="border-radius:8px;margin:5px;display: inline-block;">
|
240 |
-
<img src="https://c8.patreon.com/3/200/548524" alt="Steve Hanff" width="100" height="100" style="border-radius:8px;margin:5px;display: inline-block;">
|
241 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/152118848/3b15a43d71714552b5ed1c9f84e66adf/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=IEKE18CBHVZ3k-08UD7Dkb7HbiFHb84W0FATdLMI0Dg%3D" alt="Kristjan Retter" width="100" height="100" style="border-radius:8px;margin:5px;display: inline-block;">
|
242 |
-
<img src="https://c8.patreon.com/3/200/83319230" alt="Miguel Lara" width="100" height="100" style="border-radius:8px;margin:5px;display: inline-block;">
|
243 |
-
</p>
|
244 |
-
<hr style="width:100%;border:none;height:2px;background:#ddd;margin:30px 0;">
|
245 |
-
<p align="center">
|
246 |
-
<img src="https://c8.patreon.com/3/200/8449560" alt="Patron" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
247 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/131773947/eda3405aa582437db4582fce908c8739/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=S4Bh0sMqTNmJlo3uRr7co5d_kxvBjITemDTfi_1KrCA%3D" alt="Jodh Singh" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
248 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/27288932/6c35d2d961ee4e14a7a368c990791315/eyJ3IjoyMDB9/1.jpeg?token-time=2145916800&token-hash=dpFFssZXZM_KZMKQhl3uDwwusdFw1c_v9x_ChJU7_zc%3D" alt="David Garrido" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
249 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/169502989/220069e79ce745b29237e94c22a729df/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=lmuorehEKQBZnhiX6JejlV0zqrvNacGxhcxyi0Sdt5E%3D" alt="Timothy Bielec" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
250 |
-
<img src="https://c8.patreon.com/3/200/2410522" alt="George Gostyshev" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
251 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/16287560/78130de30950410ca528d8a888997081/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=Ok-HSL2MthKXF09SmCOlPFCPfbMctFBZKCuTnPwxZ3A%3D" alt="Vitaly Golubenko" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
252 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/570742/4ceb33453a5a4745b430a216aba9280f/eyJ3IjoyMDB9/1.jpg?token-time=2145916800&token-hash=wUzsI5cO5Evp2ukIGdSgBbvKeYgv5LSOQMa6Br33Rrs%3D" alt="Al H" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
253 |
-
<img src="https://c8.patreon.com/3/200/22809690" alt="Michael Levine" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
254 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/99036356/7ae9c4d80e604e739b68cca12ee2ed01/eyJ3IjoyMDB9/3.png?token-time=2145916800&token-hash=zK0dHe6A937WtNlrGdefoXFTPPzHUCfn__23HP8-Ui0%3D" alt="Noctre" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
255 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/141098579/1a9f0a1249d447a7a0df718a57343912/eyJ3IjoyMDB9/2.png?token-time=2145916800&token-hash=Rd_AjZGhMATVkZDf8E95ILc0n93gvvFWe1Ig0_dxwf4%3D" alt="The Local Lab" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
256 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/98811435/3a3632d1795b4c2b9f8f0270f2f6a650/eyJ3IjoyMDB9/1.jpeg?token-time=2145916800&token-hash=93w8RMxwXlcM4X74t03u6P5_SrKvlm1IpjnD2SzVpJk%3D" alt="EmmanuelMr18" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
257 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/338551/e8f257d8d3dd46c38272b391a5785948/eyJ3IjoyMDB9/1.jpg?token-time=2145916800&token-hash=GLom1rGgOZjBeO7I1OnjiIgWmjl6PO9ZjBB8YTvc7AM%3D" alt="Plaidam" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
258 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/82763/f99cc484361d4b9d94fe4f0814ada303/eyJ3IjoyMDB9/1.jpeg?token-time=2145916800&token-hash=BpwC020pR3TRZ4r0RSCiSIOh-jmatkrpy1h2XU4sGa4%3D" alt="Doron Adler" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
259 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/103077711/bb215761cc004e80bd9cec7d4bcd636d/eyJ3IjoyMDB9/2.jpeg?token-time=2145916800&token-hash=zvtBie29rRTKTXvAA2KhOI-l3mSMk9xxr-mg_CksLtc%3D" alt="John Dopamine" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
260 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/93348210/5c650f32a0bc481d80900d2674528777/eyJ3IjoyMDB9/1.jpeg?token-time=2145916800&token-hash=PpXK9B_iy288annlNdLOexhiQHbTftPEDeCh-sTQ2KA%3D" alt="Armin Behjati" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
261 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/155963250/6f8fd7075c3b4247bfeb054ba49172d6/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=twmKs4mADF_h7bKh5jBuigYVScMeaeHv2pEPin9K0Dg%3D" alt="Un Defined" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
262 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/45562978/0de33cf52ec642ae8a2f612cddec4ca6/eyJ3IjoyMDB9/1.jpeg?token-time=2145916800&token-hash=hSAvaD4phiLcF0pvX7FP0juI5NQWCon-_TZSNpJzQJg%3D" alt="Jack English" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
263 |
-
<img src="https://c8.patreon.com/3/200/27791680" alt="Jean-Tristan Marin" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
264 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/60995694/92e0e8f336eb4a5bb8d99b940247d1d1/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=pj6Tm8XRdpGJcAEdnCakqYSNiSjoAYjvZescX7d0ic0%3D" alt="Abraham Irawan" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
265 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/164958178/4eb7a37baa0541bab7a091f2b14615b7/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=_aaum7fBJAGaJhMBhlR8vqYavDhExdVxmO9mwd3_XMw%3D" alt="Austin Robinson" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
266 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/134129880/680c7e14cd1a4d1a9face921fb010f88/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=vNKojv67krNqx7gdpKBX1R_stX2TkMRYvRc0xZrbY6s%3D" alt="Bharat Prabhakar" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
267 |
-
<img src="https://c8.patreon.com/3/200/70218846" alt="Cosmosis" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
268 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/83054970/13de6cb103ad41a5841edf549e66cd51/eyJ3IjoyMDB9/1.jpeg?token-time=2145916800&token-hash=wU_Eke9VYcfI40FAQvdEV84Xspqlo5VSiafLqhg_FOE%3D" alt="Gili Ben Shahar" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
269 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/30931983/54ab4e4ceab946e79a6418d205f9ed51/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=LBmsSsMQZhO6yRZ_YyRwTgE6a7BVWrGNsAVveLXHXR0%3D" alt="HestoySeghuro ." width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
270 |
-
<img src="https://c8.patreon.com/3/200/4105384" alt="Jack Blakely" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
271 |
-
<img src="https://c8.patreon.com/3/200/494309" alt="Julian Tsependa" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
272 |
-
<img src="https://c8.patreon.com/3/200/24653779" alt="RayHell" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
273 |
-
<img src="https://c8.patreon.com/3/200/4541423" alt="Sören " width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
274 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/31950857/c567dc648f6144be9f6234946df05da2/eyJ3IjoyMDB9/1.jpeg?token-time=2145916800&token-hash=3Vx4R1eOfD4X_ZPPd40MsZ-3lyknLM35XmaHRELnWjM%3D" alt="Trent Hunter" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
275 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/110407414/30f9e9d88ef945ddb0f47fd23a8cbac2/eyJ3IjoyMDB9/1.jpeg?token-time=2145916800&token-hash=QQRWOkMyOfDBERHn4O8N2wMB32zeiIEsydVTbSNUw-I%3D" alt="Wesley Reitzfeld" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
276 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/162398691/89d78d89eecb4d6b981ce8c3c6a3d4b8/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=SWhI-0jGpY6Nc_bUQeXz4pa9DRURi9VnnnJ3Mxjg1po%3D" alt="Zoltán-Csaba Nyiró" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
277 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/97985240/3d1d0e6905d045aba713e8132cab4a30/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=pG3X2m-py2lRYI2aoJiXI47_4ArD78ZHdSm6jCAHA_w%3D" alt="עומר מכלוף" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
278 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/140599287/cff037fb93804af28bc3a4f1e91154f8/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=vkscmpmFoM5wq7GnsLmOEgNhvyXe-774kNGNqD0wurE%3D" alt="Lukas" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
279 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/96561218/b0694642d13a49faa75aec9762ff2aeb/eyJ3IjoyMDB9/1.jpeg?token-time=2145916800&token-hash=sLQXomYm1iMYpknvGwKQ49f30TKQ0B1R2W3EZfCJqr8%3D" alt="Ultimate Golf Archives" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
280 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/81275465/1e4148fe9c47452b838949d02dd9a70f/eyJ3IjoyMDB9/1.jpeg?token-time=2145916800&token-hash=uzJzkUq9rte3wx8wDLjGAgvSoxdtZcAnH7HctDhdYEo%3D" alt="Aaron Amortegui" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
281 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/44568304/a9d83a0e786b41b4bdada150f7c9271c/eyJ3IjoyMDB9/1.jpeg?token-time=2145916800&token-hash=SBphTD654nwr-OTrvIBIJBEQho7GE2PtRre8nyaG1Fk%3D" alt="Albert Bukoski" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
282 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/49304261/d0a730de1c3349e585c49288b9f419c6/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=C2BMZ3ci-Ty2nhnSwKZqsR-5hOGsUNDYcvXps0Geq9w%3D" alt="Arvin Flores" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
283 |
-
<img src="https://c8.patreon.com/3/200/5048649" alt="Ben Ward" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
284 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/130338124/f904a3bb76cd4588ac8d8f595c6cb486/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=k-inISRUtYDu9q7fNAKc3S2S7qcaw26fr1pj7PqU28Q%3D" alt="Bnp" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
285 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/111904990/08b1cf65be6a4de091c9b73b693b3468/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=OAJc9W5Ak0uJfQ2COlo1Upo38K3aj1fMQFCMC7ft5tM%3D" alt="Brian Smith" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
286 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/113207022/d4a67cc113e84fb69032bef71d068720/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=mu-tIg88VwoQdgLEOmxuVkhVm9JT59DdnHXJstmkkLU%3D" alt="Fagem X" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
287 |
-
<img src="https://c8.patreon.com/3/200/5602036" alt="Kelevra" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
288 |
-
<img src="https://c8.patreon.com/3/200/358350" alt="L D" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
289 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/159203973/36c817f941ac4fa18103a4b8c0cb9cae/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=9toslDfsO14QyaOiu6vIf--d4marBsWCZWN3gdPqbIU%3D" alt="Marko jak" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
290 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/11198131/e696d9647feb4318bcf16243c2425805/eyJ3IjoyMDB9/1.jpeg?token-time=2145916800&token-hash=o6Hrpzw9rf2Ucd4cZ-hdUkGejLNv44-pqF8smeOF3ts%3D" alt="Nicholas Agranoff" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
291 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/785333/bdb9ede5765d42e5a2021a86eebf0d8f/eyJ3IjoyMDB9/2.jpg?token-time=2145916800&token-hash=dr5eaMg3Ua0wyCy40Qv3F-ZFajWZmuz2fWG55FskREc%3D" alt="Sapjes " width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
292 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/44738426/b01ff676da864d4ab9c21f226275b63e/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=54nIkcxFaGszJ3q0jNhtrVSBbV3WNK9e5WX9VzXltYk%3D" alt="Shakeel Saleemi" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
293 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/76566911/6485eaf5ec6249a7b524ee0b979372f0/eyJ3IjoyMDB9/1.jpeg?token-time=2145916800&token-hash=S1QK78ief5byQU7tB_reqnw4V2zhW_cpwTqHThk-tGc%3D" alt="the biitz" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
294 |
-
<img src="https://c8.patreon.com/3/200/83034" alt="william tatum" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
295 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/32633822/1ab5612efe80417cbebfe91e871fc052/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=RHYMcjr0UGIYw5FBrUfJdKMGuoYWhBQlLIykccEFJvo%3D" alt="Zack Abrams" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
296 |
-
<img src="https://c10.patreonusercontent.com/4/patreon-media/p/user/138787189/2b5662dcb638466282ac758e3ac651b4/eyJ3IjoyMDB9/1.png?token-time=2145916800&token-hash=IlUAs9JAlVRphfx81V-Jt-nMiSBS8mPewRr9u6pQjaQ%3D" alt="Антон Антонио" width="60" height="60" style="border-radius:8px;margin:5px;display: inline-block;">
|
297 |
-
</p>
|
298 |
-
|
299 |
-
---
|
300 |
-
|
|
|
43 |
|
44 |
## Usage
|
45 |
|
|
|
46 |
|
|
|
47 |
|
48 |
+
## Support His Work
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
|
50 |
If you enjoy my projects or use them commercially, please consider sponsoring me. Every bit helps! 💖
|
51 |
|
52 |
[Sponsor on GitHub](https://github.com/orgs/ostris) | [Support on Patreon](https://www.patreon.com/ostris) | [Donate on PayPal](https://www.paypal.com/donate/?hosted_button_id=9GEFUKC8T9R9W)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|