{"id":20239074,"url":"https://github.com/kevinmichaelchen/go-dgraph-starter","last_synced_at":"2026-04-14T06:01:13.293Z","repository":{"id":53504514,"uuid":"342881202","full_name":"kevinmichaelchen/go-dgraph-starter","owner":"kevinmichaelchen","description":"A Todo List app powered by a gRPC, GraphQL, Dgraph, Redis, Meilisearch, and NextJS.","archived":false,"fork":false,"pushed_at":"2021-03-27T15:35:57.000Z","size":569,"stargazers_count":2,"open_issues_count":12,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-10-09T23:34:04.256Z","etag":null,"topics":["dgo","dgraph","golang","graphql","graphql-go","grpc","nextjs","opentelemetry","protobuf","protocol-buffers"],"latest_commit_sha":null,"homepage":"https://github.com/kevinmichaelchen/go-dgraph-starter/projects/1","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kevinmichaelchen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-02-27T14:52:45.000Z","updated_at":"2023-07-16T12:45:52.000Z","dependencies_parsed_at":"2022-09-18T03:40:19.503Z","dependency_job_id":null,"html_url":"https://github.com/kevinmichaelchen/go-dgraph-starter","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kevinmichaelchen/go-dgraph-starter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinmichaelchen%2Fgo-dgraph-starter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinmichaelchen%2Fgo-dgraph-starter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinmichaelchen%2Fgo-dgraph-starter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinmichaelchen%2Fgo-dgraph-starter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kevinmichaelchen","download_url":"https://codeload.github.com/kevinmichaelchen/go-dgraph-starter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinmichaelchen%2Fgo-dgraph-starter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31784254,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T02:24:21.117Z","status":"ssl_error","status_checked_at":"2026-04-14T02:24:20.627Z","response_time":153,"last_error":"SSL_read: 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":["dgo","dgraph","golang","graphql","graphql-go","grpc","nextjs","opentelemetry","protobuf","protocol-buffers"],"created_at":"2024-11-14T08:37:16.860Z","updated_at":"2026-04-14T06:01:13.256Z","avatar_url":"https://github.com/kevinmichaelchen.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"![go-dgraph-starter](https://raw.githubusercontent.com/graph-gophers/graphql-go/master/docs/img/logo.png)\n\n## Table of Contents\n1. [Introduction](#introduction)\n    1. [In Progress](#in-progress)\n    1. [Tools](#tools)\n        1. [Protocol Buffers](#protocol-buffers)\n        1. [gRPC](#grpc)\n        1. [GraphQL](#graphql)\n        1. [Dgraph](#dgraph)\n        1. [Sqlboiler](#sqlboiler)\n        1. [Meilisearch](#meilisearch)\n    1. [Patterns](#patterns)\n        1. [Cursor pagination](#cursor-pagination)\n        1. [Garden](#garden)\n        1. [Change Data Capture](#change-data-capture)\n\nTOC generated with\n```\ndocker run -v $PWD:/app -w /app --rm -it pbzweihander/markdown-toc README.md --min-depth 1 \n```\n\n## Introduction\n\n[![forthebadge](https://forthebadge.com/images/badges/60-percent-of-the-time-works-every-time.svg)](https://forthebadge.com)\n\nThis is a Todo List app built with [Dgraph](https://dgraph.io/)-backed [gRPC](https://grpc.io/) and [GraphQL](https://graphql.org/) APIs, combined with a [NextJS](https://nextjs.org/) + [Chakra-UI](https://chakra-ui.com/) powered front-end.\n\n### In Progress\n\nThis project is still very much in progress.\n\nhttps://github.com/kevinmichaelchen/go-dgraph-starter/projects/1\n\n### Tools\n\n#### Protocol Buffers\n\nProtocol buffers are a great choice for a language-neutral representation\nof your data models.\n\nThey are binary, lean, and fast to serialize when compared with JSON.\n\nTheir extensibility comes from the fact that you can\nadd or remove fields in a way while maintaining backwards compatibilty.\n\nCode generation makes it easy to generate your models in any language.\n\n#### gRPC\n\ngRPC is a lean transport system (typically paired with HTTP/2) meant to\nreduce latency and payload size.\n\nHTTP/2 allows for long-lived connections (fewer handshakes).\n\nUnlike REST, gRPC uses an HTTP POST method for all calls, and doesn't specify the resource in its URL, which means edge caching is impossible.\n\ngRPC is also binary, so it's not as easy to debug than something human-readable, like GraphQL. But it is excellent for internal calls between microservices.\n\n#### GraphQL\n\nGraphQL is an ideal query language for APIs, especially when consumed by web clients. It's typically human-readable (JSON). Clients can specify exactly which fields they want. GraphiQL is an amazing tool for gaining insight into what an API offers.\n\nIt also can make you think about your data as a graph.\n\n#### Dgraph\n\nDgraph is a popular open-source, fast, distributed graph database written in Golang.\nYou get high throughput and low latency for deep joins and complex traversals.\nIt offers a query language that is a superset of GraphQL.\n\nGraph databases in general prioritize relationships between data points, rather than the data points themselves.\n\nPerformance: SQL performance suffers the more joins you ask it to do.\n\nFlexibility / Complexity: Like NoSQL, the schema can be modified easily with time. Adding new relationships is as simple as adding a predicate. No need to create join tables. Ultimately, the graph model is more simpler / more intuitive.\n\n#### Sqlboiler\n\nIt's not currently used in this project, but it's worth mentioning [Sqlboiler](https://github.com/volatiletech/sqlboiler)\nsince I believe it is by far the best SQL ORM for Golang due its \"data-first\"\napproach: it auto-generates Go code based on your existing schema and as a\nresult you get extreme type safety.\n\nFor services that aren't expected to have a whole lot of data relationships, SQL is still an excellent choice, and sqlboiler is an ideal ORM for keeping your persistence layer code strongly typed.\n\n#### Meilisearch\n\nWe use [MeiliSearch](https://www.meilisearch.com/) as our \"open source, blazingly fast and hyper relevant search-engine.\"\n\nPer their site, MeiliSearch is effective and accessible:\n\n\u003e Efficient search engines are often only accessible to companies with the financial means and resources necessary to develop a search solution adapted to their needs. The majority of other companies that do not have the means or do not realize that the lack of relevance of a search greatly impacts the pleasure of navigation on their application, end up with poor solutions that are more frustrating than effective, for both the developer and the user.\n\n### Patterns\n\n#### Cursor pagination\n\n- https://uxdesign.cc/why-facebook-says-cursor-pagination-is-the-greatest-d6b98d86b6c0\n- https://relay.dev/graphql/connections.htm\n\n#### Garden\n\nThe problem: developers will not bother with running CI tests and integration tests locally; instead they'll push to their GitHub PR and let the CI system take care of it.\n\nNot only are they deprived of a production-like system on their local machines, but the feedback loop is too slow: having CircleCI run all the end-to-end tests takes too long.\n\n[Garden](https://garden.io/) fixes all of this and breaks down the barrier between dev, testing, and CI.\n\nFor shops with hundreds or thousands of microservices, I can see the argument that it's excessive (or even impossible) to run the whole system on your local machine. That said, maybe there's a term for a subset of services that are related, and maybe it's worth running those on Garden.\n\n#### Change Data Capture\n\nIn a distributed system, when events occur in one service, they need to eventually be broadcast to other services. Too often, I've seen an event get emitted inside a database transaction, regardless of whether that transaction succeeds or fails. The [transactional outbox](https://microservices.io/patterns/data/transactional-outbox.html) pattern offers a way to keep data across services in sync.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkevinmichaelchen%2Fgo-dgraph-starter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkevinmichaelchen%2Fgo-dgraph-starter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkevinmichaelchen%2Fgo-dgraph-starter/lists"}