# FragmentColor
[FragmentColor](https://fragmentcolor.org) is a cross-platform GPU programming library implemented in Rust and [wgpu](https://wgpu.rs).
It has bindings for **Javascript**, **Python**, **Swift**, and **Kotlin**
and targets each platform's native graphics API: **Vulkan**, **Metal**, **DirectX**, **OpenGL**, **WebGL**, or **WebGPU**.\
See [Platform Support](#platform-support) for details.
The API encourages a simple shader composition workflow. You can use **WGSL** or **GLSL** shaders
for visual consistency across platforms, while avoiding the verbosity of modern GPU APIs.
**We strive to remove the complexity without sacrificing control**. Because of the composition primitives, you can
build a highly customized render graph with multiple render passes.
Check the [Documentation](/welcome) and the [API Reference](/api) for more information.
> ⚠️ **This library is its early days of development**
>
> The API is subject to frequent changes in minor versions. Documentation is not always in sync.
>
> Check the [Roadmap](/ROADMAP.md) and [Changelog](/CHANGELOG.md) on [GitHub](https://github.com/vista-art/fragmentcolor) to stay tuned on the latest updates.
## Example
From a given shader source, our library will:
- parse the shader
- compile/reload it at runtime
- create the Uniform bindings in your platform's native graphics API
- expose them with the dot notation.
### Example usage (Python)
```bash
pip install fragmentcolor glfw rendercanvas
```
```python
from fragmentcolor import FragmentColor as fc, Shader, Pass, Frame
from rendercanvas.auto import RenderCanvas, loop
# Initializes a renderer and a target compatible with the given canvas
canvas = RenderCanvas(size=(800, 600))
renderer, target = fc.init(canvas)
# You can pass the shader as a source string, file path, or URL:
circle = Shader("./path/to/circle.wgsl")
triangle = Shader("https://fragmentcolor.org/shaders/triangle.wgsl")
my_shader = Shader("""
struct VertexOutput {
@builtin(position) coords: vec4<f32>,
}
struct MyStruct {
my_field: vec3<f32>,
}
@group(0) @binding(0)
var<uniform> my_struct: MyStruct;
@group(0) @binding(1)
var<uniform> my_vec2: vec2<f32>;
@vertex
fn vs_main(@builtin(vertex_index) in_vertex_index: u32) -> VertexOutput {
const vertices = array(
vec2( -1., -1.),
vec2( 3., -1.),
vec2( -1., 3.)
);
return VertexOutput(vec4<f32>(vertices[in_vertex_index], 0.0, 1.0));
}
@fragment
fn fs_main() -> @location(0) vec4<f32> {
return vec4<f32>(my_struct.my_field, 1.0);
}
""")
# The library binds and updates the uniforms automatically
my_shader.set("my_struct.my_field", [0.1, 0.8, 0.9])
my_shader.set("my_vec2", [1.0, 1.0])
# One shader is all you need to render
renderer.render(shader, target)
# But you can also combine multiple shaders in a render Pass
rpass = Pass("single pass")
rpass.add_shader(circle)
rpass.add_shader(triangle)
rpass.add_shader(my_shader)
renderer.render(rpass, target)
# Finally, you can combine multiple passes in a Frame
frame = Frame()
frame.add_pass(rpass)
frame.add_pass(Pass("GUI pass"))
renderer.render(frame, target)
# To animate, simply update the uniforms in a loop
@canvas.request_draw
def animate():
circle.set("position", [0.0, 0.0])
renderer.render(frame, target)
loop.run()
```
### Example usage (Javascript)
```javascript
import { Shader, Renderer, Target, FragmentColor } from "fragmentcolor";
let canvas = document.getElementById("my-canvas");
const resolution = [canvas.width, canvas.heigth];
[renderer, target] = FragmentColor.init(canvas);
const shader = new Shader("https://fragmentcolor.org/shaders/circle.wgsl");
shader.set("resolution", resolution);
shader.set("circle.radius", 0.05);
shader.set("circle.color", [1.0, 0.0, 0.0, 0.8]);
const renderer = new Renderer();
function animate() {
shader.set("circle.position", [mouseX, mouseY]);
renderer.render(shader, target);
requestAnimationFrame(animate);
}
animate();
```
## Limitations
- The current version of this library **always use a fullscreen triangle for every shader**. Support for custom geometries and instanced rendering is planned.
- In Python, we depend on [rendercanvas](https://github.com/pygfx/rendercanvas) adapter to support multiple window libraries. Direct support for other libraries is planned.
- Textures and Samplers are currently not supported, but are also planned.
- Javascript, Swift, and Kotlin are currently WIP.
## Running this project
### Target: Desktop (Rust library)
For Rust, check the examples folder and run them with:
```bash
cargo run --example circle
cargo run --example triangle
cargo run --example multiobject
cargo run --example multipass
```
### Target: Desktop (Python module)
**NOTE:** Pip Package currently only available for MacOS (Apple Silicon)
```bash
pip install fragmentcolor glfw rendercanvas
```
Alternativaly, You can build it locally with [maturin](https://www.maturin.rs/installation.html):
```bash
pipx install maturin
maturin develop
pip install glfw rendercanvas
```
The built library is located in `platforms/python/fragmentcolor`
```bash
cd platforms/python/fragmentcolor
python3 main.py
```
### Target: Web browser (WASM module)
- TBD
### Target: iOS (Swift library)
- TBD
### Target: Android (Kotlin library)
- TBD
## Platform support
Platform support is the same as upstream [wgpu](https://github.com/gfx-rs/wgpu):
| API | Windows | Linux/Android | macOS/iOS | Web (wasm) |
| ------ | ------------ | --------------- | --------- | ----------- |
| Vulkan | ✅ | ✅ | 🌋 | |
| Metal | | | ✅ | |
| DX12 | ✅ | | | |
| OpenGL | 🆗 (GL 3.3+) | 🆗 (GL ES 3.0+) | 📐 | 🆗 (WebGL2) |
| WebGPU | | | | ✅ |
✅ = First Class Support
🆗 = Downlevel/Best Effort Support
📐 = Requires the [ANGLE](http://angleproject.org/) translation layer (GL ES 3.0 only)
🌋 = Requires the [MoltenVK](https://vulkan.lunarg.com/sdk/home#mac) translation layer
Raw data
{
"_id": null,
"home_page": "https://fragmentcolor.org",
"name": "fragmentcolor",
"maintainer": "Rafael Beckel",
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "graphics, rendering, wgpu, cross-platform, art",
"author": "Rafael Beckel",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/39/92/8613d9abffdca3a4e0a93317f97ee7083cd5a5d4c0463f827816d179f28e/fragmentcolor-0.10.6.tar.gz",
"platform": null,
"description": "# FragmentColor\n\n[FragmentColor](https://fragmentcolor.org) is a cross-platform GPU programming library implemented in Rust and [wgpu](https://wgpu.rs).\n\nIt has bindings for **Javascript**, **Python**, **Swift**, and **Kotlin**\nand targets each platform's native graphics API: **Vulkan**, **Metal**, **DirectX**, **OpenGL**, **WebGL**, or **WebGPU**.\\\nSee [Platform Support](#platform-support) for details.\n\nThe API encourages a simple shader composition workflow. You can use **WGSL** or **GLSL** shaders\nfor visual consistency across platforms, while avoiding the verbosity of modern GPU APIs.\n\n**We strive to remove the complexity without sacrificing control**. Because of the composition primitives, you can\nbuild a highly customized render graph with multiple render passes.\n\nCheck the [Documentation](/welcome) and the [API Reference](/api) for more information.\n\n> \u26a0\ufe0f **This library is its early days of development**\n>\n> The API is subject to frequent changes in minor versions. Documentation is not always in sync.\n>\n> Check the [Roadmap](/ROADMAP.md) and [Changelog](/CHANGELOG.md) on [GitHub](https://github.com/vista-art/fragmentcolor) to stay tuned on the latest updates.\n\n## Example\n\nFrom a given shader source, our library will:\n\n- parse the shader\n- compile/reload it at runtime\n- create the Uniform bindings in your platform's native graphics API\n- expose them with the dot notation.\n\n### Example usage (Python)\n\n```bash\npip install fragmentcolor glfw rendercanvas\n```\n\n```python\nfrom fragmentcolor import FragmentColor as fc, Shader, Pass, Frame\nfrom rendercanvas.auto import RenderCanvas, loop\n\n# Initializes a renderer and a target compatible with the given canvas\ncanvas = RenderCanvas(size=(800, 600))\nrenderer, target = fc.init(canvas)\n\n# You can pass the shader as a source string, file path, or URL:\ncircle = Shader(\"./path/to/circle.wgsl\")\ntriangle = Shader(\"https://fragmentcolor.org/shaders/triangle.wgsl\")\nmy_shader = Shader(\"\"\"\nstruct VertexOutput {\n @builtin(position) coords: vec4<f32>,\n}\n\nstruct MyStruct {\n my_field: vec3<f32>,\n}\n\n@group(0) @binding(0)\nvar<uniform> my_struct: MyStruct;\n\n@group(0) @binding(1)\nvar<uniform> my_vec2: vec2<f32>;\n\n@vertex\nfn vs_main(@builtin(vertex_index) in_vertex_index: u32) -> VertexOutput {\n const vertices = array(\n vec2( -1., -1.),\n vec2( 3., -1.),\n vec2( -1., 3.)\n );\n return VertexOutput(vec4<f32>(vertices[in_vertex_index], 0.0, 1.0));\n}\n\n@fragment\nfn fs_main() -> @location(0) vec4<f32> {\n return vec4<f32>(my_struct.my_field, 1.0);\n}\n\"\"\")\n\n# The library binds and updates the uniforms automatically\nmy_shader.set(\"my_struct.my_field\", [0.1, 0.8, 0.9])\nmy_shader.set(\"my_vec2\", [1.0, 1.0])\n\n# One shader is all you need to render\nrenderer.render(shader, target)\n\n# But you can also combine multiple shaders in a render Pass\nrpass = Pass(\"single pass\")\nrpass.add_shader(circle)\nrpass.add_shader(triangle)\nrpass.add_shader(my_shader)\nrenderer.render(rpass, target)\n\n# Finally, you can combine multiple passes in a Frame\nframe = Frame()\nframe.add_pass(rpass)\nframe.add_pass(Pass(\"GUI pass\"))\nrenderer.render(frame, target)\n\n# To animate, simply update the uniforms in a loop\n@canvas.request_draw\ndef animate():\n circle.set(\"position\", [0.0, 0.0])\n renderer.render(frame, target)\n\nloop.run()\n```\n\n### Example usage (Javascript)\n\n```javascript\nimport { Shader, Renderer, Target, FragmentColor } from \"fragmentcolor\";\n\nlet canvas = document.getElementById(\"my-canvas\");\nconst resolution = [canvas.width, canvas.heigth];\n\n[renderer, target] = FragmentColor.init(canvas);\n\nconst shader = new Shader(\"https://fragmentcolor.org/shaders/circle.wgsl\");\nshader.set(\"resolution\", resolution);\nshader.set(\"circle.radius\", 0.05);\nshader.set(\"circle.color\", [1.0, 0.0, 0.0, 0.8]);\n\nconst renderer = new Renderer();\n\nfunction animate() {\n shader.set(\"circle.position\", [mouseX, mouseY]);\n renderer.render(shader, target);\n\n requestAnimationFrame(animate);\n}\nanimate();\n```\n\n## Limitations\n\n- The current version of this library **always use a fullscreen triangle for every shader**. Support for custom geometries and instanced rendering is planned.\n\n- In Python, we depend on [rendercanvas](https://github.com/pygfx/rendercanvas) adapter to support multiple window libraries. Direct support for other libraries is planned.\n\n- Textures and Samplers are currently not supported, but are also planned.\n\n- Javascript, Swift, and Kotlin are currently WIP.\n\n## Running this project\n\n### Target: Desktop (Rust library)\n\nFor Rust, check the examples folder and run them with:\n\n```bash\ncargo run --example circle\ncargo run --example triangle\ncargo run --example multiobject\ncargo run --example multipass\n```\n\n### Target: Desktop (Python module)\n\n**NOTE:** Pip Package currently only available for MacOS (Apple Silicon)\n\n```bash\npip install fragmentcolor glfw rendercanvas\n```\n\nAlternativaly, You can build it locally with [maturin](https://www.maturin.rs/installation.html):\n\n```bash\npipx install maturin\nmaturin develop\npip install glfw rendercanvas\n```\n\nThe built library is located in `platforms/python/fragmentcolor`\n\n```bash\ncd platforms/python/fragmentcolor\npython3 main.py\n```\n\n### Target: Web browser (WASM module)\n\n- TBD\n\n### Target: iOS (Swift library)\n\n- TBD\n\n### Target: Android (Kotlin library)\n\n- TBD\n\n## Platform support\n\nPlatform support is the same as upstream [wgpu](https://github.com/gfx-rs/wgpu):\n\n| API | Windows | Linux/Android | macOS/iOS | Web (wasm) |\n| ------ | ------------ | --------------- | --------- | ----------- |\n| Vulkan | \u2705 | \u2705 | \ud83c\udf0b | |\n| Metal | | | \u2705 | |\n| DX12 | \u2705 | | | |\n| OpenGL | \ud83c\udd97 (GL 3.3+) | \ud83c\udd97 (GL ES 3.0+) | \ud83d\udcd0 | \ud83c\udd97 (WebGL2) |\n| WebGPU | | | | \u2705 |\n\n\u2705 = First Class Support \n\ud83c\udd97 = Downlevel/Best Effort Support\n\ud83d\udcd0 = Requires the [ANGLE](http://angleproject.org/) translation layer (GL ES 3.0 only) \n\ud83c\udf0b = Requires the [MoltenVK](https://vulkan.lunarg.com/sdk/home#mac) translation layer\n\n",
"bugtrack_url": null,
"license": null,
"summary": "Easy cross-platform GPU Rendering for Javascript, Python, Swift and Kotlin",
"version": "0.10.6",
"project_urls": {
"Homepage": "https://fragmentcolor.org",
"changelog": "https://github.com/vista-art/fragmentcolor/releases",
"documentation": "https://fragmentcolor.org/welcome",
"repository": "https://github.com/vista-art/fragmentcolor"
},
"split_keywords": [
"graphics",
" rendering",
" wgpu",
" cross-platform",
" art"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "ba5f326deeeb527aafa8cfd11f77b459e9075c19333421e47d2aef73190131c6",
"md5": "99e063696cf4e5c2b70339f2aef8e701",
"sha256": "9a3c3515572cc9b84ffa606aaaca8bd62d3f41c6761e60f0065a69a4e0e89fde"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp313-cp313t-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "99e063696cf4e5c2b70339f2aef8e701",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 2595933,
"upload_time": "2025-08-22T11:22:36",
"upload_time_iso_8601": "2025-08-22T11:22:36.691432Z",
"url": "https://files.pythonhosted.org/packages/ba/5f/326deeeb527aafa8cfd11f77b459e9075c19333421e47d2aef73190131c6/fragmentcolor-0.10.6-cp313-cp313t-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2516a2dc69b148d313663cfe2ec11df27377fde1f2ca5bdba7fa3caf10e9e237",
"md5": "fc40a17b00d4548820a3bc0dcfbad226",
"sha256": "3d8a59af307ffc1e59cd47ac1f549583c9f649982255e3d72279f2225f943a40"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp313-cp313t-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "fc40a17b00d4548820a3bc0dcfbad226",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 2481252,
"upload_time": "2025-08-22T11:22:33",
"upload_time_iso_8601": "2025-08-22T11:22:33.536806Z",
"url": "https://files.pythonhosted.org/packages/25/16/a2dc69b148d313663cfe2ec11df27377fde1f2ca5bdba7fa3caf10e9e237/fragmentcolor-0.10.6-cp313-cp313t-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "032697d397571e2bef2d37c129f2759e1ea8f756f8e38d3c9d622d0e507b2cfa",
"md5": "313f2a06e0fbc5e39944c52c43301706",
"sha256": "5c6a9774c844b1e779968b4d2e4bd0fa2c0ee5bc94cb526a65698b95dd42f1b0"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "313f2a06e0fbc5e39944c52c43301706",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 3217873,
"upload_time": "2025-08-22T11:22:15",
"upload_time_iso_8601": "2025-08-22T11:22:15.265148Z",
"url": "https://files.pythonhosted.org/packages/03/26/97d397571e2bef2d37c129f2759e1ea8f756f8e38d3c9d622d0e507b2cfa/fragmentcolor-0.10.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e8010c6d6942412d391ed35adf112b80528e18ad1ee1d17576d45666ad9bbfc7",
"md5": "00b7ace437db967ec8dcb6e12013f705",
"sha256": "14d94137596d3554889d27bfac0750a702f0eded8ffcce9eab2b558743db7f3e"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "00b7ace437db967ec8dcb6e12013f705",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 3190296,
"upload_time": "2025-08-22T11:22:18",
"upload_time_iso_8601": "2025-08-22T11:22:18.480022Z",
"url": "https://files.pythonhosted.org/packages/e8/01/0c6d6942412d391ed35adf112b80528e18ad1ee1d17576d45666ad9bbfc7/fragmentcolor-0.10.6-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7f5b95fc48587bd3f5de6f30226df0a99283abdd7ffdc996a528cf7b5cf775d3",
"md5": "61320ed6a8aa5bfd0415d6b15419a7a7",
"sha256": "c513f63199cb94ca8a26eaaa0b0a41ec92660cc873b8e46e7367c870197d44b4"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "61320ed6a8aa5bfd0415d6b15419a7a7",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 3458468,
"upload_time": "2025-08-22T11:22:27",
"upload_time_iso_8601": "2025-08-22T11:22:27.805911Z",
"url": "https://files.pythonhosted.org/packages/7f/5b/95fc48587bd3f5de6f30226df0a99283abdd7ffdc996a528cf7b5cf775d3/fragmentcolor-0.10.6-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "df0b88631ce1a15db348d9d68bea660c77bc72b09e5594bef0b24224375f8034",
"md5": "80ae858ed0e313c6c2f357717cbf8709",
"sha256": "336df1faa7cd6d35a345d104031b9ec780af5861807aaad19e70f1b1d9f327a5"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "80ae858ed0e313c6c2f357717cbf8709",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 3690543,
"upload_time": "2025-08-22T11:22:21",
"upload_time_iso_8601": "2025-08-22T11:22:21.315320Z",
"url": "https://files.pythonhosted.org/packages/df/0b/88631ce1a15db348d9d68bea660c77bc72b09e5594bef0b24224375f8034/fragmentcolor-0.10.6-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "bad9c5db79f98a3b437870a9f4a7fc712f151cde00bc7d4c4e347f147379dc70",
"md5": "73060c77dea8d3e3a0a4337ef73b422f",
"sha256": "6c5f6494a618411d6f2f671d50a04a39e17a0462fe99a11eed809328908a7e96"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "73060c77dea8d3e3a0a4337ef73b422f",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 3289765,
"upload_time": "2025-08-22T11:22:24",
"upload_time_iso_8601": "2025-08-22T11:22:24.562392Z",
"url": "https://files.pythonhosted.org/packages/ba/d9/c5db79f98a3b437870a9f4a7fc712f151cde00bc7d4c4e347f147379dc70/fragmentcolor-0.10.6-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "95a988fc6d4aeb8866e2bd95672dc15ec0659ac8bba29d01667f2e7f1ef86c82",
"md5": "141680c4575a7410a52b3ef834727078",
"sha256": "e2ad2e9fc9aa245e65a50bc333ab34d96912df348777c5fbcc99ea01362924cc"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "141680c4575a7410a52b3ef834727078",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 3274859,
"upload_time": "2025-08-22T11:22:30",
"upload_time_iso_8601": "2025-08-22T11:22:30.415856Z",
"url": "https://files.pythonhosted.org/packages/95/a9/88fc6d4aeb8866e2bd95672dc15ec0659ac8bba29d01667f2e7f1ef86c82/fragmentcolor-0.10.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5ea7a1ee39983223d3b9e6a39f1eade1cdb1da661791852118218ad539510334",
"md5": "eeeaa1506cca1d7c6d40b25d92198162",
"sha256": "c575c069870076ecfd2c9c9e21fa62ef83ae19242a031d594137d46e59c47935"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp313-cp313t-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "eeeaa1506cca1d7c6d40b25d92198162",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 3370834,
"upload_time": "2025-08-22T11:22:39",
"upload_time_iso_8601": "2025-08-22T11:22:39.762242Z",
"url": "https://files.pythonhosted.org/packages/5e/a7/a1ee39983223d3b9e6a39f1eade1cdb1da661791852118218ad539510334/fragmentcolor-0.10.6-cp313-cp313t-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3c287990db0f7e9ad52004c38a2cfd44c175d1c3b488fa575a62618c278f9ff2",
"md5": "761843f3be7615ee73b2c022ec6b5bd9",
"sha256": "fff009c5d23639986611f7c99974f1c8e3e61554d1054854e87e60f4cf5e876e"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp313-cp313t-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "761843f3be7615ee73b2c022ec6b5bd9",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 3454321,
"upload_time": "2025-08-22T11:22:42",
"upload_time_iso_8601": "2025-08-22T11:22:42.834731Z",
"url": "https://files.pythonhosted.org/packages/3c/28/7990db0f7e9ad52004c38a2cfd44c175d1c3b488fa575a62618c278f9ff2/fragmentcolor-0.10.6-cp313-cp313t-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3c52dfc832fc5987041e6f2ee76112ffd9032edcd359ac5bb95e45612bb270d9",
"md5": "091cd020053d6e8b50ec0d0cc98f7cc9",
"sha256": "50ee18240994f1b416c73ab11ce77874d0d88940485cf5e3019711f66b0ace94"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp313-cp313t-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "091cd020053d6e8b50ec0d0cc98f7cc9",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 3445846,
"upload_time": "2025-08-22T11:22:45",
"upload_time_iso_8601": "2025-08-22T11:22:45.669584Z",
"url": "https://files.pythonhosted.org/packages/3c/52/dfc832fc5987041e6f2ee76112ffd9032edcd359ac5bb95e45612bb270d9/fragmentcolor-0.10.6-cp313-cp313t-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c4c1113aadfcf0a719dbc4049b8e4dcea093b88d126a80847e1cb757af2ddff0",
"md5": "3ae4810d5d5fe1fe79165f23e2860b77",
"sha256": "d65622c252fabef6abaaf87476da386ecad875b9efba5a419074b2ad530a5b67"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp313-cp313t-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "3ae4810d5d5fe1fe79165f23e2860b77",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 3445977,
"upload_time": "2025-08-22T11:22:48",
"upload_time_iso_8601": "2025-08-22T11:22:48.473926Z",
"url": "https://files.pythonhosted.org/packages/c4/c1/113aadfcf0a719dbc4049b8e4dcea093b88d126a80847e1cb757af2ddff0/fragmentcolor-0.10.6-cp313-cp313t-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c71feab7687fe724e8c6894cf725f4b85636eada992318c26e3e5a68b7bab3a0",
"md5": "49299cb3cbbbf6eeaf6f6f781269273d",
"sha256": "78d09e14ac2282ce0b732fddc0f82ffc9fe216eae6f0dcc7fc0b29f6c3537381"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp313-cp313t-win32.whl",
"has_sig": false,
"md5_digest": "49299cb3cbbbf6eeaf6f6f781269273d",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 2729497,
"upload_time": "2025-08-22T11:22:54",
"upload_time_iso_8601": "2025-08-22T11:22:54.182205Z",
"url": "https://files.pythonhosted.org/packages/c7/1f/eab7687fe724e8c6894cf725f4b85636eada992318c26e3e5a68b7bab3a0/fragmentcolor-0.10.6-cp313-cp313t-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "dbdde3f151c486088eddc4d4bad6a8d84e7a0af625bae04e46d3c266a765f05e",
"md5": "52a82e65035e76d6a0bc3819e41cdd2d",
"sha256": "4e3ac61bfbbc5d6e82f15a6a4950e4880650afff7e4fd878f3de027d86a7b683"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp313-cp313t-win_amd64.whl",
"has_sig": false,
"md5_digest": "52a82e65035e76d6a0bc3819e41cdd2d",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 2925499,
"upload_time": "2025-08-22T11:22:51",
"upload_time_iso_8601": "2025-08-22T11:22:51.680942Z",
"url": "https://files.pythonhosted.org/packages/db/dd/e3f151c486088eddc4d4bad6a8d84e7a0af625bae04e46d3c266a765f05e/fragmentcolor-0.10.6-cp313-cp313t-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "679a30fdca48783734d3012300e95799e7a5f595caa67ef23534f2bc4a67068f",
"md5": "a0674c9c776e7bdf6b60f4c4a89d7c6a",
"sha256": "9ced57e79598307038ae6a25ef6d1c055ae42df8a46a966aaeb802f39695f26c"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp39-abi3-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "a0674c9c776e7bdf6b60f4c4a89d7c6a",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 2608136,
"upload_time": "2025-08-22T11:22:38",
"upload_time_iso_8601": "2025-08-22T11:22:38.158638Z",
"url": "https://files.pythonhosted.org/packages/67/9a/30fdca48783734d3012300e95799e7a5f595caa67ef23534f2bc4a67068f/fragmentcolor-0.10.6-cp39-abi3-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "86617fb4b4951298754f869e94606ad1792e4fb54749494ee17dc9706eb196c0",
"md5": "1985daba2c2cb43811c6c9d18fdd7a26",
"sha256": "8813842810087cbf139722c5b3c018117da7b7db279c48bc00fc9ed94cd003db"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp39-abi3-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "1985daba2c2cb43811c6c9d18fdd7a26",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 2488732,
"upload_time": "2025-08-22T11:22:35",
"upload_time_iso_8601": "2025-08-22T11:22:35.008135Z",
"url": "https://files.pythonhosted.org/packages/86/61/7fb4b4951298754f869e94606ad1792e4fb54749494ee17dc9706eb196c0/fragmentcolor-0.10.6-cp39-abi3-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "eea5227e8cac5dc29ed3c317ae12693ec5a81f16b24077c46055274035e7c1d0",
"md5": "90b681412dc4785632f073a5e89213ca",
"sha256": "b8680af03279ae9419940d38b3ea71c22c3095ca14eec83683e55bf9737cd5fb"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "90b681412dc4785632f073a5e89213ca",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3223937,
"upload_time": "2025-08-22T11:22:16",
"upload_time_iso_8601": "2025-08-22T11:22:16.911816Z",
"url": "https://files.pythonhosted.org/packages/ee/a5/227e8cac5dc29ed3c317ae12693ec5a81f16b24077c46055274035e7c1d0/fragmentcolor-0.10.6-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0a36a111a34b3999c80bd4968c80e7b13c17337a20d0f2b9d459c7e116197f66",
"md5": "aac724efdd9e26904d7e0e1dc7df31cc",
"sha256": "6048d887469c68eed87d0f8fba27f884fb7bcd289e8e8cd231b635db2cbc867a"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "aac724efdd9e26904d7e0e1dc7df31cc",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3194045,
"upload_time": "2025-08-22T11:22:20",
"upload_time_iso_8601": "2025-08-22T11:22:20.088407Z",
"url": "https://files.pythonhosted.org/packages/0a/36/a111a34b3999c80bd4968c80e7b13c17337a20d0f2b9d459c7e116197f66/fragmentcolor-0.10.6-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fcbd0829308b79978e3f3de7dd8d30da5c07feb1f7070310d3b3606e0f5934a7",
"md5": "d148260096ddaf051668d567f64c286c",
"sha256": "372cfe2b1257dfb45e4c3f9154fcd1597421607e91882696b9d5387361c4a4fc"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "d148260096ddaf051668d567f64c286c",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3465266,
"upload_time": "2025-08-22T11:22:29",
"upload_time_iso_8601": "2025-08-22T11:22:29.175852Z",
"url": "https://files.pythonhosted.org/packages/fc/bd/0829308b79978e3f3de7dd8d30da5c07feb1f7070310d3b3606e0f5934a7/fragmentcolor-0.10.6-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d753df8ced9f85fb1d2b3d6f54d0d52aed4ceec1202b52471b0b20372334bec2",
"md5": "2f4ec9b3134cfcd9e9d07b08738716d2",
"sha256": "8f67410b8027672e4dbb5229ef918e0f4ac36fc0d273610c239f913857384cf5"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "2f4ec9b3134cfcd9e9d07b08738716d2",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3698730,
"upload_time": "2025-08-22T11:22:23",
"upload_time_iso_8601": "2025-08-22T11:22:23.140847Z",
"url": "https://files.pythonhosted.org/packages/d7/53/df8ced9f85fb1d2b3d6f54d0d52aed4ceec1202b52471b0b20372334bec2/fragmentcolor-0.10.6-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "24e2e9876875d4fb748497860475476eaea11d864683828d7b4ff806b76b8113",
"md5": "7db65ab8104b76865c790a508010bddb",
"sha256": "556e086de575e21e5f40fe59dfd68b46d6a163c57218138a858a17088b4811a7"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "7db65ab8104b76865c790a508010bddb",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3296611,
"upload_time": "2025-08-22T11:22:26",
"upload_time_iso_8601": "2025-08-22T11:22:26.083973Z",
"url": "https://files.pythonhosted.org/packages/24/e2/e9876875d4fb748497860475476eaea11d864683828d7b4ff806b76b8113/fragmentcolor-0.10.6-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4c6071bdeacd5e9272490a9d0729fce0962dbc24590e8b8dc44fa1579e677986",
"md5": "9605b2e55cce68c9aef01ae0e8ec48d9",
"sha256": "1ca6ed013c1b66672d17e7a846459c12a0fa842d425ea7722f2dcc5897d4e832"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "9605b2e55cce68c9aef01ae0e8ec48d9",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3281464,
"upload_time": "2025-08-22T11:22:32",
"upload_time_iso_8601": "2025-08-22T11:22:32.020023Z",
"url": "https://files.pythonhosted.org/packages/4c/60/71bdeacd5e9272490a9d0729fce0962dbc24590e8b8dc44fa1579e677986/fragmentcolor-0.10.6-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b5e7415ca663cc69194ec1eddcce740402318ba707c60fd5f08de80b7d669f7c",
"md5": "867931cb8513bb48ae8b34537775a3fe",
"sha256": "22c2a842564e323f53e6f2b50face05846720fce2b03f0d40ca4ab084377d8e8"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp39-abi3-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "867931cb8513bb48ae8b34537775a3fe",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3379865,
"upload_time": "2025-08-22T11:22:41",
"upload_time_iso_8601": "2025-08-22T11:22:41.301337Z",
"url": "https://files.pythonhosted.org/packages/b5/e7/415ca663cc69194ec1eddcce740402318ba707c60fd5f08de80b7d669f7c/fragmentcolor-0.10.6-cp39-abi3-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "951d2865d9d270e83f9096f2777f5799c3bf59a23bdd01a24a7639767a8df43b",
"md5": "84fd0466ffbc743afe8179a21130b019",
"sha256": "24bf374ab245d20818ba980c24b4a61957851c2ed4750dbdf962a1e410c4492d"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp39-abi3-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "84fd0466ffbc743afe8179a21130b019",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3458280,
"upload_time": "2025-08-22T11:22:44",
"upload_time_iso_8601": "2025-08-22T11:22:44.010611Z",
"url": "https://files.pythonhosted.org/packages/95/1d/2865d9d270e83f9096f2777f5799c3bf59a23bdd01a24a7639767a8df43b/fragmentcolor-0.10.6-cp39-abi3-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e49b98587302617a0521e121748eff4c21a24ded5dd89736296da5a7c0b8700e",
"md5": "8a548f2c1b0fbe5b4c5ee941be258458",
"sha256": "d4a14825d3ecd439423200c67a95bb080430eae3ff0368aeab92b0406e99785a"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp39-abi3-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "8a548f2c1b0fbe5b4c5ee941be258458",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3452501,
"upload_time": "2025-08-22T11:22:46",
"upload_time_iso_8601": "2025-08-22T11:22:46.898039Z",
"url": "https://files.pythonhosted.org/packages/e4/9b/98587302617a0521e121748eff4c21a24ded5dd89736296da5a7c0b8700e/fragmentcolor-0.10.6-cp39-abi3-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "616685442e635a4f93ed87be66707f8216b83c98575f0bb6b797b20b40d889aa",
"md5": "47da217689cf82e8bd7c9f8f9df31e5b",
"sha256": "e97d7831a441b9d7a22fcc65e667c596c73bd8dc1ce4c4384965133556d9a453"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp39-abi3-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "47da217689cf82e8bd7c9f8f9df31e5b",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 3452925,
"upload_time": "2025-08-22T11:22:49",
"upload_time_iso_8601": "2025-08-22T11:22:49.697478Z",
"url": "https://files.pythonhosted.org/packages/61/66/85442e635a4f93ed87be66707f8216b83c98575f0bb6b797b20b40d889aa/fragmentcolor-0.10.6-cp39-abi3-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6ac55c4153f2457f4f5a9c4bb1bf30cc0be7dfb4edf4abaf637bd66aa9132bb7",
"md5": "b8319d7bc7361347b40abf2b46eb8c60",
"sha256": "f5e30d179817fdca64dda3dac1cf2e40039ce462b2fc62f8dbd6955e5e0a2562"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp39-abi3-win32.whl",
"has_sig": false,
"md5_digest": "b8319d7bc7361347b40abf2b46eb8c60",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 2736027,
"upload_time": "2025-08-22T11:22:55",
"upload_time_iso_8601": "2025-08-22T11:22:55.828643Z",
"url": "https://files.pythonhosted.org/packages/6a/c5/5c4153f2457f4f5a9c4bb1bf30cc0be7dfb4edf4abaf637bd66aa9132bb7/fragmentcolor-0.10.6-cp39-abi3-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c79fcbc61a1d0a2f070f07b38a206b19c070a9d4661902fb8a580ba3185739ab",
"md5": "d328088c975d1df443107b6bc708b836",
"sha256": "a7e0100894735a2de1089be627af8305193ae99d227c0895859cda263e7cfc63"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6-cp39-abi3-win_amd64.whl",
"has_sig": false,
"md5_digest": "d328088c975d1df443107b6bc708b836",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 2931061,
"upload_time": "2025-08-22T11:22:52",
"upload_time_iso_8601": "2025-08-22T11:22:52.950546Z",
"url": "https://files.pythonhosted.org/packages/c7/9f/cbc61a1d0a2f070f07b38a206b19c070a9d4661902fb8a580ba3185739ab/fragmentcolor-0.10.6-cp39-abi3-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "39928613d9abffdca3a4e0a93317f97ee7083cd5a5d4c0463f827816d179f28e",
"md5": "0ad95d66915226fd68c9e514f567a523",
"sha256": "8337be65d6b39e8e88fe68849f3dd161b4aa2b9165c9d163345e3b53e2e9f4eb"
},
"downloads": -1,
"filename": "fragmentcolor-0.10.6.tar.gz",
"has_sig": false,
"md5_digest": "0ad95d66915226fd68c9e514f567a523",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 97902,
"upload_time": "2025-08-22T11:22:50",
"upload_time_iso_8601": "2025-08-22T11:22:50.954050Z",
"url": "https://files.pythonhosted.org/packages/39/92/8613d9abffdca3a4e0a93317f97ee7083cd5a5d4c0463f827816d179f28e/fragmentcolor-0.10.6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-22 11:22:50",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "vista-art",
"github_project": "fragmentcolor",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "fragmentcolor"
}