{"id":43264377,"url":"https://github.com/jkenlooper/piecemaker","last_synced_at":"2026-02-01T15:03:48.333Z","repository":{"id":6782994,"uuid":"8030179","full_name":"jkenlooper/piecemaker","owner":"jkenlooper","description":"Create jigsaw puzzle pieces","archived":false,"fork":false,"pushed_at":"2025-11-29T22:46:56.000Z","size":538,"stargazers_count":67,"open_issues_count":7,"forks_count":13,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-12-02T03:44:06.343Z","etag":null,"topics":["jigsaw-puzzle","python","svg"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jkenlooper.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"security-issues-from-bandit.csv","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},"funding":{"github":"jkenlooper","patreon":"puzzlemassive","open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":[]}},"created_at":"2013-02-05T14:03:06.000Z","updated_at":"2025-11-29T22:47:00.000Z","dependencies_parsed_at":"2024-01-01T19:32:08.729Z","dependency_job_id":"0e20f0de-cd04-44d9-b3fb-c53b30faba7b","html_url":"https://github.com/jkenlooper/piecemaker","commit_stats":{"total_commits":125,"total_committers":2,"mean_commits":62.5,"dds":0.008000000000000007,"last_synced_commit":"3ae162d998ac06d8cf07eefa90b85e381c35faa3"},"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/jkenlooper/piecemaker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jkenlooper%2Fpiecemaker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jkenlooper%2Fpiecemaker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jkenlooper%2Fpiecemaker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jkenlooper%2Fpiecemaker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jkenlooper","download_url":"https://codeload.github.com/jkenlooper/piecemaker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jkenlooper%2Fpiecemaker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28980855,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-01T13:38:33.235Z","status":"ssl_error","status_checked_at":"2026-02-01T13:38:32.912Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["jigsaw-puzzle","python","svg"],"created_at":"2026-02-01T15:03:23.911Z","updated_at":"2026-02-01T15:03:48.315Z","avatar_url":"https://github.com/jkenlooper.png","language":"Python","funding_links":["https://github.com/sponsors/jkenlooper","https://patreon.com/puzzlemassive"],"categories":[],"sub_categories":[],"readme":"# The Jigsaw Piece Maker\n\nA jigsaw puzzle pieces generator that levels the playing field.\n\nIt creates jigsaw puzzle pieces in multiple formats: svg, jpg, and png.  The\nnumber and size of pieces are set by passing the script different options.  It\ntakes a while to run if doing a lot of pieces.  Extra JSON files are created\nwith details on size of pieces and adjacent pieces information which is commonly\nused when verifying that two pieces can join together.\n\nSamples from different generated puzzles:\n\n![generated piece](docs/0.png)\n![generated piece](docs/3.png)\n![sample](docs/sample-pieces.png)\n![generated piece cut example](docs/generated-piece-cut-example.svg)\n\nTry out by running the `piecemaker.sh` script that will prompt for necessary options\nand run piecemaker inside a docker container. It will use the files in the examples\ndirectory by default.\n\n```bash\n# Build and run using docker\n./piecemaker.sh\n```\n\n## Installing\n\nRequires:\n\nPython Packages:\n\n* [Pillow](http://github.com/python-imaging/Pillow)\n* [pixsaw](http://github.com/jkenlooper/pixsaw)\n* [beautifulsoup4](http://www.crummy.com/software/BeautifulSoup/bs4/)\n* [svgwrite](https://pypi.python.org/pypi/svgwrite)\n* lxml\n\nOther Software needed:\n\n* [potrace](http://potrace.sourceforge.net/)\n\nIf on ubuntu or other debian based distro\n\n```bash\napt-get --yes install libspatialindex8\napt-get --yes install optipng\napt-get --yes install python3-pil\napt-get --yes install potrace libffi-dev libxml2-dev python3-lxml python3-xcffib\napt-get --yes install librsvg2-bin\napt-get --yes install python3-pip\n```\n\n\nInstall with pip in editable mode for developing and use virtualenv to isolate\npython dependencies\n\n```bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install --upgrade --upgrade-strategy eager -e .\n```\n\n\n## Usage\n\nSee the script.py for more.  Not everything has been implemented. Use this\nexample command to create 100 randomly generated jigsaw puzzle pieces from\ntest.jpg image. This assumes that the 'test1' directory is empty since that is\nwhere it will be placing all the generated files.  The test.jpg is the source\nimage that will be used when creating the pieces.  It is not modified.\n\n```bash\npiecemaker --dir test1  --number-of-pieces 100 test.jpg\n```\n\nExample of using an already existing svg file with jigsaw puzzle cut lines. The\n'test2' directory should be empty as well. Note that the svg file\n(test2-custom-cut-lines.svg) and the image (test.jpg) both need to be the same\nwidth and height. Try this out by using a previously generated\n'lines-resized.svg' from a different puzzle and a different image to create\na new puzzle with identical piece cuts.\n\n```bash\npiecemaker --dir test2 --svg test2-custom-cut-lines.svg test.jpg\n```\n\n## Other Suggested Tools\n\nCreate SVG files for jigsaws with tools from [proceduraljigsaw](https://github.com/proceduraljigsaw).\n\n* [CustomShapeJigsawJs](https://proceduraljigsaw.github.io/CustomShapeJigsawJs/) A custom border jigsaw puzzle generator for laser cutting based on Voronoi tesselation\n    * [proceduraljigsaw/CustomShapeJigsawJs](https://github.com/proceduraljigsaw/CustomShapeJigsawJs)\n* [Fractalpuzzlejs](https://proceduraljigsaw.github.io/Fractalpuzzlejs/) Javascript web based circle grid fractal jigsaw puzzle generator for lasercutting.\n    * [proceduraljigsaw/Fractalpuzzlejs](https://github.com/proceduraljigsaw/Fractalpuzzlejs)\n* [OrganicPuzzleJs](https://proceduraljigsaw.github.io/OrganicPuzzleJs/) is a (pretty broken, but mostly functional) organic-shaped jigsaw generator with custom border support.\n    * [proceduraljigsaw/OrganicPuzzleJs](https://github.com/proceduraljigsaw/OrganicPuzzleJs)\n* [Gosperpuzzlejs](https://proceduraljigsaw.github.io/Gosperpuzzlejs/) Gosper curve fractal jigsaw generator\n    * [proceduraljigsaw/Gosperpuzzlejs](https://github.com/proceduraljigsaw/Gosperpuzzlejs)\n* [HexFractalpuzzlejs](https://proceduraljigsaw.github.io/Hexpuzzlejs/) Hexagonal grid fractal puzzle generator\n    * [proceduraljigsaw/Hexpuzzlejs](https://github.com/proceduraljigsaw/Hexpuzzlejs)\n* [ImpactPuzzle](https://github.com/proceduraljigsaw/ImpactPuzzle) Broken glass jigsaw puzzle generator.\n* [CircleGridPuzzle](https://github.com/proceduraljigsaw/CircleGridPuzzle) Fractal jigsaw puzzle generator in Python.\n\nSVG editing tools\n\n* [SVGEdit Online Editor](https://svgedit.netlify.app/editor/index.html) is a fast, web-based, JavaScript-driven SVG drawing editor that works in any modern browser.\n    * [SVGEdit](https://svg-edit.github.io/svgedit/)\n    * [SVG-Edit/svgedit](https://github.com/SVG-Edit/svgedit)\n* [GodSVG SVG editor](https://www.godsvg.com/)\n\n## Contributing\n\nPlease contact [Jake Hickenlooper](mailto:jake@massive.xyz) or create an issue.\n\nAny submitted changes to this project require the commits to be signed off with\nthe [git command option\n'--signoff'](https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---signoff).\nThis ensures that the committer has the rights to submit the changes under the\nproject's license and agrees to the [Developer Certificate of\nOrigin](https://developercertificate.org).\n\n## License\n\n[GNU Lesser General Public License v3.0](https://choosealicense.com/licenses/lgpl-3.0/)\n\n## Maintenance\n\nWhere possible, an upkeep comment has been added to various parts of the source\ncode. These are known areas that will require updates over time to reduce\nsoftware rot. The upkeep comment follows this pattern to make it easier for\ncommands like grep to find these comments.\n\nExample UPKEEP comment has at least a 'due:' or 'label:' or 'interval:' value\nsurrounded by double quotes (\").\n````\nExample-\u003e # UPKEEP due: \"2022-12-14\" label: \"an example upkeep label\" interval: \"+4 months\"\n````\n\nShow only past due UPKEEP comments.\n```bash\nmake upkeep\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjkenlooper%2Fpiecemaker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjkenlooper%2Fpiecemaker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjkenlooper%2Fpiecemaker/lists"}