{"id":13552098,"url":"https://github.com/public-accountability/oligrapher","last_synced_at":"2026-01-15T02:05:56.943Z","repository":{"id":29390837,"uuid":"121553660","full_name":"public-accountability/oligrapher","owner":"public-accountability","description":"JavaScript app for displaying annotated network graphs based on data from LittleSis","archived":false,"fork":false,"pushed_at":"2026-01-02T19:08:42.000Z","size":22110,"stargazers_count":105,"open_issues_count":7,"forks_count":22,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-01-09T07:21:26.745Z","etag":null,"topics":["graph-editor","graphviz","javascript","network-graph","react","visualization"],"latest_commit_sha":null,"homepage":"https://littlesis.org/oligrapher","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/public-accountability.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-02-14T19:44:29.000Z","updated_at":"2026-01-02T19:08:37.000Z","dependencies_parsed_at":"2023-01-14T14:50:00.115Z","dependency_job_id":"6d82cef4-ac62-4310-9aee-681bf8151877","html_url":"https://github.com/public-accountability/oligrapher","commit_stats":{"total_commits":1247,"total_committers":11,"mean_commits":"113.36363636363636","dds":0.6246992782678429,"last_synced_commit":"a7e95559c7d0c95ba66ab98b40c47d698b978138"},"previous_names":[],"tags_count":52,"template":false,"template_full_name":null,"purl":"pkg:github/public-accountability/oligrapher","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/public-accountability%2Foligrapher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/public-accountability%2Foligrapher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/public-accountability%2Foligrapher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/public-accountability%2Foligrapher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/public-accountability","download_url":"https://codeload.github.com/public-accountability/oligrapher/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/public-accountability%2Foligrapher/sbom","scorecard":{"id":749025,"data":{"date":"2025-08-11","repo":{"name":"github.com/public-accountability/oligrapher","commit":"caa7fcda2a5c4e267edec6d3b21bac6828613a6f"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4,"checks":[{"name":"Maintained","score":10,"reason":"16 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","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/8 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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/compile.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/test.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":"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":6,"reason":"dependency not pinned by hash detected -- score normalized to 6","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/compile.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/public-accountability/oligrapher/compile.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/compile.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/public-accountability/oligrapher/compile.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/public-accountability/oligrapher/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/public-accountability/oligrapher/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/public-accountability/oligrapher/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/public-accountability/oligrapher/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/public-accountability/oligrapher/test.yml/main?enable=pin","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   3 out of   3 npmCommand 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":"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: GNU General Public License v3.0: 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":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v4.0.20 not signed: https://api.github.com/repos/public-accountability/oligrapher/releases/238702868","Warn: release artifact v4.0.19 not signed: https://api.github.com/repos/public-accountability/oligrapher/releases/232940416","Warn: release artifact v4.0.18 not signed: https://api.github.com/repos/public-accountability/oligrapher/releases/192723693","Warn: release artifact v4.0.17 not signed: https://api.github.com/repos/public-accountability/oligrapher/releases/191255762","Warn: release artifact v4.0.16 not signed: https://api.github.com/repos/public-accountability/oligrapher/releases/152253274","Warn: release artifact v4.0.20 does not have provenance: https://api.github.com/repos/public-accountability/oligrapher/releases/238702868","Warn: release artifact v4.0.19 does not have provenance: https://api.github.com/repos/public-accountability/oligrapher/releases/232940416","Warn: release artifact v4.0.18 does not have provenance: https://api.github.com/repos/public-accountability/oligrapher/releases/192723693","Warn: release artifact v4.0.17 does not have provenance: https://api.github.com/repos/public-accountability/oligrapher/releases/191255762","Warn: release artifact v4.0.16 does not have provenance: https://api.github.com/repos/public-accountability/oligrapher/releases/152253274"],"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 23 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":6,"reason":"4 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv"],"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-22T19:42:54.145Z","repository_id":29390837,"created_at":"2025-08-22T19:42:54.145Z","updated_at":"2025-08-22T19:42:54.145Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28325082,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-11T18:42:50.174Z","status":"ssl_error","status_checked_at":"2026-01-11T18:39:13.842Z","response_time":60,"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":["graph-editor","graphviz","javascript","network-graph","react","visualization"],"created_at":"2024-08-01T12:01:58.921Z","updated_at":"2026-01-11T22:09:55.862Z","avatar_url":"https://github.com/public-accountability.png","language":"TypeScript","funding_links":[],"categories":["HTML","Software","javascript"],"sub_categories":["JavaScript"],"readme":"# Oligrapher\n\nOligrapher is a JavaScript app for visualizing network graphs. It allows a user to design a nice-looking network graph using a combination of imported or manually entered data, and to create a collection of annotations for a graph.\n\nOligrapher was originally developed by [LittleSis](https://littlesis.org) before it was separated into a standalone library. LittleSis has a large collection of [maps created with Oligrapher](https://littlesis.org/oligrapher).\n\nOligrapher is built with [React](https://reactjs.com) and [Redux](https://redux.js.org) and is bundled with [esbuild](https://esbuild.github.io/)\n\n- [Features](#features)\n- [Install](#install)\n- [Development](#development)\n- [Data Schema](#data-schema)\n- [API](#api)\n- [Data Sources](#data-sources)\n- [Editing Guide](#editing-guide)\n\n![Oligrapher Demo Screenshot](https://user-images.githubusercontent.com/8505044/189668138-500bbbe0-5781-4f80-8fae-ad1f4efb85d2.png)\n\nFeatures\n--------\n\n- easily create and display network graphs\n- tell a story about networks with click-through series of annotations\n- add images, labels, links, and captions\n- customize graph layout by dragging nodes and edges\n- import data from LittleSis and other APIs\n- undo and redo edits to a graph\n- runs on all modern web browsers\n- export map as svg or jpeg\n- save map to LittleSis.org account\n\nInstall\n-------\n\nTo run Oligrapher app in a web page, include *oligrapher.js*  and *oligrapher.css* on your page and create a element for the map:\n\n```html\n\u003clink rel=\"stylesheet\" href=\"oligrapher.css\"\u003e\n\u003cscript src=\"oligrapher.js\"\u003e\u003c/script\u003e\n\n\u003cdiv id=\"example-oligrapher\"\u003e\u003c/div\u003e\n\n\u003cscript\u003e\nconst oli = new Oligrapher({ isEditor: true, domId: \"example-oligrapher\" })\n\u003c/script\u003e\n```\n\nSee [defaultState.ts](./app/util/defaultState.ts) for configuration options\n\nDevelopment\n-----------\n\nOligrapher development requires [jq](https://jqlang.github.io/jq/), a JSON manipulation command line tool.  Installation instructions can be found [here](https://jqlang.github.io/jq/download/).  \n\nTo run Oligrapher in development mode:\n\n```\ngit clone https://github.com/public-accountability/oligrapher\ncd oligrapher\nnpm install\nnpm run dev\nnpm run serve\n```\n\nThen point your browser to [localhost:8000](http://localhost:8000) to view a blank graph.\n\nAlso available:\n\n- example maps : `/exxon.html` \u0026 `/dev.html`\n- larger map with annotations : `/dev.html`\n- map in embedded-mode using an inframe : `/article.html`\n\nProduction build: `npm run build`\n\nDevelopment build: `npm run build-dev`\n\nBuild css: `npx sass app/oligrapher.scss build/oligrapher.css --style=compressed`\n\nRun tests: `npm test`\n\nData Schema\n-----------\n\n### Node Attributes\n- ```id:``` **(required)** a string uniquely identifying the node\n- ```name:``` **(required)** a string, which will be displayed underneath the node (on multiple lines if necessary)\n- ```scale:``` relative size of node (```1``` is default and smallest)\n- ```status:```  default is ```normal```, can also be ```highlighted``` or ```faded```\n- ```color:``` hexcodeof node color\n- ```image:``` image URL or dataurl\n- ```url:``` optional source URL\n- ```x:``` x-coordinate of the node's position\n- ```y:``` y-coordinate of the node's position\n- ```edgeIds``` array of connected edges, calculated internally\n\n### Edge Attributes\n- ```id:``` **(required)** an integer or string uniquely identifying the edge\n- ```node1_id:``` **(required)** equal to the first node's id\n- ```node2_id:``` **(required)** equal to the second node's id\n- ```label:``` **(required)** label appearing above the edge\n- ```url:``` optional source URL\n- ```scale:``` relative thickness of edge (```1``` is default, ```2``` is twice as thick, etc)\n- ```status:```  default is ```normal```, can also be ```highlighted``` or ```faded```\n- ```arrow:``` Direction of the arrow: ``` 'left', 'right', 'both' or false ```  (default is ```false```)\n- ```dash:``` the kind of dash displayed in edge's line (default is ```null```, a solid line)\n- ```cx:``` x-coordinate of the control point for the edge's quadratic [Bezier curve](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#Bezier_Curves), *relative to the midpoint of the straight line between the two nodes* (if not specified, this is computed to display a slight curve)\n- ```cy:``` y-coordinate of the control point for the edge's quadratic [Bezier curve](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#Bezier_Curves), *relative to the midpoint of the straight line between the two nodes* (if not specified, this is computed to display a slight curve)\n\n### Caption Attributes\n- ```id:``` **(required)** an integer or string uniquely identifying the caption\n- ```text:``` **(required)** the caption's text content\n- ```x:``` x-coordinate of the caption's position\n- ```y:``` y-coordinate of the caption's position\n- ```size:``` caption font-size\n- ```font:``` caption font-family\n- ```weight:``` caption font-weight\n\n### Annotation Attributes\n\nThe `annotations` array should conforms to the following schema:\n\n```javascript\n[\n  {\n    header: \"The Revolving Door\",\n    text: \"Goldman Sachs has many former executives with top positions in the federal government.\",\n    nodeIds: [...],\n    edgeIds: [...],\n    captionIds: [...]\n  },\n  {\n    header: \"Treasury Department\",\n    text: \"Former Treasury Secretary Robert Rubin was co-chair of Goldman before joining the Clinton Administration in 1993.\" ,\n    nodeIds: [...],\n    edgeIds: [...],\n    captionIds: []\n  },\n  ...\n]\n```\n\n- ```header:``` **(required)** a header to be displayed above the annotation\n- ```text:``` **(required)** the text body of the annotation, with optional HTML markup\n- ```nodeIds:``` **(required)** an array of ids of nodes to highlight from the underlying graph (can be empty)\n- ```edgeIds:``` **(required)** an array of ids of edges to highlight from the underlying graph (can be empty)\n- ```captionIds:``` **(required)** an array of ids of captions to highlight from the underlying graph (can be empty)\n\nIf no node, edge, or captions are highlighted, the graph will have its normal appearance when viewing the annotation. If there are highlights, non-highlighted content will appear faded.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpublic-accountability%2Foligrapher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpublic-accountability%2Foligrapher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpublic-accountability%2Foligrapher/lists"}