{"id":49861717,"url":"https://github.com/hydrabeer/word-bomb","last_synced_at":"2026-05-14T21:43:36.541Z","repository":{"id":318981786,"uuid":"961591491","full_name":"hydrabeer/word-bomb","owner":"hydrabeer","description":null,"archived":false,"fork":false,"pushed_at":"2025-11-22T22:10:48.000Z","size":1212,"stargazers_count":0,"open_issues_count":5,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-22T22:18:04.639Z","etag":null,"topics":["express","react","react-router","socket-io","tailwindcss","vite"],"latest_commit_sha":null,"homepage":"https://word-bomb.pages.dev","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/hydrabeer.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":null,"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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-04-06T20:28:33.000Z","updated_at":"2025-11-22T22:10:52.000Z","dependencies_parsed_at":"2025-10-17T15:10:08.671Z","dependency_job_id":"c11c2feb-d513-4711-a55c-86854439c2d8","html_url":"https://github.com/hydrabeer/word-bomb","commit_stats":null,"previous_names":["hydrabeer/word-bomb"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hydrabeer/word-bomb","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hydrabeer%2Fword-bomb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hydrabeer%2Fword-bomb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hydrabeer%2Fword-bomb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hydrabeer%2Fword-bomb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hydrabeer","download_url":"https://codeload.github.com/hydrabeer/word-bomb/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hydrabeer%2Fword-bomb/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33044955,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-14T02:00:06.663Z","response_time":57,"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":["express","react","react-router","socket-io","tailwindcss","vite"],"created_at":"2026-05-14T21:43:35.876Z","updated_at":"2026-05-14T21:43:36.534Z","avatar_url":"https://github.com/hydrabeer.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Word Bomb\n\n[![codecov](https://codecov.io/gh/hydrabeer/word-bomb/graph/badge.svg?token=CZU4XTPVQK)](https://codecov.io/gh/hydrabeer/word-bomb)\n\n## TL;DR Quick Start (Local Dev)\n\n### Prereqs\n\n- Install Node from [nodejs.org](https://nodejs.org/)\n\n```bash\ngit clone https://github.com/hydrabeer/word-bomb.git\ncd word-bomb\n\n# Make sure you have node installed\nnode -v\n\n# Lets you use pnpm, our package manager\ncorepack enable\n\n# Install all the dependencies\npnpm install --frozen-lockfile\n\n# Start the backend and frontend dev servers\npnpm dev\n```\n\nWhen you start the dev server, it'll give you a link to the frontend, `http://localhost:5173` by default. The frontend will talk to the backend on `http://localhost:3001` unless configured otherwise with environment variables.\n\n### Dictionary setup\n\nTo actually play in dev, you'll need to download a word list and put it at `apps/backend/src/platform/dictionary/words.txt`.\n\n---\n\n## Monorepo Map\n\n```\napps/\n  backend/     # Express + Socket.IO server, room orchestration, logging\n  frontend/    # React UI, routes, components, hooks\npackages/\n  domain/      # Pure game/domain logic for the backend\n  types/       # Shared TypeScript types (socket payloads, events)\n  typescript-config/  # Shared tsconfig presets\n\ndocs/          # Read some!\n```\n\nDesign intent: **business rules live in `packages/domain`**, imported by both backend and tests. Backend focuses on orchestration (rooms, timers, sockets). Frontend focuses on the player UI/UX with a mobile‑first mindset.\n\n---\n\n## Scripts \u0026 Tasks (no magic, just pnpm)\n\nCommon one‑liners, from repo root:\n\n```bash\n# Install deps\npnpm install --frozen-lockfile\n\n# Typecheck only (no emit)\npnpm typecheck\n\n# Lint (TypeScript)\npnpm lint\n\n# Format files\npnpm format\n\n# Run all tests with coverage (workspace configs)\npnpm test:coverage\n\n# -F is short for --filter, useful for focusing\npnpm -F backend test:coverage\npnpm -F frontend test:coverage\npnpm -F @word-bomb/domain test:coverage\npnpm -F @word-bomb/types test:coverage\n```\n\nCoverage goal is **100%** – iterate until green.\n\n---\n\n## Development Notes\n\n- **Domain‑first**: put new game rules and computations in `packages/domain` with exhaustive tests; import into backend/frontend.\n- **Typed sockets**: shared event names and payloads live in `packages/types`. Add/modify there first, then wire in backend/ frontend.\n- **Mobile UX**: ensure keyboard‑safe layouts and readable timers; test on small viewports early.\n- **Logging**: backend logging utilities live under `apps/backend/src/platform/logging`. Use structured logs; do not commit code with `console.log` in it.\n\n---\n\n## Testing\n\nThe repo uses **Vitest** everywhere.\n\n**Patterns**\n\n- Unit tests colocated with sources or under `src/**` next to the module.\n- Integration tests live under `apps/**/test` where appropriate.\n- Prefer **pure tests** in `packages/domain` and keep I/O out.\n\n**Useful flags**\n\n```bash\n# Watch mode while developing a specific area\npnpm -F frontend test:watch src/components/GameBoard.test.tsx\n\n# Debug a single test name\npnpm -F backend test -t \"startGameForRoom emits events in order\"\n```\n\n---\n\n## CI expectations (high level)\n\n- PRs must pass: **typecheck, lint, tests + coverage**.\n- **Conventional Commits** required (scopes like `frontend|backend|domain|types|infra|docs`).\n- Keep a single `CHANGELOG.md` updated for user‑visible changes.\n- If you introduce/alter a protocol or major design choice, add an **ADR** in `docs/adr/`.\n\n---\n\n## Docs Standard\n\nThis repo adopts:\n\n- **Diátaxis** structure (`/docs/{tutorials,how-to,reference,explanations}`) as it grows.\n- **Keep a Changelog** + **Semantic Versioning**.\n- **Conventional Commits**.\n- **ADRs** (MADR format) for architectural decisions.\n\n---\n\n## Contributing\n\n1. Fork \u0026 branch: `feat/\u003cscope\u003e-\u003cshort-description\u003e`\n2. Implement with tests; keep domain logic in `packages/domain` where possible.\n3. Lint/format/typecheck locally.\n4. Update `CHANGELOG.md` if user‑visible.\n5. Open PR with checklist; link any ADR changes.\n\n`CONTRIBUTING.md` codifies versions, scripts, and the PR checklist.\n\n---\n\n## License\n\nThis project is currently **UNLICENSED** (proprietary). Do not distribute without permission.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhydrabeer%2Fword-bomb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhydrabeer%2Fword-bomb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhydrabeer%2Fword-bomb/lists"}