{"id":29605461,"url":"https://github.com/abeleuta/easyannotation","last_synced_at":"2026-03-11T13:40:07.654Z","repository":{"id":42935277,"uuid":"236945282","full_name":"abeleuta/easyannotation","owner":"abeleuta","description":"Annotate your pictures online and save in different formats","archived":false,"fork":false,"pushed_at":"2023-10-04T12:06:12.000Z","size":850,"stargazers_count":13,"open_issues_count":11,"forks_count":6,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-19T08:51:26.906Z","etag":null,"topics":["image-manipulation","javascript","javascript-library","npm-package","typescript","typescript-library"],"latest_commit_sha":null,"homepage":"http://easyannotation.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/abeleuta.png","metadata":{"files":{"readme":"README.md","changelog":null,"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}},"created_at":"2020-01-29T09:26:36.000Z","updated_at":"2025-06-22T08:16:11.000Z","dependencies_parsed_at":"2023-10-20T16:15:28.715Z","dependency_job_id":null,"html_url":"https://github.com/abeleuta/easyannotation","commit_stats":{"total_commits":16,"total_committers":2,"mean_commits":8.0,"dds":0.0625,"last_synced_commit":"fe9a23d4b6f0e5d8883c5ac42b9900d576c4c221"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/abeleuta/easyannotation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abeleuta%2Feasyannotation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abeleuta%2Feasyannotation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abeleuta%2Feasyannotation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abeleuta%2Feasyannotation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abeleuta","download_url":"https://codeload.github.com/abeleuta/easyannotation/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abeleuta%2Feasyannotation/sbom","scorecard":{"id":160462,"data":{"date":"2025-08-11","repo":{"name":"github.com/abeleuta/easyannotation","commit":"67fc84b38ce2fd989673739051f0fb51cbb9ca5d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"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":"Code-Review","score":0,"reason":"Found 0/17 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":"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":-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":"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":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"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 '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 2 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":"25 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-phwq-j96m-2c2q","Warn: Project is vulnerable to: GHSA-ghr5-ch3p-vcr6","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-35jh-r3h4-6jhm","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-rp65-9cf3-cjxr","Warn: Project is vulnerable to: GHSA-566m-qj78-rww5","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-p493-635q-r6gr","Warn: Project is vulnerable to: GHSA-3965-hpx2-q597","Warn: Project is vulnerable to: GHSA-gcx4-mw62-g8wm","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-4wf5-vphf-c2xc","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-h6q6-9hqw-rwfv","Warn: Project is vulnerable to: GHSA-5fg8-2547-mr8q","Warn: Project is vulnerable to: GHSA-crh6-fp67-6883"],"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-16T13:15:44.178Z","repository_id":42935277,"created_at":"2025-08-16T13:15:44.178Z","updated_at":"2025-08-16T13:15:44.178Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30382674,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-11T12:49:11.341Z","status":"ssl_error","status_checked_at":"2026-03-11T12:46:41.342Z","response_time":84,"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":["image-manipulation","javascript","javascript-library","npm-package","typescript","typescript-library"],"created_at":"2025-07-20T16:05:06.103Z","updated_at":"2026-03-11T13:40:07.632Z","avatar_url":"https://github.com/abeleuta.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Easy Annotation - a JavaScript library to annotate pictures online\n\n### Features\n* Add different shapes to your pictures\n* Highlight some part of the image\n* Blur parts of the image\n* Save to PNG, JSON or XML\n* Load previously saved work\n* Simple usage\n* Zero dependencies\n* Responsive and auto-positioning\n* Supports touch devices\n\n## Getting Started\n# Installation\n\nInstall via npm:\n```shell\nnpm i easyannotation\n```\n\nInclude code:\n```js\n\u003cscript type=\"text/javascript\" src=\"https://cdn.jsdelivr.net/npm/easyannotation\"\u003e\u003c/script\u003e\n```\n### Example\n\n```javascript\n  new easyannotation.AnnotatorContainer(document.querySelector('#inputImage')).show(function(res) {\n      //process result when user press Save\n      document.querySelector('#sample4Res').src = res;\n  });\n```\n## Options\n```javascript\n  new easyannotation.AnnotatorContainer(document.querySelector('#inputImage'), {\n     \n     // optional target element to place the EasyAnnotation container.\n     // If not specified container will be placed on document.body element.\n     targetElement: document.body,\n    \n     // default ui for Easy Annotation toolbar and buttons.\n     // Currently supported values are 'default' and 'dark'.\n     ui: 'default',\n\n     //default font to be used for text elements.\n     font: {\n        name: 'Arial', // font name\n        size: 24,      //default font size\n        bold: false,   //bold\n        italic: false  //italic\n     },\n    \n     // the drawing style for lines, the following options can be used:\n     drawStyle: {\n     //   startArrow and endArrow properties define the start and end of lines, can be one of the follwing:\n     //     *   ArrowType.NONE - no arrow\n     //     *   ArrowType.ARROW - simple arrow\n     //     *   ArrowType.OPEN_ARROW - simple open arrow\n     //     *   ArrowType.RECT - rectangle arrow\n     //     *   ArrowType.DIAMOND_ARROW - diamond arrow\n     //     *   ArrowType.OVAL_ARROW - oval arrow\n     //     *   ArrowType.LINE_ARROW - vertical line arrow\n          startArrow: ArrowType.NONE, \n          endArrow: ArrowType.NONE,\n\n     //   line type, can be one of the follwing:\n     //     *  StrokeType.SOLID - solid line\n     //     *  StrokeType.DOTTED - dotted line\n     //     *  StrokeType.DASHED - dashed line\n        type: easyannotation.StrokeType.SOLID,\n        \n        width: 1, //   Line width, can be any number starting with 1\n        color: '#000' // default line color\n     },\n\n    // Individual draw style for each annotator.\n    // If specified this style will be used when adding an annotator of the specified type.\n    drawStyles: {\n        line: DrawStyle,\n        arrow: DrawStyle,\n        rect: DrawStyle,\n        polygon: DrawStyle,\n        callout: DrawStyle,\n        ellipse: DrawStyle\n    },\n\n     //default fill style for shapes that can be filled, the following options can be used:\n     fillStyle: {\n          fillType: 0, // a number between 0 and 9 defining the fill type. \n                      // If 0 is specified, elements will fill with solid background.\n          opacity: 100,  // default opacity fill for components, 100 - opaque, 0 - transparent\n          color: '#000' // default fill color\n     },\n    \n    // optional fill style for each annotator.\n    // If specified this style will be used when adding an annotator of the specified type.\n    fillStyles: {\n        text: FillStyle,\n        rect: FillStyle,\n        polygon: FillStyle,\n        callout: FillStyle,\n        ellipse: FillStyle\n    },\n\n     x: null, //x position based on target element\n     y: null, //y position based on target element\n     width: null, //with of the container element. If not specified defaults to image width.\n     height: null, //height of the container element. If not specified defaults to image height.\n  \n     loadOnClick: boolean, //if true, annotator will load when user click or tap on the image element\n\n     showClose: boolean,//if true, close button will show\n\n     showToolbar: true, //true to show annotation toolbar\n     showProperties: true, // true to show properties toolbar\n\n     style: null, //additional style properties to apply to Easy Annotation container element\n\n     // a list of items to add to toolbar element, by default contains the following items:\n     toolbarItems: [\n                    {\n                        //clear button to delete selected or all elements\n                        itemId: 'delete',\n                        iconSVG: EraseIcon,\n                        title: 'Delete selected or all elements'\n                    },\n                    {xtype: 'text'},     //text element\n                    {xtype: 'line'},     //line element\n                    {xtype: 'arrow'},    //arrow element\n                    {xtype: 'ellipse'},   //ellipse/circle element\n                    {xtype: 'rect'},      //rectangle element\n                    {xtype: 'callout'},   //callout element\n                    {xtype: 'image'},     //image element\n                    {xtype: 'blur'},      //bluring element to blur parts of the image\n                    {xtype: 'free-draw'}, //free draw element\n                    {xtype: 'polygon'},   // polygon draw element\n                    {\n                        //save element\n                        itemId: 'save',\n                        iconSVG: SaveIcon,\n                        title: 'Save changes and close annotator'\n                    }],\n\n     //Hide original image element. \n     //If false, image element won't be hidden and EasyAnnotation container will be placed above the original image\n     hideElement: true,\n\n    // default text to show when users adds a new Text annotator\n    // by default this is \"Text\" string\n    defaultText: null,\n    \n    //an optional object with label translations. \n    // The following are the keys and default values for dialog labels.\n    // * color - 'Color'\n    // * transparency - 'Transparency'\n    // * blurRadius - 'Blur Radius'\n    // * lineStyle - 'Line Style'\n    // * drawLineWidth - 'Width'\n    // * fillPattern - 'Fill Pattern'\n    // * fillEffects - 'Effects'\n    // * textFont - 'Font'\n    // * textSize - 'Size'\n     translations: null\n    \n  }).show(function(res) {\n      //process result when user press Save\n      document.querySelector('#sample4Res').src = res;\n  });\n```\n\n### Methods\n\n* show(callback`:function`, exportType`:ExportType`) _- Show EasyAnnotation container and provide callback to be called when user save changes._\n* addElement(element`:BaseAnnotator`) _- Add new annotator element._\n* selectAll() _- select all elements_\n* deselectAll() _- deselect all elements_\n* clear() _- delete all elements from the container _\n* save(callback`:function`, exportType`:ExportType`) _- save data to specified format and call callback function when done. \nData can be saved as PNG, JSON or XML. Callback function will be called with one string argument with saved data in the required format_\n* loadXML(xml`:string`) _- load data from specified XML string. `xml` parameter must be a valid XML result from `show` or `save` functions._\n* loadJSON(json`:string`) _- load data from specified JSON string. `json` parameter must be a valid JSON result from `show` or `save` functions._\n\n## License\n(see [LICENSE](https://github.com/abeleuta/easyannotation/blob/master/LICENSE) for details) - library is free of charge for Open Source projects and for personal use only.\nOther projects require a license.\n\nFor more details, please visit [EasyAnnotation.com website](http://easyannotation.net/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabeleuta%2Feasyannotation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabeleuta%2Feasyannotation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabeleuta%2Feasyannotation/lists"}