{"id":26996083,"url":"https://github.com/peter-mghendi/karata","last_synced_at":"2026-05-30T19:00:50.642Z","repository":{"id":43639246,"uuid":"377863443","full_name":"peter-mghendi/karata","owner":"peter-mghendi","description":"Open-source, real-time, online multiplayer Kenyan street poker on ASP.NET Core, Blazor Webassembly and websockets via SignalR.","archived":false,"fork":false,"pushed_at":"2026-05-27T14:06:42.000Z","size":1932,"stargazers_count":18,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-05-27T15:18:09.459Z","etag":null,"topics":["blazor","dotnet","realtime","signalr","webassembly","websockets"],"latest_commit_sha":null,"homepage":"https://karata.app","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/peter-mghendi.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-06-17T14:42:00.000Z","updated_at":"2026-05-27T14:09:19.000Z","dependencies_parsed_at":"2025-06-22T09:19:50.135Z","dependency_job_id":"b403afb3-95c6-4e1a-8a3a-10e4d4a5fe0d","html_url":"https://github.com/peter-mghendi/karata","commit_stats":null,"previous_names":["peter-mghendi/karata"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/peter-mghendi/karata","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peter-mghendi%2Fkarata","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peter-mghendi%2Fkarata/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peter-mghendi%2Fkarata/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peter-mghendi%2Fkarata/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/peter-mghendi","download_url":"https://codeload.github.com/peter-mghendi/karata/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peter-mghendi%2Fkarata/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33705207,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"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":["blazor","dotnet","realtime","signalr","webassembly","websockets"],"created_at":"2025-04-04T01:17:03.067Z","updated_at":"2026-05-30T19:00:50.628Z","avatar_url":"https://github.com/peter-mghendi.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Test Solution](https://github.com/peter-mghendi/karata/actions/workflows/test-solution.yml/badge.svg)](https://github.com/peter-mghendi/karata/actions/workflows/test-solution.yml)\n[![Publish Karata.Server project](https://github.com/peter-mghendi/karata/actions/workflows/publish-server.yml/badge.svg)](https://github.com/peter-mghendi/karata/actions/workflows/publish-server.yml)\n[![Publish Karata.Web project](https://github.com/peter-mghendi/karata/actions/workflows/publish-web.yml/badge.svg)](https://github.com/peter-mghendi/karata/actions/workflows/publish-web.yml)\n[![Netlify Status](https://api.netlify.com/api/v1/badges/0b4734fe-7614-4aac-99ca-fafa54e2f942/deploy-status)](https://app.netlify.com/projects/karata/deploys)\n\n# karata\n\n\u003e Karata (cards) is a Swahili word that refers to both the Kenyan game of cards and the cards used to play it.\n\nReal-time Kenyan street poker over ASP.NET Core SignalR/websockets.\n\nThe game is currently playable and implements all game logic.\n\nThere is also a custom cards library [here](https://github.com/sixpeteunder/karata/tree/main/src/Karata.Cards) (with a complete test suite).\n\n## Features\n- [x] Real-time in-game chat.\n- [x] Real-time gameplay.\n- [x] Game logic.\n- [x] Activity Feed\n- [x] Password-protected rooms.\n- [x] Player disconnection/reconnection handling.\n- [x] Resumable games.\n- [ ] Configurable rules.\n- [x] Game replays.\n- [ ] Friend system.\n- [ ] Tournaments/Knockouts.\n- [ ] Fines for illegal moves.\n- [x] Bots\n\n## Installation\n\n### Karata.Server\n\n\"Karata.Server\" is the supported server runtime.\n\n#### Docker (recommended)\n\nThe latest server image is published to GitHub Container Registry:\n\nPull\n\n```shell\ndocker pull ghcr.io/peter-mghendi/karata-server:latest\n```\n\nRun:\n\n```shell\ndocker run -d \\\n  --name karata-server \\\n  --env-file path/to/your/.env \\\n  -p 5000:5000 \\\n  ghcr.io/peter-mghendi/karata-server:latest\n```\n\nA PostgreSQL-compatible database is required.\n\n#### Pre-built binary\n\nPre-built server binaries are attached to GitHub Releases.\n\nBuilds are currently available for:\n\n- `linux-x64`\n\n```\nchmod +x karata-server-linux-x64\nsource path/to/your/.env ./karata-server-linux-x64\n```\n\nThe server expects its configuration to be supplied via environment variables.\n\n#### Building from source\n\nBuild from source:\n\n```shell\ngit clone https://github.com/peter-mghendi/karata.git\ncd karata\n\ndotnet publish src/Karata.Server -c Release\n```\n\n---\n\n### Karata.Web\n\n\"Karata.Web\" is the browser client.\n\n#### Release Artifact\n\nCompiled frontend assets are attached to GitHub Releases as `karata-web.tar.gz`.\n\nExtract the archive and serve the resulting files using any static web server.\n\n```shell\ntar -xzf karata-web.tar.gz\n```\n\n#### Published Assets Branch\n\nThe latest generated frontend assets are also available in the `releases-karata-web` branch.\n\nThis branch contains build output only and may be used directly with static hosting providers.\n\n#### Building from source\n\nBuild from source:\n\n```shell\ngit clone https://github.com/sixpeteunder/karata.git\ncd karata\n\ndotnet publish src/Karata.Web -c Release\n```\n\n---\n\n## Rules\n\n\u003e The rules are automatically applied to games, you do not need to actively think about them (unless fines are enabled!)\n\u003e This is mostly included for reference and troubleshooting the game's behaviour.\n\u003e I should probably add these to an in-game \"rules\" page.\n\nNone of the sources I consulted could agree on a canonical set of rules (as they should) so I implemented some sensible defaults:\n\n### Basics\n- The game can only start and end with a non-special card (any card other than those described below).\n- Players may choose to enable a one or two card \"fine\" for invalid moves.\n- Fines are off by default and enabled on a per-game basis.\n- The winner is the first player to discard all of their cards while on \"last card\" status.\n- A player cannot enter \"last card\" status while in possession of an Ace, \"Bomb\", Jack or King.\n- A card sequence that would usually cause the player to play again, e.g. two Kings or \"jumping\" everyone, is counted as its own turn.\n\n### Aces\n\n![Ace of Spades](src/Karata.Web/wwwroot/img/cards/AceSpades.svg)\n\n- Ace of Spades equals two regular Aces.\n- One Ace can be used to request a suit.\n- Two Aces (or equivalent) can be used to request a specific card.\n- Aces can be used to block \"bomb\" cards.\n- Aces can play anywhere.\n- Any number of Aces is valid, but three or four aces have no special effects.\n- Two aces can request a specific Joker but one Ace can not request a Joker.\n\n### \"Bombs\" - Twos, Threes and Jokers\n\n![Two of Spades](src/Karata.Web/wwwroot/img/cards/TwoSpades.svg)\n![Three of Spades](src/Karata.Web/wwwroot/img/cards/ThreeSpades.svg)\n![Black Joker](src/Karata.Web/wwwroot/img/cards/BlackJoker.svg)\n\n- Two, three and joker cards cause the next player to pick two, three or five cards respectively.\n- Two and three cards can be countered by jokers or \"bomb\" cards of the same face or suit.\n- Jokers can only be countered by jokers or blocked by a single Ace.\n- Two and three cards can only play on top cards of the same face or suit.\n- Jokers can play anywhere.\n- Anything can play on top of jokers.\n- Picking is not cumulative. Only the top card's value need be picked.\n- Picking cannot be \"jumped\" or \"kicked back\".\n\n### \"Jumps\" - Jacks\n\n![Jack of Hearts](src/Karata.Web/wwwroot/img/cards/JackHearts.svg)\n\n- A Jack played will \"jump\" the next player (two Jacks played in succession will jump two players, etc.).\n- A Jack must be played on top of a card of the same face(Jack) or suit.\n- Jumping cannot be blocked, e.g. by another Jack placed by a \"jumped player\".\n\n### \"Questions\" - Queens and Eights\n\n![Queen of Hearts](src/Karata.Web/wwwroot/img/cards/QueenHearts.svg)\n![Eight of Hearts](src/Karata.Web/wwwroot/img/cards/EightHearts.svg)\n\n- Queen and Eight cards are \"Question\" cards which require an \"Answer\".\n- A Queen or Eight must be played on top of a card of the same face or suit.\n- Valid answer cards are any cards of the same face or suit (including other questions).\n- Every rank of card (Ace to King) is a valid answer card.\n\n### \"Kickbacks\" - Kings\n\n![Kind of Hearts](src/Karata.Web/wwwroot/img/cards/KingHearts.svg)\n\n- A King will cause the direction of the game to reverse.\n- A King must be played on top of a card of the same face(King) or suit.\n- An even number of Kings played at once will cause the current player to play again.\n- A single King played in a two-person game will have no effect.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeter-mghendi%2Fkarata","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpeter-mghendi%2Fkarata","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeter-mghendi%2Fkarata/lists"}