{"id":13810543,"url":"https://github.com/andrewcourtice/harlem","last_synced_at":"2026-01-23T01:53:04.324Z","repository":{"id":37367459,"uuid":"300454424","full_name":"andrewcourtice/harlem","owner":"andrewcourtice","description":"Powerfully simple global state management for Vue 3","archived":false,"fork":false,"pushed_at":"2024-06-03T00:06:34.000Z","size":13446,"stargazers_count":520,"open_issues_count":7,"forks_count":14,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-01-22T09:23:55.821Z","etag":null,"topics":["javascript","state-management","typescript","vue","vue3","vuejs"],"latest_commit_sha":null,"homepage":"https://harlemjs.com","language":"TypeScript","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/andrewcourtice.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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}},"created_at":"2020-10-01T23:52:49.000Z","updated_at":"2025-11-25T05:20:46.000Z","dependencies_parsed_at":"2024-06-18T15:52:07.781Z","dependency_job_id":null,"html_url":"https://github.com/andrewcourtice/harlem","commit_stats":{"total_commits":482,"total_committers":10,"mean_commits":48.2,"dds":0.03526970954356845,"last_synced_commit":"45055b77a3413cea38a4cdde46505e0722538e95"},"previous_names":[],"tags_count":85,"template":false,"template_full_name":null,"purl":"pkg:github/andrewcourtice/harlem","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewcourtice%2Fharlem","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewcourtice%2Fharlem/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewcourtice%2Fharlem/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewcourtice%2Fharlem/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andrewcourtice","download_url":"https://codeload.github.com/andrewcourtice/harlem/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewcourtice%2Fharlem/sbom","scorecard":{"id":193504,"data":{"date":"2025-08-11","repo":{"name":"github.com/andrewcourtice/harlem","commit":"45055b77a3413cea38a4cdde46505e0722538e95"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"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":1,"reason":"Found 2/16 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":"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-test.yml:1","Warn: no topLevel permission defined: .github/workflows/publish-demo-app.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":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-test.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/andrewcourtice/harlem/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/andrewcourtice/harlem/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/andrewcourtice/harlem/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/andrewcourtice/harlem/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-test.yml:69: update your workflow using https://app.stepsecurity.io/secureworkflow/andrewcourtice/harlem/build-and-test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-demo-app.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/andrewcourtice/harlem/publish-demo-app.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-demo-app.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/andrewcourtice/harlem/publish-demo-app.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-demo-app.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/andrewcourtice/harlem/publish-demo-app.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish-demo-app.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/andrewcourtice/harlem/publish-demo-app.yml/main?enable=pin","Info:   0 out of   8 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction 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: 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":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 20 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":"49 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-h5c3-5r3r-rr8q","Warn: Project is vulnerable to: GHSA-rmvr-2pp2-xj38","Warn: Project is vulnerable to: GHSA-xx4v-prfh-6cgc","Warn: Project is vulnerable to: GHSA-wf5p-g6vw-rhxx","Warn: Project is vulnerable to: GHSA-8hc4-vh64-cxmj","Warn: Project is vulnerable to: GHSA-jr5f-v2jv-69x6","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-ghr5-ch3p-vcr6","Warn: Project is vulnerable to: GHSA-67mh-4wv8-2f99","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-4q6p-r6v2-jvc5","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-vf6r-87q4-2vjf","Warn: Project is vulnerable to: GHSA-jvhm-gjrh-3h93","Warn: Project is vulnerable to: GHSA-8g77-54rh-46hx","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-gcx4-mw62-g8wm","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-76p7-773f-r4q5","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-3mv9-4h5g-vhg3","Warn: Project is vulnerable to: GHSA-353f-5xf4-qw67","Warn: Project is vulnerable to: GHSA-c24v-8rfc-w8vw","Warn: Project is vulnerable to: GHSA-8jhw-289h-jh2g","Warn: Project is vulnerable to: GHSA-64vr-g452-qvp3","Warn: Project is vulnerable to: GHSA-9cwx-2883-4wfx","Warn: Project is vulnerable to: GHSA-vg6x-rcgg-rjx6","Warn: Project is vulnerable to: GHSA-x574-m823-4x7w","Warn: Project is vulnerable to: GHSA-4r4m-qw57-chr8","Warn: Project is vulnerable to: GHSA-xcj6-pq6g-qj4x","Warn: Project is vulnerable to: GHSA-356w-63v5-8wf4","Warn: Project is vulnerable to: GHSA-859w-5945-r5v3","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q"],"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-16T21:19:23.557Z","repository_id":37367459,"created_at":"2025-08-16T21:19:23.558Z","updated_at":"2025-08-16T21:19:23.558Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28677714,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T01:00:35.747Z","status":"ssl_error","status_checked_at":"2026-01-23T01:00:19.529Z","response_time":144,"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":["javascript","state-management","typescript","vue","vue3","vuejs"],"created_at":"2024-08-04T02:00:58.999Z","updated_at":"2026-01-23T01:53:04.307Z","avatar_url":"https://github.com/andrewcourtice.png","language":"TypeScript","funding_links":[],"categories":["Packages","TypeScript","Vue 相关","Components \u0026 Libraries"],"sub_categories":["Utilities"],"readme":"\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://harlemjs.com\"\u003e\n        \u003cimg src=\"https://raw.githubusercontent.com/andrewcourtice/harlem/main/docs/src/public/assets/images/logo-192.svg\" alt=\"Harlem\"/\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n# Harlem\n\n[![Build and Test](https://github.com/andrewcourtice/harlem/actions/workflows/build-and-test.yml/badge.svg)](https://github.com/andrewcourtice/harlem/actions/workflows/build-and-test.yml)\n![npm](https://img.shields.io/npm/v/harlem)\n\nPowerfully simple global state management for Vue 3. Head over to [harlemjs.com](https://harlemjs.com) to get started or take a look at the [demo](https://andrewcourtice.github.io/harlem) to see it in action.\n\n\u003c!-- TOC depthfrom:2 depthto:2 --\u003e\n\n- [Foundations](#foundations)\n- [Features](#features)\n- [Getting started](#getting-started)\n- [Extensibility](#extensibility)\n- [Documentation](#documentation)\n- [Credits](#credits)\n\n\u003c!-- /TOC --\u003e\n\n## Foundations\n\n### Simple \nHarlem has a simple functional API for creating, reading and mutating state. From the most basic global state management needs to the most complex, Harlem has you covered.\n\n### Safe\nAll state exposed from a Harlem store is immutable. State can only be changed through mutations/actions making your state predictable and auditable.\n\n### Modular\nHarlem is super lightweight, tree-shakeable, and dependency-free! It is designed to be used with native ES modules so even unused parts of your stores (getters, mutations, actions etc.) can be tree-shaken.\n\n### Extensible\nHarlem comes with a suit of official extensions that allow you to add extra features to your stores such as cancellable actions, tracing, transactions, undo/redo, and more. You can even write your own extension or plugin.\n\n### Great DX\nHarlem has a great developer experience. It's built using TypeScript so all of your state, getters, and mutations are strongly typed. Harlem also has Vue devtools integration so you can explore your stores and see store events on the timeline in realtime.\n\n### Battle-Tested\nHarlem is built by enterprise software engineers and used in medium-large enterprise software. It's built to handle even the most complex state management use-cases.\n\n\n## Features\n\n- TypeScript support\n- Vue devtools integration\n- Lightweight \u0026 dependency-free\n- Tree-shakeable\n- Extensible (via plugins \u0026 extensions)\n- SSR Support\n\nCheck out the [docs](https://harlemjs.com) for more details.\n\n\n## Getting Started\n\nGetting started with Harlem is easy. Just follow the steps below and you'll be up and running in no time.\n\n### Installation\n\nInstall `harlem` and any [plugins](/plugins/)/[extensions](/extensions/) you wish to include.\n\n```bash\n# yarn\nyarn add harlem\n\n# npm\nnpm install harlem\n```\n\nThe [devtools plugin](/plugins/official/devtools) is enabled by default during development and tree-shaken out of production builds. If you don't need devtools during develpment, you can instead install harlem from `@harlem/core`\n\nIf you're using Nuxt, instead follow the instructions to [install the Nuxt module](https://github.com/nuxt-community/harlem-module) and then resume this guide below, at [Create your first store](#create-your-first-store).\n\n\n### Register the Harlem Vue plugin\n\nRegister the Harlem plugin with your Vue app instance:\n```typescript\nimport App from './app.vue';\n\nimport {\n    createVuePlugin\n} from 'harlem';\n\ncreateApp(App)\n    .use(createVuePlugin())\n    .mount('#app');\n```\n\n\n### Create your first store\n\nCreate your store and define any getters, actions or mutations:\n\n```typescript\nimport {\n    createStore\n} from 'harlem';\n\n// The initial state for this store\nconst STATE = {\n    firstName: 'John',\n    lastName: 'Smith'\n};\n\n// Create the store, specifying the name and intial state\nexport const {\n    state, \n    getter,\n    mutation,\n    action,\n    ...store\n} = createStore('user', STATE);\n\nexport const fullName = getter('fullname', state =\u003e `${state.firstName} ${state.lastName}`);\n\nexport const setFirstName = mutation('set-first-name', (state, payload: string) =\u003e {\n    state.firstName = payload;\n});\n\nexport const setLastName = mutation('set-last-name', (state, payload: string) =\u003e {\n    state.lastName = payload;\n});\n\nexport const loadDetails = action('load-details', async (id: string, mutate) =\u003e {\n    const response = await fetch(`/api/details/${id}`);\n    const details = await response.json();\n\n    mutate(state =\u003e {\n        state.details = details;\n    });\n});\n```\n\n### Use your store in your app\n\nTo use your store in your app just import the parts of it you need.\n\n```html\n\u003ctemplate\u003e\n    \u003cdiv class=\"app\"\u003e\n        \u003ch1\u003eHello {{ fullName }}\u003c/h1\u003e\n        \u003cbutton @click=\"loadDetails()\"\u003eLoad Details\u003c/button\u003e\n        \u003cinput type=\"text\" v-model=\"firstName\" placeholder=\"First name\"\u003e\n        \u003cinput type=\"text\" v-model=\"lastName\" placeholder=\"Last name\"\u003e\n    \u003c/div\u003e\n\u003c/template\u003e\n\n\u003cscript lang=\"ts\" setup\u003e\nimport {\n    computed\n} from 'vue';\n\nimport {\n    state,\n    fullName,\n    setFirstName,\n    setLastName,\n    loadDetails\n} from './stores/user';\n\nconst firstName = computed({\n    get: () =\u003e state.firstName,\n    set: value =\u003e setFirstName(value)\n});\n\nconst lastName = computed({\n    get: () =\u003e state.lastName,\n    set: value =\u003e setLastName(value)\n});\n\u003c/script\u003e\n```\n\n\n## Extensibility\n\nHarlem uses a combination of extensions and plugins to extend core functionality. \n\n### Extensions\n\nExtensions are per-store additions to Harlem's core functionaility. Extensions are often used for adding store features, changing store behaviour and various other low-level tasks. This is the primary method in which Harlem stores are extended. Feel free to choose from some of the official extensions or write your own. See the [extensions documentation](https://harlemjs.com/extensions/) from more information on the official set of extensions or how to author your own plugin.\n\nThe official extensions include:\n\n- [Action](extensions/action) (`@harlem/extension-action`) - Extends a store to support advanced actions (cancellation, status \u0026 error tracking etc.).\n- [Compose](extensions/compose) (`@harlem/extension-compose`) - Extends a store to to add simple read/write convenience methods.\n- [History (preview)](extensions/history) (`@harlem/extension-history`) - Extends a store to support undo and redo capabilities.\n- [Lazy](extensions/lazy) (`@harlem/extension-lazy`) - Extends a store to support lazy async getters.\n- [Storage](extensions/storage) (`@harlem/extension-storage`) - Extends a store to support synchronising state to/from `localStorage` or `sessionStorage`.\n- [Trace](extensions/trace) (`@harlem/extension-trace`) - Extends a store to support tracing granular changes to state during mutations. Useful for auditing during development.\n- [Transaction](extensions/transaction) (`@harlem/extension-transaction`) - Extends a store to support rolling back multiple mutations if one fails. \n\n### Plugins\n\nPlugins are global extensions to Harlem's core functionality. Plugins are often used for generic store operations like tracking events and collating state. Feel free to choose from some of the official plugins or write your own. See the [plugins documentation](https://harlemjs.com/plugins/) from more information on the official set of plugins or how to author your own plugin.\n\nThe official plugins include:\n\n- [Devtools](plugins/devtools) (`@harlem/plugin-devtools`) - The devtools plugin adds Vue devtools integration with your stores to show updates to your state in realtime.\n- [SSR](plugins/ssr) (`@harlem/plugin-ssr`) - The SSR plugin enables support for using Harlem stores in a server-side rendered application.\n\n\n## Documentation\nFull documentation for Harlem is available at https://harlemjs.com.\n\n## Credits\n\nLogo design by [Ethan Roxburgh](https://github.com/ethanroxburgh)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrewcourtice%2Fharlem","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandrewcourtice%2Fharlem","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrewcourtice%2Fharlem/lists"}