{"id":37190856,"url":"https://github.com/obitech/genqlient","last_synced_at":"2026-01-14T22:03:25.274Z","repository":{"id":184166636,"uuid":"671413030","full_name":"obitech/genqlient","owner":"obitech","description":"a truly type-safe Go GraphQL client","archived":false,"fork":true,"pushed_at":"2023-07-31T09:28:03.000Z","size":1354,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-04-30T11:52:33.853Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"Khan/genqlient","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/obitech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"docs/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"docs/SECURITY.md","support":null,"governance":null}},"created_at":"2023-07-27T09:01:16.000Z","updated_at":"2024-04-30T11:52:33.853Z","dependencies_parsed_at":"2023-07-27T10:42:34.632Z","dependency_job_id":null,"html_url":"https://github.com/obitech/genqlient","commit_stats":null,"previous_names":["obitech/genqlient"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/obitech/genqlient","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obitech%2Fgenqlient","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obitech%2Fgenqlient/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obitech%2Fgenqlient/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obitech%2Fgenqlient/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/obitech","download_url":"https://codeload.github.com/obitech/genqlient/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/obitech%2Fgenqlient/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28436268,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T21:32:52.117Z","status":"ssl_error","status_checked_at":"2026-01-14T21:32:33.442Z","response_time":107,"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":[],"created_at":"2026-01-14T22:03:24.274Z","updated_at":"2026-01-14T22:03:25.266Z","avatar_url":"https://github.com/obitech.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg width=\"100%\" alt=\"generated graphql client ⇒ genqlient\" src=\"docs/images/genqlient.svg\"\u003e\n\n[![Go Reference](https://pkg.go.dev/badge/github.com/Khan/genqlient.svg)](https://pkg.go.dev/github.com/Khan/genqlient)\n[![Test Status](https://github.com/Khan/genqlient/actions/workflows/go.yml/badge.svg)](https://github.com/Khan/genqlient/actions)\n[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](docs/CODE_OF_CONDUCT.md)\n[![GoReportcard](https://goreportcard.com/badge/github.com/Khan/genqlient?status.svg)](https://goreportcard.com/report/github.com/Khan/genqlient)\n\n# genqlient: a truly type-safe Go GraphQL client\n\n## What is genqlient?\n\ngenqlient is a Go library to easily generate type-safe code to query a GraphQL API. It takes advantage of the fact that both GraphQL and Go are typed languages to ensure at compile-time that your code is making a valid GraphQL query and using the result correctly, all with a minimum of boilerplate.\n\ngenqlient provides:\n\n- Compile-time validation of GraphQL queries: never ship an invalid GraphQL query again!\n- Type-safe response objects: genqlient generates the right type for each query, so you know the response will unmarshal correctly and never need to use `interface{}`.\n- Production-readiness: genqlient is used in production at Khan Academy, where it supports millions of learners and teachers around the world.\n\n## How do I use genqlient?\n\nYou can download and run genqlient the usual way: `go run github.com/Khan/genqlient`.  To set your project up to use genqlient, see the [getting started guide](docs/INTRODUCTION.md), or the [example](example).  For more complete documentation, see the [docs](docs).\n\n## How can I help?\n\ngenqlient welcomes contributions!  Check out the ([Contribution Guidelines](docs/CONTRIBUTING.md)), or file an issue [on GitHub](issues).\n\n## Why another GraphQL client?\n\nMost common Go GraphQL clients have you write code something like this:\n```go\nquery := `query GetUser($id: ID!) { user(id: $id) { name } }`\nvariables := map[string]interface{}{\"id\": \"123\"}\nvar resp struct {\n\tMe struct {\n\t\tName graphql.String\n\t}\n}\nclient.Query(ctx, query, \u0026resp, variables)\nfmt.Println(resp.Me.Name)\n// Output: Luke Skywalker\n```\n\nThis code works, but it has a few problems:\n\n- While the response struct is type-safe at the Go level; there's nothing to check that the schema looks like you expect.  Maybe the field is called `fullName`, not `name`; or maybe you capitalized it wrong (since Go and GraphQL have different conventions); you won't know until runtime.\n- The GraphQL variables aren't type-safe at all; you could have passed `{\"id\": true}` and again you won't know until runtime!\n- You have to write everything twice, or hide the query in complicated struct tags, or give up what type safety you do have and resort to `interface{}`.\n\nThese problems aren't a big deal in a small application, but for serious production-grade tools they're not ideal.  And they should be entirely avoidable: GraphQL and Go are both typed languages; and GraphQL servers expose their schema in a standard, machine-readable format.  We should be able to simply write a query and have that automatically validated against the schema and turned into a Go struct which we can use in our code.  In fact, there's already good prior art to do this sort of thing: [99designs/gqlgen](https://github.com/99designs/gqlgen) is a popular server library that generates types, and Apollo has a [codegen tool](https://www.apollographql.com/docs/devtools/cli/#supported-commands) to generate similar client-types for several other languages.  (See [docs/DESIGN.md](docs/DESIGN.md) for more prior art.)\n\ngenqlient fills that gap: you just specify the query, and it generates type-safe helpers, validated against the schema, that make the query.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fobitech%2Fgenqlient","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fobitech%2Fgenqlient","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fobitech%2Fgenqlient/lists"}