{"id":43417603,"url":"https://github.com/launchdarkly/sdk-meta","last_synced_at":"2026-04-10T17:41:05.655Z","repository":{"id":231749875,"uuid":"767784011","full_name":"launchdarkly/sdk-meta","owner":"launchdarkly","description":"SDK Metadata.","archived":false,"fork":false,"pushed_at":"2026-03-31T23:29:39.000Z","size":3711,"stargazers_count":2,"open_issues_count":2,"forks_count":2,"subscribers_count":19,"default_branch":"main","last_synced_at":"2026-04-01T01:01:01.595Z","etag":null,"topics":["launchdarkly-sdk","launchdarkly-sdk-component","managed-by-terraform"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/launchdarkly.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":"CODEOWNERS","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":"2024-03-05T22:24:57.000Z","updated_at":"2026-03-27T16:49:17.000Z","dependencies_parsed_at":"2026-04-01T00:03:44.645Z","dependency_job_id":null,"html_url":"https://github.com/launchdarkly/sdk-meta","commit_stats":null,"previous_names":["launchdarkly/sdk-meta"],"tags_count":95,"template":false,"template_full_name":null,"purl":"pkg:github/launchdarkly/sdk-meta","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/launchdarkly%2Fsdk-meta","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/launchdarkly%2Fsdk-meta/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/launchdarkly%2Fsdk-meta/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/launchdarkly%2Fsdk-meta/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/launchdarkly","download_url":"https://codeload.github.com/launchdarkly/sdk-meta/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/launchdarkly%2Fsdk-meta/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31317833,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T21:35:00.834Z","status":"ssl_error","status_checked_at":"2026-04-02T21:34:59.806Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6: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":["launchdarkly-sdk","launchdarkly-sdk-component","managed-by-terraform"],"created_at":"2026-02-02T18:16:35.106Z","updated_at":"2026-04-03T00:51:58.865Z","avatar_url":"https://github.com/launchdarkly.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Actions Status](https://github.com/launchdarkly/sdk-meta/actions/workflows/crawl.yml/badge.svg)](https://github.com/launchdarkly/sdk-meta/actions/workflows/crawl.yml) [![NPM][js-badge]][js-link]  [![Go Module][go-badge]][go-link]\n\n\n# sdk-meta\n\nThis repo contains metadata related to LaunchDarkly SDKs. \n\nThe data is intended for consumption by downstream products and services.\n\nIt also contains a [Go module](./api) exposing the metadata for easier consumption by Go applications.\n\n| Data Product                                   | Description                                                     | Format  |\n|------------------------------------------------|-----------------------------------------------------------------|---------|\n| [Database](./metadata.sqlite3)                 | Database containing data from which other products are derived. | sqlite3 |\n| [SDK Names](products/names.json)               | SDK friendly names for display.                                 | JSON    |\n| [SDK Releases](products/releases.json)         | SDK major/minor releases with EOL dates.                        | JSON    |\n| [SDK Types](products/types.json)               | SDK types for categorization.                                   | JSON    |\n| [SDK Languages](products/languages.json)       | Programming languages associated with SDKs.                     | JSON    |\n| [SDK Repos](products/repos.json)               | SDK source repositories                                         | JSON    |\n| [SDK Features](products/features.json)         | SDK supported features                                          | JSON    |\n| [SDK Feature Info](products/feature_info.json) | Descriptions of SDK features                                    | JSON    |\n| [SDK Popularity](products/popularity.json)     | SDK popularity                                                  | JSON    |\n\n\n## structure\n\nThis repo contains an [sqlite database](./metadata.sqlite3) containing a snapshot of SDK metadata\nfetched from individual repos.\n\nIt also contains [JSON files](./products) that are derived from the database. These are intended for\nconsumption by downstream products and services. \n\nThe JSON schemas for those products live in [`schemas`](./schemas). \n\n## tooling\n\nData products can be validated against the schemas using `./scripts/ci/check-json-schemas.sh` on Linux.\n\nEnsure that the JSON files are valid and formatted using `./scripts/ci/format-json.sh`.\n\nTo quickly create basic metadata for a new repo, run `./scripts/add-repo.sh \u003claunchdarkly/repo-name\u003e`. This will\nclone the repo, check-in an `.sdk_metadata.json` file, and create a PR.\n\nSome of the tooling lives in a [Go module](./tool) because it's too complex for a shell script.\n\n### SDK Feature Comparison Tool\n\nCan be found on Github Pages [here](https://launchdarkly.github.io/sdk-meta/).\n\nThis repo includes an interactive web-based tool for comparing LaunchDarkly SDK features. The tool provides two complementary views:\n\n**By SDK View** (`by-sdk.html`):\n- Select up to 3 SDKs (client-side or server-side)\n- View all features supported by the selected SDKs\n- Compare feature availability and version information side-by-side\n\n**By Feature View** (`by-feature.html`):\n- Select up to 5 features\n- View which SDKs support the selected features\n- Compare version information across all SDKs\n\n**Generating the comparison pages:**\n```bash\nmake html\n```\n\nThis generates both HTML files in the `_sites_/` directory. The pages are automatically deployed to GitHub Pages when changes are pushed to the main branch.\n\n\n## backfill\n\nThe `backfill/` directory contains metadata files that supplement the main crawl. Each file is named\n`\u003corg\u003e_\u003crepo\u003e.json` (e.g., `launchdarkly_java-server-sdk.json`), and the filename determines which\nGitHub repo is queried for releases.\n\nThere are two types of backfill files:\n\n### Old-repo backfill (default)\n\nUsed when an SDK has migrated from a standalone repo to a monorepo. The backfill file references the\n**old** repo to capture historical releases that used simple unprefixed tags (e.g., `7.7.0`). The new\nmonorepo's `.sdk_metadata.json` uses a `tag-prefix` to capture new releases (e.g.,\n`launchdarkly-java-server-sdk-7.8.0`).\n\nWhen the main crawl encounters a repo that has a backfill file, it **skips** that repo — since the\nold repo's metadata is no longer authoritative.\n\nExample (`backfill/launchdarkly_java-server-sdk.json`):\n```json\n{\n  \"version\": 1,\n  \"sdks\": {\n    \"java-server-sdk\": {}\n  }\n}\n```\n\n### Same-repo backfill (`\"same-repo\": true`)\n\nUsed when a repo changed its tag format (e.g., from `3.3.2` to `launchdarkly-react-client-sdk-v3.4.0`)\nwithout migrating to a different repo. The backfill file references the **same** repo to capture the\nold unprefixed releases, while the repo's `.sdk_metadata.json` uses a `tag-prefix` to capture the\nnew prefixed releases.\n\nSetting `\"same-repo\": true` tells the crawl that this repo is still the canonical home for the SDK.\nThe main crawl will **still process** this repo (rather than skipping it), so that full metadata and\nprefixed releases are also ingested.\n\nExample (`backfill/launchdarkly_java-core.json`):\n```json\n{\n  \"same-repo\": true,\n  \"version\": 1,\n  \"sdks\": {\n    \"java-server-sdk\": {}\n  }\n}\n```\n\n## versioning policy\n\nThe JSON products have an implicit 'v1' version at this time.\n\nThe sqlite database has no versioning policy and may change schemas at any time.\n\nIf any JSON schema needs a breaking change, then we should \nprobably handle it like so:\n1. Add a new `products/v2` directory and `schemas/v2` directory as needed\n2. Update `./scripts/generate-products.sh` to generate the new data products, and also keep generating the\nold ones so they remain up-to-date.\n3. Have new applications consume `/products/v2/whatever.json`\n4. Eventually, when/if all consumers have migrated, stop generating the old products. Don't delete them though, \njust in case something is intermittently using them that we've forgotten about.\n\nThe [API](./api) Go module should follow semver:\n- Patch for \"bug fixes\" to the JSON specs, or whenever metadata is updated in a backwards compatible way.\n- Minor for new data products (necessitating a new embedded table in the module)\n- Major for breaking changes to the API or data products. In the case of a major version, we need to append\na new suffix to the module like `v2`.\n\n### what necessitates a new major version\n- Changing the meaning of an existing field\n- Changing the contents of an existing field in an incompatible way (like changing its type)\n- Removing an existing field\n- Probably other things that we haven't thought of\n\n### what doesn't necessitate a new major version\n- Adding a new field\n\n\n## consumers\n\nConsumers of SDK metadata include:\n- [LaunchDarkly Docs](https://docs.launchdarkly.com/)\n- [LaunchDarkly CLI](https://github.com/launchdarkly/ldcli)\n- LaunchDarkly internal service (G)\n\nAre you a consumer? Add a link here to receive communications when new features/changes are coming.\n\n\n[//]: # 'api-js'\n[js-badge]: https://img.shields.io/npm/v/@launchdarkly/sdk-meta.svg?style=flat-square\n[js-link]: https://www.npmjs.com/package/@launchdarkly/sdk-meta\n\n[//]: # 'api'\n[go-badge]: https://img.shields.io/github/v/tag/launchdarkly/sdk-meta?filter=api/*\u0026include_prereleases\u0026label=Go\n[go-link]: https://pkg.go.dev/github.com/launchdarkly/sdk-meta/api/sdkmeta\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaunchdarkly%2Fsdk-meta","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flaunchdarkly%2Fsdk-meta","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaunchdarkly%2Fsdk-meta/lists"}