{"id":31581113,"url":"https://github.com/bean-mhm/saffron","last_synced_at":"2025-10-05T21:53:43.327Z","repository":{"id":316790975,"uuid":"1062346636","full_name":"bean-mhm/Saffron","owner":"bean-mhm","description":"🪻 A Huge Collection of Compositor Nodes for Blender","archived":false,"fork":false,"pushed_at":"2025-09-26T17:19:00.000Z","size":34796,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-26T19:14:59.331Z","etag":null,"topics":["aces","blender","color-grading","color-management","color-space","compositor","effects","flim","image-processing","lightroom","nodes","photo-editing","photography","tone-mapping","view-transform"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bean-mhm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-23T06:21:16.000Z","updated_at":"2025-09-26T17:19:04.000Z","dependencies_parsed_at":"2025-09-26T19:26:29.805Z","dependency_job_id":null,"html_url":"https://github.com/bean-mhm/Saffron","commit_stats":null,"previous_names":["bean-mhm/saffron"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/bean-mhm/Saffron","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bean-mhm%2FSaffron","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bean-mhm%2FSaffron/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bean-mhm%2FSaffron/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bean-mhm%2FSaffron/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bean-mhm","download_url":"https://codeload.github.com/bean-mhm/Saffron/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bean-mhm%2FSaffron/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278526242,"owners_count":26001325,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-05T02:00:06.059Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aces","blender","color-grading","color-management","color-space","compositor","effects","flim","image-processing","lightroom","nodes","photo-editing","photography","tone-mapping","view-transform"],"created_at":"2025-10-05T21:53:38.369Z","updated_at":"2025-10-05T21:53:43.321Z","avatar_url":"https://github.com/bean-mhm.png","language":null,"funding_links":["https://ko-fi.com/E1E81LFRKY'","https://ko-fi.com/bean_mhm"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003ca href='https://ko-fi.com/E1E81LFRKY' target='_blank'\u003e\u003cimg height='42' style='border:0px;height:42px;' src='https://storage.ko-fi.com/cdn/kofi2.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' /\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n# 🪻 Saffron\n\n![Saffron's Compositor Nodes](./images/saffron-nodes.webp)\n\n**Saffron** is a large collection of compositor nodes for [Blender](https://blender.org/) providing many great features in the following categories:\n- ### Color Grading \u0026 Effects\n- ### Black \u0026 White\n- ### Masking\n- ### Advanced Color Processing\n- ### Color Space Conversions: Linear, Displays, ACES, Oklab.\n- ### View Transforms: [flim](https://github.com/bean-mhm/flim), Khronos PBR Neutral, ACES, and more.\n\nHere's some eye candy to show you how Saffron can transform images. Whether you\nwant a vintage look with film emulation or cinematic color grading, Saffron's\ngot you covered!\n\n### 1. Processing linear OpenEXR images with Saffron\n\n![Comparison Image](./images/comp1a.webp)\n![Comparison Image](./images/comp1b.webp)\n\n### 2.\n\n![Comparison Image](./images/comp2a.webp)\n![Comparison Image](./images/comp2b.webp)\n\n### 3.\n\n![Comparison Image](./images/comp3a.webp)\n![Comparison Image](./images/comp3b.webp)\n\n### 4.\n\n![Comparison Image](./images/comp4a.webp)\n![Comparison Image](./images/comp4b.webp)\n\n### 5. Saffron running in the 3D viewport using Blender's Realtime Compositor\n\n![Comparison Image](./images/comp5a.jpg)\n![Comparison Image](./images/comp5b.jpg)\n\n# Color Grading \u0026 Effects\n\n![Nodes](./images/nodes-color-grading-effects.webp)\n\nThis section is the go-to for general photo editing. Let's see what each node\ndoes.\n\n## Camera Noise Reduction\n\nThis node uses Blender's built-in Denoise node at the high quality preset but when mixing, it gives more weight to darker pixels since, in digital cameras, darker pixels contain a lot more noise than the midtones, and highlights are usually very clean.\n\n## Saffron Grade\n\nThis node is all about color grading. It uses the [Oklab](https://bottosson.github.io/posts/oklab/) color space as its processing space to provide a perceptually uniform and intuitive parameter space. It uses custom-made algorithms to alter the tone and color of\nthe image. You can adjust the entire image globally or grade shadows, midtones,\nand highlights individually.\n\n![screenshot](./images/saffron-grade-before.webp)\n![screenshot](./images/saffron-grade-after.webp)\n![screenshot](./images/saffron-grade.webp)\n\n## Color Zone\n\nWith this node you can isolate a certain hue range (for example, only the blues\nto select the sky) and adjust the tone of that part.\n\n![screenshot](./images/color-zone-before.webp)\n![screenshot](./images/color-zone-after.webp)\n![screenshot](./images/color-zone.webp)\n\n## Saffron Effects\n\nThis node provides artistic image editing effects including\n**Texture \u0026 Clarity**, **Dehaze**, **Vignette**, **Halation**, and\n**Film Grain**. It too uses [Oklab](https://bottosson.github.io/posts/oklab/) as\nits processing space and is made of custom algorithms.\n\n![screenshot](./images/saffron-effects-before.webp)\n![screenshot](./images/saffron-effects-after.webp)\n![screenshot](./images/saffron-effects.webp)\n\n# Black \u0026 White\n\n![Nodes](./images/nodes-bw.webp)\n\nThese nodes let you convert an RGB color to a grayscale value using different\nmethods.\n\n![screenshot](./images/bw.webp)\n\n# Masking\n\n![Nodes](./images/nodes-masking.webp)\n\nMasking is a technique used to vary the strength of an effect at different\npositions on the image. For example, with a **Radial Gradient Mask**, we can\ncreate a mask that covers the subject's face and only brighten that part.\n\n![screenshot](./images/masking-mask.jpg)\n\n![screenshot](./images/masking-split.jpg)\n\nWith Saffron's masking nodes you can create and combine masks using different\nmethods.\n\n# Advanced\n\n![Nodes](./images/nodes-advanced.webp)\n\nThis is a set of node groups for slightly more advanced color processing\ntechniques. Feel free to experiment with them.\n\n# Color Space Conversions\n\n![Nodes](./images/nodes-color-space-convs.webp)\n\nThese nodes let you convert between different color spaces. A more detailed\nexplanation is provided below.\n\n# [IMPORTANT] Color Management\n\n\u003e [!IMPORTANT]\n\u003e Humans are naturally lazy to read long pieces of text (including myself), but\n\u003e if you want to use Saffron without broken results, you\n\u003e need to read and understand the following instructions. You might even need to\n\u003e read it several times.\n\n\u003e [!WARNING]\n\u003e Please don't create an issue or ask me questions if you haven't fully read\n\u003e this section.\n\nIn order to use Saffron, we need to disable Blender's color management system\nbecause Saffron has its own. To do this,\n\n1. Go to the **Color Management** tab in **Render Properties** and set\n**View Transform** to *None* or *Raw*.\n\n![screenshot](./images/view-transform-raw.png)\n\n2. When loading external images with **Image** nodes in the compositor, set the\n**Color Space** property to *Non-Color* or *Generic Data*. If you already have\n**Image** nodes, change them too.\n\n![screenshot](./images/image-node-non-color.png)\n\nSince we've disabled Blender's color management, we need to do it ourselves.\nThis has three parts:\n1. Loading images\n2. Processing in the working color space\n3. Display/View transforms\n\nTo put it simply:\n\n1. When you load an image from a file or a scene render, convert it from its\ncolor space to the working color space.\n\n2. Do your image processing in the working color space.\n\n3. Finally, convert from the working space to a display color space that matches your display device (e.g. sRGB, Display P3, etc.). If you're unsure, look it up based on your display device.\n\n## Example\n\nHere's an example scenario to help you wrap your head around color management.\nLet's say our working space is **Linear BT.709 I-D65** (also called Linear sRGB\nor Linear Rec.709), and we load an image named `plants.jpg`.\n\nWhen working with a PNG or JPEG image, there's a 99.999% chance it's in the sRGB\ncolor space. Linear image formats like OpenEXR on the other hand, usually use\n**Linear BT.709** but they might also use **ACES2065-1**, **Linear DCI-P3**,\nor **Linear BT.2020**, all of which are supported by Saffron.\n\n\u003e [!TIP]\n\u003e If you're advanced enough to use OpenEXR, you will almost surely know what color space your image is in. If not, load the image again and pay attention to the **Color Space** property of the **Image** node because Blender will try to guess the color space, which is correct most of the time. Take note of the color space, then set it to *Non-Color* and use Saffron's color space conversion nodes to convert from that color space to your working space.\n\n\u003e [!TIP]\n\u003e If you’ve rendered a 3D scene, the resulting image can be accessed through a **Render Layers** node. The output of this node uses Blender's own working space which is **Linear BT.709** by default but it might change in future versions of Blender. They may also add a selector for the working space.\n\nThe next step is to set the **Color Space** to *Non-Color* and convert the\nimage from its color space (sRGB) to our working space (Linear BT.709) using\nSaffron's **sRGB -\u003e Linear BT.709 I-D65** node.\n\n![screenshot](./images/load-jpg-image.webp)\n\nNow we need to convert to our display's color space. For example, if we\nwere using an sRGB display device, we would use the\n**Linear BT.709 I-D65 -\u003e sRGB** node.\n\n![screenshot](./images/apply-display-transform.webp)\n\nFinally, any processing happens before the display transform while we're still\nin the working color space. Here's a blur effect, for example.\n\n![screenshot](./images/process-in-working-space.webp)\n\n## View Transforms\n\nRight before the **Display Transform**, we can optionally apply a\n**View Transform** (so-called \"Tone Mapping\") to make sure our colors are not\nexceeding 100% brightness level because that introduces overexposed/clipped\npixels in bright areas. A good option is\n[flim](https://github.com/bean-mhm/flim), a filmic color transform I've made.\nOf course, Saffron has an implementation for it!\n\n![screenshot](./images/add-flim.webp)\n\nView transforms don't modify the color space, they just make your colors reach\n100% in a smoother and more visually pleasing way instead of applying a harsh\ncut-off. The output is still in the working color space, which is why we still\nneed a **Display Transform** at the end.\n\n## The Reference Space\n\nIf we made a node to convert between every combination of color spaces, we would\nhave hundreds of nodes! To work around this, we choose a\n**reference color space** and implement conversions to and from that space.\nFor example, Saffron has **Ref -\u003e X** and **Ref \u003c- X** (notice the arrow\ndirections).\n\nWith this system, if we want to convert from a color space A to\na color space B, we simply convert from A to the reference and then from the\nreference to B. Saffron uses **Linear CIE-XYZ I-D65** as its reference color\nspace.\n\nIn the following example we convert from **Linear BT.709** to **Oklab** using\nthis method.\n\n![screenshot](./images/709-to-oklab.webp)\n\nNote that **View Transforms** are one-sided and they expect the input to be in a\nlinear RGB color space. Also, since **Display Transforms** are typically based\non a single linear color space (you wouldn't normally convert from Linear BT.709\nto Display P3, for example), we don't use the reference space for them and\nsimply have **Linear X -\u003e Display X** and vice versa.\n\n## They Tell You What They Want\n\nPay attention to the input sockets. Some inputs are named **In (RGB)**,\nthis means they expect the input to be in a linear RGB color space. **In (Ref)**\nmeans the input must be in the reference color space, and so forth. The same\nis true for output sockets (e.g. **Out (Oklab)** means the output is in Oklab).\n\n![screenshot](./images/input-socket.webp)\n\n## What If...\n\nWhat if you need a conversion for a color space that's not supported by Saffron?\nDon't worry, you can use Blender's **Convert Colorspace** node in the compositor\nthe same way you use Saffron's conversion nodes... as long as there's at least\none common color space that exists in both Saffron and Blender's OpenColorIO\nconfig (or your custom config that you use in Blender).\n\nHere we apply the AgX view/display (combined) transform using this node:\n\n![screenshot](./images/blender-convert-colorspace.webp)\n\n## Exporting\n\nWhen exporting images or videos, set **Color Management** to *Override* and **View** to *Raw* or *None*. Obviously, **Exposure** and **Gamma** need to be at their default values of 0 and 1, respectively.\n\n![screenshot](./images/export-png.png)\n\nIf exporting to a linear format like OpenEXR, set **Color Space** to\n*Non-Color*. Also, make sure you've disabled your **Display Transform** so that\nthe EXR image stores linear data.\n\n![screenshot](./images/export-exr.png)\n![screenshot](./images/disp-view-transform-disabled.png)\n\nIn general, the exported file will use the color space from your last conversion\nnode. If it was a **X -\u003e sRGB** conversion, the exported file will be in sRGB,\nand so on.\n\n\u003e [!TIP]\n\u003e If you're exporting for the web and want the highest compatibility, use\n\u003e **Linear BT.709 I-D65** as your working space and **sRGB** as your Display\n\u003e Transform. Of course, if your display uses something else (like Display P3),\n\u003e add a conversion from sRGB to your display's color space at the very end so\n\u003e that the image looks correct on your display when you're editing, but make\n\u003e sure to disable this conversion when exporting.\n\n# Adding Saffron\n\nTo use Saffron in your own Blender file,\n\n0. Make sure you've properly read and understood everything above.\n\n1. Download Saffron's `.blend` file at the top of this page.\n\n2. In your own `.blend` file, go to **File \u003e Append**.\n\n![screenshot](./images/file-append.png)\n\n3. Find Saffron's `.blend` file and double click on it.\n\n![screenshot](./images/file-view-saffron.png)\n\n4. Double click on **Scene**.\n\n![screenshot](./images/append-scene.png)\n\n5. Double click on **Saffron Compositor Nodes**.\n\n![screenshot](./images/append-scene-saffron.png)\n\n6. In the top right corner, change the current scene to **Saffron Compositor Nodes**.\n\n![screenshot](./images/change-scene.png)\n\n7. Go to the **Compositing** tab / workspace and box-select Saffron's nodes, then hit Ctrl+C to copy them.\n\n![screenshot](./images/compositing-tab.jpg)\n\n8. Change back the scene.\n\n![screenshot](./images/change-scene-back.png)\n\n9. Check \"Use Nodes\" if you haven't already.\n\n![screenshot](./images/use-nodes.png)\n\n10. Hit Ctrl+V to paste Saffron's nodes.\n\n![screenshot](./images/paste-saffron.png)\n\n11. If you have fully read the [Color Management](#important-color-management)\nsection, you should know what to do, but I'm repeating myself. Set the view\ntransform to Raw to disable Blender's color management.\n\n![screenshot](./images/view-transform-raw.png)\n\n12. This will make your renders look broken. That's because, as explained in\nthe [Color Management](#important-color-management) section, we need to add in a\ndisplay transform.\n\n![screenshot](./images/wrong-srgb.jpg)\n\n13. Once we add the proper view and display transforms, we get a clean image\nready to be graded.\n\n![screenshot](./images/add-view-transform.jpg)\n\n14. From here, you're on your own. Try all the different nodes Saffron provides.\nMake some pretty art!\n\n# Contribution\n\nIf you want to improve Saffron by adding new features or fixing the existing\nones, definitely feel free to make a pull request! This is open-source after all.\n\n# Donations\n\nIf you think the project is deserving, feel free to support me at [Ko-fi](https://ko-fi.com/bean_mhm). Your support is hugely appreciated!\n\n# Useful Links\n\n- [CG Cinematography - Christophe Brejon](https://chrisbrejon.com/cg-cinematography/)\n- [The Hitchhiker's Guide to Digital Colour - Troy Sobotka](https://hg2dc.com/)\n- [RealBloom, Physically Accurate Bloom Simulation - Me](https://github.com/bean-mhm/realbloom)\n- [Test Image Collection 1 - Troy Sobotka](https://github.com/sobotka/Testing_Imagery)\n- [Test Image Collection 2 - Troy Sobotka](https://github.com/sobotka/images)\n- [PolyHaven, HDRIs](https://polyhaven.com/hdris)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbean-mhm%2Fsaffron","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbean-mhm%2Fsaffron","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbean-mhm%2Fsaffron/lists"}