{"id":19489404,"url":"https://github.com/1j01/skele2d","last_synced_at":"2026-03-03T07:44:27.696Z","repository":{"id":31155996,"uuid":"126127083","full_name":"1j01/skele2d","owner":"1j01","description":"☠ A 2D game engine based around skeletal structures, with an in-game editor and animation support (pre-alpha)","archived":false,"fork":false,"pushed_at":"2024-09-12T18:47:54.000Z","size":1960,"stargazers_count":14,"open_issues_count":11,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-09-29T03:38:41.041Z","etag":null,"topics":["2d","2d-game-engine","animation","bones","canvas","game-development","game-engine","game-framework","points","polygons","structure"],"latest_commit_sha":null,"homepage":"https://1j01.github.io/tiamblia-game/","language":"CoffeeScript","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/1j01.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","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}},"created_at":"2018-03-21T05:20:24.000Z","updated_at":"2025-05-01T16:28:23.000Z","dependencies_parsed_at":"2024-09-13T06:14:02.700Z","dependency_job_id":null,"html_url":"https://github.com/1j01/skele2d","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/1j01/skele2d","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1j01%2Fskele2d","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1j01%2Fskele2d/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1j01%2Fskele2d/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1j01%2Fskele2d/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/1j01","download_url":"https://codeload.github.com/1j01/skele2d/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1j01%2Fskele2d/sbom","scorecard":{"id":2144,"data":{"date":"2025-08-11","repo":{"name":"github.com/1j01/skele2d","commit":"21d3d1a2987f973bdc84a1ae5576f4007fa3ab42"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"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":"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":-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":"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":"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"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 '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":"Vulnerabilities","score":0,"reason":"32 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-cwfw-4gq5-mrqx","Warn: Project is vulnerable to: GHSA-g95f-p29q-9xw4","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","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-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-7wpw-2hjm-89gp","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","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-c2qf-rxjj-qqgw","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-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","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j"],"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-14T12:48:18.301Z","repository_id":31155996,"created_at":"2025-08-14T12:48:18.301Z","updated_at":"2025-08-14T12:48:18.301Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30036161,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-03T06:58:30.252Z","status":"ssl_error","status_checked_at":"2026-03-03T06:58:15.329Z","response_time":61,"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":["2d","2d-game-engine","animation","bones","canvas","game-development","game-engine","game-framework","points","polygons","structure"],"created_at":"2024-11-10T21:08:26.579Z","updated_at":"2026-03-03T07:44:27.658Z","avatar_url":"https://github.com/1j01.png","language":"CoffeeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Skele2D\n\nSkele2D is a game engine based around points, with a fancy in-game editor.\n\nThere are lots of 2D game engines based around tiles; *this is the opposite of that.*\nIt's for games where the world is made of polygons, and the entities are made of points, connected by bones (segments), in arbitrary configurations.\n\nIf there's a theme song for Skele2D, it's probably the one that goes:\n\n\u003e The hip bone's connected to the back bone  \n\u003e The back bone's connected to the neck bone…\n\nThis project is pre-alpha. **Consider it unreleased**.\n\n\u003c!-- TODO: add GIFs; also a logo would be good; maybe make a better demo that IS a logo --\u003e\n\n\n## Features\n\n* In-game editor\n  * Easily drag and drop to place entities in the world\n  * Select entities, drag them around, and pose them (with double click)\n  * Cut, copy and paste, undo and redo\n  * Keyboard shortcuts and context menus\n  * Zoom towards the mouse with mousewheel, and pan with middle mouse button\n  * Animation editor\n    * Shows previews of poses and animations, using the arbitrary drawing code of the entity\n    * Create, rename, edit, and delete poses and animations\n    * No undo/redo currently, but you can use Git for versioning\n* Animations and poses can be blended together and composed any way you want (in code),\n  with tweening/interpolation helpers for both linear and cyclical animations\n* Arbitrary data can be associated with points, for use with rendering, physics or whatever, for instance \"color\", \"size\", \"velocity\" - you name it!\n\n\n## Demo\n\nCheck out [Tiamblia](https://1j01.github.io/tiamblia-game/)\n\n\n## Setup / API\n\nSo far, if you wanted to use this, you'd have to look at the source code, and copy from the examples.\n\nI do maintain a [changelog](CHANGELOG.md), so you wouldn't be too crazy to try and build a game with this,\nbut nothing's set in stone yet, and you probably want docs.\n\nThe library is published on npm as [`skele2d`](https://www.npmjs.com/package/skele2d),\nand available as UMD and ESM, with minified versions of both.\n\nRight now you have to include Material UI in addition to the module, as seen in the examples.\n(However, React is bundled with the module, as well as the CSS specific to Skele2D.)\n\n## Examples\n\n* [`examples/webpack-coffee/`](examples/webpack-coffee/) - Webpack usage example, with CoffeeScript. This uses Webpack to bundle module imports (including Skele2D and other parts of the example), and coffee-loader to compile CoffeeScript.\n* [`examples/script-tag-coffee/`](examples/script-tag-coffee/) - Script tag usage example, with CoffeeScript. This uses the in-browser CoffeeScript compiler, and uses globals instead of imports/exports.\n* [`examples/esm/`](examples/esm/) - ES Modules example. This uses a separate ESM build of Skele2D, and imports it from inside a `\u003cscript type=\"module\"\u003e`.\n* [`examples/esm-pixi/`](examples/esm-pixi/) - ES Modules example using [PIXI.js](https://www.pixijs.com/) for rendering.\n* [Tiamblia](https://github.com/1j01/tiamblia-game) - A game built with Skele2D (or a fuller example, at least.)\n\nThe examples in this repo are super bare-bones, and don't actually show off the flexibility of the editor. There's no animated entities! (It was kind of an oversight when I was copying from Tiamblia and trimming it down.)\n\n\u003c!--\nI'd also like to show off different things you can do with Skele2D, like:\n* Using Skele2D with a physics engine, like Matter.js\n* Using Skele2D with a rendering engine, like Pixi. Done!\n* I'd like to show very different art styles, to show the breadth of what you can achieve.\n\nSince I want to show off functionality distinct from module setups, I think I should pick a module setup, probably ESM,\nfor most of the examples to use, and then keep the other module setups super basic, just to show that it works with them.\nIn particular, I want to keep them to as few files as possible, to make it easier to maintain and understand them.\n(I don't want to have a bunch of files that are named the same but in different directories that can get confused,\nand can get out of sync with each other.)\nI think I can bring most things into one or two files. ESM and script tag examples could be done in one HTML file,\nbut webpack might need a separate JS file (unless there's a plugin or option to make it operate on JS inlined in HTML,)\nplus package.json and webpack.config.js\n--\u003e\n\n## Dev Setup\n\nSynopsis:\n```bash\nnpm install\nnpm run build\nnpm run install-example\nnpm run example\n```\n\nThis should run the webpack dev server for the webpack example, with hot module reloading.\nYou can open the example in your browser at http://localhost:8080/ or whatever port it gives you if that's taken.\n\n### Webpack in Production\n\nThe webpack example can be built for production with:\n```bash\ncd examples/webpack-coffee\nnpm run build\n```\nThen the `examples/webpack-coffee` directory can be served with any web server, for instance:\n```bash\npython -m http.server\n```\nThen open http://localhost:8000 in your browser.\n\nIt could be deployed to a static site host, and some files could be excluded like the `node_modules` directory, `source` directory, `package.json`, `package-lock.json`, and `webpack.config.js`.\n\nThe examples in this repo are not yet deployed, but [Tiamblia](https://github.com/1j01/tiamblia-game) is [deployed to GitHub Pages here](https://1j01.github.io/tiamblia-game/), using a dumb Node.js script to copy only the files that are needed, and then the [gh-pages](https://www.npmjs.com/package/gh-pages) package to deploy.\n\n### NW.js\nThe webpack example can also be run in NW.js, with:\n```bash\nnpm run example-nw\n```\nWhen running in NW.js it automatically saves the `world.json` as you edit.\n\u003e Note: This workflow could be replaced by the FS Access API, which didn't exist when I made this originally.\n\u003e I don't think I'm terribly interested in NW.js for distributing games.\n\u003e It'll still be an _option_, of course, but it shouldn't be required for a nice workflow.\n\n### Running the Script Tag and ESM examples\n\nThese examples don't need pre-compiling in principle, but because they live in this repo, for practical purposes they reference the Skele2D build files from the `dist` directory.\n\nOnce the library is built (with `npm run build`), you can run the examples with any web server, for instance:\n```bash\nnpx live-server --open=examples/script-tag-coffee/\nnpx live-server --open=examples/esm/\n```\nThis will open the page in your browser, and automatically reload when you make changes to the source code.\n\nNote: it will also reload when editing the library itself, but it won't reflect those changes until you run `npm run build` again. I could add an `--ignore`/`--ignorePattern` flag but I don't think it's worth it for now.\n\nAlso note: if you run a server within the directory of the example, it will end up trying to request `skele2d.js` from outside the server root, which will fail.\n\n(Would it be better to create a symlink, or copy the file to the example directory? That way it would be easer to copy the example as a base for a new project, as it would match more closely how you would include the library. Symlinks might not work for security reasons, though, and copying the file to all the examples seems expensive, especially as I add more examples.)\n\n### Troubleshooting\n\nAny time you run into an error like `Module not found: Error: Can't resolve 'skele2d'`,\njust run the following in the `examples/webpack-coffee` directory:\n```bash\nnpm link skele2d\n```\nOr alternatively run `npm run install-example` again.\n\nThis can happen when updating dependencies, or (perhaps) when switching branches, or when you've just cloned the repo and haven't run the [installation procedure](#dev-setup) yet.\n\n## Roadmap\n\n* Finish separating this out into a reusable library / framework (from [Tiamblia](https://github.com/1j01/tiamblia-game))\n\t* Find a good boundary between the engine and game, and think about how to minimize assumptions\n\t\t* When something is part of an application/game, there aren't necessarily any barriers between it and the application/game code, which can make it easy to introduce coupling, which is bad, but importantly, there are no barriers to editing any part of it, which is really nice: you can adapt it to your needs as your needs progress. When you go to separate it out into a library, suddenly you're confronted with either having to remove all the coupling (which takes significant effort and thought), or just sort of \"include everything\" and make it a grab-bag framework with all the functionality you need for each applications you intend to use it with - which is of course, bad. Or somewhere in between, or whatever.\n\t\t\t* OOP introduces problems with reusability, with its methods on classes/objects. Also if you have any private variables.\n\t\t* Try to remove the prescribed `Entity` class (currently relied upon: `x`, `y`, `structure`, `toWorld`, `fromWorld`, and serialization)\n\t\t* Ditto for `World` (currently relied upon for serialization, and directly accessing `entities`)\n\t\t* Look into [ResurrectJS](https://github.com/skeeto/resurrect-js) for serialization (I'd come across [cereal](https://github.com/atomizejs/cereal) before, but it doesn't handle prototypes); let's see, there's also [kaiser](https://www.npmjs.com/package/kaiser), and a few others\n\t\t\t* I did make a system for serializing and deserializing references to other entities, but it only supports references to other entities as top level properties of an entity, because that's all I needed - the player can hold a bow, and an arrow, but for instance if you wanted to have an array of references to other entities (perhaps multiple arrows!), it wouldn't work. I don't think it would actually be that hard to extend it to arbitrarily nested properties, but it would certainly be nice to offload that work and complexity to a library.\n\t\t* Separate out world saving/loading logic (you could want to save to and load from a file like I have it now in NW.js, or over the network to a server (Node, Python, PHP, whatever), or to localStorage, IndexedDB, whatever)\n\t* Get rid of [ReactScript](https://github.com/1j01/react-script) (an old library I made, deprecated) in favor of JSX support in CoffeeScript 2 (requires a JSX compilation step!)\n\t* Documentation!\n\t\t* Setup\n\t\t* API\n\t\t* For now, it is very much a framework, so document how to stay within the bounds of it, and conventions that make it a smoother experience\n\t\t\t* References to other entities must only be at the top level of serialized data for now. References are handled at the top level as a special case, and only for `Entity` instances.\n\t\t\t* Adding properties to other entities ad-hoc may work, but each entity class is responsible for its own serialization, so it's better to either create get/set methods on target class for a clean API boundary, or the store information about other entities in a map with the keys as entity IDs\n\t\t\t* When animations/poses don't exist, default to `@structure.getPose()`\n\t\t\t\t* TODO: implement a way to wait for animation data to be loaded, either as a loading system or just inversion of control\n\t\t\t* Name points and segments like how you'd name variables, so you can access them with destructuring when drawing/stepping (e.g. `let {leftArm, rightArm} = @structure.points`)\n\t\t\t* A default pose is decided by the (overridable) method `initLayout`, and if you include \"left\"/\"right\" in the names of points it moves them to the left or right, and it uses poses named \"Default\"/\"Stand\"/\"Standing\"/\"Idle\" in that order (most to least preferred), if one is available.\n\t\t* Demos:\n\t\t\t* Improve the simple example, maybe make a logo as part of it\n\t\t\t* Could make a better version of [pbp2d](https://github.com/1j01/pbp2d), a point based physics sandbox; or a full blown physics engine playground; rigid bodies use polygons and polygons use points too, and generating shapes and bodies from other types of structures would be very much possible too\n\t\t\t* Could do a demo with a totally different renderer, overriding `Editor.draw` and maybe `View`, or superimposing canvases so that the editor's own rendering doesn't need to change while using WebGL for game stuff. Three.js could be fun :) for a 2.5D game, or PIXI.js for 2D but still bringing shaders to the table.\n\n* Encourage versioning of world data in examples, such as I do [in Tiamblia](https://github.com/1j01/tiamblia-game/blob/352ecceda83634404fdfcf14b417abd8c98ea32e/src/World.coffee). Code patterns for upgrading can be pretty simple. [Here's another example.](https://github.com/1j01/wavey/blob/12203a2166c27aab783592184263dbb2daad0e44/src/components/AudioEditor.coffee#L88-L128)\n\n* Add \u003ckbd\u003eshift\u003c/kbd\u003e/\u003ckbd\u003ectrl\u003c/kbd\u003e selection-manipulation modifiers\n\n* Add \u003ckbd\u003ealt\u003c/kbd\u003e+drag to drag the selection from anywhere (i.e. without having to have your mouse over part of the selection, especially for when the selection is a set of points) (inspired by [this video](https://youtu.be/elws59R9CrM))\n\n* Add undo/redo, frame reordering, and maybe variable delays to the animation editor\n\n* Make undo/redo efficient (currently it saves the entire world state every operation!)\n\n* Use this in a few different games\n\n* It would be nice to have vector maths, haha! Kinda silly how this whole thing is based around points and there's no vector operations\n\t* We want to keep (the ability to keep) arbitrary data on (or at least associated with) points\n\n\n## Changelog\n\nFor a history of changes to the API and the editor, see [CHANGELOG.md](CHANGELOG.md)\n\n## License\n\nOpen source under the [MIT License](LICENSE.txt)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F1j01%2Fskele2d","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F1j01%2Fskele2d","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F1j01%2Fskele2d/lists"}