{"id":13680436,"url":"https://github.com/manthanhd/talkify","last_synced_at":"2026-01-28T22:08:26.751Z","repository":{"id":74263605,"uuid":"71181916","full_name":"manthanhd/talkify","owner":"manthanhd","description":"Talkify is an open source framework with an aim to standardize and model conversational AI enabling development of personal assistants and chat bots. The mission of this framework is to make developing chat bots and personal assistants as easy as spinning up a simple website in html.","archived":false,"fork":false,"pushed_at":"2018-04-09T18:26:51.000Z","size":125,"stargazers_count":73,"open_issues_count":15,"forks_count":17,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-08-09T17:15:37.585Z","etag":null,"topics":["bot","chatbot","framework","javascript"],"latest_commit_sha":null,"homepage":"","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/manthanhd.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2016-10-17T21:15:51.000Z","updated_at":"2025-02-16T16:42:17.000Z","dependencies_parsed_at":"2023-07-23T02:30:52.124Z","dependency_job_id":null,"html_url":"https://github.com/manthanhd/talkify","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/manthanhd/talkify","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manthanhd%2Ftalkify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manthanhd%2Ftalkify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manthanhd%2Ftalkify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manthanhd%2Ftalkify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/manthanhd","download_url":"https://codeload.github.com/manthanhd/talkify/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manthanhd%2Ftalkify/sbom","scorecard":{"id":615662,"data":{"date":"2025-08-11","repo":{"name":"github.com/manthanhd/talkify","commit":"82028b85123014dda5f54d769795652267202af3"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/7 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":"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":"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":"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":"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":"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":"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":"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 28 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"}}]},"last_synced_at":"2025-08-21T03:51:50.759Z","repository_id":74263605,"created_at":"2025-08-21T03:51:50.759Z","updated_at":"2025-08-21T03:51:50.759Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28853211,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T15:15:36.453Z","status":"ssl_error","status_checked_at":"2026-01-28T15:15:13.020Z","response_time":57,"last_error":"SSL_read: 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":["bot","chatbot","framework","javascript"],"created_at":"2024-08-02T13:01:17.067Z","updated_at":"2026-01-28T22:08:26.734Z","avatar_url":"https://github.com/manthanhd.png","language":"JavaScript","readme":"# Talkify\nFramework for developing chat bot applications.\n\n[![npm version](https://badge.fury.io/js/talkify.svg)](https://badge.fury.io/js/talkify) [![Build Status](https://travis-ci.org/manthanhd/talkify.svg?branch=master)](https://travis-ci.org/manthanhd/talkify) [![Coverage Status](https://coveralls.io/repos/github/manthanhd/talkify/badge.svg?branch=master)](https://coveralls.io/github/manthanhd/talkify?branch=master)\n\n\u003c!-- vim-markdown-toc GFM --\u003e\n* [Usage](#usage)\n  * [Setup](#setup)\n  * [Code Tutorial](#code-tutorial)\n    * [Initialize](#initialize)\n    * [Train](#train)\n    * [Add Skills](#add-skills)\n    * [Resolve queries](#resolve-queries)\n\t* [Chainable methods](#chainable-methods)\n  * [Configuration Options](#configuration-options)\n    * [Context Store](#context-store)\n    * [Classifier](#classifier)\n  * [Extending bot](#extending-bot)\n    * [Context management](#context-management)\n\t* [Custom Classifier](#custom-classifier)\n* [Reference Documentation](#reference-documentation)\n* [Contributing](#contributing)\n\n\u003c!-- vim-markdown-toc --\u003e\n\n# Usage\n## Setup\n\nMake sure you have node and npm installed. As of now, this module has been tested against 0.12 node version within the [Travis CI](https://travis-ci.org/manthanhd/talkify) pipeline.\n\nSimply run `npm install` command to install:\n\n```bash\nnpm install --save talkify\n```\n\n## Code Tutorial\n\n### Initialize\n\nRequire the main module, types and dependencies. The following command loads everything that you need from the module.\n\n```javascript\n// Core dependency\nconst talkify = require('talkify');\nconst Bot = talkify.Bot;\n\n// Types dependencies\nconst BotTypes = talkify.BotTypes;\nconst Message = BotTypes.Message;\nconst SingleLineMessage = BotTypes.SingleLineMessage;\nconst MultiLineMessage = BotTypes.MultiLineMessage;\n\n// Skills dependencies\nconst Skill = BotTypes.Skill;\n\n// Training dependencies\nconst TrainingDocument = BotTypes.TrainingDocument;\n```\n\nOnce the dependencies have been loaded, you can initialise the bot core.\n\n```javascript\nconst bot = new Bot();\n```\n\nThe `Bot()` constructor also accepts parameters in the form of configuration object. Here you can pass in configuration switch values or alternate implementations for things like `ContextStore` and `Classifier` etc. We'll cover that afterwards in the [Configuration Options](#configuration-options) section.\n\n### Train\n\nOnce Bot has been initialised, the first thing you should do is to train it. To train it one document at a time synchronously, you can use the `train` method:\n\n```javascript\nbot.trainAll([\n    new TrainingDocument('how_are_you', 'how are you'),\n    new TrainingDocument('how_are_you', 'how are you going'),\n    new TrainingDocument('how_are_you', 'how is it going'),\n\n    new TrainingDocument('help', 'how can you help'),\n    new TrainingDocument('help', 'i need some help'),\n    new TrainingDocument('help', 'how could you assist me')\n], function() {});\n```\n\nThe code above trains the bot to recognise the topic `how_are_you` when the text looks like `how are you` or `how are you doing` as well as `how is it going` but to recognise topic `help` when the text looks like `how can you help` or `i need some help` as well as `how can you assist me`. This is how you would train the bot. \n\nThe `trainAll` method accepts an array of `TrainingDocument` objects as well as a callback function. The `TrainingDocument` object constructor accepts two parameters. These are `topicName` and `trainingData`. The `topicName` parameter is the name of the topic you want to train the `trainingData` for and the `trainingData` is the sentence that you are feeding the bot as its training data. The `topicName` will later on map to actual skills the bot can respond to.\n\nThe callback for the `trainAll` method is a function that the bot can call when the training is complete. If you have too much training data, you should implement this properly. In this example, since there is not much training data, we've passed in an empty `function`.\n\nNeedless to say, the bot gets better with more training data. In this tutorial we are using the default classifier, which currently is the `LogisticRegression` classifier from the [talkify-natural-classifier](https://github.com/manthanhd/talkify-natural-classifier) library. This classifier typically needs bit more training data to start with but is more accurate than others in most conditions.\n\n### Add Skills\n\nOnce you have trained the bot for some topics, you need to add some skills. Skills are actions that the bot will execute when it recognises a topic. So topics and skills map to 1:1.\n\nTo add a skill, you need to create it first. A skill requires three things. Name of the skill that is unique to the bot. The name is used to relate skills later on within the context. A topic that it maps to and a function that the bot will call in order to execute the skill. This function will take four parameters, namely: `context, request, response, next`. The `context` parameter is used to store any useful contextual information from that skill. The `request` parameter contains information about the request, same for `response`. The `next` parameter is a function that you can call to let the bot\nknow that you are done processing. Here's what a skill looks like:\n\n```javascript\nvar howAction = function(context, request, response, next) {\n    response.message = new SingleLineMessage('You asked: \\\"' + request.message.content + '\\\". I\\'m doing well. Thanks for asking.');\n    next();\n};\n\nvar helpAction = function(context, request, response, next) {\n    response.message = new SingleLineMessage('You asked: \\\"' + request.message.content + '\\\". I can tell you how I\\'m doing if you ask nicely.');\n    next();\n};\n\nvar howSkill = new Skill('how_skill', 'how_are_you', howAction);\nvar helpSkill = new Skill('help_skill', 'help', helpAction);\n```\n\n**Note:** Name of a skill can be undefined. However, please be aware that doing so will mean that the bot will execute that skill whenever its confidence level is 0 for responding to a given query.\n\nOnce you have defined some skills, you need to add them to the bot. Add the skill to the bot like so:\n\n```javascript\nbot.addSkill(howSkill);\nbot.addSkill(helpSkill);\n```\n\n### Resolve queries\n\nOnce added, you can now ask bot to resolve something. This is where you are querying the bot with a sentence and it will respond with a message asynchronously. The resolve function takes in three parameters: `contextId, text, callback`. The `contextId` helps bot resolve context from any previous conversation. The `text` is the question or piece of natural language string that the bot needs to interpret and respond to. Lastly, the `callback` is the callback function that the bot will call\nwith `err, messages` parameters to indicate an error (if any) and it's reply messages.\n\n```javascript\nvar resolved = function(err, messages) {\n    if(err) return console.error(err);\n\n    return console.log(messages);\n};\n\nbot.resolve(123, 'Assistance required', resolved);\n```\n\nRun it like a simple node file and it should print the following in the console.\n\n```\n[ { type: 'SingleLine',\n    content: 'You asked: \"Assistance required\". I can tell you how I\\'m doing if you ask nicely.' } ]\n```\n\nTry changing `bot.resolve` to this and notice the change in response.\n\n```javascript\nbot.resolve(456, 'How\\'s it going?', resolved);\n```\n\nLet's ask two things at once. Change `bot.resolve` again to:\n\n```javascript\nbot.resolve(456, 'How\\'s it going? Assistance required please.', resolved);\n```\n\nWhen you run your code, you should get two messages back:\n\n```javascript\n[ { type: 'SingleLine',\n    content: 'You asked: \"How\\'s it going? Assistance required please.\". I\\'m doing well. Thanks for asking.' },\n  { type: 'SingleLine',\n    content: 'You asked: \"How\\'s it going? Assistance required please.\". I can tell you how I\\'m doing if you ask nicely.' } ]\n```\n\n### Chainable methods\nCurrently `train`, `addSkill` and `resolve` methods are chainable. That means you can create Bot object and cascade methods like is mentioned below.\n\n```javascript\n\tnew Bot().train(topic, sentence).addSkill(skill).resolve(....)\n```\n\n## Configuration Options\n\n### Context Store\n\nThe bot core also accepts an alternate implementation for the built in context store. Please see [Context management](#context-management) for more details.\n\n### Classifier\n\nYou can also supply your own version of the classifier to the bot. This option was primarily used to make testing easier, however, it can still be used in production if you have a better version of the built-in classifier.\n\nThe built in classifier is the [talkify-natural-classifier](https://github.com/manthanhd/talkify-natural-classifier). This classifier provides two implementations:\n\n* `LogisticRegressionClassifier`\n* `BayesClassifier`\n\nThe `LogisticRegressionClassifier` is the default classifier. If you prefer to implement the `BayesClassifier` from `talkify-natural-classifier`, you can do the following:\n\n```javascript\nvar BayesClassifier = require('talkify-natural-classifier').BayesClassifier;\n\nvar bot = new Bot({classifier: new BayesClassifier()});\n```\n\nIf you prefer to use IBM Watson's Natural Language Processing Classifier instead, you should use the [talkify-watson-classifier](https://github.com/manthanhd/talkify-watson-classifier) library instead. Please see the guide on the Github repository page for more details on how to use that classifier.\n\nIf you think yours work better, give me a shout! I'd be delighted to know and possibly work towards implementing it within the core module.\n\n### Skill resolution strategy\n\nTo provide your own implementation of Skill Resolution Strategy, simply pass the function definition in configuration object as follows:\n\n```javascript\nvar mySkillResolutionStrategy = function() {\n    this.addSkill = function (skill, options) { ... };\n    this.getSkills = function () {...};\n    this.resolve = function (err, resolutionContext, callback) {\n        ...\n    };\n    return this;\n};\n\nvar bot = new Bot({\n    skillResolutionStrategy: mySkillResolutionStrategy\n});\n```\n\nThe bot core will create an instance of your skill resolution strategy object on init and will use it as single instance across all resolutions.\n\n### Topic resolution strategy\n\nTo provide your own implementation of Topic Resolution Strategy, simply pass the function definition in configuration object as follows:\n\n```javascript\nvar myTopicResolutionStrategy = function() {\n    this.collect = function (classification, classificationContext, callback) { callback() };\n    this.resolve = function (callback) { callback([{name: \"topic_name\", confidence: 0.5]) };\n    return this;\n};\n\nvar bot = new Bot({\n    topicResolutionStrategy: myTopicResolutionStrategy\n});\n```\n\nThe bot core will create a new instance of your topic resolution strategy for every call it receives into the resolve method.\n\n## Extending bot\n\n### Context management\nBy default, the bot core uses its built in version of ContextStore. If you look into lib/ContextStore.js, you'll find that it is a very simple implementation where the context is stored in a simple in-memory map with the `contextId` being the key and the context object being the value. Of course when you come to deploy this, the built-in context store will be very limiting.\n\nExtending the context store is very easy. Within the config, you can provide your own implementation for the ContextStore object. The following code provides a very trivial implementation that simply logs the values to the console.\n\n```javascript\nvar myContextStore = {\n    put: function(id, context, callback) {\n        console.info('put');\n        console.info(id);\n        console.info(context);\n    },\n\n    get: function(id, callback) {\n        console.info('get');\n        console.info(id);\n    },\n\n    remove: function(id, callback) {\n        console.info('remove');\n        console.info(id);\n    }\n}\n\nvar bot = new Bot({contextStore: myContextStore});\n```\n\nThe current spec for `ContextStore` requires three functions to be implemented. These are `put, get and remove`. As long as these methods are provided, the bot does not care where the value for `contextStore` field in config comes from.\n\nIf you were to run that code with some query resolves, you will find that the remove function never gets called. This is a work in progress as currently there is no limit as to how long a context must be remembered.\n\n### Custom Classifier\n\nAs mentioned before, the default classifier that the bot uses is from the [talkify-natural-classifier](https://github.com/manthanhd/talkify-natural-classifier) library. You are free to write your own classifier and use it in your application. To do this, you need to extend the classifier interface defined in the [talkify-classifier](https://github.com/manthanhd/talkify-classifier) library.\n\nOnce you have successfully extended that implementation, you can supply your classifier to the bot like so:\n\n```javascript\nvar myClassifier = new MyAwesomeClassifier();\nvar bot = new Bot({ classifier: myClassifier });\n```\n\nI'd love to see your implementation of the talkify classifier. If you have extended the interface and successfully implemented your classifier give me a shout! I'd be delighted to know your experience using this library.\n\nSince version 2.1.0, you can specify multiple classifiers for your bot. See [docs on classifier](./wiki/CLASSIFIER.md) for more info.\n\n### Skill Resolution Strategy\n\nA skill resolution strategy is a component that is able to output a skill, given a resolution context. A resolution context is an object comprised of a list of topics and the original sentence, essential ingredients needed to resolve a skill.\n\n```\n +-------------+\n |  Topic  | | |\n +---------+ | +----\u003e +--------------+\n |-----------+ |      |              |\n +-------------+      |  Skill       |      +---------+\n                      |  Resolution  +----\u003e |  Skill  |\n                      |  Strategy    |      +---------+\n +------------+       |              |\n |  Sentence  | +---\u003e +--------------+\n +------------+\n```\n\n### Topic Resolution Strategy\n\nA topic resolution strategy allows you to plug in custom logic to resolve a topic, given classification data. When plugging in a custom topic resolution strategy, the bot core expects the function definition to be passed in instead of result of the function execution. This is because the topic resolution strategy object is constructed using `new` for every call to `resolve` method. \n\nThe process of topic resolution works in two parts:\n\n#### Step 1\n\nFirst stage of the topic resolution process is the collection phase. Here, the bot core sends the classification for every classification set returned from the classifier along with any required context. The bot core also passes in a callback function which is required to be invoked to let the bot core know that the invocation was successful.\n\n```\n+------------------+ +\n|  Classification  | |\n+------------------+ |\n                     |        +-----------+\n                     +--------\u003e  Collect  |\n                     |        +-----------+\n       +-----------+ |\n       |  Context  | |\n       +-----------+ +\n```\n\n#### Step 2\n\nSecond stage is the resolution phase. Here, the bot core is expecting a list of classifications to be returned. The resolution is called only after all collections have finished executing.\n\n```\n+-----------+     +---------+-+-+\n|  Resolve  +----\u003e+  Topic  | | |\n+-----------+     +---------+ | |\n                  |-----------+ |\n                  +-------------+\n```\n\nA topic resolution strategy object must expose two methods:\n\n* collect\n* resolve\n\nThe collect method is called everytime a classifier returns classification(s). It is called with `classification, context, callback` signature. The `classification` object contains the classification returned from the classifier (or set of classifiers if using quorums). The `context` object is the object containing request context. The last parameter `callback` is the function that must be invoked to let the bot core know that you have finished collecting the passed in parameters.\n\nThe resolve method is called once after the bot core is done calling `collect` on your topic resolution strategy. This is the final call from bot core and is meant to collect topic resolution information. The `resolve` method is called with a `callback` parameter. This is the callback function that must be called with two parameters `error, topics`. The error parameter must be defined as an error object in case an error has occurred when resolving the topic. In any other case, this object must be `undefined`. The second `topics` parameter must be an array of topics resolved by the resolution strategy. \n\n# Reference Documentation\n\n* [Classifier](./wiki/CLASSIFIER.md)\n* [Skills](./wiki/SKILLS.md)\n\n# Contributing\n\nPlease see the [contributing guide](./CONTRIBUTING.md) for more details.\n","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmanthanhd%2Ftalkify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmanthanhd%2Ftalkify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmanthanhd%2Ftalkify/lists"}