{"id":34108414,"url":"https://github.com/imohitmayank/jaal","last_synced_at":"2026-04-08T13:31:19.227Z","repository":{"id":37707837,"uuid":"333369736","full_name":"imohitmayank/jaal","owner":"imohitmayank","description":"Your interactive network visualizing dashboard","archived":false,"fork":false,"pushed_at":"2025-05-09T12:13:25.000Z","size":4966,"stargazers_count":355,"open_issues_count":19,"forks_count":47,"subscribers_count":8,"default_branch":"main","last_synced_at":"2025-12-17T01:33:13.743Z","etag":null,"topics":["dashboard","graph","network","python","visualization"],"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/imohitmayank.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,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-01-27T09:34:34.000Z","updated_at":"2025-12-12T13:18:00.000Z","dependencies_parsed_at":"2024-05-01T19:31:57.774Z","dependency_job_id":"ecb84d50-5beb-4698-ad54-9f7b067b0610","html_url":"https://github.com/imohitmayank/jaal","commit_stats":{"total_commits":79,"total_committers":3,"mean_commits":"26.333333333333332","dds":0.03797468354430378,"last_synced_commit":"74a7d2cbe6195e55ad655b63d0099243712c1cda"},"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/imohitmayank/jaal","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imohitmayank%2Fjaal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imohitmayank%2Fjaal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imohitmayank%2Fjaal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imohitmayank%2Fjaal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/imohitmayank","download_url":"https://codeload.github.com/imohitmayank/jaal/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imohitmayank%2Fjaal/sbom","scorecard":{"id":486017,"data":{"date":"2025-08-11","repo":{"name":"github.com/imohitmayank/jaal","commit":"bd596d0dd3fab0d2c3c9565174c693712b47b6f9"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"name":"Code-Review","score":1,"reason":"Found 3/25 approved changesets -- score normalized to 1","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":"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":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build_and_publish.yml:1","Info: no jobLevel write permissions found"],"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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build_and_publish.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/imohitmayank/jaal/build_and_publish.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build_and_publish.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/imohitmayank/jaal/build_and_publish.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/build_and_publish.yml:33","Warn: pipCommand not pinned by hash: .github/workflows/build_and_publish.yml:34","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 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 'main'"],"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":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2024-35 / GHSA-547x-748v-vp6p"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 10 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-19T17:49:08.611Z","repository_id":37707837,"created_at":"2025-08-19T17:49:08.611Z","updated_at":"2025-08-19T17:49:08.611Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31558380,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T10:21:54.569Z","status":"ssl_error","status_checked_at":"2026-04-08T10:21:38.171Z","response_time":54,"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":["dashboard","graph","network","python","visualization"],"created_at":"2025-12-14T18:17:31.356Z","updated_at":"2026-04-08T13:31:19.218Z","avatar_url":"https://github.com/imohitmayank.png","language":"Python","readme":"\u003cimg src=\"jaal/assets/logo.png\" alt=\"jaal logo\"/\u003e\n\n![PyPI](https://img.shields.io/pypi/v/jaal) [![PyPI dm](https://img.shields.io/pypi/dm/jaal.svg)](https://img.shields.io/pypi/jaal) [![Join the chat at https://gitter.im/imm-jaal/community](https://badges.gitter.im/imm-jaal/community.svg)](https://gitter.im/imm-jaal/community?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge) ![GitHub](https://img.shields.io/github/license/imohitmayank/jaal) ![GitHub Repo stars](https://img.shields.io/github/stars/imohitmayank/jaal?style=social)\n\n*Your interactive network visualizing dashboard*\n\nDocumentation: [Here](http://mohitmayank.com/jaal/)\n\n## 👉 What is Jaal\n\nJaal is a python based interactive network visualizing tool built using Dash and Visdcc. Along with the basic features, Jaal also provides multiple option to play with the network data such as searching graph, filtering and even coloring nodes and edges in the graph. And all of this within 2 lines of codes :)\n\n## 👉 Requirements\n\nJaal requires following python packages, \n1. Dash\n    - dash_core_components\n    - dash_html_components \n2. dash_bootstrap_components\n3. visdcc\n4. pandas\n\n## 👉 Install\n\nInstalling Jaal is super easy, just do the following,\n\n```bash\npip install jaal\n```\n\nAnd you are done :)\n\nNote, it's recommended to create a virtual enivornment before installing. This can be easily done using `python -m venv myenv` and then to activate the env we need,\n1. (Windows) `.\\\\myvenv\\\\Scripts\\\\activate.bat`\n2. (Linux) `source myvenv/bin/activate`\n\n## 👉 Getting started\n\nAfter installing Jaal, we need to fetch the data and call `plot` function in Jaal. This can be shown by playing with an included Game of Thrones dataset, as follows,\n\n```python\n# import\nfrom jaal import Jaal\nfrom jaal.datasets import load_got\n# load the data\nedge_df, node_df = load_got()\n# init Jaal and run server\nJaal(edge_df, node_df).plot()\n```\n\nHere first we import `Jaal` main class and the dataset loading function `load_got`. Later we load the GoT dataset from the datasets included in the package. This gives us two files,\n1. **edge_df:** its a pandas dataframe with atleast `from` and `to` column, which represents the edge relationship between the entities\n2. **node_df:** its an optional parameter, but should contains a `id` column with unique node names. \n\nNote, edge_df is mandatory and node_df is optional. Also we can include additional columns in these files which are automatically considered as edge or node features respectively.\n\nAfter running the plot, the console will prompt the default localhost address (`127.0.0.1:8050`) where Jaal is running. Access it to see the following dashboard,\n\n\u003cimg src=\"jaal/assets/dashboard.png\" alt=\"dashboard\"/\u003e\n\n## 👉 Features\n\nAt present, the dashboard consist of following sections,\n1. **Setting panel:** here we can play with the graph data, it further contain following sections:\n    - **Search:** can be used to find a node in graph\n    - **Filter:** supports pandas query language and can be used to filter the graph data based on nodes or edge features.\n    - **Color:** can be used to color nodes or edges based on their categorical features. Note, currently only features with at max 20 cardinality are supported. \n    - **Size:** can be used to size nodes or edges based on their numerical features.\n2. **Graph:** the network graph in all its glory :)\n\n## 👉 Examples\n\n### 1. Searching\n\u003cimg src=\"jaal/assets/jaal_search.gif\" alt=\"dashboard\"/\u003e\n\n### 2. Filtering\n\u003cimg src=\"jaal/assets/jaal_filter.gif\" alt=\"dashboard\"/\u003e\n\n### 3. Coloring\n\u003cimg src=\"jaal/assets/jaal_color.gif\" alt=\"dashboard\"/\u003e\n\n### 4. Size\n\u003cimg src=\"jaal/assets/jaal_size.gif\" alt=\"dashboard\"/\u003e\n\n## 👉 Extra settings\n\n### Display edge label\n\nTo display labels over edges, we need to add a `label` attribute (column) in the `edge_df`. Also, it has to be in `string` format. \nFor example, using the GoT dataset, by adding the following line before the `Jaal` call, we can display the edge labels.\n\n```python\n# add edge labels\nedge_df.loc[:, 'label'] = edge_df.loc[:, 'weight'].astype(str)\n```\n### Display image in node\n\nCurrently it is possible to show image within node (with circular shape). For this, we need to put `node_image_url` column in the `node_df` with URLs for each node.\n\n\u003cimg src=\"jaal/assets/jaal_node_image.png\" width=\"300\" height=\"200\" alt=\"dashboard\"/\u003e\n\n### Directed edges\n\nBy default, `Jaal` plot undirected edges. This setting can be changed by,\n\n```python\nJaal(edge_df, node_df).plot(directed=True)\n```\n\n### Showing Custom Label\n\nBy default, `id` is shown as label. To overwrite this, include a `label` column with the respective data.\n\n### Showing Tooltip\n\nBy default, `id` is shown as tooltip. To overwrite this, include a `title` column with the respective data.\n\n### Using vis.js settings\n\nWe can tweak any of the `vis.js` related network visualization settings. An example is,\n\n```python\n# init Jaal and run server\nJaal(edge_df, node_df).plot(vis_opts={'height': '600px', # change height\n                                      'interaction':{'hover': True}, # turn on-off the hover \n                                      'physics':{'stabilization':{'iterations': 100}}}) # define the convergence iteration of network\n\n```\n\nFor a complete list of settings, visit [vis.js website](https://visjs.github.io/vis-network/docs/network/).\n\n### Using gunicorn\n\nWe can host Jaal on production level HTTP server using `gunicorn` by first creating the app file (`jaal_app.py`),\n\n```python\n# import\nfrom jaal import Jaal\nfrom jaal.datasets import load_got\n# load the data\nedge_df, node_df = load_got()\n# create the app and server\napp = Jaal(edge_df, node_df).create()\nserver = app.server\n```\n\nthen from the command line, start the server by,\n\n```\ngunicorn jaal_app:server\n```\n\nNote, `Jaal.create()` takes `directed` and `vis_opts` as arguments. (same as `Jaal.plot()` except the `host` and `port` arguments)\n\n## 👉 Common Problems\n\n### Port related issue\n\nIf you are facing port related issue, please try the following way to run Jaal. It will try different ports, until an empty one is found.\n\n```python\nport=8050\nwhile True:\n    try:\n        Jaal(edge_df, node_df).plot(port=port)\n    except:\n        port+=1\n```\n\n## 👉 Issue tracker\n\nPlease report any bug or feature idea using Jaal issue tracker: https://github.com/imohitmayank/jaal/issues\n\n## 👉 Collaboration\n\nAny type of collaboration is appreciated. It could be  testing, development, documentation and other tasks that is useful to the project. Feel free to connect with me regarding this.\n\n## 👉 Contact\n\nYou can connect with me on [LinkedIn](https://www.linkedin.com/in/imohitmayank/) or mail me at mohitmayank1@gmail.com.\n\n## 👉 License\n\nJaal is licensed under the terms of the MIT License (see the file\nLICENSE).\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimohitmayank%2Fjaal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fimohitmayank%2Fjaal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimohitmayank%2Fjaal/lists"}