SPB Git forge

spb/websensor

Public
33commits 1branches 0releases
3.4 MBsize
maindefault branch
10 days agolast push
TypeScript 55.4% Python 43.2% SQL 1.2%
56.1 KB · 357 lines python
Raw Blame History
1# Spec for config/sources.d/47-open-source-long-tail.yaml (executed in order by scripts/gen-open-source-long-tail.py; parts 2–6 reuse the src()/ext() helpers defined here).2# Entry keys: id, extend, name, domain, categories, tier, weight, aliases, products, country, llm, notes,3#   repos: "owner/repo" | ("owner/repo", kind|None, label|None, tier|None)      kind defaults to releases4#   feeds: (name, url[, type[, tier]])5# A bare string in SPEC is a section comment.67HEADER = """# config/sources.d/47-open-source-long-tail.yaml — the long tail of open-source projects and developer tooling8# (2026-09-11): GitHub release / tag Atom feeds for ~400 widely used repositories not covered by 10–46, grouped9# under their organization or foundation (existing ids are extended), plus the official blog / news feed of each10# organization when one exists. Every sensor was fetched and parsed by `apps/engine/src/validate.ts` before being11# written; repos without GitHub releases use `tags.atom` (`kind: tags`). Generated by12# `scripts/gen-open-source-long-tail.py` from `scripts/gen-open-source-long-tail-spec*.py`."""1314OSD = ["open-source", "developer"]15OSINF = ["open-source", "developer", "infrastructure"]16OSSEC = ["open-source", "developer", "cyber"]17OSAPP = ["open-source", "consumer-tech"]18OSML = ["open-source", "developer", "ai"]19OSOS = ["open-source", "technology"]20T = "tags"212223def src(id, name, domain, aliases=(), repos=(), feeds=(), tier="C", categories=OSD, country=None, products=(), llm=True, notes=None, weight=None):24    d = {"id": id, "name": name, "domain": domain, "categories": list(categories), "tier": tier, "aliases": list(aliases), "repos": list(repos), "feeds": list(feeds),25         "products": [(p, "software") if isinstance(p, str) else p for p in products], "llm": llm}26    if country: d["country"] = country27    if notes: d["notes"] = notes28    if weight: d["weight"] = weight29    return d303132def ext(id, repos=(), feeds=(), products=(), aliases=(), country=None):33    d = {"id": id, "extend": True, "repos": list(repos), "feeds": list(feeds), "products": [(p, "software") if isinstance(p, str) else p for p in products], "aliases": list(aliases)}34    if country: d["country"] = country35    return d363738SPEC = [39    "Foundations",40    ext("linux-foundation", feeds=[("newsroom feed", "https://www.linuxfoundation.org/press/rss.xml")], country="US"),41    src("numfocus", "NumFOCUS", "numfocus.org", ["numfocus foundation"], categories=["open-source", "science", "ngo"], country="US", feeds=[("news feed", "https://numfocus.org/feed")]),42    src("sfconservancy", "Software Freedom Conservancy", "sfconservancy.org", ["software freedom conservancy"], categories=["open-source", "ngo", "legal"], country="US",43        feeds=[("news feed", "https://sfconservancy.org/feeds/news/"), ("blog feed", "https://sfconservancy.org/feeds/blog/")]),44    src("fsfe", "Free Software Foundation Europe", "fsfe.org", ["fsfe", "free software foundation europe"], categories=["open-source", "ngo", "legal"], country="DE", feeds=[("news feed", "https://fsfe.org/news/news.en.rss")]),45    src("cd-foundation", "Continuous Delivery Foundation", "cd.foundation", ["cdf", "continuous delivery foundation"], country="US", feeds=[("news feed", "https://cd.foundation/feed/")]),46    src("lf-ai-data", "LF AI & Data Foundation", "lfaidata.foundation", ["lf ai & data", "lf ai and data"], categories=["open-source", "ai"], country="US", feeds=[("news feed", "https://lfaidata.foundation/feed/")]),47    src("openinfra", "OpenInfra Foundation (OpenStack)", "openinfra.org", ["openinfra foundation", "openstack", "openstack foundation", "kata containers"], categories=["open-source", "cloud"], country="US",48        products=["OpenStack", "Kata Containers"], repos=["kata-containers/kata-containers", ("openstack/nova", T), ("openstack/neutron", T), ("openstack/keystone", T)],49        feeds=[("superuser blog", "https://superuser.openinfra.org/feed/")]),50    src("bytecode-alliance", "Bytecode Alliance", "bytecodealliance.org", ["bytecode alliance", "wasmtime"], country="US", products=["Wasmtime", "wasm-tools"],51        repos=["bytecodealliance/wasmtime", "bytecodealliance/wasm-tools", "bytecodealliance/wasm-micro-runtime", "bytecodealliance/jco"]),52    src("webassembly", "WebAssembly", "webassembly.org", ["wasm", "wasi", "wasmer", "wasmedge", "wasmcloud"], categories=["open-source", "developer", "standards"],53        products=["WASI", "Binaryen", "wabt", "Wasmer", "WasmEdge", "wasmCloud"],54        repos=[("WebAssembly/spec", T), ("WebAssembly/WASI", T), "WebAssembly/binaryen", "WebAssembly/wabt", "wasmerio/wasmer", "WasmEdge/WasmEdge", "wasmCloud/wasmCloud"]),55    ext("openjs", products=["jQuery", "Mocha", "Appium", "WebdriverIO", "Node-RED", "Jest", "nvm", "undici"],56        repos=["nodejs/undici", "nvm-sh/nvm", "jquery/jquery", ("lodash/lodash", T), "mochajs/mocha", "appium/appium", "webdriverio/webdriverio", "node-red/node-red", "jestjs/jest"]),57    ext("eclipse", products=["Eclipse Theia", "Eclipse Vert.x", "Eclipse Mosquitto", "Eclipse Jetty", "Jakarta EE", "Eclipse Temurin", "OpenJ9", "GlassFish", "Eclipse Che"],58        repos=["eclipse-theia/theia", "eclipse-vertx/vert.x", "eclipse-mosquitto/mosquitto", "jetty/jetty.project", "eclipse-platform/eclipse.platform", "eclipse-che/che",59               "jakartaee/platform", "eclipse-paho/paho.mqtt.java", "eclipse-openj9/openj9", "adoptium/temurin21-binaries", "eclipse-ee4j/glassfish", "eclipse-ee4j/jersey"]),60    ext("apache",61        products=[("Apache Spark", "software", ["spark"]), ("Apache Flink", "software", ["flink"]), "Apache Beam", ("Apache Arrow", "software", ["arrow", "pyarrow"]), ("Apache Iceberg", "software", ["iceberg"]),62                  "Apache Hudi", "Apache Druid", "Apache Pinot", ("Apache Superset", "software", ["superset"]), ("Apache NiFi", "software", ["nifi"]), ("Apache Pulsar", "software", ["pulsar"]),63                  ("Apache ZooKeeper", "software", ["zookeeper"]), ("Apache Tomcat", "software", ["tomcat"]), ("Apache Lucene", "software", ["lucene"]), ("Apache Solr", "software", ["solr"]),64                  ("Apache Hadoop", "software", ["hadoop"]), "Apache Hive", "Apache HBase", ("Apache CouchDB", "software", ["couchdb"]), "Apache Camel", ("Apache ActiveMQ", "software", ["activemq"]),65                  ("Apache Groovy", "software", ["groovy"]), ("Apache NetBeans", "software", ["netbeans"]), ("Apache APISIX", "software", ["apisix"]), "Apache SkyWalking", "Apache Dubbo",66                  "Apache ShardingSphere", "Apache Doris", "Apache Paimon", "Apache SeaTunnel", "Apache DolphinScheduler", ("Apache ECharts", "software", ["echarts"]), ("Apache RocketMQ", "software", ["rocketmq"]),67                  "Apache DataFusion", "Apache OpenDAL", ("Apache Log4j", "software", ["log4j", "log4j2"]), "Apache TVM", "Apache Kyuubi", "Apache Ozone", "Apache NuttX", "Apache AGE",68                  ("Apache Cordova", "software", ["cordova"]), "Apache Thrift", "Apache Avro", "Apache Calcite", ("Apache JMeter", "software", ["jmeter"]), ("Apache Struts", "software", ["struts"]),69                  ("Apache CloudStack", "software", ["cloudstack"]), "Apache Traffic Server", "Apache Ignite", "Apache Tika", "Apache PDFBox", "Apache POI", ("Apache Guacamole", "software", ["guacamole"]),70                  "Apache Gravitino", "Apache Polaris", "Apache Celeborn", "Apache Answer", "Apache Shiro", "Apache Karaf", "Apache TinkerPop", "Apache Jena", "Apache Storm", "Apache Pekko", "Apache TomEE"],71        repos=[("apache/spark", T), ("apache/flink", T), "apache/beam", "apache/arrow", "apache/iceberg", "apache/hudi", "apache/druid", "apache/pinot", "apache/superset", ("apache/nifi", T),72               "apache/pulsar", ("apache/zookeeper", T), ("apache/tomcat", T), ("apache/lucene", T), ("apache/solr", T), ("apache/hadoop", T), ("apache/hive", T), ("apache/hbase", T),73               ("apache/couchdb", T), ("apache/camel", T), ("apache/activemq", T), ("apache/groovy", T), "apache/netbeans", "apache/apisix", "apache/skywalking", "apache/dubbo",74               "apache/shardingsphere", "apache/doris", "apache/paimon", "apache/seatunnel", "apache/dolphinscheduler", "apache/echarts", "apache/rocketmq", "apache/datafusion", "apache/opendal",75               "apache/logging-log4j2", "apache/tvm", "apache/kyuubi", "apache/ozone", "apache/nuttx", "apache/age", "apache/cordova-android", ("apache/thrift", T), "apache/avro", ("apache/calcite", T),76               ("apache/jmeter", T), ("apache/struts", T), ("apache/cloudstack", T), ("apache/trafficserver", T), ("apache/ignite", T), ("apache/tika", T), ("apache/pdfbox", T), ("apache/poi", T),77               ("apache/guacamole-server", T), "apache/gravitino", "apache/polaris", "apache/celeborn", "apache/answer", "apache/shiro", "apache/karaf", "apache/tinkerpop", "apache/jena",78               ("apache/storm", T), "apache/pekko", "apache/tomee", ("apache/httpcomponents-client", T), ("apache/commons-lang", T)],79        feeds=[("foundation blog", "https://blogs.apache.org/foundation/feed/entries/atom", "ATOM")]),80    ext("cncf",81        products=["Cortex", "Contour", "Operator SDK", "KubeEdge", "Antrea", "CloudEvents", "in-toto", "Notation", "Kubescape", "Emissary-ingress", "KubeVela", "Artifact Hub", "OpenFeature", "Flatcar",82                  "Cluster API", "kind", "Gateway API", "Kustomize", "CRI-O", "Rook", "Longhorn", "Buildpacks", "TiKV", "Cloud Custodian", "Kuma", "MetalLB", "Litmus", "Chaos Mesh", "Karmada", "Volcano",83                  "SPIRE", "Open Policy Agent", "Gatekeeper", "Kyverno", "KEDA", "Knative", "Dapr", "Backstage", "Harbor", "Thanos", "KubeVirt", "Fluent Bit", "Fluentd", "OpenFGA", "CloudNativePG",84                  "Strimzi", "OpenCost", "Jaeger", "Vitess", "NATS", "gRPC", "CubeFS", "KubeArmor", "Meshery", "Headlamp", "Kubeflow", "OpenEBS", "Argo Workflows", "Argo Rollouts", "Tekton", "Temporal",85                  ("OpenTelemetry", "software", ["otel"]), "Prometheus Operator", "Keptn", "Dragonfly", "Kueue", "Karpenter", "Kubebuilder", "minikube", "kOps"],86        repos=["cortexproject/cortex", "projectcontour/contour", "operator-framework/operator-sdk", "kubeedge/kubeedge", "antrea-io/antrea", ("cloudevents/spec", T), "in-toto/in-toto",87               "notaryproject/notation", "kubescape/kubescape", "emissary-ingress/emissary", "kubevela/kubevela", "artifacthub/hub", "open-feature/spec", "flatcar/Flatcar", "dragonflyoss/dragonfly",88               "kubernetes-sigs/cluster-api", "kubernetes-sigs/kind", "kubernetes-sigs/gateway-api", "kubernetes-sigs/kustomize", "kubernetes-sigs/metrics-server", "kubernetes-sigs/external-dns",89               "kubernetes-sigs/descheduler", "kubernetes-sigs/aws-load-balancer-controller", "kubernetes-sigs/kueue", "kubernetes-sigs/karpenter", "kubernetes-sigs/kubebuilder", "kubernetes-sigs/controller-runtime",90               "cri-o/cri-o", "rook/rook", "longhorn/longhorn", "buildpacks/pack", "tikv/tikv", "cloud-custodian/cloud-custodian", "kumahq/kuma", "metallb/metallb", "litmuschaos/litmus",91               "chaos-mesh/chaos-mesh", "karmada-io/karmada", "volcano-sh/volcano", "spiffe/spire", "open-policy-agent/opa", "open-policy-agent/gatekeeper", "kyverno/kyverno", "kedacore/keda",92               "knative/serving", "knative/eventing", "dapr/dapr", "backstage/backstage", "goharbor/harbor", "thanos-io/thanos", "kubevirt/kubevirt", "fluent/fluent-bit", "fluent/fluentd", "openfga/openfga",93               "cloudnative-pg/cloudnative-pg", "strimzi/strimzi-kafka-operator", "opencost/opencost", "jaegertracing/jaeger", "ko-build/ko", "kubernetes/minikube", "kubernetes/kops", "kubernetes/dashboard",94               "kubernetes/kube-state-metrics", ("kubernetes/kubectl", T), "istio/ztunnel", "vitessio/vitess", "nats-io/nats-server", "nats-io/nats.go", "grpc/grpc", "grpc/grpc-go", "grpc/grpc-java",95               "grpc/grpc-node", "cubefs/cubefs", "kubearmor/KubeArmor", "meshery/meshery", "headlamp-k8s/headlamp", "kubeflow/kubeflow", "kubeflow/pipelines", "kubeflow/trainer", "openebs/openebs",96               "argoproj/argo-workflows", "argoproj/argo-rollouts", "argoproj/argo-events", "tektoncd/pipeline", "tektoncd/cli", "temporalio/temporal", "temporalio/sdk-go", "temporalio/sdk-typescript",97               "open-telemetry/opentelemetry-collector-contrib", "open-telemetry/opentelemetry-js", "open-telemetry/opentelemetry-python", "open-telemetry/opentelemetry-java", "open-telemetry/opentelemetry-go",98               "open-telemetry/opentelemetry-dotnet", "open-telemetry/opentelemetry-operator", ("open-telemetry/opentelemetry-specification", None, "otel specification releases"), "open-telemetry/opentelemetry-demo",99               "prometheus/node_exporter", "prometheus/blackbox_exporter", "prometheus-operator/prometheus-operator", "prometheus/client_golang", "prometheus/pushgateway", "keptn/lifecycle-toolkit"],100        feeds=[("opentelemetry blog", "https://opentelemetry.io/blog/index.xml"), ("cncf blog", "https://www.cncf.io/blog/feed/")]),101    ext("openssf", products=["OpenBao", "Sigstore", "Rekor", "Fulcio", "SLSA", "Allstar"],102        repos=["ossf/allstar", "ossf/package-analysis", "openbao/openbao", "sigstore/sigstore", "sigstore/rekor", "sigstore/fulcio", "sigstore/gitsign", "slsa-framework/slsa"]),103104    "Languages and runtimes",105    ext("rust-foundation", products=["rustup", "rust-analyzer", "Cargo", "mdBook", "rustfmt", "Clippy", "Miri", "crates.io"],106        repos=["rust-lang/rustup", "rust-lang/rust-analyzer", ("rust-lang/cargo", T), "rust-lang/mdBook", "rust-lang/rustfmt", "rust-lang/rust-clippy", "rust-lang/crates.io", "rust-lang/miri"]),107    ext("rust", products=["Tokio", "Axum", "Serde", "Hyper", "clap", "Actix Web", "reqwest", "SQLx", "Diesel", "SeaORM", "Leptos", "Dioxus", "Yew", "Bevy", "rustls", "tracing", "Rayon", "ripgrep", "bat", "Nushell", "maturin", "kube-rs"],108        repos=["tokio-rs/tokio", "tokio-rs/axum", "serde-rs/serde", "hyperium/hyper", "clap-rs/clap", "actix/actix-web", "seanmonstar/reqwest", "launchbadge/sqlx", "diesel-rs/diesel", "SeaQL/sea-orm",109               "leptos-rs/leptos", "DioxusLabs/dioxus", "yewstack/yew", "bevyengine/bevy", "rustls/rustls", "tokio-rs/tracing", "rayon-rs/rayon", "BurntSushi/ripgrep", "sharkdp/bat", "nushell/nushell",110               "PyO3/maturin", "kube-rs/kube"]),111    ext("python", products=["mypy", "pip", "setuptools", "Poetry", "Pydantic", "Black", "Requests", "PyO3", "Cython", "pipx", "Werkzeug", "Jinja", "Click", "pylint", "pytest", "HTTPX", "Starlette", "Uvicorn",112                            "Django REST framework", "Gunicorn", "uWSGI", "Celery", "SQLAlchemy", "Alembic", "aiohttp", "Typer", "Wagtail", "Textual", "Rich", "pyenv", "IPython", "conda", "pixi", "Sphinx",113                            "MkDocs", "Litestar", "Streamlit", "Gradio", "Dash", "marimo", "JupyterHub", "Scrapy", "Pyright"],114        repos=["python/mypy", "pypa/pip", "pypa/setuptools", "pypa/packaging", "pypa/hatch", "python-poetry/poetry", "pydantic/pydantic", "psf/black", "psf/requests", "PyO3/pyo3", "cython/cython",115               "pypa/pipx", "pypa/cibuildwheel", "pallets/werkzeug", "pallets/jinja", "pallets/click", "pylint-dev/pylint", "pytest-dev/pytest", "encode/httpx", "encode/starlette", "encode/uvicorn",116               "encode/django-rest-framework", "benoitc/gunicorn", ("unbit/uwsgi", T), "celery/celery", "sqlalchemy/sqlalchemy", "sqlalchemy/alembic", "aio-libs/aiohttp", "fastapi/typer", "wagtail/wagtail",117               "Textualize/textual", "Textualize/rich", "pyenv/pyenv", "ipython/ipython", "conda/conda", "prefix-dev/pixi", "sphinx-doc/sphinx", "mkdocs/mkdocs", "squidfunk/mkdocs-material",118               "litestar-org/litestar", "streamlit/streamlit", "gradio-app/gradio", "plotly/dash", "marimo-team/marimo", "jupyterhub/jupyterhub", "scrapy/scrapy", "microsoft/pyright", "python/peps"]),119    src("astral", "Astral", "astral.sh", ["astral sh", "uv python", "ruff linter"], tier="B", country="US", products=["uv", ("Ruff", "software", ["ruff"]), "ty"],120        repos=["astral-sh/uv", "astral-sh/ruff", "astral-sh/ty", "astral-sh/python-build-standalone"], feeds=[("blog feed", "https://astral.sh/blog/rss.xml")]),121    ext("nodejs", products=["Node.js", "Corepack", "PM2", "nodemon", "tsx", "libuv", "Volta", "fnm", "axios", "Zod", "Socket.IO", "ws", "Sequelize", "TypeORM", "Knex", "Mongoose", "BullMQ", "Puppeteer", "Vitest", "Husky", "semantic-release", "Changesets", "typescript-eslint"],122        repos=["nodejs/node", "nodejs/corepack", "Unitech/pm2", "remy/nodemon", "privatenumber/tsx", "libuv/libuv", "volta-cli/volta", "Schniz/fnm", "axios/axios", "colinhacks/zod", "socketio/socket.io",123               "websockets/ws", "sequelize/sequelize", "typeorm/typeorm", "knex/knex", "Automattic/mongoose", "taskforcesh/bullmq", "puppeteer/puppeteer", "vitest-dev/vitest", "typicode/husky",124               "semantic-release/semantic-release", "changesets/changesets", "typescript-eslint/typescript-eslint"]),125    ext("go", products=["gopls", "golangci-lint", "Delve", "GoReleaser", "Gin", "Echo", "Fiber", "chi", "Cobra", "Viper", "zap", "GORM", "sqlc", "pgx", "testify", "Wire", "grpc-gateway", "Connect", "Bubble Tea", "Buf", "Task", "gqlgen", "ent", "golang-migrate", "go-redis", "Kratos", "go-zero", "Kitex", "govulncheck"],126        repos=[("golang/tools", T), "golangci/golangci-lint", "go-delve/delve", "goreleaser/goreleaser", "gin-gonic/gin", "labstack/echo", "gofiber/fiber", "go-chi/chi", "spf13/cobra", "spf13/viper",127               "uber-go/zap", "go-gorm/gorm", "sqlc-dev/sqlc", "jackc/pgx", "stretchr/testify", "google/wire", "grpc-ecosystem/grpc-gateway", "connectrpc/connect-go", "charmbracelet/bubbletea",128               "bufbuild/buf", "go-task/task", "99designs/gqlgen", "ent/ent", "golang-migrate/migrate", "redis/go-redis", "go-kratos/kratos", "zeromicro/go-zero", "cloudwego/kitex", "golang/vuln"]),129    ext("ruby", products=["RubyGems", "RuboCop", "Puma", "Sidekiq", "RSpec", "Rack", "Sinatra", "Hanami", "Ruby LSP", "RBS", "Jekyll", "fastlane", "Chef", "Puppet", "Passenger"],130        repos=[("ruby/ruby", T), "rubygems/rubygems", "rubocop/rubocop", "puma/puma", "sidekiq/sidekiq", "rspec/rspec-core", "rack/rack", "sinatra/sinatra", "hanami/hanami", "Shopify/ruby-lsp", "ruby/rbs",131               "jekyll/jekyll", "fastlane/fastlane", "chef/chef", "puppetlabs/puppet", "phusion/passenger"]),132    ext("rails", products=["Kamal", "Turbo", "Stimulus", "Propshaft", "Solid Queue", "Devise"],133        repos=["basecamp/kamal", "hotwired/turbo", "hotwired/stimulus", "rails/propshaft", "rails/solid_queue", "heartcombo/devise"]),134    ext("php", products=["Composer", "PHPUnit", "PHPStan", "Psalm", "PHP CS Fixer", "FrankenPHP", "RoadRunner", "Swoole", "Guzzle", "Doctrine ORM", "Twig", "Monolog", "phpMyAdmin", "CakePHP", "Yii", "CodeIgniter", "Slim", "Rector", "PhpSpreadsheet", "Carbon"],135        repos=["php/php-src", "composer/composer", "sebastianbergmann/phpunit", "phpstan/phpstan", "vimeo/psalm", "PHP-CS-Fixer/PHP-CS-Fixer", "php/frankenphp", "roadrunner-server/roadrunner", "swoole/swoole-src",136               "guzzle/guzzle", "doctrine/orm", "twigphp/Twig", "Seldaek/monolog", "phpmyadmin/phpmyadmin", "cakephp/cakephp", "yiisoft/yii2", "codeigniter4/CodeIgniter4", "slimphp/Slim", "rectorphp/rector",137               "PHPOffice/PhpSpreadsheet", "briannesbitt/Carbon"]),138    src("symfony", "Symfony", "symfony.com", ["symfony framework", "sensiolabs"], tier="B", country="FR", products=["Symfony", "API Platform", "Symfony CLI", "Symfony UX"],139        repos=["symfony/symfony", "api-platform/core", "symfony/cli", "symfony/ux", "symfony/webpack-encore", "symfony/maker-bundle"], feeds=[("blog feed", "https://feeds.feedburner.com/symfony/blog")]),140    ext("laravel", products=["Livewire", "Inertia.js", "Filament", "Laravel Octane", "Laravel Sail", "Laravel Horizon", "Laravel Pint", "Pest"],141        repos=["laravel/laravel", "livewire/livewire", "inertiajs/inertia", "filamentphp/filament", "laravel/octane", "laravel/sail", "laravel/horizon", "laravel/pint", "laravel/passport", "pestphp/pest"]),142    ext("spring", products=["Spring Framework", "Spring Security", "Spring Data JPA", "Spring Cloud Gateway", "Spring AI", "Spring Batch", "Spring Kafka", "Spring Authorization Server", "Spring GraphQL"],143        repos=["spring-projects/spring-framework", "spring-projects/spring-security", "spring-projects/spring-data-jpa", "spring-cloud/spring-cloud-gateway", "spring-projects/spring-ai",144               "spring-projects/spring-batch", "spring-projects/spring-kafka", "spring-projects/spring-authorization-server", "spring-projects/spring-graphql", "spring-io/initializr"]),145    src("quarkus", "Quarkus", "quarkus.io", ["quarkus framework", "red hat quarkus"], repos=["quarkusio/quarkus", "quarkusio/quarkus-quickstarts"], feeds=[("blog feed", "https://quarkus.io/feed.xml")]),146    src("micronaut", "Micronaut", "micronaut.io", ["micronaut framework"], repos=["micronaut-projects/micronaut-core", "micronaut-projects/micronaut-starter"]),147    src("openjdk", "OpenJDK", "openjdk.org", ["openjdk", "java development kit", "jdk"], tier="B", products=[("JDK", "software", ["java se"]), "JDK Mission Control", "jextract"],148        repos=[("openjdk/jdk", T), ("openjdk/jdk21u", T), ("openjdk/jdk17u", T), "openjdk/jmc", "openjdk/jextract"], feeds=[("inside.java feed", "https://inside.java/feed.xml")]),149    src("graalvm", "GraalVM", "graalvm.org", ["graal", "graalvm native image", "graaljs", "graalpy"], country="US", products=["GraalVM", "GraalJS", "GraalPy", "Native Build Tools", "Mandrel"],150        repos=["oracle/graal", "oracle/graaljs", "oracle/graalpython", "graalvm/native-build-tools", "graalvm/mandrel"], feeds=[("blog feed", "https://medium.com/feed/graalvm")]),151    src("java-libraries", "Java ecosystem — major libraries", "java.net", ["java libraries", "jvm libraries"],152        products=["Hibernate", "Jackson", "JUnit", "Mockito", "Netty", "Guava", "Lombok", "Micrometer", "Resilience4j", "Helidon", "Dropwizard", "Play Framework", "Vaadin", "Javalin", "Logback", "MapStruct", "jOOQ", "Testcontainers", "OkHttp", "Retrofit", "Gson", "Dagger", "Reactor", "RxJava", "Flyway", "Liquibase", "WildFly", "Open Liberty", "Hazelcast", "Infinispan"],153        repos=["hibernate/hibernate-orm", "FasterXML/jackson-databind", "junit-team/junit-framework", "mockito/mockito", "netty/netty", "google/guava", "projectlombok/lombok", "micrometer-metrics/micrometer",154               "resilience4j/resilience4j", "helidon-io/helidon", "dropwizard/dropwizard", "playframework/playframework", "vaadin/flow", "javalin/javalin", "qos-ch/logback", "mapstruct/mapstruct", "jOOQ/jOOQ",155               "testcontainers/testcontainers-java", "square/okhttp", "square/retrofit", "google/gson", "google/dagger", "reactor/reactor-core", "ReactiveX/RxJava", "flyway/flyway", "liquibase/liquibase",156               "wildfly/wildfly", "OpenLiberty/open-liberty", "hazelcast/hazelcast", "infinispan/infinispan"]),157    ext("kotlin", products=["kotlinx.coroutines", "kotlinx.serialization", "Ktor", "Compose Multiplatform", "Exposed", "ktlint", "detekt", "SQLDelight", "Koin", "KSP", "Arrow"],158        repos=["JetBrains/kotlin", "Kotlin/kotlinx.coroutines", "Kotlin/kotlinx.serialization", "ktorio/ktor", "JetBrains/compose-multiplatform", "JetBrains/Exposed", "pinterest/ktlint", "detekt/detekt",159               "sqldelight/sqldelight", "InsertKoinIO/koin", "google/ksp", "arrow-kt/arrow"]),160    ext("swift", products=["Swift Package Manager", "SwiftNIO", "Vapor", "SourceKit-LSP", "swift-syntax", "swift-format", "Hummingbird", "SwiftLint", "SwiftFormat", "Alamofire", "The Composable Architecture", "CocoaPods", "Tuist", "XcodeGen", "Swift Testing", "swift-openapi-generator"],161        repos=["swiftlang/swift", "swiftlang/swift-package-manager", "apple/swift-nio", "vapor/vapor", "swiftlang/sourcekit-lsp", "swiftlang/swift-syntax", "swiftlang/swift-format", "hummingbird-project/hummingbird",162               "realm/SwiftLint", "nicklockwood/SwiftFormat", "Alamofire/Alamofire", "pointfreeco/swift-composable-architecture", "CocoaPods/CocoaPods", "tuist/tuist", "yonaskolb/XcodeGen", "swiftlang/swift-testing",163               "apple/swift-openapi-generator", "apple/swift-collections", "apple/swift-argument-parser", "grpc/grpc-swift"]),164    src("elixir", "Elixir", "elixir-lang.org", ["elixir language", "elixir lang", "phoenix framework"], products=[("Phoenix Framework", "software", ["phoenix"]), "Ecto", "LiveView", "Nx", "Livebook", "Oban", "Absinthe", "Hex"],165        repos=["elixir-lang/elixir", "phoenixframework/phoenix", "phoenixframework/phoenix_live_view", "elixir-ecto/ecto", "elixir-nx/nx", "livebook-dev/livebook", "elixir-lang/ex_doc", "oban-bg/oban",166               "absinthe-graphql/absinthe", "hexpm/hex", "elixir-lsp/elixir-ls", "elixir-nx/bumblebee"], feeds=[("blog feed", "https://elixir-lang.org/atom.xml", "ATOM")]),167    src("erlang", "Erlang/OTP", "erlang.org", ["erlang", "otp", "erlang otp", "beam vm", "rebar3"], products=["Erlang/OTP", "rebar3"],168        repos=["erlang/otp", "erlang/rebar3", "erlang-ls/erlang_ls"], feeds=[("blog feed", "https://www.erlang.org/blog.xml")]),169    src("gleam", "Gleam", "gleam.run", ["gleam language"], repos=["gleam-lang/gleam", "gleam-lang/stdlib"], feeds=[("news feed", "https://gleam.run/feed.xml")]),170    src("scala", "Scala", "scala-lang.org", ["scala language", "scala center", "scala 3", "dotty"], country="CH", products=["Scala 3", "sbt", "Metals", "Akka", "ZIO", "Cats", "Cats Effect", "http4s", "scalafmt", "Mill", "Scala CLI", "Tapir"],171        repos=["scala/scala3", "scala/scala", "sbt/sbt", "scalameta/metals", "akka/akka", "zio/zio", "typelevel/cats", "typelevel/cats-effect", "http4s/http4s", "scalameta/scalafmt", "com-lihaoyi/mill",172               "VirtusLab/scala-cli", "softwaremill/tapir", "scalatest/scalatest"], feeds=[("blog feed", "https://www.scala-lang.org/feed.xml")]),173    src("haskell", "Haskell", "haskell.org", ["haskell language", "ghc", "glasgow haskell compiler", "haskell foundation"], products=["GHC", "Cabal", "Stack", ("Haskell Language Server", "software", ["hls"]), "GHCup"],174        repos=["haskell/cabal", "commercialhaskell/stack", "haskell/haskell-language-server", "haskell/ghcup-hs"],175        feeds=[("ghc tags (gitlab)", "https://gitlab.haskell.org/ghc/ghc/-/tags?format=atom", "ATOM"), ("discourse announcements", "https://discourse.haskell.org/c/announcements/10.rss")]),176    src("ocaml", "OCaml", "ocaml.org", ["ocaml language", "opam", "dune build", "reasonml", "rescript"], country="FR", products=["opam", "Dune", "Merlin", "OCaml LSP", "Reason", "ReScript", "MirageOS"],177        repos=["ocaml/ocaml", "ocaml/opam", "ocaml/dune", "ocaml/merlin", "ocaml/ocaml-lsp", "ocsigen/lwt", "janestreet/base", "mirage/mirage", "reasonml/reason", "rescript-lang/rescript"],178        feeds=[("blog feed", "https://ocaml.org/feed.xml", "ATOM")]),179    src("dart", "Dart", "dart.dev", ["dart language", "dart sdk", "pub.dev"], country="US", products=["Dart SDK", "pub"],180        repos=[("dart-lang/sdk", T), "dart-lang/pub", "dart-lang/language", "dart-lang/native", "dart-lang/shelf", "dart-lang/build"], feeds=[("blog feed", "https://medium.com/feed/dartlang")]),181    ext("flutter", products=["bloc", "Riverpod", "GetX", "FlutterFire", "Flame", "Isar", "Drift", "FVM"],182        repos=["flutter/packages", "flutter/devtools", "felangel/bloc", "rrousselGit/riverpod", "jonataslaw/getx", "firebase/flutterfire", "flame-engine/flame", "isar/isar", "simolus3/drift", "leoafarias/fvm"]),183    src("lua", "Lua", "lua.org", ["lua language", "luajit", "luarocks", "luau"], country="BR", products=["LuaJIT", "LuaRocks", "Luau", "Lua Language Server"],184        repos=[("lua/lua", T), ("LuaJIT/LuaJIT", T), "luarocks/luarocks", "luau-lang/luau", "LuaLS/lua-language-server", "openresty/lua-nginx-module", "teal-language/tl"]),185    src("nim", "Nim", "nim-lang.org", ["nim language", "nim lang", "nimble"], repos=["nim-lang/Nim", "nim-lang/nimble", "nim-lang/langserver"], feeds=[("blog feed", "https://nim-lang.org/feed.xml")]),186    src("crystal", "Crystal", "crystal-lang.org", ["crystal language", "crystal lang", "shards"], repos=["crystal-lang/crystal", "crystal-lang/shards", "luckyframework/lucky", "kemalcr/kemal"],187        feeds=[("blog feed", "https://crystal-lang.org/feed.xml", "ATOM")]),188    src("vlang", "V language", "vlang.io", ["vlang", "v programming language"], repos=["vlang/v", "vlang/ui"]),189    src("odin-lang", "Odin", "odin-lang.org", ["odin language", "odin programming language"], repos=["odin-lang/Odin"]),190    src("mojo", "Modular / Mojo", "modular.com", ["mojo language", "modular ai", "max engine"], categories=OSML, country="US", repos=["modular/modular"], feeds=[("blog feed", "https://www.modular.com/blog/rss.xml")]),191    src("perl", "Perl", "perl.org", ["perl language", "perl 5", "cpan", "raku", "rakudo"], products=["Perl 5", ("Raku", "software", ["perl 6"]), "Rakudo", "Mojolicious", "cpanminus", "Dancer2", "perltidy", "Perl::Critic"],192        repos=[("Perl/perl5", T), "rakudo/rakudo", "mojolicious/mojo", "miyagawa/cpanminus", "MoarVM/MoarVM", "PerlDancer/Dancer2", "perltidy/perltidy", "Perl-Critic/Perl-Critic"],193        feeds=[("perl.com feed", "https://www.perl.com/article/index.xml"), ("perl weekly", "https://perlweekly.com/perlweekly.rss")]),194    src("clojure", "Clojure", "clojure.org", ["clojure language", "clojurescript", "leiningen", "babashka"], products=["Clojure", "ClojureScript", "Leiningen", "Babashka", "shadow-cljs", "clj-kondo", "clojure-lsp", "CIDER", "Ring", "reitit", "re-frame", "Reagent"],195        repos=[("clojure/clojure", T), ("clojure/clojurescript", T), "technomancy/leiningen", "babashka/babashka", "thheller/shadow-cljs", "clj-kondo/clj-kondo", "clojure-lsp/clojure-lsp", "clojure-emacs/cider",196               "ring-clojure/ring", "metosin/reitit", "day8/re-frame", "reagent-project/reagent", "clojure/tools.deps"], feeds=[("clojure news", "https://clojure.org/feed.xml", "ATOM")]),197    src("racket", "Racket", "racket-lang.org", ["racket language", "plt scheme"], repos=["racket/racket", "racket/typed-racket"], feeds=[("blog feed", "https://blog.racket-lang.org/feeds/all.atom.xml", "ATOM")]),198    ext("julia", products=["Pkg.jl", "IJulia", "DifferentialEquations.jl", "Flux.jl", "Plots.jl", "DataFrames.jl", "Pluto.jl", "CUDA.jl", "JuMP", "juliaup", "Makie", "Turing.jl", "Genie", "Documenter"],199        repos=["JuliaLang/Pkg.jl", "JuliaLang/IJulia.jl", "julia-vscode/julia-vscode", "SciML/DifferentialEquations.jl", "FluxML/Flux.jl", "JuliaPlots/Plots.jl", "JuliaData/DataFrames.jl", "fonsp/Pluto.jl",200               "JuliaGPU/CUDA.jl", "jump-dev/JuMP.jl", "JuliaLang/juliaup", "MakieOrg/Makie.jl", "TuringLang/Turing.jl", "GenieFramework/Genie.jl", "JuliaDocs/Documenter.jl"]),201    ext("r-project", products=["ggplot2", "dplyr", "tidyr", "purrr", "devtools", "testthat", "roxygen2", "data.table", "Shiny", "R Markdown", "knitr", "rlang", "pak", "renv", "reticulate", "tidymodels", "sf", "plumber", "httr2", "targets", "bslib"],202        repos=[("wch/r-source", T), "tidyverse/ggplot2", "tidyverse/dplyr", "tidyverse/tidyr", "tidyverse/purrr", "r-lib/devtools", "r-lib/testthat", "r-lib/roxygen2", "Rdatatable/data.table", "rstudio/shiny",203               "rstudio/rmarkdown", "yihui/knitr", "r-lib/rlang", "r-lib/pak", "rstudio/renv", "rstudio/reticulate", "tidymodels/tidymodels", "r-spatial/sf", "rstudio/plumber", "r-lib/httr2", "ropensci/targets", "rstudio/bslib"]),204    src("posit", "Posit (RStudio)", "posit.co", ["posit pbc", "rstudio pbc", "rstudio", "quarto"], categories=["open-source", "developer", "science"], country="US", products=["RStudio", "Positron", "Quarto", "Shiny for Python", "Great Tables", "Ark"],205        repos=[("rstudio/rstudio", T), "posit-dev/positron", "quarto-dev/quarto-cli", "posit-dev/py-shiny", "posit-dev/great-tables", "posit-dev/publisher", "posit-dev/ark", "posit-dev/pointblank"],206        feeds=[("blog feed", "https://posit.co/feed/")]),207    ext("dotnet", aliases=["asp.net core", "aspnetcore", ".net maui", "entity framework", "blazor", "powershell"],208        products=["ASP.NET Core", ".NET SDK", ".NET MAUI", "Entity Framework Core", "Roslyn", "F#", "PowerShell", "NuGet", "Orleans", "Aspire", "MSBuild", "Avalonia", "Uno Platform", "Polly", "MediatR", "Serilog", "xUnit", "NUnit", "Dapper", "MassTransit", "Hangfire", "Npgsql"],209        repos=["dotnet/aspnetcore", "dotnet/sdk", "dotnet/maui", "dotnet/efcore", "dotnet/roslyn", "dotnet/fsharp", "PowerShell/PowerShell", "NuGet/NuGet.Client", "dotnet/orleans", "dotnet/aspire", "dotnet/msbuild",210               "AvaloniaUI/Avalonia", "unoplatform/uno", "App-vNext/Polly", "jbogard/MediatR", "serilog/serilog", "xunit/xunit", "nunit/nunit", "DapperLib/Dapper", "MassTransit/MassTransit", "HangfireIO/Hangfire",211               "npgsql/npgsql", "microsoft/garnet", "OmniSharp/omnisharp-roslyn"]),212    ext("deno", products=["Fresh", "Deno Standard Library"], repos=["denoland/fresh", "denoland/std"]),213    ext("microsoft", products=["Windows Terminal", "WSL", "winget", "vcpkg", "Playwright", "PowerToys", "Fluent UI", "LightGBM", "TypeSpec", "windows-rs", "Monaco Editor", "mimalloc", "MsQuic", "Windows App SDK", "typescript-go"],214        repos=["microsoft/terminal", "microsoft/WSL", "microsoft/winget-cli", "microsoft/vcpkg", "microsoft/playwright", "microsoft/PowerToys", "microsoft/fluentui", "microsoft/LightGBM", "microsoft/typespec",215               "microsoft/windows-rs", "microsoft/monaco-editor", "microsoft/mimalloc", "microsoft/msquic", "microsoft/WindowsAppSDK", "microsoft/typescript-go", "microsoft/vscode-python", "microsoft/vscode-cpptools",216               "microsoft/vscode-jupyter", "microsoft/pylance-release", "microsoft/rushstack"]),217    ext("typescript", products=["typedoc", "type-fest", "typescript-language-server", "DefinitelyTyped"],218        repos=["typescript-language-server/typescript-language-server", "TypeStrong/typedoc", "sindresorhus/type-fest", "TypeStrong/ts-loader"]),219220    "Web frameworks, front-end and build tooling",221    src("expressjs", "Express", "expressjs.com", ["express js", "expressjs", "express framework"], tier="B", repos=["expressjs/express", "expressjs/body-parser", "expressjs/multer", "expressjs/cors"]),222    src("fastify", "Fastify", "fastify.dev", ["fastify framework"], tier="B", repos=["fastify/fastify", "fastify/fastify-cli", "fastify/fastify-swagger", "fastify/fastify-jwt", "pinojs/pino"]),223    src("nestjs", "NestJS", "nestjs.com", ["nest js", "nestjs framework", "nest framework"], tier="B", repos=["nestjs/nest", "nestjs/nest-cli", "nestjs/graphql", "nestjs/swagger", "nestjs/typeorm"]),224    src("hono", "Hono", "hono.dev", ["honojs", "hono framework"], country="JP", repos=["honojs/hono", "honojs/middleware", "honojs/node-server", "honojs/honox"]),225    src("koa", "Koa", "koajs.com", ["koajs", "koa framework"], repos=["koajs/koa", "koajs/router"]),226    src("adonisjs", "AdonisJS", "adonisjs.com", ["adonis js", "adonisjs framework"], repos=["adonisjs/core", "adonisjs/lucid"]),227    src("remix", "Remix / React Router", "remix.run", ["remix run", "react router", "react-router"], tier="B", country="US", products=["React Router", "Remix"],228        repos=["remix-run/react-router", "remix-run/remix"], feeds=[("blog feed", "https://remix.run/blog/rss.xml")]),229    src("nuxt", "Nuxt", "nuxt.com", ["nuxt js", "nuxtjs", "nuxt framework", "unjs", "nitro"], tier="B", country="FR", products=["Nuxt", "Nitro", "UnJS", "Nuxt UI", "Nuxt Content", "h3"],230        repos=["nuxt/nuxt", "nitrojs/nitro", "h3js/h3", "nuxt/ui", "nuxt/content", "nuxt/image", "nuxt/devtools", "unjs/unstorage", "unjs/ofetch", "nuxt-modules/i18n"], feeds=[("blog feed", "https://nuxt.com/blog/rss.xml")]),231    ext("svelte", products=["SvelteKit", "vite-plugin-svelte", "Svelte language tools", "shadcn-svelte", "Skeleton", "Bits UI", "Threlte"],232        repos=["sveltejs/kit", "sveltejs/vite-plugin-svelte", "sveltejs/language-tools", "sveltejs/cli", "huntabyte/shadcn-svelte", "huntabyte/bits-ui", "skeletonlabs/skeleton", "threlte/threlte"]),233    src("solidjs", "SolidJS", "solidjs.com", ["solid js", "solidjs framework", "solidstart"], products=["Solid", "SolidStart", "Solid Router", "Kobalte"],234        repos=["solidjs/solid", "solidjs/solid-start", "solidjs/solid-router", "solidjs-community/solid-primitives", "kobaltedev/kobalte"]),235    src("qwik", "Qwik", "qwik.dev", ["qwik framework", "qwikcity", "builder.io qwik", "partytown"], products=["Qwik", "Partytown", "Mitosis"], repos=["QwikDev/qwik", "QwikDev/partytown", "BuilderIO/mitosis"]),236    src("htmx", "htmx", "htmx.org", ["htmx library", "hypermedia systems", "big sky software", "hyperscript"], products=["htmx", "_hyperscript", "idiomorph"],237        repos=["bigskysoftware/htmx", "bigskysoftware/htmx-extensions", "bigskysoftware/_hyperscript", "bigskysoftware/idiomorph"], feeds=[("essays feed", "https://htmx.org/atom.xml", "ATOM")]),238    src("alpinejs", "Alpine.js", "alpinejs.dev", ["alpine js", "alpinejs"], repos=["alpinejs/alpine"]),239    src("preact", "Preact", "preactjs.com", ["preactjs", "preact signals"], repos=["preactjs/preact", "preactjs/signals", "preactjs/preact-render-to-string", "preactjs/preset-vite"]),240    src("lit", "Lit", "lit.dev", ["lit element", "lit-element", "polymer", "web components"], country="US", products=["Lit", "Shoelace", "Stencil", "Open Web Components"],241        repos=["lit/lit", "shoelace-style/shoelace", "stenciljs/core", "open-wc/open-wc", "modernweb-dev/web"]),242    src("emberjs", "Ember.js", "emberjs.com", ["ember js", "emberjs", "ember cli", "ember data"], products=["Ember CLI", "Ember Data", "Embroider", "Glimmer"],243        repos=["emberjs/ember.js", "ember-cli/ember-cli", "emberjs/data", "embroider-build/embroider", "glimmerjs/glimmer-vm"], feeds=[("blog feed", "https://blog.emberjs.com/feed.xml")]),244    src("tanstack", "TanStack", "tanstack.com", ["tanstack query", "react query", "tanstack router", "tanstack table", "tanstack start"], tier="B", country="US",245        products=[("TanStack Query", "software", ["react query"]), "TanStack Router", "TanStack Table", "TanStack Start", "TanStack Form", "TanStack Virtual", "TanStack DB"],246        repos=["TanStack/query", "TanStack/router", "TanStack/table", "TanStack/form", "TanStack/virtual", "TanStack/db"]),247    ext("vue", products=["Vue Router", "Pinia", "VitePress", "Vue language tools (Volar)", "Vue DevTools", "VueUse", "Vuetify", "Element Plus", "PrimeVue", "Quasar", "Ant Design Vue", "Naive UI"],248        repos=["vuejs/router", "vuejs/pinia", "vuejs/vitepress", "vuejs/language-tools", "vuejs/devtools", "vuejs/test-utils", "vuejs/create-vue", "vuejs/eslint-plugin-vue", "vueuse/vueuse", "vuetifyjs/vuetify",249               "element-plus/element-plus", "primefaces/primevue", "quasarframework/quasar", "vueComponent/ant-design-vue", "tusen-ai/naive-ui", "unplugin/unplugin-vue-components", "vitejs/vite-plugin-vue"]),250    ext("react", products=["Relay", "Lexical", "Hermes", "Redux", "Redux Toolkit", "Zustand", "Jotai", "React Three Fiber", "react-spring", "React Hook Form", "Motion (Framer Motion)", "dnd kit", "SWR", "Recharts", "styled-components", "Emotion", "React Testing Library", "Metro", "Flow", "StyleX", "Docusaurus", "Yoga"],251        repos=["facebook/react", "facebook/relay", "facebook/lexical", "facebook/hermes", "reduxjs/redux", "reduxjs/redux-toolkit", "pmndrs/zustand", "pmndrs/jotai", "pmndrs/react-three-fiber", "pmndrs/react-spring",252               "react-hook-form/react-hook-form", "motiondivision/motion", "clauderic/dnd-kit", "vercel/swr", "recharts/recharts", "styled-components/styled-components", "emotion-js/emotion",253               "testing-library/react-testing-library", "facebook/metro", "facebook/flow", "facebook/yoga", "facebook/stylex", "facebook/docusaurus"]),254    ext("react-native", products=["React Navigation", "Reanimated", "Gesture Handler", "react-native-screens", "React Native Paper", "FlashList", "React Native Skia", "VisionCamera", "MMKV", "react-native-maps", "Async Storage", "Bottom Sheet", "React Native CLI"],255        repos=["react-navigation/react-navigation", "software-mansion/react-native-reanimated", "software-mansion/react-native-gesture-handler", "software-mansion/react-native-screens", "callstack/react-native-paper",256               "Shopify/flash-list", "Shopify/react-native-skia", "react-native-community/cli", "mrousavy/react-native-vision-camera", "mrousavy/react-native-mmkv", "react-native-maps/react-native-maps",257               "react-native-async-storage/async-storage", "gorhom/react-native-bottom-sheet", "callstack/react-native-testing-library"]),258    ext("angular", products=["Angular CLI", "Angular Material / CDK", "AngularFire", "NgRx", "ng-bootstrap", "PrimeNG", "ng-packagr", "angular-eslint", "Analog", "NGXS", "Transloco", "ngx-translate", "Taiga UI", "NG-ZORRO"],259        repos=["angular/angular-cli", "angular/components", "angular/angularfire", "ngrx/platform", "ng-bootstrap/ng-bootstrap", "primefaces/primeng", "ng-packagr/ng-packagr", "angular-eslint/angular-eslint",260               "analogjs/analog", "ngxs/store", "jsverse/transloco", "ngx-translate/core", "taiga-family/taiga-ui", "NG-ZORRO/ng-zorro-antd", "angular/vscode-ng-language-service"]),261    ext("tailwind", products=["Headless UI", "Heroicons", "tailwindcss-typography", "tailwindcss-forms", "prettier-plugin-tailwindcss", "Tailwind CSS IntelliSense", "daisyUI", "Flowbite", "tailwind-merge", "cva", "UnoCSS", "PostCSS", "Autoprefixer", "Sass", "Less", "Lightning CSS", "Bootstrap", "Bulma", "Pico CSS", "Open Props", "stylelint", "Browserslist", "cssnano"],262        repos=["tailwindlabs/headlessui", "tailwindlabs/heroicons", "tailwindlabs/tailwindcss-typography", "tailwindlabs/tailwindcss-forms", "tailwindlabs/prettier-plugin-tailwindcss", "tailwindlabs/tailwindcss-intellisense",263               "saadeghi/daisyui", "themesberg/flowbite", "dcastil/tailwind-merge", "joe-bell/cva", "unocss/unocss", "postcss/postcss", "postcss/autoprefixer", "sass/dart-sass", "less/less.js", "parcel-bundler/lightningcss",264               "twbs/bootstrap", "twbs/icons", "jgthms/bulma", "picocss/pico", "argyleink/open-props", "stylelint/stylelint", "browserslist/browserslist", "cssnano/cssnano"]),265    src("shadcn-ui", "shadcn/ui", "ui.shadcn.com", ["shadcn", "shadcn ui", "shadcn/ui"], tier="B", country="US", repos=["shadcn-ui/ui"]),266    src("radix-ui", "Radix UI", "radix-ui.com", ["radix ui", "radix primitives", "radix themes", "workos radix"], country="US", products=["Radix Primitives", "Radix Themes", "Radix Colors", "Radix Icons"],267        repos=["radix-ui/primitives", "radix-ui/themes", "radix-ui/colors", "radix-ui/icons"]),268    src("mui", "MUI (Material UI)", "mui.com", ["material ui", "material-ui", "mui x", "base ui", "pigment css", "toolpad"], tier="B", products=["Material UI", "MUI X", "Base UI", "Pigment CSS", "Toolpad"],269        repos=["mui/material-ui", "mui/mui-x", "mui/base-ui", "mui/pigment-css", "mui/toolpad"]),270    src("chakra-ui", "Chakra UI", "chakra-ui.com", ["chakra", "chakra ui", "zag js", "ark ui", "panda css"], products=["Chakra UI", "Zag", "Ark UI", "Panda CSS"], repos=["chakra-ui/chakra-ui", "chakra-ui/zag", "chakra-ui/ark", "chakra-ui/panda"]),271    src("ant-design", "Ant Design", "ant.design", ["antd", "ant design", "ant design pro", "ant design x"], country="CN", products=["Ant Design", "Ant Design Pro Components", "Ant Design Mobile", "Ant Design X"],272        repos=["ant-design/ant-design", "ant-design/pro-components", "ant-design/ant-design-mobile", "ant-design/x"]),273    src("mantine", "Mantine", "mantine.dev", ["mantine ui", "mantine dev"], repos=["mantinedev/mantine"]),274    src("storybook", "Storybook", "storybook.js.org", ["storybookjs", "storybook js", "chromatic"], tier="B", products=["Storybook", "Storybook test-runner", "Chromatic CLI"],275        repos=["storybookjs/storybook", "storybookjs/test-runner", "chromaui/chromatic-cli"]),276    src("primer", "GitHub Primer design system", "primer.style", ["primer design system", "primer react", "octicons"], country="US", products=["Primer React", "Primer CSS", "Primer Primitives", "Octicons"],277        repos=["primer/react", "primer/css", "primer/primitives", "primer/octicons"]),278    src("carbon-design-system", "Carbon Design System (IBM)", "carbondesignsystem.com", ["carbon design system", "ibm carbon", "carbon components"], country="US", products=["Carbon", "Carbon Charts"],279        repos=["carbon-design-system/carbon", "carbon-design-system/carbon-charts"]),280    src("adobe-spectrum", "Adobe Spectrum / React Aria", "react-spectrum.adobe.com", ["react spectrum", "react aria", "spectrum design system", "spectrum css", "spectrum web components"], country="US",281        products=["React Aria", "React Spectrum", "Spectrum CSS", "Spectrum Web Components"], repos=["adobe/react-spectrum", "adobe/spectrum-css", "adobe/spectrum-web-components"]),282    src("nx", "Nx", "nx.dev", ["nx monorepo", "nrwl", "nx dev", "lerna"], tier="B", country="US", products=["Nx", "Nx Console", "Lerna"], repos=["nrwl/nx", "nrwl/nx-console", "lerna/lerna"]),283    src("biome", "Biome", "biomejs.dev", ["biomejs", "biome toolchain", "rome tools"], tier="B", repos=["biomejs/biome", "biomejs/biome-vscode"]),284    src("oxc", "Oxc / VoidZero", "oxc.rs", ["oxc project", "oxlint", "void zero", "voidzero", "rolldown"], tier="B", products=["oxlint", "oxfmt", "Rolldown", "Vite+"],285        repos=["oxc-project/oxc", "oxc-project/oxc-resolver", "rolldown/rolldown", "voidzero-dev/vite-plus"]),286    src("swc", "SWC", "swc.rs", ["swc project", "speedy web compiler"], tier="B", repos=["swc-project/swc", "swc-project/swc-node", "swc-project/plugins"]),287    src("rspack", "Rspack / Rstack (ByteDance web-infra)", "rspack.dev", ["rspack", "rsbuild", "rspress", "rslib", "modern.js", "web-infra-dev"], tier="B", country="CN",288        products=["Rspack", "Rsbuild", "Rspress", "Rslib", "Rsdoctor", "Modern.js"],289        repos=["web-infra-dev/rspack", "web-infra-dev/rsbuild", "web-infra-dev/rspress", "web-infra-dev/rslib", "web-infra-dev/rsdoctor", "web-infra-dev/modern.js"]),290    src("parcel", "Parcel", "parceljs.org", ["parcel bundler", "parceljs"], repos=["parcel-bundler/parcel", "parcel-bundler/watcher"]),291    ext("vite", products=["vite-plugin-react", "vite-plugin-pwa", "Vike", "vitest VS Code", "eslint-plugin-vitest"],292        repos=["vitejs/vite-plugin-react", "vite-pwa/vite-plugin-pwa", "vikejs/vike", "vitest-dev/vscode", "vitest-dev/eslint-plugin-vitest"]),293    ext("webpack", products=["webpack-cli", "webpack-dev-server", "Module Federation", "webpack-bundle-analyzer"],294        repos=["webpack/webpack-cli", "webpack/webpack-dev-server", "module-federation/core", "webpack-contrib/webpack-bundle-analyzer", "webpack-contrib/css-loader", "webpack-contrib/mini-css-extract-plugin"]),295    ext("esbuild", products=["tsup"], repos=["egoist/tsup"]),296    ext("rollup", products=["Rollup plugins"], repos=["rollup/plugins"]),297    ext("babel", products=["babel-loader", "babel-plugin-macros"], repos=["babel/babel-loader", "babel/minify", "kentcdodds/babel-plugin-macros"]),298    ext("eslint", products=["ESLint Stylistic", "eslint-plugin-import", "eslint-plugin-react", "eslint-plugin-jsx-a11y", "eslint-plugin-unicorn", "eslint-plugin-n", "@eslint/css", "@eslint/markdown", "@eslint/json"],299        repos=["eslint-stylistic/eslint-stylistic", "import-js/eslint-plugin-import", "jsx-eslint/eslint-plugin-react", "jsx-eslint/eslint-plugin-jsx-a11y", "sindresorhus/eslint-plugin-unicorn", "eslint-community/eslint-plugin-n",300               "eslint/css", "eslint/markdown", "eslint/json", "eslint/rewrite", "eslint/config-inspector"]),301    ext("prettier", products=["prettier-vscode", "eslint-config-prettier", "eslint-plugin-prettier", "@prettier/plugin-php", "@prettier/plugin-ruby", "@prettier/plugin-xml", "pretty-quick"],302        repos=["prettier/prettier-vscode", "prettier/eslint-config-prettier", "prettier/eslint-plugin-prettier", "prettier/plugin-php", "prettier/plugin-ruby", "prettier/plugin-xml", "prettier/pretty-quick"]),303    src("graphql", "GraphQL Foundation", "graphql.org", ["graphql", "graphql foundation", "graphql spec", "graphql-js"], categories=["open-source", "developer", "standards"], country="US",304        products=["GraphQL specification", "GraphQL.js", "GraphiQL", "GraphQL Code Generator", "GraphQL Yoga", "GraphQL Mesh", "graphql-ws", "DataLoader"],305        repos=["graphql/graphql-js", ("graphql/graphql-spec", T), "graphql/graphiql", "dotansimha/graphql-code-generator", "graphql-hive/graphql-yoga", "graphql-hive/graphql-mesh", "enisdenjo/graphql-ws", "graphql/dataloader"],306        feeds=[("blog feed", "https://graphql.org/blog/rss.xml")]),307    src("apollo-graphql", "Apollo GraphQL", "apollographql.com", ["apollo graphql", "apollo server", "apollo client", "apollo router", "apollo federation"], tier="B", country="US",308        products=["Apollo Server", "Apollo Client", "Apollo Router", "Apollo Federation", "Rover"], repos=["apollographql/apollo-server", "apollographql/apollo-client", "apollographql/router", "apollographql/federation", "apollographql/rover"]),309    src("hasura", "Hasura", "hasura.io", ["hasura graphql engine", "hasura ddn", "promptql"], tier="B", country="US", products=["Hasura GraphQL Engine", "Hasura DDN", "PromptQL"], repos=["hasura/graphql-engine", "hasura/ndc-postgres", "hasura/ndc-hub"]),310    src("prisma", "Prisma", "prisma.io", ["prisma orm", "prisma client", "prisma postgres", "prisma accelerate"], tier="B", country="DE", products=["Prisma ORM", "Prisma Postgres", "Prisma Accelerate"],311        repos=["prisma/prisma", "prisma/prisma-engines", "prisma/language-tools", "prisma/studio"], feeds=[("blog feed", "https://www.prisma.io/blog/rss.xml")]),312    src("drizzle", "Drizzle ORM", "orm.drizzle.team", ["drizzle orm", "drizzle kit", "drizzle team"], tier="B", repos=["drizzle-team/drizzle-orm", "drizzle-team/drizzle-kit-mirror"]),313    src("trpc", "tRPC", "trpc.io", ["trpc", "typescript rpc"], repos=["trpc/trpc"]),314    src("keycloak", "Keycloak", "keycloak.org", ["keycloak", "red hat sso", "keycloak identity"], tier="B", categories=OSSEC, repos=["keycloak/keycloak", "keycloak/keycloak-quickstarts"], feeds=[("blog feed", "https://www.keycloak.org/rss.xml")]),315    src("ory", "Ory", "ory.sh", ["ory kratos", "ory hydra", "ory keto", "ory oathkeeper", "ory network"], categories=OSSEC, country="DE", products=["Kratos", "Hydra", "Keto", "Oathkeeper"],316        repos=["ory/kratos", "ory/hydra", "ory/keto", "ory/oathkeeper", "ory/fosite"]),317    src("authentik", "authentik", "goauthentik.io", ["authentik", "goauthentik", "authentik security"], categories=OSSEC, country="US", repos=["goauthentik/authentik"]),318    src("authelia", "Authelia", "authelia.com", ["authelia"], categories=OSSEC, repos=["authelia/authelia"]),319    src("zitadel", "ZITADEL", "zitadel.com", ["zitadel", "zitadel identity"], categories=OSSEC, country="CH", repos=["zitadel/zitadel", "zitadel/oidc"]),320    src("authjs", "Auth.js (NextAuth.js)", "authjs.dev", ["auth.js", "authjs", "next-auth", "nextauth", "nextauth.js"], repos=["nextauthjs/next-auth"]),321    src("better-auth", "Better Auth", "better-auth.com", ["better auth", "better-auth"], repos=["better-auth/better-auth"]),322    src("supertokens", "SuperTokens", "supertokens.com", ["supertokens"], categories=OSSEC, repos=["supertokens/supertokens-core", "supertokens/supertokens-node"]),323    src("casbin", "Casbin / Casdoor", "casbin.org", ["casbin", "casdoor"], categories=OSSEC, repos=["casbin/casbin", "casdoor/casdoor", "casbin/jcasbin", "casbin/pycasbin"]),324    src("hanko", "Hanko", "hanko.io", ["hanko", "hanko passkeys"], categories=OSSEC, country="DE", repos=["teamhanko/hanko"]),325    src("logto", "Logto", "logto.io", ["logto"], categories=OSSEC, repos=["logto-io/logto"]),326    src("cypress", "Cypress", "cypress.io", ["cypress testing", "cypress.io"], tier="B", country="US", repos=["cypress-io/cypress", "cypress-io/github-action"]),327    src("testing-library", "Testing Library", "testing-library.com", ["testing library", "dom testing library", "user-event", "jest-dom"], products=["DOM Testing Library", "user-event", "jest-dom", "Vue Testing Library", "Svelte Testing Library", "Angular Testing Library"],328        repos=["testing-library/dom-testing-library", "testing-library/user-event", "testing-library/jest-dom", "testing-library/vue-testing-library", "testing-library/svelte-testing-library", "testing-library/angular-testing-library"]),329    src("mock-service-worker", "Mock Service Worker", "mswjs.io", ["msw", "mock service worker", "mswjs"], repos=["mswjs/msw", "mswjs/data", "mswjs/interceptors"]),330    src("faker", "Faker", "fakerjs.dev", ["faker js", "fakerjs", "faker.js", "faker python", "datafaker"], products=["Faker (JS)", "Faker (Python)", "Faker (Ruby)", "FakerPHP", "Datafaker", "gofakeit"],331        repos=["faker-js/faker", "joke2k/faker", "faker-ruby/faker", "FakerPHP/Faker", "datafaker-net/datafaker", "brianvoe/gofakeit"]),332    src("d3", "D3 / Observable", "d3js.org", ["d3 js", "d3js", "d3.js", "observable plot", "observablehq"], country="US", products=["D3", "Observable Plot", "Observable Framework", "Observable Runtime"],333        repos=["d3/d3", "observablehq/plot", "observablehq/framework", "observablehq/runtime"]),334    src("chartjs", "Chart.js", "chartjs.org", ["chart js", "chartjs", "chart.js"], products=["Chart.js", "chartjs-plugin-datalabels", "chartjs-plugin-annotation", "chartjs-plugin-zoom", "react-chartjs-2"],335        repos=["chartjs/Chart.js", "chartjs/chartjs-plugin-datalabels", "chartjs/chartjs-plugin-annotation", "chartjs/chartjs-plugin-zoom", "reactchartjs/react-chartjs-2"]),336    src("apexcharts", "ApexCharts", "apexcharts.com", ["apexcharts", "apex charts"], repos=["apexcharts/apexcharts.js", "apexcharts/react-apexcharts", "apexcharts/vue-apexcharts", "apexcharts/ng-apexcharts"]),337    src("plotly", "Plotly", "plotly.com", ["plotly", "plotly.js", "plotly python", "plotly dash", "plotly express"], tier="B", country="CA", products=["plotly.js", "plotly.py", "Dash", "Dash AG Grid", "Kaleido", "Dash Mantine Components", "dash-bootstrap-components"],338        repos=["plotly/plotly.js", "plotly/plotly.py", "plotly/dash-ag-grid", "plotly/Kaleido", "snehilvj/dash-mantine-components", "facultyai/dash-bootstrap-components", "plotly/plotly.rs"]),339    src("vega", "Vega / Vega-Lite / Altair", "vega.github.io", ["vega", "vega-lite", "altair", "vega-altair", "vega embed"], country="US", products=["Vega", "Vega-Lite", "Vega-Altair", "vega-embed", "vl-convert"],340        repos=["vega/vega", "vega/vega-lite", "vega/altair", "vega/vega-embed", "vega/vl-convert"]),341    src("holoviz", "Bokeh / HoloViz", "holoviz.org", ["bokeh", "holoviz", "holoviews", "hvplot", "datashader", "param"], categories=["open-source", "developer", "science"], products=["Bokeh", "Panel", "HoloViews", "hvPlot", "Datashader", "Param"],342        repos=["bokeh/bokeh", "holoviz/panel", "holoviz/holoviews", "holoviz/hvplot", "holoviz/datashader", "holoviz/param"]),343    src("threejs", "three.js", "threejs.org", ["three js", "threejs", "three.js", "mrdoob"], tier="B", products=["three.js", "drei", "Theatre.js"], repos=["mrdoob/three.js", "pmndrs/drei", "pmndrs/postprocessing"]),344    src("babylonjs", "Babylon.js", "babylonjs.com", ["babylon js", "babylonjs", "babylon.js"], country="US", repos=["BabylonJS/Babylon.js", "BabylonJS/Editor"]),345    src("pixijs", "PixiJS", "pixijs.com", ["pixi js", "pixijs", "pixi.js"], repos=["pixijs/pixijs", "pixijs/pixi-react", "pixijs/layout"]),346    src("phaser", "Phaser", "phaser.io", ["phaser game framework", "phaserjs", "phaser editor"], country="GB", repos=["phaserjs/phaser", "phaserjs/editor"]),347    src("playcanvas", "PlayCanvas", "playcanvas.com", ["playcanvas engine", "supersplat"], country="GB", repos=["playcanvas/engine", "playcanvas/supersplat", "playcanvas/editor"]),348    src("maplibre", "MapLibre", "maplibre.org", ["maplibre gl", "maplibre native", "martin tiles", "maputnik"], categories=["open-source", "developer", "technology"], products=["MapLibre GL JS", "MapLibre Native", "Martin", "Maputnik", "MapLibre Style Spec"],349        repos=["maplibre/maplibre-gl-js", "maplibre/maplibre-native", "maplibre/martin", "maplibre/maputnik", "maplibre/maplibre-style-spec"]),350    src("leaflet", "Leaflet", "leafletjs.com", ["leaflet js", "leafletjs", "leaflet.js"], repos=["Leaflet/Leaflet", "Leaflet/Leaflet.markercluster", "PaulLeCam/react-leaflet"]),351    src("openlayers", "OpenLayers", "openlayers.org", ["openlayers", "ol"], repos=["openlayers/openlayers", "openlayers/ol-ext"]),352    src("deckgl", "deck.gl / vis.gl", "deck.gl", ["deck.gl", "deckgl", "vis.gl", "visgl", "luma.gl", "loaders.gl", "react-map-gl", "kepler.gl"], categories=["open-source", "developer", "technology"], country="US",353        products=["deck.gl", "luma.gl", "loaders.gl", "react-map-gl", "kepler.gl"], repos=["visgl/deck.gl", "visgl/luma.gl", "visgl/loaders.gl", "visgl/react-map-gl", "keplergl/kepler.gl"]),354    src("cesium", "CesiumJS", "cesium.com", ["cesium", "cesiumjs", "3d tiles", "cesium ion"], categories=["open-source", "developer", "technology"], country="US", products=["CesiumJS", "3D Tiles", "Cesium for Unreal", "Cesium for Unity"],355        repos=["CesiumGS/cesium", ("CesiumGS/3d-tiles", T), "CesiumGS/cesium-unreal", "CesiumGS/cesium-unity", "CesiumGS/cesium-native"]),356]357