{"id":38721243,"url":"https://github.com/soimy/atlasify","last_synced_at":"2026-01-17T11:09:10.758Z","repository":{"id":35011519,"uuid":"187140080","full_name":"soimy/atlasify","owner":"soimy","description":"GPU friendly assets packer using max-rects algorithm","archived":false,"fork":false,"pushed_at":"2025-10-01T03:49:15.000Z","size":26318,"stargazers_count":33,"open_issues_count":25,"forks_count":5,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-10-05T05:25:45.140Z","etag":null,"topics":["font","maxrects","packer","texturepacker","truetype","vector-graphics"],"latest_commit_sha":null,"homepage":"https://atlasify.nanoo.app","language":"TypeScript","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/soimy.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2019-05-17T03:26:23.000Z","updated_at":"2025-09-02T02:59:14.000Z","dependencies_parsed_at":"2025-08-29T16:21:51.113Z","dependency_job_id":"c98908e5-9d24-440e-9751-d67686494097","html_url":"https://github.com/soimy/atlasify","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/soimy/atlasify","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soimy%2Fatlasify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soimy%2Fatlasify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soimy%2Fatlasify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soimy%2Fatlasify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/soimy","download_url":"https://codeload.github.com/soimy/atlasify/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soimy%2Fatlasify/sbom","scorecard":{"id":836589,"data":{"date":"2025-08-11","repo":{"name":"github.com/soimy/atlasify","commit":"90c4d2c1b7dbcb76cc55da13e7c116ec677208aa"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"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":"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":"Code-Review","score":0,"reason":"Found 0/29 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":-1,"reason":"no workflows found","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":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":"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:0","Info: FSF or OSI recognized license: MIT License: LICENSE: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":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"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":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 1 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"65 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-8mmm-9v2q-x3f9","Warn: Project is vulnerable to: GHSA-xvf7-4v9q-58w6","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-6fx8-h7jm-663j","Warn: Project is vulnerable to: GHSA-x565-32qp-m3vf","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-776f-qx25-q3cc","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-c2jc-4fpr-4vhg","Warn: Project is vulnerable to: GHSA-wf5p-g6vw-rhxx","Warn: Project is vulnerable to: GHSA-jr5f-v2jv-69x6","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-mf6x-hrgr-658f","Warn: Project is vulnerable to: GHSA-xrh7-m5pp-39r6","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-pw2r-vq6v-hr8c","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-rc47-6667-2j5j","Warn: Project is vulnerable to: GHSA-c7qv-q95q-8v27","Warn: Project is vulnerable to: GHSA-4www-5p9h-95mh","Warn: Project is vulnerable to: GHSA-9gqv-wp59-fq42","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-76p3-8jx3-jpfq","Warn: Project is vulnerable to: GHSA-3rfm-jhwj-7488","Warn: Project is vulnerable to: GHSA-hhq3-ff78-jv3g","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-2r2c-g63r-vccr","Warn: Project is vulnerable to: GHSA-cfm4-qjh2-4765","Warn: Project is vulnerable to: GHSA-x4jg-mjrx-434g","Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-3949-f494-cm99","Warn: Project is vulnerable to: GHSA-x7hr-w5r2-h6wg","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-76p7-773f-r4q5","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-4wf5-vphf-c2xc","Warn: Project is vulnerable to: GHSA-w5p7-h5w8-2hfq","Warn: Project is vulnerable to: GHSA-fhg7-m89q-25r3","Warn: Project is vulnerable to: GHSA-hc6q-2mpp-qw7j","Warn: Project is vulnerable to: GHSA-4vvj-4cpr-p986","Warn: Project is vulnerable to: GHSA-wr3j-pwj9-hqq6","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q"],"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-23T19:12:35.557Z","repository_id":35011519,"created_at":"2025-08-23T19:12:35.557Z","updated_at":"2025-08-23T19:12:35.557Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28506601,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T10:25:30.148Z","status":"ssl_error","status_checked_at":"2026-01-17T10:25:29.718Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["font","maxrects","packer","texturepacker","truetype","vector-graphics"],"created_at":"2026-01-17T11:09:10.638Z","updated_at":"2026-01-17T11:09:10.724Z","avatar_url":"https://github.com/soimy.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ![Atlasify](https://github.com/soimy/atlasify/blob/master/media/title.png?raw=true)\n\n![npm version](https://badge.fury.io/js/atlasify.svg)\n![npm type definitions](https://shields-staging.herokuapp.com/npm/types/atlasify.svg)\n\n## What is Atlasify\n\nAtlasify is an open-source app designed to pack graphical assets like\n\n- sprite images\n- textures\n- Bitmap fonts\n- True-type fonts\n- Vector graphics (SVG)\n\ninto a single/several GPU friendly texture atlas to reduce draw call, and a spritesheet catalog `json\\xml` to locate those assets.\n\n![demo](https://github.com/soimy/atlasify/blob/master/assets/demo.jpg?raw=true)\n\n## Why Atlasify\n\nYes, there are many excellent packing tools like Texture packer etc. already. But the goal of Atlasify is being able to managing, generating and packing all kinds of graphical assets like above into a single atlas in one application.\n\nTogether with proper render pipeline, this will be a perfect solution for rendering GPU accelerated vector and true-type text on any game engine.\n\nAnd most of all, it will be **free and open source**.\n\n## The architecture\n\n![Architecture](https://github.com/soimy/atlasify/blob/master/assets/architecture.png?raw=true)\n\u003e Proposal Map, modules marked as ☑️ is implemented.\n\nAtlasify's pipeline contain these kinds of modules:\n\n### Controller\n\nControllers get input assets and settings from user, and start the whole packing process. Controllers will have the following forms:\n\n- **GUI** Of cause! Will be Electron based, cross-platform, separated module. (Working in progress)\n- **WebAPI** More accessible from the internet. (Planned)\n- **CLI** Command-line interface for terminal user \u0026 CI automation. (Implemented)\n\n### Generators\n\nReading different input data and generate Array of `Buffer` \u0026 `Metric` for the core controller. `Buffer`containing image data and `Metric` containing sizing \u0026 spacing of the `Buffer`. Currently scheduled generators:\n\n- PNG/Jpeg image reader Through file I/O \u0026 [Jimp](https://github.com/oliver-moran/jimp)\n- Multi-signed distance field font renderer [msdf-bmfont-xml](https://github.com/soimy/msdf-bmfont-xml)\n    \u003e `msdf-bmfont-xml` will be depreciated when Atlasify is finished. I'm planning to rewrite msdf generator as a separate module using Rust.\n\n### Post-Processor\n\nStore `Buffer` \u0026 `Metric` as `Sheet` object and do the following manipulation based on settings:\n\n- TrimAlpha\n- Extrude edge pixels\n- Split/Composite ARGB channels\n- Rotation\n\n### Core\n\n[Core module](https://github.com/soimy/atlasify) to control the whole pipeline:\n\n1. Aquire settings from front-end(CLI, GUI)\n2. Store array of `Buffer` \u0026 `Metric` from generator;\n3. Doing `Buffer` post-processing like `TrimAlpha` \u0026 `Extrude Edge`;\n4. Calling Packer to process the `Metric` and composing the `Buffer` onto the atlas;\n5. Generate the `spritesheet`data object;\n6. Calling the Exporter to compile the `spritesheet` onto different templates;\n\n### Packer\n\nAtlasify uses [maxrects-packer](https://github.com/soimy/maxrects-packer) to calculate sheets position \u0026 rotation on the atlas using Maximum Rectangle Algorithm (Same as TexturePacker).\n\n### Exporter\n\nAlmost every game engine has it's own data structure to represent the spritesheets, Exporters use [mustache.js](http://mustache.github.com/) template system, so it's highly customizable through modifying `mst` template files. Atlasify supports these types out-of-the-box:\n\n- bmfont/xml\n- json (font)\n- jsonHash (TexturePacker)\n- jsonArray (TexturePacker)\n- Cocos2d\n- Phaser3\n- Spine\n- Starling\n- UIKit\n- Unreal\n\n### Engine plugins\n\nAtlasify extends the \"standard\" TexturePacker data structure to better utilize the power of GPU accelerated asset rendering like `multi-channel` \u0026 `multi-page`, and most importantly, MSDF (multi-signed distance field) based vector object. Many game engine don't support these feature yet, so it's important to implement plugins as separated modules for them. (Coming soon)\n\n---\n\n## Installation\n\nFor now only CLI controller and core module is implemented. In order to reduce package size, GUI will be a [separate Repo](https://github.com/soimy/atlasify-gui) and platform dependent installer will be publish in the Release section of [Main Repo](https://github.com/soimy/atlasify)\n\nTo install the CLI, run the following command in terminal:\n\n```bash\nnpm i -g atlasify\n```\n\n## Usage (CLI)\n\n```console\n$ atlasify --help\n\nUsage: cli [options] \u003cimage-files/folder\u003e\n\nCLI tools to packing and compositing image files into atlas using MaxRects packing algorithm\n\nOptions:\n  -V, --version            output the version number\n  -o, --output \u003cfilename\u003e  output atlas filename (Default: sprite.png)\n      --load \u003cfilename\u003e    load saved project atl file\n  -m, --size \u003cw,h\u003e         ouput texture atlas size (Default: 2048,2048)\n  -p, --padding \u003cn\u003e        padding between images (Default: 0)\n  -b, --border \u003cn\u003e         space to atlas edge (Default: 0)\n  -a, --auto-size          shrink atlas to the smallest possible square (Default: false)\n  -t, --pot                atlas size shall be power of 2 (Default: false)\n  -s, --square             atlas size shall be square (Default: false)\n  -r, --rot                allow 90-degree rotation while packing (Default: false)\n      --trim [n]           remove surrounding transparent pixels with optional tolerence [n] (Default: false)\n      --extrude \u003cn\u003e        extrude edge pixels (Default: 0)\n      --debug              draw debug gizmo on atlas (Default: false)\n      --instant            instant packing is quicker and skip sorting (Default: false)\n      --seperate-folder    Seperate bin based on folder (Default: false)\n      --group-folder       Group bin based on folder (Default: false)\n      --save               Save configuration for reuse (Default: false)\n  -h, --help               output usage information\n\n```\n\n\u003e Important: Atlasify is in **VERY EARLY STAGE**, any interface or API might change\n\nExamples: Packing all assets inside `./assets/actor` folder into an autosize atlas with max-size 1024x1024, trim image alpha and extrude 1px on edge pixels, 2px padding and save to `sprite.png` \u0026 save project file for later reuse.\n\n```console\n$ atlasify -o sprite.png -ast -p 2 -m 1024,1024 --extrude 1 --trim --save ./assets/actor\n\nSaved atlas: sprite.png\nSaved spritesheet: sprite.json\nSaved configuration: sprite.atl\n```\n\nExamples: Load previous project files and add all assets inside `./assets/ui` folder into the same atlas with same settings except no edge pixel extrude and no trim alpha.\n\n```console\n$ atlasify --load ./sprite.atl --extrude 0 --no-trim ./assets/ui\n\nLoading project file: ./sprite.atl\nLoad completed\nSaved atlas: sprite.png\nSaved spritesheet: sprite.json\nSaved configuration: sprite.atl\n```\n\n## Module quick start\n\n```javascript\nimport { Atlasify, Option } from \"atlasify\";\nconst opts = new Options(\"sprite.png\", 1024, 1024);\nopts.extrude = 1;\nopts.trimAlpha = true;\nimageFiles = [\n    \"a.png\",\n    \"b.png\",\n    \"c.jpg\"\n]\n\nconst packer = new Atlasify(opts);\npacker.addURLs(imageFiles).then(result =\u003e {\n    // Do your fileIO with results\n});\n```\n\nPlease refer to `./bin/cli.js` \u0026 test files(WIP) for further examples.\n\n## API Reference\n\n- [Atlasify](https://soimy.github.io/atlasify/docs/classes/Atlasify)\n- [Sheet](https://soimy.github.io/atlasify/docs/classes/Sheet)\n- [Exporter](https://soimy.github.io/atlasify/docs/classes/Exporter)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoimy%2Fatlasify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsoimy%2Fatlasify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoimy%2Fatlasify/lists"}