{"id":29278250,"url":"https://github.com/opensource-observer/oss-directory","last_synced_at":"2025-10-08T06:36:59.228Z","repository":{"id":186419251,"uuid":"674006860","full_name":"opensource-observer/oss-directory","owner":"opensource-observer","description":"A curated directory of open source software (OSS) projects and their associated artifacts","archived":false,"fork":false,"pushed_at":"2025-09-30T23:03:30.000Z","size":10051,"stargazers_count":83,"open_issues_count":8,"forks_count":206,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-10-01T01:06:03.011Z","etag":null,"topics":["data","github","open-source","public-goods","research"],"latest_commit_sha":null,"homepage":"https://www.opensource.observer","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/opensource-observer.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-08-02T23:50:31.000Z","updated_at":"2025-09-30T23:03:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"24a82931-48ae-4272-a4d9-4c81e9add6ef","html_url":"https://github.com/opensource-observer/oss-directory","commit_stats":{"total_commits":111,"total_committers":13,"mean_commits":8.538461538461538,"dds":"0.26126126126126126","last_synced_commit":"2b2661f55d45617e9486da6d2a6510ee7658fd1c"},"previous_names":["hypercerts-org/oss-directory","opensource-observer/oss-directory"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/opensource-observer/oss-directory","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensource-observer%2Foss-directory","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensource-observer%2Foss-directory/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensource-observer%2Foss-directory/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensource-observer%2Foss-directory/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/opensource-observer","download_url":"https://codeload.github.com/opensource-observer/oss-directory/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opensource-observer%2Foss-directory/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278903012,"owners_count":26065784,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"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":["data","github","open-source","public-goods","research"],"created_at":"2025-07-05T11:01:43.606Z","updated_at":"2025-10-08T06:36:59.222Z","avatar_url":"https://github.com/opensource-observer.png","language":"Python","readme":"# OSS Directory [![License: Apache 2.0][license-badge]][license]\n\n[license]: https://opensource.org/license/apache-2-0/\n[license-badge]: https://img.shields.io/badge/License-Apache2.0-blue.svg\n\nThis repository contains a curated directory of open source software (OSS) projects and their associated artifacts. Artifacts include git repositories, npm packages, smart contracts, Open Collective collectives, accounts used for managing grant funds, and more. Groups of related projects are organized into collections.\n\nThe OSS Directory serves as the \"source of truth\" for the projects and collections that are discoverable on [Open Source Observer](https://www.opensource.observer).\n\nWhile the directory may never be complete, it is actively maintained. We welcome community contributions of new projects and collections, as well as updates to existing entries.\n\nThis directory is a public good, free to use and distribute. We hope it serves the needs of researchers, developers, foundations, and other users looking to better understand the OSS ecosystem!\n\n## How to contribute\n\nCurrently the main way to contribute is by submitting a pull request. You can update any `.yaml` file under `./data/` or submit a new one. Fork this repository, commit your changes, and open a pull request from your fork to this repository.\n\nDetailed instructions are available in the [latest docs](https://docs.opensource.observer/docs/projects).\n\nIf you are adding a new project, please make sure to include a unique project name to identify the project and at least one GitHub url. In most cases, we adopt the GitHub organization name as the project name. Our project naming conventions are described in more detail [here](https://docs.opensource.observer/docs/projects#project-names) - please try to follow them!\n\nSubmissions will be validated to ensure they conform to the schema and don't contain any artifacts that are already in the directory. If you are unsure or have additional questions about contributing, please open an issue or message us on [Discord](https://www.opensource.observer/discord).\n\n### Setup for local development\n\nYou can install dependencies with `pnpm`.\n\n```bash\npnpm install\n```\n\n### Lint\n\nLinting is the easiest way to catch formatting errors in yaml\n\n```bash\npnpm lint\n```\n\nIf these formatting errors are easy for `prettier` to handle (e.g. indents),\nyou can use it to automatically rewrite the files for you\n\n```bash\npnpm prettier:write\n```\n\n### Validation\n\nOur GitHub actions CI will reject any contributions that do not conform to the schema defined in `./src/resources/schema`.\n\nTo check for validation errors locally, run\n\n```bash\npnpm run validate\n```\n\n### Publish\n\n#### NPM\n\nFirst bump the version number in `package.json`. Then build and publish\n\n```bash\npnpm build\nnpm publish\n```\n\nIf you did not log into npm yet, you'll first need to run `npm login`.\n\n#### PyPI\n\nFirst bump the version number in `pyproject.toml`. Then build and publish\n\n```bash\npoetry build\npoetry publish\n```\n\nIf you did not log into PyPI yet, you'll first need to\n[generate an API Token](https://pypi.org/manage/account/)\nand configure the CLI `poetry config pypi-token.pypi API_TOKEN`.\n\n## Using as a library\n\nWe have also published this repository as a library that you can use in your own projects. This is useful if you want to build a tool that uses the data in this repository or perform your own custom analysis.\n\nWe have libraries for JavaScript and Python. We don't store the entire dataset with the package. Under the hood, this will clone the repository into a temporary directory, read all the data files, validate the schema, and return the objects. This way, you know you're getting the latest data, even if the package hasn't been updated in a while.\n\n_Note: These do not work in a browser-environment_\n\n### JavaScript library\n\n[npm page](https://www.npmjs.com/package/oss-directory)\n\n#### Installation\n\nInstall the library\n\n```bash\nnpm install oss-directory\n# OR yarn add oss-directory\n# OR pnpm add oss-directory\n```\n\n#### Fetch all of the data\n\nYou can fetch all of the latest data in this repo with the following:\n\n```js\nimport { Project, Collection, fetchData } from \"oss-directory\";\n\nconst data = await fetchData();\nconst projects: Project[] = data.projects;\nconst collections: Collection[] = data.collections;\n```\n\nYou can pass in the following options to `fetchData`:\n\n```js\nconst data = await fetchData({\n  // The branch to check out from the repo\n  branch: \"main\",\n  // The commit to check out from the repo\n  commit: \"066e5ad612d6ef67c0516b55b0c3be789282e6b6\"\n  // Do not strictly validate the data coming from GitHub\n  skipValidation: true,\n});\n```\n\n_Note: skipValidation is really useful if you don't want this integration\nto force an error everytime we update the schema.\nHowever, this will necessarily lead to getting data that does not\nconform to the types your application expects as we add new fields._\n\n#### Utility functions\n\nWe also include functions for casting and validating data:\n\n- `validateProject`\n- `validateCollection`\n- `safeCastProject`\n- `safeCastCollection`\n\n### Python library\n\n[PyPI page](https://pypi.org/project/oss-directory/)\n\n#### Installation\n\nInstall the library\n\n```bash\npip install oss-directory\n# OR poetry add oss-directory\n```\n\n#### Fetch all of the data\n\nYou can fetch all of the data in this repo with the following:\n\n```python\nfrom ossdirectory import fetch_data\nfrom ossdirectory.fetch import OSSDirectory\n\ndata: OSSDirectory = fetch_data()\nprojects: List[dict] = data.projects;\ncollections: List[dict] = data.collections;\n```\n\n## Organization\n\nThe directory is organized into two main folders:\n\n- `./data/projects` - each file represents a single open source project and contains all of the artifacts for that project.\n  - See `./src/resources/schema/project.json` for the expected JSON schema\n  - Files should be named by the project \"name\"\n  - Project names must be globally unique. If there is a conflict in chosen name, we will give priority to the project that has the associated GitHub organization\n  - In most cases, we adopt the GitHub organization name as the `name`.\n- `./data/collections` - each file represents a collection of projects that have some collective meaning (e.g. all projects in an ecosystem).\n  - See `./src/resources/schema/collection.json` for the expected JSON schema\n  - Projects are identified by their unique project `name`.\n\n## Scripting changs\n\nSometimes you need to make a bunch of changes all at once. We have a framework that supports 2 types of such changes:\n\n1. **Migrations**: If you are changing the schema of the data files, you'll need to write a migration that changes all data files to adhere to the new schema\n2. **Transformations**: If you want to write a one-off transformation that does not change the schema, use this\n\n### Changing the schema with migrations\n\n🚨⚠️ **Note**: Please use this sparingly. In the current setup, all upstream dependents of this package will break anytime there is a schema change. This is because older versions of the library will try to get the latest data from the main branch and break when validating it against an older schema ️️🚨⚠️\n\nAll files under `./data` must conform to schemas defined in `./src/resources/schema`.\n\nIf you want to change the schema, you'll need to write a migration:\n\n1. Update the schema in `src/resources/schema/`\n2. Add a [version]-[desc].ts file to the `src/migrations/` folder, exporting functions that migrate each file type.\n3. Add the migration functions to the MIGRATIONS array in `src/migrations/index.ts`.\n4. You can run the migration by running `pnpm migrate`.\n5. Please run `pnpm validate` to make sure your migration adheres to the schema. We will not accept any PRs where the data does not conform to the schemas.\n6. Commit and submit a pull request with all of the resulting changes.\n7. Publish a new version of the npm package. Remember to bump the version number in `package.json`. If you don't do this, you'll break all downstream dependents, because they're fetching the latest from GitHub.\n8. Notify all upstream dependents of this package that there is a new major version number and they need to update. Schema changes **will** break any dependent builds until they upgrade.\n\nThe framework will run migrations in sequence, so you are guaranteed that your data is valid as of the previous version.\nNote: we currently only support migrating in one direction (and not reverting)\n\n### Running a one-off transformation\n\nIf you need to make a wide-ranging change that does not affect the schema, use these steps to script the change\n\n1. Add a [transformName].ts file to the `src/transformations/` folder, exporting functions that transform each file type.\n2. Add the transformation functions to the TRANSFORMATIONS array in `src/transformations/index.ts`.\n3. You can run the transformation by running `pnpm transform --name \u003ctransformName\u003e`\n4. Please run `pnpm validate` to make sure your migration adheres to the schema. We will not accept any PRs where the data does not conform to the schemas.\n5. Commit and submit a pull request with all of the resulting changes.\n\n## Making onchain attestations about projects\n\n### EAS schemas\n\nWe've created a schema for making project attestations with [EAS](https://attest.sh/). These attestations create an onchain link between a GitHub repo and its blockchain addresses (ie, that smart contracts and contract factories under its control).\n\nYou can view the schemas here:\n\n- optimism-goerli: [Schema 168](https://optimism-goerli-bedrock.easscan.org/schema/view/0x739257b1bf8533a29a5c59a6dda5905c50f7c2bf436d709cd9ea7bfabbe5172b)\n\n- optimism: [Schema 86](https://optimism.easscan.org/schema/view/0x739257b1bf8533a29a5c59a6dda5905c50f7c2bf436d709cd9ea7bfabbe5172b)\n\n### EAS attestations\n\nYou can make a series of attestations about a project by running the following:\n\n```bash\nts-node src/scripts/optimism-attestation.ts data/projects/P/PROJECT.yaml optimism # OR optimism-goerli\n```\n\nMake sure you have `.env` file that contains your `PRIVATE_KEY` for an account with some ETH on the appropriate network.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopensource-observer%2Foss-directory","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopensource-observer%2Foss-directory","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopensource-observer%2Foss-directory/lists"}