{"id":17399124,"url":"https://github.com/matkoniecz/tactile_patterns","last_synced_at":"2025-10-08T11:58:57.164Z","repository":{"id":57473162,"uuid":"347974402","full_name":"matkoniecz/tactile_patterns","owner":"matkoniecz","description":null,"archived":false,"fork":false,"pushed_at":"2021-06-24T08:06:05.000Z","size":3796,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-09-22T22:38:18.651Z","etag":null,"topics":["blind","blind-people","laser-cutter","pregenerated-patterns","tactile-patterns"],"latest_commit_sha":null,"homepage":"","language":"Python","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/matkoniecz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-03-15T13:11:06.000Z","updated_at":"2021-08-25T11:59:51.000Z","dependencies_parsed_at":"2022-09-26T17:40:49.910Z","dependency_job_id":null,"html_url":"https://github.com/matkoniecz/tactile_patterns","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/matkoniecz/tactile_patterns","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matkoniecz%2Ftactile_patterns","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matkoniecz%2Ftactile_patterns/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matkoniecz%2Ftactile_patterns/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matkoniecz%2Ftactile_patterns/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/matkoniecz","download_url":"https://codeload.github.com/matkoniecz/tactile_patterns/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matkoniecz%2Ftactile_patterns/sbom","scorecard":{"id":624970,"data":{"date":"2025-08-11","repo":{"name":"github.com/matkoniecz/tactile_patterns","commit":"62bd16e4a90cec7d39fc80a9260789607c49ed7f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.6,"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":"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":"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":"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":"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":"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":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"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":"Pinned-Dependencies","score":10,"reason":"all dependencies are pinned","details":["Info:   1 out of   1 pipCommand 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":"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":"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"}}]},"last_synced_at":"2025-08-21T06:08:26.067Z","repository_id":57473162,"created_at":"2025-08-21T06:08:26.067Z","updated_at":"2025-08-21T06:08:26.067Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278939315,"owners_count":26072277,"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-08T02:00:06.501Z","response_time":56,"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":["blind","blind-people","laser-cutter","pregenerated-patterns","tactile-patterns"],"created_at":"2024-10-16T15:11:45.771Z","updated_at":"2025-10-08T11:58:57.129Z","avatar_url":"https://github.com/matkoniecz.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Archived, replaced, deprecated!\n\nPlease see [https://github.com/matkoniecz/lunar_assembler](https://github.com/matkoniecz/lunar_assembler) for a replacement.\n\nI switched to JS based solution, as using browser as an operating systems allows to skip installation.\n\nStill, maybe patterns here will be useful for someone.\n\nRight now I am not using it as turned out that the simplest patterns were better (though, testing more complex solutions was worth doing).\n\n# current blocker:\n\nhttps://forum.lightburnsoftware.com/t/bugs-on-importing-svg-with-small-elements/37173\n\n# Disclaimer\n\nPattern here are of alpha quality - not validated in actual use, examples are missing, usage instruction is missing, tested only in LightBurn etc etc.\n\nAll of that will change.\n\nPart of designs were prototyped already, so initial testing is done.\n\n# Pregenerated patterns\n\n[/patterns](/patterns) folder contains pregenerated patterns, so you can use them without running any code.\n\n# Usage\n\n## Laser cut wood\n\nPlywood is commonly used for laser cutters.\n\nThere are two major problems with using wood (plywood) engraved with laser cutter.\n\nFirst is charring, this can be avoided by engraving in multiple passes with reduced power rather than one pass with high power.\n\nSecond is that inherent wood texture is often masking shapes created by laser engraving. This is more problematic with laser engraving compared to other potential production methods.\n\nNote that raster engraving are often optimalized for how generated works looks like. Requirements for tactile materials may differ. For example in LightBurn typically recommended Jarvis is the best for something that will be looked at, not touched. For tactile patterns grayscale setting is superior. Jarvis may look well, but produces rough texture, with fine elements that are crushed on touch, with very poor recognizability of overall shape.\n\nTODO: include example settings in LightBurn\n\nTODO: include photo with both charring and succesful burns\n\n## Laser cut plexiglass\n\nPlexiglass is also usable on laser cutters and texture cut into it is much more recognisable by touch, as it has no grain or large scale internal structure.\n\nNote that cutting through plexiglass is more tricky, one (untested) recomendation is to use two passes with lower power, as settings typical to wood will leave unclean cut with stringy parts or jagged edge.\n\nCombining plywood and plexiglass in one design is a good idea, as difference in materials is clear by touch. Plywood without pattern and plexiglass without pattern are clearly recognisable.\n\n## Cloth, felt\n\nProblematic due to hygienic issues. It would become dirty quickly and is basically impossible to clean it.\n\n## Cork\n\n??? should be interesting and useful\n\n## Leather\n\n??? should be interesting and useful\n\n# Tactile patterns for laser cutter\n\nGenerates patterns recognisable by touch, for use in laser-cut materials.\n\nUsed for example on maps for blind people.\n\nAvailable as tactile_patterns pip package.\n\nIf you would use it but \"pip package\" is too scary - please open an issue to let me know how it can be also published in way that makes it useful.\n\n# Examples\n\n## Square\n\n```\nfrom tactile_patterns.data_format import Rescale\nfrom tactile_patterns.data_format import Point\nfrom tactile_patterns.data_format import Polygon\nfrom tactile_patterns.data_format import Collection\nfrom tactile_patterns.data_format import LinearRing\nfrom tactile_patterns.data_format import pretty_geojson_string\n\n\nouter = LinearRing([\n            Point(x=0, y=0),\n            Point(x=1, y=0),\n            Point(x=1, y=1),\n            Point(x=0, y=1),\n            Point(x=0, y=0),\n        ])\npolygon = Polygon(outer)\ncollection = Collection([polygon])\nprint(pretty_geojson_string(collection.to_geojson()))\n```\n\n## Use one of vector generators\n\n```\nfrom tactile_patterns.vector import maze_under_construction_pattern\nfrom tactile_patterns.data_format import pretty_geojson_string\nfrom tactile_patterns.data_format import get_recommended_scaling\nfrom tactile_patterns.data_format import projection_code\n\n\npattern = maze_under_construction_pattern(30, 30)\nlat = 50.05518\nlon = 19.92757\nbase_scaling = 0.000001\nprojection_scale = get_recommended_scaling(lat, lon, projection_code(\"web mercator\"))\nscale_lat = projection_scale['scale_lat'] * base_scaling\nscale_lon = projection_scale['scale_lon'] * base_scaling\npattern.rescale(Rescale(multiply_lat=scale_lat, multiply_lon=scale_lon, add_lon=lon, add_lat=lat))\nprint(pretty_geojson_string(pattern.to_geojson()))\n```\n\nIf you want SVG file rather than geojson file, you can run\n\n`svgis draw test.geojson --style '* {stroke: none; fill: #00f}' -o out.svg`\n\n## Use one of raster generators\n\n\n# Sponsors\n\n\u003ca href=\"https://osmfoundation.org/\"\u003e\u003cimg src=\"logo_osmf.png\" height=\"100\"/\u003e\u003c/a\u003e\u003cbr/\u003e\n\nThe [OpenStreetMap foundation](https://wiki.osmfoundation.org/wiki/Main_Page) was funding the development of this project in their first round of the [microgrant program](https://wiki.osmfoundation.org/wiki/Microgrants) in 2020. It was done as part of making [tactile maps based on OpenStreetMap data, for blind or visually impaired children](https://wiki.openstreetmap.org/wiki/Microgrants/Microgrants_2020/Proposal/Tactile_maps_for_blind_or_visually_impaired_children).\n\nIf anyone else is also interested in supporting this project via funding - [let me know](mailto:osm-messages@tutanota.com) (opening a new issue is also OK) :)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatkoniecz%2Ftactile_patterns","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmatkoniecz%2Ftactile_patterns","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatkoniecz%2Ftactile_patterns/lists"}