{"id":16918141,"url":"https://github.com/vito/dagql","last_synced_at":"2025-10-12T14:10:57.953Z","repository":{"id":211942374,"uuid":"730035683","full_name":"vito/dagql","owner":"vito","description":"an opinionated GraphQL server","archived":false,"fork":false,"pushed_at":"2024-01-11T01:01:13.000Z","size":276,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-11T16:32:28.075Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","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/vito.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}},"created_at":"2023-12-11T04:02:40.000Z","updated_at":"2024-01-17T13:18:24.000Z","dependencies_parsed_at":"2023-12-18T23:02:51.264Z","dependency_job_id":"884e459f-7939-4672-b3c8-059a46722508","html_url":"https://github.com/vito/dagql","commit_stats":null,"previous_names":["vito/dagql"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vito%2Fdagql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vito%2Fdagql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vito%2Fdagql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vito%2Fdagql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vito","download_url":"https://codeload.github.com/vito/dagql/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248441349,"owners_count":21103976,"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","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":"2024-10-13T19:38:57.937Z","updated_at":"2025-10-12T14:10:52.891Z","avatar_url":"https://github.com/vito.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# dagql\n\nDagQL is a strongly opinionated implementation of a GraphQL server.\n\n## axioms\n\nBelow are a set of assertions that build on one another.\n\n* All Objects are immutable.\n* All Objects are [Nodes][Node], i.e. all objects have an `id`.\n* All Objects have their own ID type, e.g. `PointID`.\n* All Objects have a top-level constructor named after the object, e.g. `point`.\n* All Objects may be loaded from an ID, which will create the Object if needed.\n* An Object's field may be `@impure` which indicates that the field's result shall not be cached.\n* An Object's field may be `@meta` which indicates that the field may be omitted without affecting the result.\n* All IDs are derived from the query that constructed the Object.\n* An ID is *canonicalized* by removing any embedded `@meta` selectors.\n* An ID is *impure* if it contains any `@impure` selectors or any *tainted* IDs.\n* An ID may be loaded on a server that has never seen its Object before.\n* When a *pure* ID is loaded it must always return the same Object.\n* When an *impure* ID is loaded it may return a different Object each time.\n* An *impure* query or ID may return an Object with a *pure* ID.\n* All data may be kept in-memory with LRU-like caching semantics.\n* All Arrays returned by Objects have deterministic order.\n* An ID may refer to an Object returned in an Array by specifing the *nth* index (starting at 1).\n* All Objects in Arrays have IDs: either an ID of their own, or the field's ID with *nth* set.\n* At the GraphQL API layer, Objects are passed to each other by ID.\n* At the code layer, Objects received as arguments are automatically loaded from a given ID.\n\n[Node]: https://graphql.org/learn/global-object-identification/\n\n## context\n\nThis repository might be re-integrated into Dagger, but for now is just a\npersonal experiment.\n\nIt should replace our use of the following forks:\n\n* `github.com/dagger/graphql`\n* `github.com/dagger/graphql-go-tools`\n\nI think it may make sense to leave as its own repo just to make sure there's a\nclear boundary between the theory and the practice. But it should probably move\ninto the Dagger account.\n\n## TODO\n\n* [x] parallel query execution\n* [ ] figure out whether constructor patterns are enshrined or ad-hoc\n* [x] figure out how to return objects that already have an ID (e.g. `loadFooFromID` should not have itself in the returned ID)\n* [ ] implement caching semantics, including `@impure` and `@meta`\n* [ ] figure out telemetry\n* [ ] support schema docs for everything (types, fields, args, enum values, etc)\n* [ ] figure out how interfaces work\n* [ ] IDs should also contain module info\n* [ ] IDs should also contain digest of result (stretch goal, this is higher\n  level, e.g. we want literal file checksums for objects that represent a file)\n* [x] get rid of Identified in favor of Object? (see interfaces + wrapping concern below)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvito%2Fdagql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvito%2Fdagql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvito%2Fdagql/lists"}