mikecann/clouds-and-edges
56.5
Adequate · 21 September 2026
5.8k
lines of production code
TypeScript
primary language
4
measurements over time
What this system is
Clouds And Edges is a real-time multiplayer game platform built as a Lerna monorepo, featuring a React frontend for match management and an event-driven backend using Durable Objects. The system handles user authentication, match state, and game logic through a combination of server-side aggregates, processes, and projections. It provides an admin dashboard for monitoring system state and a user interface for creating, joining, and playing matches.
Features
Add centralized site configuration module
A new \config.ts\ module has been added to the site's feature layer, exposing environment variables (SERVER\_ROOT, MODE, DEV, SSR, PROD, BASE\_URL) as a single exported object. This provides a consistent way for the application to access runtime configuration and environment settings.
packages/site/src/features/config · high confidence
Add exhaustive type-checking match utilities
Added new \match\ and \matchSwitch\ functions in \packages/essentials/src/match\ that provide exhaustive type-checking for object-based pattern matching. The \match\ function (and its curried \matchConfig\ variant) allows developers to map string or numeric keys to handler functions, with TypeScript enforcing that all possible keys are covered. A separate \matchImpl\ in \experimental.ts\ offers a more flexible, discriminated-union-style matching with support for default handlers and \else\ fallbacks. These utilities enable safer, compile-time validated switch-like behavior for object dispatch.
packages/essentials/src/match · medium confidence
Add match page and game state UI components
The match feature now includes a new MatchPage component that routes to different states (playing, finished, cancelled, not-started) using a status literal. New components have been added to render the game interface: Announcement for displaying game status (e.g., 'Your Turn', 'You Won'), PlayerPanel to show player details and scores, and Finished to display the completed game board and player panels. The PlayingGame component handles the active game state with turn management and refresh functionality.
packages/site/src/features/match · high confidence
Add server build script for ESM output
A new build script (build.ts) and its TypeScript configuration (tsconfig.json) have been added to the server package. The script uses esbuild to bundle the server entry point (src/main.ts) into an ES module (.mjs) for Node 14, with external source maps and a banner that sets a specific environment variable.
packages/server/scripts · high confidence
Add signup page with name-based registration
A new SignupPage component has been added to the site, providing a user interface for new users to register by entering their name. The page displays the application logo and heading, an input field for the user's name, and a signup button that triggers the registration mutation. It also includes logic to redirect authenticated users away from the signup page to the '/me' route.
packages/site/src/features/signup · high confidence
Add utility modules for colors, directions, emojis, ID generation, and random number generation
Added several new utility modules to the essentials package: a palette of hex color codes, a Direction type, a comprehensive list of emojis, helper functions for ensuring non-null/undefined values, a NanoID-style ID generator, and a seeded pseudo-random number generator (PRNG) with methods for generating random numbers, shuffling arrays, and sampling items. These utilities provide foundational tools for styling, game logic, and deterministic randomness.
packages/essentials/src/utils · high confidence
Added AggregatesAdmin component with vertical tabs for User and Match sections
A new React component, AggregatesAdmin, was added to the admin aggregates feature. It renders a vertical tabbed interface using Chakra UI's Tabs, with two tabs labeled 'User' and 'Match'. Each tab panel currently displays a SectionContainer with a 'Todo: Implement me :)' placeholder, indicating the initial UI structure for these administrative views.
packages/site/src/features/admin/aggregates · high confidence
Added SidebarPage layout component
A new SidebarPage component has been introduced to provide a consistent layout structure for pages requiring a sidebar. This component renders a ConnectedDashboardSidebar alongside a content area, establishing a standard visual template for the application's pages.
packages/site/src/features/page · high confidence
Added Storybook configuration and a sample Chakra UI button component
Developers can now use Storybook to view and interact with UI components in isolation. This change introduces the Storybook configuration files (.storybook/main.js, preview.tsx, tsconfig.json) which set up the environment with Chakra UI providers, and adds a new 'MyButton' component in the buttons feature folder, demonstrating how to use Chakra UI's Button component within the storybook context.
packages/site/.storybook, packages/site/src/features/buttons · high confidence
Added admin storage inspection UI
Introduced a new admin interface for inspecting storage contents. This includes a reusable \InspectableStorage\ component that provides filtering controls (prefix, limit, start key, reverse order) and a \KeyValueTable\ for displaying results. The \ConnectedInspectableStorage\ component wires this UI to the \useQueryStorage\ hook, which queries the \admin.queryStorage\ API endpoint. A Storybook story was also added for the storage inspector.
packages/site/src/features/admin/storage · high confidence
Added authentication hooks for token, sign-out, and sign-up
The auth feature now includes three new React hooks: useAuthToken, which retrieves the user ID from the app state; useSignout, which clears the React Query cache and resets the user ID in the app state; and useSignup, which triggers the 'auth.signup' API mutation and updates the app state with the new user ID upon success.
packages/site/src/features/auth · high confidence
Added editable text component and loading page UI
Introduced new UI components for the site: an editable text field with inline editing controls (submit, cancel, and edit buttons) and a full-screen loading spinner. These components provide the visual interface for user text editing and loading states.
packages/site/src/features/editable, packages/site/src/features/loading · high confidence
Added match management UI and data hooks
The matches feature now includes a complete set of React components and hooks to manage matches. This includes a modal for creating new matches, a table and cards for displaying match status and player avatars, and hooks for joining, canceling, and taking turns. The UI allows users to propose new matches, join existing ones, and see real-time status updates.
packages/site/src/features/matches/matches · high confidence
Added new code generation templates for components, modals, Redux stores, and types
Developers can now generate boilerplate code for various architectural patterns, including React components and their Storybook stories, modal components with MobX integration, Redux slices with epics and selectors, and TypeScript types using io-ts. These templates provide a consistent starting point for new features, including pre-configured state management, validation, and UI storybook integration.
blueprint-templates · medium confidence
Added new sidebar navigation component
Introduced a new sidebar navigation feature for the dashboard, consisting of a fixed vertical menu with buttons for 'Me', 'Matches', and 'Admin'. The implementation includes a reusable SidebarButton component that handles navigation via the router and a main ConnectedDashboardSidebar component that renders the sidebar layout using Chakra UI elements.
packages/site/src/features/sidebar · high confidence
Added open matches listing and card components
Users can now view a list of open matches, each displayed as a card that allows them to join or cancel participation. The new components (ConnectedOpenMatches, ConnectedOpenMatchCard, OpenMatchCard) and the useOpenMatches hook fetch and render these matches, integrating with the application state and API queries.
packages/site/src/features/matches/openMatches · high confidence
Added shared domain models and API contracts for match and user aggregates
The shared package now includes the foundational types and interfaces for the game's domain model. This includes the \Aggregates\ interface defining \UserCommands\ and \MatchCommands\, and the \API\ type exposing RPC operations for user authentication, match queries, and command execution. Additionally, new files define the structure for match projections (including \MatchProjection\ and \MatchesProjections\), user projections, and the internal game board model (cells, lines, dots, and scoring logic).
packages/shared/src · high confidence
Added site logo components and assets
The site now includes a new logo feature, introducing a generic Logo component and a specific CloudflareLogo component, both rendering images with a fixed height of 140px. This change adds the necessary React components, CSS animations for a subtle scaling effect, and the underlying SVG and PNG assets required to display the logos on the site.
packages/site/src/features/logo · high confidence
Adds a custom logging utility with a null logger option
A new logging module is introduced in the essentials package, providing a \getLogger\ function that returns an object with \log\, \debug\, \info\, \error\, and \warn\ methods that output to the console. The module also exports a \Logger\ interface and a \nullLogger\ constant, which provides no-op implementations for all logging methods, allowing for silent logging when needed.
packages/essentials/src/logging · medium confidence
Admin UI for managing processes and projections
Added new admin interface components for managing processes and projections. The \ProcessesAdmin\ and \ProjectionsAdmin\ components now provide tabbed views for \MatchCreation\/\MatchJoining\ and \Users\/\Matches\ respectively. Each view includes a 'Rebuild' action button and a data inspection panel, with the projection admin fully wired to the \useAdminRebuild\ hook while the process admin currently provides the UI structure.
packages/site/src/features/admin/processes, packages/site/src/features/admin/projections · medium confidence
Initial project structure and configuration for Clouds And Edges
Established the foundational configuration for the 'Clouds And Edges' monorepo, including TypeScript, ESLint, Prettier, Jest, and Lerna settings. Added a PowerShell script for building and deploying the site and server to Cloudflare Workers, and updated the README with project documentation and caveats.
(repo-wide) · high confidence
Initial site application shell with Chakra UI and React Query integration
The site package now includes a new application entry point that bootstraps the UI with a dark-mode default theme via Chakra UI, manages global state with an AppStateProvider, and integrates React Query for data fetching. The app structure includes a custom Chakra theme provider, a router, and a React Query client provider, establishing the foundational layout and state management for the site.
packages/site/src · high confidence
Initial site routing and authentication guard setup
The application now defines its primary navigation structure. A new Router component maps URL paths to specific pages, including a signup page, a matches page, a match detail page, a profile page, and an admin page. The matches, match, and profile routes are protected by an AuthRequired wrapper that redirects unauthenticated users to the signup page. The root route redirects users to either the signup or matches page based on their authentication state.
packages/site/src/features/router · high confidence
Introduce event-driven architecture with aggregates, processes, and projections
Added a new event-driven architecture for the workers-es package, introducing core components for handling business logic and state management. This includes an event store (BaseEventStore) to persist and retrieve events, aggregate root classes (AggreateDurableObject) to execute commands and apply reducers, and durable objects for processes (ProcessDurableObject) and projections (ProjectionDurableObject) that react to events. The system also provides a central System registry to wire these components together, along with helper utilities for database access (createSimpleDb, createComplexDB) and RPC routing (addRpcRoutes).
packages/workers-es/src · high confidence
Introduce game board and interactive components for match play
Added new components for the match game interface: a \GameBoard\ that renders a grid of \CellView\ and \DotView\ elements, along with supporting \LineView\ and \GameState\ types. This enables users to see the game board, interact with line nodes to fill them, and view cell ownership and player avatars on the board.
packages/site/src/features/match/game · high confidence
Introduce user profile and authentication state management
Added new components and hooks to manage user profile data and authentication state. The \MyProfilePage\ displays the user's avatar, editable name, and ID, while \ConnectedEditableUserName\ allows users to update their display name. The \useMe\ and \useSetName\ hooks handle fetching and mutating user data, and \useIsAuthenticated\ provides a boolean check for login status. Additionally, \appState\ and \useAppStatePersistance\ manage and persist the user's ID in local storage.
packages/site/src/features/me · medium confidence
Introduces TypeScript types for RPC operations
A new file, rpc.ts, has been added to the essentials package, defining TypeScript interfaces and types for RPC operations. This includes an RPCOperation interface that specifies input and output schemas using Zod, as well as utility types for inferring input and output types from a registry of operations. The file also contains commented-out code for request and response schemas, suggesting a shift in how RPC interactions are typed and validated within the application.
packages/essentials/src/rpc · high confidence
Introduces generic error handling and user data fetching hooks
The site now includes a new generic error handler hook that displays toast notifications for API errors, and a new user data fetching hook that retrieves user information by ID using the application state and API query utilities.
packages/site/src/features/errors, packages/site/src/features/user · medium confidence
Introduces server-side aggregates, projections, and processes for user and match management
Added new server-side components to support user and match functionality. This includes \UserAggregate\ and \MatchAggregate\ for handling user and match state, along with their respective events, commands, and reducers. Projections (\UsersProjection\, \MatchesProjection\) and processes (\MatchCreationProcess\, \MatchJoiningProcess\) are introduced to handle data consistency and business logic. The \Env\ interface is updated to include these new Durable Object namespaces, and the main entry point (\main.ts\) exports these components for routing and RPC handling.
packages/server/src · high confidence
New Matches page with sections for active and open matches
A new Matches page has been added to the site, providing a central hub for users to view their current matches and browse open matches available to join. The page is structured with two main sections: 'My Matches' displaying the user's latest matches, and 'Open Matches' showing matches available for joining. Users can also create a new match via a dedicated modal.
packages/site/src/features/matches · high confidence
New admin components for viewing event logs
The admin interface now includes new React components to display event logs. The unconnected 'EventsAdminLog' component renders a key-value table of stored events, while the 'EventItem' component provides a reusable UI for displaying label-value pairs. A new 'ConnectedEventsAdminLog' component wraps the log view with the necessary storage connection, enabling administrators to inspect event data through the admin panel.
packages/site/src/features/admin/events · medium confidence
New admin dashboard with tabs for system state and management
The admin interface now provides a centralized dashboard for monitoring and managing the system. Users can access four main sections via tabs: Event Log, Aggregates, Processes, and Projections. The page also includes a utility component for displaying and copying IDs, and a hook for triggering system rebuilds.
packages/site/src/features/admin · medium confidence
New essentials package exports
A new \packages/essentials/src/index.ts\ file has been added, serving as the public entry point for the \essentials\ package. This change exposes a collection of utilities and modules, including logging, match handling (experimental and non-discriminated), RPC, and various utility functions such as colors, direction, emojis, ID generation, and random number generation.
packages/essentials/src · high confidence
Site package initialization and configuration
The site package is initialized with a new Vite build configuration, a TypeScript configuration extending the root tsconfig, and an ESLint configuration. A custom useDebounce React hook is added to the utilities. The project title is updated to 'Clouds & Edges' and the favicon link is changed from SVG to ICO.
packages/site · high confidence
Behavioural changes
Introduces new API client hooks and RPC execution layer
The site's API layer has been refactored to use a new set of React Query-based hooks (useApiQuery, useApiMutation, useCommand) that wrap a generic performRPCOperation function. This provides a consistent, typed interface for fetching data, executing mutations, and running commands against the backend, with automatic authentication header injection and error handling.
packages/site/src/features/api · high confidence
Refactor site-worker to use serveSinglePageApp and update Wrangler config
The site-worker module was restructured: the main entry point was moved to packages/site-worker/index.js and updated to import and use serveSinglePageApp from @cloudflare/kv-asset-handler instead of mapRequestToAsset, enabling single-page app routing. The worker script was added at packages/site-worker/worker/script.js, and an ESLint configuration was introduced at packages/site-worker/.eslintrc.json. Additionally, the Wrangler configuration was updated with a new compatibility date, a new project name, and an environment-specific name for the worker.
packages/site-worker · high confidence
Removed server and site frontend code
Deleted the server-side Durable Object implementation (Counter class, entry point, and build configuration) and the site-worker frontend assets (React components, styles, and Vite configuration). This removes the server-side logic for handling HTTP requests and the client-side React application that previously rendered the counter UI.
server, site, site-worker · high confidence
Dependencies
Migrate to Lerna monorepo structure with updated dependencies
The project has been restructured into a Lerna-managed monorepo under a 'packages/' directory, replacing the previous flat structure. This includes renaming '@project/site' and '@project/site-worker' to 'packages/site' and 'packages/site-worker' respectively, and introducing new packages like '@project/essentials' and '@project/server'. The root package.json now defines workspaces for 'packages/\*' and includes Lerna, TypeScript, and various linting tools. Dependencies have been updated, including '@babel/core' to 7.15.5, 'jest' to 27.0.6, and 'typescript' to 4.4.2, while older lockfiles and package manifests for the old structure were removed.
(dependencies) · medium confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 54 → 57 (+2.8)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 94 → 94 (+0.6)
- Architecture 74 → 73 (-0.1)
- Maturity 71 → 73 (+2.1)
- Readiness 51 → 43 (-7.8)
- Security 41 → 60 (+19.4)
Resolved (74)
- Boundary-crossing change coupling: UserAggregate.ts ↔ UsersProjection.ts (packages/server/src/aggregates/user/UserAggregate.ts)
- Change coupling: RPCDurableObject.ts ↔ BaseEventStore.ts (packages/workers-es/src/durableObjects/RPCDurableObject.ts)
- Change coupling: UsersProjection.ts ↔ routes.ts (packages/server/src/projections/users/UsersProjection.ts)
- Change coupling: commands.ts ↔ main.ts (packages/server/src/aggregates/user/commands.ts)
- Change coupling: main.ts ↔ App.tsx (packages/server/src/main.ts)
- Coverage not included — suite not readable by the collector
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- …and 54 more
New (173)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical CVE: [GHSA redacted] (yarn.lock)
- Critical vulnerability: [GHSA redacted] (yarn.lock)
- Floating npm dependency: @project/essentials
- Floating npm dependency: @project/essentials
- Floating npm dependency: @project/shared
- …and 153 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
mikecann/clouds-and-edges was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit e144ca463702660bd2047857af9fa3a6e702b5e6 — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-b84573e22831.