{"id":14985455,"url":"https://github.com/dandonahoe/crude-cards","last_synced_at":"2026-02-15T07:36:58.814Z","repository":{"id":254705400,"uuid":"846665331","full_name":"dandonahoe/crude-cards","owner":"dandonahoe","description":"❐ ❐ ❐ Crude Cards - A shameless \"parody\" of Cards Against Humanity for those of you who love laughing at the worst things imaginable — because clearly, your sense of humor is broken.","archived":false,"fork":false,"pushed_at":"2025-03-28T23:04:42.000Z","size":105128,"stargazers_count":1,"open_issues_count":23,"forks_count":0,"subscribers_count":1,"default_branch":"dev","last_synced_at":"2025-04-11T20:05:07.868Z","etag":null,"topics":["cypress","docker","game","jest","kubernetes","nestjs","nextjs","react","storybook","tutorial","typescript","websockets"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/dandonahoe.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-08-23T17:31:51.000Z","updated_at":"2025-03-26T18:20:42.000Z","dependencies_parsed_at":"2024-09-29T22:41:44.769Z","dependency_job_id":"9ae58e1e-548b-4743-aa7b-1d00c4dc35fc","html_url":"https://github.com/dandonahoe/crude-cards","commit_stats":{"total_commits":127,"total_committers":2,"mean_commits":63.5,"dds":"0.19685039370078738","last_synced_commit":"ffcabd5e99904744472e1bce23e7a7508ec987f6"},"previous_names":["dandonahoe/crude-cards"],"tags_count":52,"template":false,"template_full_name":null,"purl":"pkg:github/dandonahoe/crude-cards","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dandonahoe%2Fcrude-cards","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dandonahoe%2Fcrude-cards/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dandonahoe%2Fcrude-cards/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dandonahoe%2Fcrude-cards/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dandonahoe","download_url":"https://codeload.github.com/dandonahoe/crude-cards/tar.gz/refs/heads/dev","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dandonahoe%2Fcrude-cards/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29472883,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T06:58:05.414Z","status":"ssl_error","status_checked_at":"2026-02-15T06:58:05.085Z","response_time":118,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["cypress","docker","game","jest","kubernetes","nestjs","nextjs","react","storybook","tutorial","typescript","websockets"],"created_at":"2024-09-24T14:10:59.884Z","updated_at":"2026-02-15T07:36:58.799Z","avatar_url":"https://github.com/dandonahoe.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🎉 Crude Cards\n\n## A Party Game For Horrible People! 🎉\n\n### Web Development Series\n\nWelcome to **Crude Cards**, a real-time, WebSocket-enabled card game designed for both learning and fun! If you've ever played **Cards Against Humanity** or **Apples to Apples**, you already know how to play. This project is built with modern web technologies like **React**, **Next.js**, and **NestJS** to demonstrate technical concepts in a fun and engaging way.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n      \u003ch3\u003e🎯 Game Overview\u003c/h3\u003e\n      \u003cp\u003eCrude Cards is a \u003cem\u003egood\u003c/em\u003e party game for \u003cstrong\u003ebad\u003c/strong\u003e people. Perfect for casual hangouts or virtual game nights. Real-time play for multiple players via a WebSocket-powered backend. Adaptable for learning games or quizzes.\u003c/p\u003e\n    \u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n      \u003ch3\u003e🤓 Educational Purpose\u003c/h3\u003e\n      \u003cp\u003eMore than entertainment—this project is a learning resource for full-stack, real-time app development. Find tutorials on building, deploying, and scaling the app in the cloud.\u003c/p\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## 🎨 CrudeCards - Game Dev Series\n\n\u003ctable cellspacing=\"0\" cellpadding=\"0\" border=\"0\"\u003e\n  \u003ctr\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/015.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Introduction to the Series\n\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\nThis article provides an overview of the series, explaining what will be covered and the goals of creating a CAH clone.\n\n\u003c/div\u003e\u003c/td\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/002.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Defining the Project: What and Why\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\n    Detailed description of the CAH clone, including its purpose and goals.\n\u003c/div\u003e\u003c/td\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/003.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Defining the Audience and Stakeholders\n\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\n\n\u003c/div\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/010.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Defining Stakeholder Personas\n\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\nThe process of creating example users and applying\n\n\u003c/div\u003e\u003c/td\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/005.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Conducting In-Person Testing and Gathering Feedback\n\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\nMethods for in-person testing and how to gather and analyze feedback.\n\n\u003c/div\u003e\u003c/td\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/006.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Creating Mockups and Prototypes\n\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\nTools and techniques for creating mockups and prototypes, emphasizing their importance.\n\n\u003c/div\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/007.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Choosing the Tech Stack\n\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\nDetailed explanation of the tech stack and reasons for choosing each technology.\n\n\u003c/div\u003e\u003c/td\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/008.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    High-Level Application Architecture\n\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\nOverview of the application architecture, key components, and their interactions.\n\n\u003c/div\u003e\u003c/td\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/009.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    \n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\n    \n\u003c/div\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/010.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Version Control and Collaboration\n\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\nImportance of version control and best practices for collaboration.\n\n\u003c/div\u003e\u003c/td\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/011.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Implementing CI/CD Pipelines\n\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\nSetting up continuous integration and deployment pipelines, including tools and best practices.\n\n\u003c/div\u003e\u003c/td\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/012.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Managing Cloud Infrastructure with Terraform\n\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\nBuilding the User Interface with React\nBasics of React for building the user interface, including component structure and state management.\n\n\u003c/div\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/013.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\nFrontend State Management\n\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\nIntroduction to Redux for managing application state, with examples.\n\n\u003c/div\u003e\u003c/td\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/016.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Architecting Cloud Infrastructure\n\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\nDesigning the cloud infrastructure using services like Kubernetes and Docker.\n\n\u003c/div\u003e\u003c/td\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/015.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Setting Up the Node.js Backend\n\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\nBasics of Node.js and Express, including how to structure the backend.\n\n\u003c/div\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\n\u003cimg src=\"./internal/wiki/016.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Connecting the Frontend and Backend\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\nHow to connect a React frontend with a Node.js backend, including setting up API routes and handling requests.    \n\u003c/div\u003e\u003c/td\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/010.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Quality Assurance and Testing\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\nOverview of testing methodologies including unit, integration, and end-to-end testing, and the tools used for each.    \n\u003c/div\u003e\u003c/td\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/002.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Steps to deploy the app on GCP, including tools and best practices for deployment.\n\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\nDescription here. Beep Beep Boop.\n\n\u003c/div\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/003.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Maintaining the Application\n\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\nRegular maintenance tasks and best practices for keeping the app up-to-date.\n\n\u003c/div\u003e\u003c/td\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/013.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Performance Tuning\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\n    Techniques for improving performance, including profiling and optimization.\n\u003c/div\u003e\u003c/td\u003e\n\u003ctd valign=\"top\" align=\"center\"\u003e\u003cimg src=\"./internal/wiki/005.webp\" alt=\"001\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif; max-height: 120px;border-radius:12px;\"\u003e\u003cbr\u003e\u003cdiv align=\"left\" style=\"font-family: 'Helvetica Neue Bold', Arial, sans-serif;\"\u003e\u003cstrong\u003e\n    Cost Management and Optimization\n\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\n    Strategies for reducing costs, monitoring and optimizing cloud expenses.\n\u003c/div\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n## 🚀 Browser\n\n\u003cimg width=\"478\" alt=\"Screenshot 2024-09-04 at 8 20 19 PM\" src=\"https://github.com/user-attachments/assets/f4730f29-1e31-41dd-b656-ede5040b5548\"\u003e\n\n\n## 🚀 Tech Stack\n\nThe tech stack is carefully chosen to showcase modern full-stack development practices. Here's a breakdown:\n\n\u003ctable style=\"width:100%\"\u003e\n  \u003ctr\u003e\n    \u003cth\u003eLayer\u003c/th\u003e\n    \u003cth\u003eTechnology\u003c/th\u003e\n    \u003cth\u003ePurpose\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    \u003ch5\u003e\n    Frontend\n    \u003c/h5\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/a/a7/React-icon.svg\" alt=\"React\" width=\"20\" style='vertical-align: middle;' /\u003e\n    \u003cspan\u003e\n     React\n     \u003c/span\u003e\n     \u003c/td\u003e\n    \u003ctd\u003eUI development and rendering\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://nextjs.org/static/favicon/favicon-16x16.png\" alt=\"Next.js\" width=\"20\" style='vertical-align: middle;' /\u003e\n    \u003cspan\u003e\n     Next.js\n     \u003c/span\u003e\n     \u003c/td\u003e\n    \u003ctd\u003eServer-side rendering, routing, and API endpoints\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\n    \u003cimg src=\"https://seeklogo.com/images/M/mantine-logo-235E19C978-seeklogo.com.png\" alt=\"Mantine\" width=\"20\" style='vertical-align: middle;' /\u003e\n    \u003cspan\u003e\n     Mantine\n     \u003c/span\u003e\n     \u003c/td\u003e\n    \u003ctd\u003eUI components and styling\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://redux.js.org/img/redux.svg\" alt=\"Redux Toolkit\" width=\"20\" style='vertical-align: middle;' /\u003e\n    \u003cspan\u003e\n     Redux Toolkit\n     \u003c/span\u003e\n     \u003c/td\u003e\n    \u003ctd\u003eState management\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://socket.io/images/logo.svg\" alt=\"Socket.io Client\" width=\"20\" style='vertical-align: middle;' /\u003e\n    \u003cspan\u003e\n     Socket.io Client\n     \u003c/span\u003e\n     \u003c/td\u003e\n    \u003ctd\u003eReal-time communication\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    \u003ch5\u003e\n    Backend\n    \u003c/h5\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://spng.pinpng.com/pngs/s/208-2082662_logo-nestjs-nest-js-hd-png-download.png\" alt=\"NestJS\" width=\"20\" style='vertical-align: middle;' /\u003e\n    \u003cspan\u003e\n     NestJS\n     \u003c/span\u003e\n     \u003c/td\u003e\n    \u003ctd\u003eBackend framework\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://th.bing.com/th/id/OIP.1BPUcbae61SbpxzZHrMtjgAAAA?rs=1\u0026pid=ImgDetMain\" alt=\"TypeORM\" width=\"20\" style='vertical-align: middle;' /\u003e\n    \u003cspan\u003e\n     TypeORM\n     \u003c/span\u003e\n     \u003c/td\u003e\n    \u003ctd\u003eDatabase ORM for managing entities and migrations\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://socket.io/images/logo.svg\" alt=\"Socket.io\" width=\"20\" style='vertical-align: middle;' /\u003e\n    \u003cspan\u003e\n     Socket.io\n     \u003c/span\u003e\n     \u003c/td\u003e\n    \u003ctd\u003eWebSocket server for real-time events\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    \u003ch5\u003e\n    Infrastructure\n    \u003c/h5\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://www.pngrepo.com/png/353805/512/google-cloud.png\" alt=\"GCP\" width=\"20\" style='vertical-align: middle;' /\u003e\n    \u003cspan\u003e\n     GCP\n     \u003c/span\u003e\n     \u003c/td\u003e\n    \u003ctd\u003eCloud hosting and deployment\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://www.docker.com/wp-content/uploads/2022/03/Moby-logo.png\" alt=\"Docker\" width=\"20\" style='vertical-align: middle;' /\u003e\n    \u003cspan\u003e\n     Docker\n     \u003c/span\u003e\n     \u003c/td\u003e\n    \u003ctd\u003eContainerization\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://i.pinimg.com/736x/28/ec/74/28ec7440a57536eebad2931517aa1cce.jpg\" alt=\"Terraform\" width=\"20\" style='vertical-align: middle;' /\u003e\n    \u003cspan\u003e\n     Terraform\n     \u003c/span\u003e\n     \u003c/td\u003e\n    \u003ctd\u003eInfrastructure as Code (IaC)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    \u003ch5\u003e\n    Testing\n    \u003c/h5\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://jestjs.io/img/jest.svg\" alt=\"Jest\" width=\"20\" style='vertical-align: middle;' /\u003e\n    \u003cspan\u003e\n     Jest\n     \u003c/span\u003e\n     \u003c/td\u003e\n    \u003ctd\u003eUnit and integration testing\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://testing-library.com/img/octopus-128x128.png\" alt=\"Testing Library\" width=\"20\" style='vertical-align: middle;' /\u003e\n    \u003cspan\u003e\n     Testing Library\n     \u003c/span\u003e\n     \u003c/td\u003e\n    \u003ctd\u003eUI testing\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://th.bing.com/th/id/OIP.31LKu2RcgssPSqAr_CKnqAHaJJ?rs=1\u0026pid=ImgDetMain\" alt=\"Storybook\" width=\"20\" style='vertical-align: middle;' /\u003e\n    \u003cspan\u003e\n     Storybook\n     \u003c/span\u003e\n     \u003c/td\u003e\n    \u003ctd\u003eComponent testing and documentation\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## 📖 **Game Rules**\n\n### Kind of Like Cards Against Humanity or Apples to Apples\n\n\n1. **Setup**:\n\n    - Players connect to a game session via a room code.\n    - One player is selected as the \"Dealer\" for each round.\n\n2. **Gameplay**:\n\n    - The Dealer plays a black card with a prompt or question e.g., \"Wy can't I sleep at night?\")\n    - The other players choose the funniest white card from their hand to complete the sentence or answer the question.\n    - The Dealer reviews the responses and selects the one they find funniest.\n\n3. **Winning**:\n\n    - The player whose card is chosen wins that round and earns a point.\n    - The first player to reach a predefined number of points wins the game.\n\n4. **Additional \"Fun\"**:\n    - The game is customizable with different rule variations to keep things interesting.\n\n## 💻 **How to Run the Game Locally**\n\n1. Clone the repository:\n    ```bash\n    git clone https://github.com/dandonahoe/crude-cards.git\n    ```\n2. Install dependencies:\n    ```bash\n    pnpm install\n    ```\n3. Run the development server:\n    ```bash\n    pnpm run reset\n    ```\n4. Open [http://localhost:3000](http://localhost:3000) in your browser to view the game.\n\n\n```mermaid\n%%{init: {'theme': 'dark', 'themeVariables': { \n\n}}}%%\nsequenceDiagram\n    participant Browser\n    participant GameService\n    participant PlayerService\n    participant WebSocket\n\n    Browser-\u003e\u003eWebSocket: Connect with AuthToken\n    WebSocket-\u003e\u003eGameService: Handle connection request\n    GameService-\u003e\u003ePlayerService: Validate AuthToken\n    PlayerService-\u003e\u003eGameService: Return existing Player (if found)\n    \n    alt AuthToken is valid and game is active\n        GameService-\u003e\u003eBrowser: Rejoin Player to game (Limbo status)\n        GameService-\u003e\u003eBrowser: Check if Player was the dealer\n        alt Player was the dealer\n            GameService-\u003e\u003eBrowser: Restore dealer status (if conditions are met)\n        end\n    else AuthToken is invalid or outdated\n        WebSocket-\u003e\u003eGameService: Create new Player\n        GameService-\u003e\u003eBrowser: New Player stays on home page\n    end\n\n    alt Dealer leaves mid-game\n        GameService-\u003e\u003eWebSocket: Wait 30 seconds for rejoin\n        alt Dealer rejoined\n            GameService-\u003e\u003eBrowser: Continue game\n        else Dealer does not rejoin\n            GameService-\u003e\u003eBrowser: Notify players of game end (all lose)\n        end\n    end\n\n    alt Player uses game code URL\n        GameService-\u003e\u003eBrowser: Validate AuthToken and game code\n        alt Game code matches player's current game\n            GameService-\u003e\u003eBrowser: Player joins Limbo status\n            GameService-\u003e\u003eBrowser: Prompt dealer to accept or skip Player\n            alt Dealer accepts Player\n                GameService-\u003e\u003eBrowser: Player joins game\n            else Dealer skips Player\n                GameService-\u003e\u003eBrowser: Notify Player of removal\n            end\n        else Game code does not match current game\n            Browser-\u003e\u003eGameService: Prompt Player to leave current game\n        end\n    end\n\n```\n\n## 📜 **License**\n\nThis project is licensed under a **Creative Commons Attribution-NonCommercial-NoDerivatives (CC BY-NC-ND) License with Custom Terms**. You can learn from it, share it, and use it for educational purposes, but you must obtain permission for commercial use or any significant modifications.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdandonahoe%2Fcrude-cards","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdandonahoe%2Fcrude-cards","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdandonahoe%2Fcrude-cards/lists"}