{"id":22486265,"url":"https://github.com/signicode/humanify","last_synced_at":"2026-06-01T13:03:30.309Z","repository":{"id":32443570,"uuid":"80160672","full_name":"signicode/humanify","owner":"signicode","description":"Add human touch to otherwise very machined node.js streams.","archived":false,"fork":false,"pushed_at":"2022-12-10T16:17:41.000Z","size":2769,"stargazers_count":7,"open_issues_count":17,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-04-27T22:30:06.421Z","etag":null,"topics":["human-computer-interaction","node-js","nodejs","reactive-programming","stream-processing"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","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/signicode.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}},"created_at":"2017-01-26T22:11:24.000Z","updated_at":"2025-10-19T08:36:55.000Z","dependencies_parsed_at":"2023-01-14T21:14:30.631Z","dependency_job_id":null,"html_url":"https://github.com/signicode/humanify","commit_stats":null,"previous_names":[],"tags_count":75,"template":false,"template_full_name":null,"purl":"pkg:github/signicode/humanify","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/signicode%2Fhumanify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/signicode%2Fhumanify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/signicode%2Fhumanify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/signicode%2Fhumanify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/signicode","download_url":"https://codeload.github.com/signicode/humanify/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/signicode%2Fhumanify/sbom","scorecard":{"id":823179,"data":{"date":"2025-08-11","repo":{"name":"github.com/signicode/humanify","commit":"ab67ab8e8b742a6b889e4485b80040b3f2eea8f4"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"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":"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":"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":"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":"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":"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":"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":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":"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":"60 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25","Warn: Project is vulnerable to: GHSA-4w2v-q235-vp99","Warn: Project is vulnerable to: GHSA-cph5-m8f7-6c5x","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-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-hm92-vgmw-qfmx","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-phwq-j96m-2c2q","Warn: Project is vulnerable to: GHSA-ghr5-ch3p-vcr6","Warn: Project is vulnerable to: GHSA-273r-mgr4-v34f","Warn: Project is vulnerable to: GHSA-r7qp-cfhv-p84w","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-74fj-2j2h-c42q","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-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-ww39-953v-wcq6","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-rc47-6667-2j5j","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","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-qrpm-p2h7-hrv2","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-px4h-xg32-q955","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-25hc-qcg6-38wj","Warn: Project is vulnerable to: GHSA-qm95-pgcg-qqfq","Warn: Project is vulnerable to: GHSA-pq67-2wwv-3xjx","Warn: Project is vulnerable to: GHSA-8cj5-5rvv-wf4v","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-662x-fhqg-9p8v","Warn: Project is vulnerable to: GHSA-394c-5j6w-4xmx","Warn: Project is vulnerable to: GHSA-78cj-fxph-m83p","Warn: Project is vulnerable to: GHSA-fhg7-m89q-25r3","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-6fc8-4gx4-v693","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-776f-qx25-q3cc"],"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-23T16:06:00.136Z","repository_id":32443570,"created_at":"2025-08-23T16:06:00.136Z","updated_at":"2025-08-23T16:06:00.136Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33775865,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-01T02:00:06.963Z","response_time":115,"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":["human-computer-interaction","node-js","nodejs","reactive-programming","stream-processing"],"created_at":"2024-12-06T17:14:14.330Z","updated_at":"2026-06-01T13:03:29.801Z","avatar_url":"https://github.com/signicode.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"![Humanify Logo](humanify-logo.png)\n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsignicode%2Fhumanify.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsignicode%2Fhumanify?ref=badge_shield)\n\n## What does it do?\n\n**Humanify** is a free and open source server and web application, written in Node.js, that allows adding human intelligence to data streaming in scenarios where computers are not suitable to make educated enough choices.\n\nIn just a couple lines of code **Humanify** will ingest your data stream, open an HTTP server with a WebApplication that will be fed with all the data from the stream. Now you and your team can add decisions to each item of your data stream.\n\nThink of it as an open-source, on-premise alternative to Amazon Mechanical Turk that you can alter to your own liking.\n\n## Usage\n\n```bash\nnpm install -s humanify\n```\n\nWith [scramjet](https://www.scramjet.org) stream:\n\n```javascript\n    streamOfRequests.use(\"humanify\", {buttons: [\n        {value: 0, caption: 'Remove', type: 'danger', kb: ['rR', 39]},\n        {value: 2, caption: 'Escalate', type: 'warning', kb: ['eE', 38]},\n        {value: 1, caption: 'Accept', type: 'success', kb: ['aA', 37]},\n    ]})\n    // do something with your data-stream\n```\n\nWith any other node.js stream:\n\n```javascript\n    import humanify from \"humanify\";\n\n    humanify(streamOfRequests, {buttons: [\n        {value: 0, caption: 'Remove', type: 'danger', kb: ['rR', 39]},\n        {value: 2, caption: 'Escalate', type: 'warning', kb: ['eE', 38]},\n        {value: 1, caption: 'Accept', type: 'success', kb: ['aA', 37]},\n    ]})\n    // do something with your data-stream\n```\n\nThe app will show at: http://localhost:8666/\n\nThis results in an app like this:\n\n![Humanify App Screenshot](screenshot.png)\n\n## API\n\nHumanify is a [Scramjet Module](https://www.scramjet.org/docs/scramjet-modules) and you can use it with any stream.\n\nOptions are:\n\n* `serialize` - serialization method for your data (default: `JSON.stringify`)\n* `deserialize` - serialization method for your data (default: `JSON.parse`)\n* `port` - the port on which the humanify app should listen on (default: `8666`)\n* `host` - the host on which the humanify app should listen on (default: `0.0.0.0`)\n* `base` - a path on which humanify app should be exposed (useful if you'd like a couple instances)\n* `root` - root path for application to start (default: public folder in humanify root)\n* `buttons` - list of buttons that are show to users\n* `maxBufferLength` - how many items to show to users\n* `logger` - logger to use, default: `{[*]: mute}`\n* `itemParser` - an async function that allows to enrich entries just before sending them to the application\n\nAdditionally you could also pass an option to reuse an existing server:\n\n```javascript\n{server: {\n    app,    // the express-compatible app to hook middleware on\n    io,     // the socket.io server instance\n    http    // the http server humanify should hook up to.\n}}\n```\n\nButton definition:\n\n```javascript\n    {\n        value: 1,           // the value that's pushed to the output stream\n        caption: 'yes',     // what should be shown on the buttons\n        type: 'primary',    // bootstrap type (in essence it's the button's class)\n        kb: ['yY', 37]      // keyboard scan code to assign as shortcut\n    },\n```\n\nitemParser:\n\n```javascript\n// this is called just before the item is sent to the browser app.\nfunction({buttons, item}) {\n    // buttons is an array of buttons\n    // item - the original data in stream\n\n    return {buttons: newButtons, item: await getSomeMoreData(item)}\n    // all returned\n}\n```\n\n### Samples\n\nSamples are in the `test` directory, try to run them like this:\n\n```bash\nnode test/sample-comments.js\n```\n\nThen run the browser, point it to `http://localhost:8666/` and push some buttons there. In console you'll see the effect of your choices:\n\n```\n16:39 $ node test/sample-comments.js\nREQUESTING CONTACT    : \u003cSequoyah Miina\u003e \"Ad quorum et cognitionem et usum iam corroborati natura ipsa praeeunte deducimur. Cuius ad naturam apta ratio vera illa ...\"\nSENDING 'THANK YOU'   : \u003cDeimos Bengta\u003e \"Omnia peccata paria dicitis. Nam quibus rebus efficiuntur voluptates, eae non sunt in potestate sapientis. Illa argument...\"\nREMOVING FROM FACEBOOK: \u003cAoibhín Cătălin\u003e \"Illa argumenta propria videamus, cur omnia sint paria peccata. Eam tum adesse, cum dolor omnis absit; Si quicquam extra ...\"\n```\n\n## Plans\n\n* Extract the data front-end library from sample app\n* Make a better sample application\n* Fix application to be more flexible and use some kind of templating system.\n* Add web notifications support with options via service workers\n\n## License\n\nHumanify is licensed as MIT. See LICENSE file in this repo.\n\n\n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fsignicode%2Fhumanify.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fsignicode%2Fhumanify?ref=badge_large)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsignicode%2Fhumanify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsignicode%2Fhumanify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsignicode%2Fhumanify/lists"}