Skip to content
CAI
Software that uses CAICheck a score

mikecann/clouds-and-edges

56.5

Adequate · 21 September 2026

5.8k

lines of production code

TypeScript

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

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.