{"id":30859252,"url":"https://github.com/castaneai/minimatch","last_synced_at":"2025-09-07T14:58:23.084Z","repository":{"id":156894920,"uuid":"617820862","full_name":"castaneai/minimatch","owner":"castaneai","description":"Minimal Open Match replacement","archived":false,"fork":false,"pushed_at":"2025-05-31T03:33:00.000Z","size":618,"stargazers_count":33,"open_issues_count":1,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-05-31T14:03:26.972Z","etag":null,"topics":["matchmaking"],"latest_commit_sha":null,"homepage":"","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/castaneai.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,"zenodo":null}},"created_at":"2023-03-23T07:17:52.000Z","updated_at":"2025-05-31T03:33:03.000Z","dependencies_parsed_at":"2023-12-25T06:25:09.679Z","dependency_job_id":"0a4558cb-fc27-42ed-9194-cfc2e022be85","html_url":"https://github.com/castaneai/minimatch","commit_stats":null,"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/castaneai/minimatch","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/castaneai%2Fminimatch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/castaneai%2Fminimatch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/castaneai%2Fminimatch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/castaneai%2Fminimatch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/castaneai","download_url":"https://codeload.github.com/castaneai/minimatch/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/castaneai%2Fminimatch/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274051970,"owners_count":25214030,"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","status":"online","status_checked_at":"2025-09-07T02:00:09.463Z","response_time":67,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["matchmaking"],"created_at":"2025-09-07T14:57:50.986Z","updated_at":"2025-09-07T14:58:23.062Z","avatar_url":"https://github.com/castaneai.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# minimatch\n\nMinimal [Open Match](https://open-match.dev/) replacement.\n\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/castaneai/minimatch)\n\n## Why minimatch?\n\n![](./overview.png)\n\n[Open Match](https://open-match.dev/) is a good solution for scalable matchmaking, but its scalability complicates the architecture.\nMost of us are game developers, not Kubernetes experts.\n\n**minimatch** provides an API compatible with Open Match, but runs entirely in a single Go process. No Kubernetes required. \nIt's also [highly scalable](./docs/scalable.md) by offloading state to Redis,\nmaking it suitable for everything from local development to full-scale production.\n\n## Features\n\n- [x] Open Match compatible Frontend Service (gRPC, gRPC-Web and [Connect](https://connectrpc.com/docs/protocol/))\n  - [x] Create/Get/Watch/Delete ticket\n  - [ ] Backfill\n- [x] Run match functions and propose matches\n- [x] Evaluator\n\n## Quickstart\n\nminimatch consists of two parts: **Frontend** and **Backend**.\n\nFrontend is an API Server for creating tickets and checking matchmaking status.\n\nBackend is a job to retrieve tickets and perform matchmaking.\nYou can pass the **MatchProfile**,\n**MatchFunction** and **Assigner** to the backend.\n\n**MatchProfile** is the definition of matchmaking. It has pools for classifying tickets.\n**MatchFunction** performs matchmaking based on Ticket for each fetched pool.\nAnd **Assigner** assigns a GameServer info to the established matches.\n\nThe following is a minimal code. See [examples/](./examples) for a more actual example.\n\n## Use case\n\n### Testing matchmaking logic\n\nMinimatch has Open Match Frontend compatible services.\nTherefore, it can be used for testing of matchmaking logic without Kubernetes.\n\nminimatch has a helper function `RunTestServer` making it easy to write matchmaking tests.\nSee [examples/integration_test](./examples/integration_test/integration_test.go) for more specific examples.\n\n```go\npackage xxx_test\n\nimport (\n  \"testing\"\n\n  \"github.com/castaneai/minimatch\"\n  pb \"github.com/castaneai/minimatch/gen/openmatch\"\n)\n\nfunc TestSimpleMatch(t *testing.T) {\n  s := minimatch.RunTestServer(t, map[*pb.MatchProfile]minimatch.MatchFunction{\n    profile: minimatch.MatchFunctionFunc(MakeMatches),\n  }, minimatch.AssignerFunc(AssignGameServer))\n  frontend := s.DialFrontend(t)\n\n  // ...\n}\n```\n\n### Small development environments\n\nWhen environments are separated for development and production,\nyou may want to reduce infrastructure costs for the development environment.\n\nIn such cases, minimatch can be installed instead of Open Match to create a minimum development environment.\nminimatch has an Open Match compatible Frontend Service, so there is no need to change the API!\n\nSee [Simple 1vs1 matchmaking server](./examples/simple1vs1/simple1vs1.go) for examples.\n\n## Differences from Open Match\n\nminimatch is modeled after [Open Match](https://github.com/googleforgames/open-match),\nbut has some differences in its internal architecture.\n\nSee [Differences from Open Match](./docs/differences.md) for details.\n\n\n## Scalability\n\nIs minimatch really just a mini? No, it is not! Despite its name, minimatch has scalability.\nPlease see [Scalable minimatch](./docs/scalable.md).\n\n## Consistency and performance\n\nPlease see the following docs for consistency and performance to consider in minimatch.\n\n[Consistency and performance](./docs/consistency.md)\n\n## Metrics \n\nminimatch Backend exposes metrics in OpenTelemetry format to help monitor performance.\nPlease see [Metrics](./docs/metrics.md) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcastaneai%2Fminimatch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcastaneai%2Fminimatch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcastaneai%2Fminimatch/lists"}