{"id":13479111,"url":"https://github.com/lgarron/folderify","last_synced_at":"2026-02-06T22:02:56.400Z","repository":{"id":553565,"uuid":"2321480","full_name":"lgarron/folderify","owner":"lgarron","description":":file_folder: Generate pixel-perfect macOS folder icons in the native style. (Now with support for macOS 26 Tahoe!)","archived":false,"fork":false,"pushed_at":"2026-02-05T01:05:00.000Z","size":13440,"stargazers_count":1882,"open_issues_count":18,"forks_count":44,"subscribers_count":21,"default_branch":"main","last_synced_at":"2026-02-05T13:39:08.694Z","etag":null,"topics":["big-sur","dark-mode","folder","graphics","icns","icons","macos","monterey","osx","rust","sequoia","sonoma","tahoe","ventura"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lgarron.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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":"2011-09-04T01:49:16.000Z","updated_at":"2026-02-05T01:05:05.000Z","dependencies_parsed_at":"2024-01-06T03:38:42.936Z","dependency_job_id":"b4f4bb8a-c73a-4e23-abe0-e68aca37d3f7","html_url":"https://github.com/lgarron/folderify","commit_stats":{"total_commits":225,"total_committers":5,"mean_commits":45.0,"dds":"0.18222222222222217","last_synced_commit":"f86e013a7aadfe38a520b74a96d70552ecce3b88"},"previous_names":[],"tags_count":58,"template":false,"template_full_name":null,"purl":"pkg:github/lgarron/folderify","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lgarron%2Ffolderify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lgarron%2Ffolderify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lgarron%2Ffolderify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lgarron%2Ffolderify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lgarron","download_url":"https://codeload.github.com/lgarron/folderify/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lgarron%2Ffolderify/sbom","scorecard":{"id":586930,"data":{"date":"2025-08-11","repo":{"name":"github.com/lgarron/folderify","commit":"7d2b12c555d112bf01d03d52abeed0615d1a4b1b"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.2,"checks":[{"name":"Maintained","score":10,"reason":"14 commit(s) and 7 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: jobLevel 'contents' permission set to 'write': .github/workflows/publish-github-release.yaml:11","Warn: no topLevel permission defined: .github/workflows/publish-github-release.yaml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish-github-release.yaml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/lgarron/folderify/publish-github-release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/lgarron/folderify/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/lgarron/folderify/test.yml/main?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: MIT License: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: RUSTSEC-2024-0384","Warn: Project is vulnerable to: RUSTSEC-2024-0370"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-20T20:46:09.543Z","repository_id":553565,"created_at":"2025-08-20T20:46:09.543Z","updated_at":"2025-08-20T20:46:09.543Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29178564,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-06T20:14:21.878Z","status":"ssl_error","status_checked_at":"2026-02-06T20:14:21.443Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["big-sur","dark-mode","folder","graphics","icns","icons","macos","monterey","osx","rust","sequoia","sonoma","tahoe","ventura"],"created_at":"2024-07-31T16:02:09.706Z","updated_at":"2026-02-06T22:02:56.394Z","avatar_url":"https://github.com/lgarron.png","language":"Rust","readme":"# folderify\n\n![mask.png + folder = folderified!](examples/png/explanation-tahoe.png)\n\nGenerate pixel-perfect macOS folder icons in the native style (including for macOS 26 Tahoe).\n\n- Automatically includes all icon sizes from `16x16` through `512x512@2x`.\n- Light or dark mode (automatically selected by default).\n\n**Using `folderify`?** [Let me know](https://mastodon.social/@lgarron) or [let me know](https://github.com/lgarron/folderify/issues/new) and I'd love to feature some real-world uses!\n\n## Install\n\nInstall `folderify` using [Homebrew](https://formulae.brew.sh/formula/folderify):\n\n```shell\nbrew install folderify\n```\n\nHomebrew install is recommended, and automatically installs `folderify` argument completions for your shell.\n\nSee below for other installation options.\n\n## Usage\n\nUse a mask to assign an icon to a folder:\n\n```shell\nfolderify mask.png /path/to/folder\n```\n\nGenerate `mask.icns` and `mask.iconset` files:\n\n```shell\nfolderify mask.png\n```\n\nBy default, `folderify` uses your system's current light/dark mode. Use `--color-scheme` to override this:\n\n```shell\nfolderify --color-scheme dark mask.png\n```\n\nNote:\n\n- There is currently no simple way to set an icon that will automatically switch between light and dark when you switch the entire OS. You can only assign one version of an icon to a folder.\n\n### Tips\n\nFor best results:\n\n- Use a `.png` mask.\n- Use a solid black design over a transparent background.\n- Make sure the corner pixels of the mask image are transparent. They are used for empty margins.\n- Pass the `--no-trim` flag and use a mask:\n  - with a height of 384px,\n  - with a width that is a multiple of 128px (up to 768px),\n  - using a 16px grid.\n  - Each 64x64 tile will exactly align with 1 pixel at the smallest icon size.\n\n### OS X (macOS 10)\n\nFolder styles from OS X / macOS 10 are no longer supported by `folderify` as of v3:\n\n- Leopard-style (OS X 10.5 to OS X 10.9)\n- Yosemite-style (OS X 10.10 to macOS 10.15)\n\nTo generate these, please use `folderify` v2. For example:\n\n```shell\n# Using `uvx`: https://docs.astral.sh/uv/guides/tools/\nuvx --from folderify folderify-v2 --macOS 10.5 path/to/icon.png\n\n# Using `pip`\npip3 install folderify\npython3 -m folderify --macOS 10.5 path/to/icon.png\n```\n\n## Other installation options\n\nIf you don't have Homebrew but you already have ImageMagick (the `magick`\nbinary) on your system, you can use the following:\n\n### Install using Rust\n\n```shell\ncargo install folderify\n```\n\n### From source\n\nOr download the code directly:\n\n```shell\ngit clone https://github.com/lgarron/folderify \u0026\u0026 cd folderify\n\n# Run directly\ncargo run -- --reveal examples/src/folder_outline.png .\n\n# Install (assuming the `cargo` bin is in your path)\ncargo install --path .\nfolderify --reveal examples/src/folder_outline.png .\n```\n\nThe repository folder should now have a custom icon.\n\n```shell\n# bash\nfor file in examples/src/*.png; do cargo run -- $file; done\nopen examples/src/\n```\n\nYou should see a bunch of new `.iconset` folders and `.icns` files that were automatically generated from the `.png` masks.\n\n### Dependencies\n\n- [ImageMagick](https://www.imagemagick.org/) - for image processing (you should be able to run `magick` and `identify` on the commandline).\n- Included with macOS:\n  - `iconutil`\n- Optional:\n  - [`fileicon`](https://github.com/mklement0/fileicon/)\n  - `sips`, `DeRez`, `Rez`, `SetFile` (You need Xcode command line tools for some of these.)\n\n## Full options\n\n````text help\nGenerate a native-style macOS folder icon from a mask file.\n\nUsage: folderify [OPTIONS] [MASK] [TARGET]\n\nArguments:\n  [MASK]\n          Mask image file. For best results:\n          - Use a .png mask.\n          - Use a solid black design over a transparent background.\n          - Make sure the corner pixels of the mask image are transparent. They are used for empty margins.\n          - Make sure the non-transparent pixels span a height of 384px, using a 16px grid.\n          If the height is 384px and the width is a multiple of 128px, each 64x64 tile will exactly align with 1 pixel at the smallest folder size.\n\n  [TARGET]\n          Target file or folder. If a target is specified, the resulting icon will\n          be applied to the target file/folder. Else (unless --output-icns or\n          --output-iconset is specified), a .iconset folder and .icns file will be\n          created in the same folder as the mask (you can use \"Get Info\" in Finder\n          to copy the icon from the .icns file).\n\nOptions:\n      --output-icns \u003cICNS_FILE\u003e\n          Write the `.icns` file to the given path.\n          (Will be written even if a target is also specified.)\n\n      --output-iconset \u003cICONSET_FOLDER\u003e\n          Write the `.iconset` folder to the given path.\n          (Will be written even if a target is also specified.)\n\n  -r, --reveal\n          Reveal either the target, `.icns`, or `.iconset` (in that order of preference) in Finder\n\n      --macOS \u003cMACOS_VERSION\u003e\n          Version of the macOS folder icon, e.g. \"14.2.1\". Defaults to the version currently running\n\n      --empty-folder\n          Render the folder as empty\n\n      --color-scheme \u003cCOLOR_SCHEME\u003e\n          Color scheme — auto matches the current system value\n          \n          [default: auto]\n          [possible values: auto, light, dark]\n\n      --no-trim\n          Don't trim margins from the mask.\n          By default (i.e. without this flag), transparent margins are trimmed from all 4 sides.\n\n      --no-progress\n          Don't show progress bars\n\n      --badge \u003cBADGE\u003e\n          Add a badge to the icon. Currently only supports one badge at a time\n          \n          [possible values: alias, locked]\n\n  -v, --verbose\n          Detailed output. Also sets `--no-progress`\n\n      --completions \u003cSHELL\u003e\n          Print completions for the given shell (instead of generating any icons).\n          These can be loaded/stored permanently (e.g. when using Homebrew), but they can also be sourced directly, e.g.:\n          \n           folderify --completions fish | source # fish\n           source \u003c(folderify --completions zsh) # zsh\n          \n          [possible values: bash, elvish, fish, powershell, zsh]\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n  -V, --version\n          Print version\n````\n\n## Example\n\nExample generated from the Apple logo:\n![Icons from apple.iconset at resolutions from 16x16 up to 512x5125@2x, shown in Quicklook on macOS](examples/png/apple.gif)\n","funding_links":[],"categories":["Rust","Python","rust"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flgarron%2Ffolderify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flgarron%2Ffolderify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flgarron%2Ffolderify/lists"}