stride-nyc/remote_retro
53.2
Adequate · 3 October 2026
7.1k
lines of production code
JavaScript
with Elixir
2
measurements over time
What this system is
RemoteRetro is a real-time collaborative retrospective tool built on Phoenix and React that enables teams to conduct structured feedback sessions. It supports multiple retro formats, such as 'Start/Stop/Continue' and 'Happy/Sad/Confused', allowing users to generate ideas, group them via drag-and-drop, vote, and assign action items. The system facilitates live collaboration through WebSocket channels with presence tracking, while managing user access via Google OAuth and sending automated email notifications for session summaries.
How it got here
2015 — Webpack migration and app rename
13 changes.
The project migrated its build tooling from Brunch to Webpack and upgraded the frontend stack to React 16 with Redux, while renaming the application to RemoteRetro. This period involved stripping legacy Phoenix boilerplate, modernizing the CSS architecture with PostCSS, and establishing comprehensive test coverage for both backend controllers and frontend components.
2016–2017 — RemoteRetro platform development
21 changes.
The project was rebranded as RemoteRetro and upgraded to Phoenix 1.6, establishing a robust backend with database migrations, automated emails, and OAuth integration. Significant frontend work introduced real-time collaborative features, including a new grouping stage with drag-and-drop functionality and configurable retro formats. Comprehensive test coverage was added across models, services, and end-to-end scenarios to support these new capabilities.
2018–2019 — Architecture modernization and feature expansion
13 changes.
This period focused on modernizing the application's architecture by centralizing state management with Redux and decomposing monolithic channel logic into modular handlers. It also introduced significant new features, including a structured grouping workflow for retrospectives, robust Google OAuth integration, and comprehensive test coverage for core state modules.
2020–2022 — HEEX migration and performance optimization
4 changes.
The project migrated application templates from EEx to HEEX syntax to enable cleaner dynamic attribute handling and improve performance. This period focused on optimizing resource loading through prefetching and preloading, while also enhancing observability with DataDog RUM integration and introducing dedicated error pages.
Features
Added database seeding script
A new \priv/repo/seeds.exs\ script has been added to allow users to populate the database. The script includes comments explaining how to run it via \mix run\ and demonstrates usage of the \RemoteRetro.Repo\ module for inserting records.
priv/repo · high confidence
Introduce automated email notifications and retro format options
The application now sends automated emails to users, including a welcome message upon registration and action item summaries after retrospectives. The action items email is sent to all retro participants and includes links to the full retro board and the source repository. Additionally, the system now supports the 'Start/Stop/Continue' retro format alongside the existing 'Happy/Sad/Confused' option.
_lib/remote\retro · high confidence
New UI components for the grouping stage and retro layout
This change introduces a suite of new React components in the web/static/js/components directory to support the grouping stage and refine the overall retro layout. Key additions include GroupingBoard and GroupingIdeaCard, which enable drag-and-drop clustering of ideas using react-dnd, and CategoryColumn, which displays ideas in sortable columns. The layout is enhanced with CenteredContentLowerThirdWrapper and CenteredTextStageWrapper to structure stage-specific content and progression buttons. Supporting components like GroupLabelContainer and GroupLabelInput allow facilitators to name groups, while ClosedLowerThirdContent provides a read-only summary view when the retro ends. Additional components such as Alert, Error, AnimatedEllipsis, and ContactStrideCTA improve user feedback, error handling, and branding.
web/static/js/components · high confidence
New asdf-based installation scripts for Erlang, Elixir, and Node.js
The repository now includes dedicated shell scripts in the bin directory to streamline local development setup using the asdf version manager. The new install\_erlang\_and\_elixir\_with\_dependencies script automates the installation of Erlang and Elixir (including rebar3 and hex), configuring KERL to use Homebrew's OpenSSL and disabling Java compilation. The install\_node\_with\_dependencies script manages Node.js installation via asdf, imports the Node.js release team's OpenPGP keys for verification, and installs global dependencies like Yarn and Chromedriver. Additionally, a prepare\_semantic\_ui\_for\_consumption\_by\_phoenix script is provided to copy and optimize Semantic UI assets for the Phoenix application, specifically stripping '!important' rules, purging unused brand icons, and applying font-display: swap to prevent flash of invisible text.
bin · high confidence
New developer utility and testing tasks
Added four new Mix tasks to streamline development workflows: \mix preflight\ now validates that required OAuth environment variables are set before starting the application; \mix lint\ runs ESLint on JavaScript and JSX files with caching enabled; \mix seed-longer-retro\ inserts a large set of dummy ideas into the database to help test UI behavior with long lists; and \mix end-to-end\ orchestrates the E2E test suite by compiling JavaScript assets and checking for an up-to-date Chromedriver binary before running the feature tests.
lib/tasks · high confidence
New service layer for real-time collaboration and grouping logic
This change introduces a dedicated services layer in the frontend to handle core collaboration features. It adds a RetroChannel service to manage Phoenix Socket connections, presence tracking, and event dispatching (including retry logic for pushes). It introduces collision detection logic using the SAT library to group ideas during the grouping stage, along with services for managing user activity (typing indicators), drag coordinate reconciliation for mobile zoom, idea edit permissions, stage configuration retrieval, and contact form population.
web/static/js/services · high confidence
New service layer for retro management, user onboarding, and data presentation
This change introduces three new service modules in the web layer to handle core application logic. \RetroManagement\ centralizes the update process for retrospectives, ensuring that idea coordinates are persisted during grouping stages, returning aggregate updates for groups and ideas, and automatically sending action item emails while incrementing participant completion counts when a retro is closed. \UserManagement\ handles Google OAuth flows, upserting user records and sending welcome emails upon new registration. \EctoSchemaPresenter\ provides a utility to clean Ecto structs by dropping metadata and unpreloaded associations, likely to prevent serialization issues in API responses.
_lib/remote\_retro\web/services · high confidence
Removals
Removal of Phoenix application core modules
The \endpoint.ex\ and \repo.ex\ files for the WebpackExample application have been deleted. This removes the HTTP endpoint configuration (including static file serving, session management, and router wiring) and the Ecto repository definition, effectively stripping the application of its web server and database access capabilities.
_lib/webpack\example · high confidence
Removal of legacy PageController
The legacy PageController, which previously handled the root index route by rendering an index template, has been removed from the application. This deletion indicates that the root URL handling or the associated view template is no longer managed by this specific controller file, likely as part of a broader restructuring of the landing page or routing configuration.
web/controllers · high confidence
Behavioural changes
Added default English error message translations
The application now includes default English translations for common Ecto changeset validation errors. This change adds the \priv/gettext/errors.pot\ template and the \priv/gettext/en/LC\_MESSAGES/errors.po\ file, which map standard validation messages (such as 'can't be blank', 'has already been taken', and 'is invalid') to their English equivalents, ensuring consistent error messaging for users.
priv/gettext · high confidence
Application renamed to RemoteRetro with Phoenix 1.6 migration and startup automation
The application has been renamed from WebpackExample to RemoteRetro, involving a structural reorganization where the main application module moved from lib/webpack\_example.ex to lib/remote\_retro.ex and the web module from web/web.ex to lib/remote\_retro\_web.ex. This change accompanies an upgrade to Phoenix 1.6, evidenced by the adoption of Ecto.Schema over the deprecated Ecto.Model, the introduction of explicit namespaces for controllers and views, and the use of the Routes alias for router helpers. Additionally, the application now automatically runs database migrations on startup via Ecto.Migrator and integrates Ecto.DevLogger for cleaner SQL logging in development, while the supervision tree has been updated to include Phoenix.PubSub, Telemetry, Presence, and cluster support.
lib · high confidence
Application renamed to RemoteRetro with environment-specific configuration updates
The application has been renamed from WebpackExample to RemoteRetro, requiring updates across all configuration files (config.exs, dev.exs, prod.exs, test.exs) to reflect the new module names (e.g., RemoteRetroWeb.Endpoint, RemoteRetro.Repo). The configuration now explicitly sets the JSON library to Jason for both Phoenix and OAuth2, integrates Honeybadger for error reporting with environment-specific keys, and configures Datadog RUM tokens. Production settings now enforce HTTPS via force\_ssl, use environment variables for sensitive data (secret key base, database URL, API keys), and enable brotli compression for assets. Development and test environments have been updated to use specific mailer adapters (Local and Test), mock user data for OAuth, and adjusted database pool settings.
config · high confidence
Authentication, access control, and observability infrastructure
The web layer now enforces stricter access controls: unauthenticated users are redirected to Google OAuth, and the /admin area is restricted to users with @stridenyc.com email addresses. Session management has been refined to store only the user ID, and the current user is exposed to templates for conditional UI elements like the logout button. Additionally, the application now includes Phoenix.LiveDashboard for monitoring, supported by new Telemetry metrics for Phoenix, Ecto, and VM performance, along with request logging in development.
_lib/remote\_retro\web · high confidence
Centralized Redux state management for retro operations
The application's state management has been consolidated into a structured Redux store, replacing scattered local component state and ad-hoc handling. This change introduces dedicated modules for managing ideas, votes, groups, user presences, and retro configuration, enabling consistent optimistic UI updates for actions like idea submission and voting. It also centralizes error and alert handling to provide immediate user feedback on failed operations (such as group updates or vote retractions) and standardizes facilitatorship and stage progression logic within the store.
web/static/js/redux · high confidence
Configure Distillery release settings
Added a new \rel/config.exs\ file to configure the Distillery release tool. This file defines development and production environments, specifying settings such as ERTS inclusion and cookie configuration, and declares the \remote\_retro\ release with its versioning strategy.
rel · high confidence
Custom error handling and asset serving logic
The application now includes custom error views that render a 500 status page when templates are missing, and provides helper functions to translate form validation errors for users. Additionally, the layout view introduces logic to serve JavaScript and CSS assets from a local development server (port 8080) during development, while falling back to static routes in production, ensuring assets load correctly across environments.
_lib/remote\_retro\web/views · high confidence
Database schema evolution and data migrations for RemoteRetro
This update applies a comprehensive series of database migrations to the RemoteRetro application, introducing new tables (retros, ideas, participations, votes, groups) and evolving existing ones to support core features. Key changes include adding user attribution to ideas, implementing a voting system, and introducing a grouping stage for retrospectives with associated stage migrations (e.g., labeling-plus-voting to groups-labeling/voting). The schema also enforces stricter data integrity through not-null constraints on critical fields (user\_id, retro\_id, stage), adds foreign key cascade behaviors for data consistency, and optimizes performance with various indexes. Additionally, user data handling is refined with longer email support, picture field type changes, and the addition of email opt-in and completed retro count tracking.
priv/repo/migrations · high confidence
Improved development experience with Redux DevTools and suppressed false warnings
The development environment now integrates Redux DevTools for better state inspection, enabled automatically in non-production builds when the extension is available. Additionally, a new utility intercepts and suppresses a specific false-positive warning from react-redux that previously cluttered the console during hot module reloading, ensuring cleaner logs for developers.
web/static/js/dev-utils · high confidence
Introduce configurable retrospective formats with new stage progression logic
The application now supports distinct retrospective formats, starting with 'Happy/Sad/Confused' and 'Start/Stop/Continue', defined in new configuration files. These formats share a common stage structure defined in \shared\_stage\_configs.js\, which establishes a specific progression flow: Idea Generation advances to Grouping, which then advances to Group Labeling, and finally to Group Voting. The configuration also enforces a global vote limit of 3 per user and an idea generation cap of 75 ideas, while introducing responsive layout support for screens below tablet width.
web/static/js/configs · high confidence
Landing page redesign and CSS architecture modernization
The landing page has been visually overhauled with a new gradient background, a 'Trusted By' section, and updated typography for testimonials. To support these changes and improve maintainability, the legacy Bootstrap-based \app.scss\ has been removed and replaced with a new CSS structure using CSS Modules and PostCSS. This includes extracting color variables into a dedicated \colors.css\ file, implementing nested selectors for the landing page components, and adding specific responsive styles for modals and mobile views.
web/static/css · high confidence
Layout template converted to HEEX with performance and observability enhancements
The application layout has been migrated from EEx to HEEX syntax, enabling cleaner dynamic attributes and improved performance. This update introduces several optimizations: DNS prefetching for GitHub and Google accounts, preloading of font resources, and the use of a purged, trimmed-down brand-icons file to reduce CSS payload. Additionally, observability is enhanced with the integration of DataDog RUM for real-user metrics, including specific tagging to filter out misleading Largest Contentful Paint (LCP) events triggered by idle clients during stage advancements. Security and privacy measures include disabling React DevTools in production to mitigate potential attack vectors and stubbing Honeybadger in non-production environments. The layout also now supports load abandonment tracking for retro sessions and ensures canonical domain usage to avoid redirect roundtrips.
_lib/remote\_retro\web/templates/layout · high confidence
Migrate build tooling from Brunch to Webpack and standardize development environment
The project replaces the Brunch asset pipeline with a Webpack-based build system, introducing separate configuration files for shared, development, and production environments to support features like hot module replacement and DLL caching. This change is accompanied by the introduction of ESLint for JavaScript linting, PostCSS for CSS processing, and a standardized tooling setup via \.tool-versions\ (managing Erlang, Elixir, and Node.js versions) and \.buildpacks\ for deployment. Documentation is significantly expanded with a new \CLAUDE.md\ architecture overview, a \CODE\_OF\_CONDUCT.md\, and a detailed \README.md\ covering local setup, testing, and OAuth configuration.
(repo-wide) · high confidence
Migrate frontend to Redux and React 16 with Hot Module Replacement
The frontend application has been refactored to use Redux for state management, replacing the previous ad-hoc state handling. This introduces a new store configuration with thunk middleware and responsive store enhancements, enabling predictable state updates across components like RemoteRetro. The upgrade to React 16 (specifically 16.8.6) brings performance improvements and new lifecycle methods, while the integration of react-hot-loader enables Hot Module Replacement (HMR) for faster development cycles without full page reloads. Additionally, the app now supports drag-and-drop via react-dnd with multi-backend support (HTML5 and Touch), improving usability on touch devices. IE11 compatibility is maintained through core-js polyfills for Set, Map, Symbol, and Array methods, and vendor libraries are bundled separately via DllPlugin to optimize build times.
web/static/js · high confidence
Migrate retro templates to HEEX and optimize resource loading
The retro index and show templates have been converted from EEx to HEEX syntax, enabling cleaner dynamic attribute handling. To improve page load performance and reduce layout shift, the show page now preloads the current user's profile image, while both pages prefetch font and icon resources during idle time.
_lib/remote\_retro\web/templates/retro · high confidence
Migrate templates to HEEX and introduce dedicated error pages
The application's view templates have been converted from the legacy EEx syntax to the modern HEEX format, enabling cleaner dynamic attribute handling. This change also introduces dedicated error pages for 404 and 500 status codes, replacing the previous generic layout, and updates the homepage to use the canonical Stride Consulting branding with updated UTM parameters. Additionally, performance optimizations include prerendering the FAQ page and prefetching JavaScript assets on the homepage to improve load times for first-time users.
_lib/remote\_retro\web/templates/page · high confidence
Port application styles to CSS Modules
The application's styling has been migrated from global CSS (including Semantic UI overrides) to scoped CSS Modules. This change introduces dedicated stylesheets for key interface components such as the grouping board, idea cards, voting interface, and user lists, ensuring that styles are isolated to their respective components and preventing global conflicts. The migration also incorporates modern CSS features like nesting and variables, and applies performance optimizations such as GPU-accelerated transforms for animations.
_web/static/js/components/css\modules · high confidence
Refactor RetroChannel into modular, concern-specific handlers
The monolithic RetroChannel logic has been decomposed into dedicated handler modules (IdeationHandlers, VotingHandlers, GroupHandlers, UserHandlers, and RetroManagementHandlers) to improve code organization and maintainability. This change introduces a structured approach where specific channel events (such as idea submissions, vote retractions, and group edits) are routed to specialized modules, each managing its own transactional logic and broadcasting. Additionally, a new Presence module and utilities have been added to track user online status with timestamped tokens, enhancing real-time collaboration features by ensuring accurate user presence information is available to all clients.
_lib/remote\_retro\web/channels · high confidence
Refactor shared styles into dedicated CSS modules
The styling logic for full-height stages, toggle components, and group labels has been extracted from inline or scattered styles into three new shared CSS modules: full\_height\_stage.css, toggle.css, and group\_label\_text.css. This refactoring improves maintainability by centralizing common flexbox declarations for stage containers, deduplicating toggle button and checkbox styles, and standardizing the appearance of group labels (including specific styles for readonly and unlabeled states).
_web/static/js/components/css\modules/shared · high confidence
Refactored authentication, session handling, and controller structure
The application's authentication flow has been restructured to store only the user's ID and given name in the session rather than the full user object, improving security and performance. A new AuthController manages Google OAuth login and logout, while the PageController now serves static pages like FAQ and Privacy with specific metadata. The RetroController has been optimized to avoid redundant database calls for the current user and includes a new plug to validate UUID parameters, returning a custom 404 message for invalid retro IDs.
_lib/remote\_retro\web/controllers · high confidence
Removal of legacy Phoenix view modules
The \ErrorView\, \LayoutView\, and \PageView\ modules have been removed from the application. This cleanup eliminates the default error rendering logic (returning plain text for 404 and 500 errors) and the base view definitions that were part of the previous Phoenix 1.2/1.3 structure, reflecting the migration to a newer application architecture where these specific view implementations are no longer required or are handled differently.
web/views · high confidence
Removed default Phoenix welcome page template
The default \web/templates/page/index.html.eex\ file, which previously displayed the standard Phoenix welcome message and resource links, has been deleted. This change removes the boilerplate landing page content, indicating that the application's root view is now handled by custom templates or other layout structures.
web/templates · high confidence
Removed unused API pipeline from router
The unused \:api\ pipeline and its associated scope configuration have been removed from the application router, simplifying the routing setup by eliminating dead code that was previously defined but not utilized.
web · high confidence
Retro model schema and validation updates
The models in lib/remote\_retro\_web/models have been updated to support new retro stages (groups-labeling, groups-voting, groups-action-items, groups-closed) and formats (Start/Stop/Continue). The Idea model now validates that action items have an assignee, supports x/y coordinates, and belongs to a Group. The Group model was introduced to store labels for grouped ideas. The User model now includes an email\_opt\_in field and a completed\_retros\_count, and the Retro model's stage validation reflects the new grouping workflow.
_lib/remote\_retro\web/models · high confidence
Updated Google OAuth integration to use v3 userinfo endpoint
The Google OAuth module now retrieves user information from the Google OAuth2 v3 userinfo endpoint (https://www.googleapis.com/oauth2/v3/userinfo) instead of the previous version. This change aligns with the upgrade of the oauth2 library to version 2.0 and ensures compatibility with current Google authentication standards.
_lib/remote\_retro\web/oauth · high confidence
Updated Semantic UI font assets to Lato v15
The Lato font files (bold and italic SVGs) in priv/static/css/semantic-ui/font have been replaced with version 15 definitions. This update ensures the application uses the latest font metrics and glyph data provided by the Semantic UI framework.
priv/static/css · high confidence
Test coverage
Add JavaScript unit tests and configure test environment; Added Redux test coverage for core retro state modules; Added and updated view tests for RemoteRetro; Added controller tests for authentication, retro management, and static pages; Added model tests for Group, Idea, Participation, Retro, User, and Vote; Added test coverage for core service modules; Added test support modules for mocking Google OAuth authentication; Added tests for Google OAuth integration; Added tests for the ForbidNonStriders plug; Added unit tests for RetroChannel and Presence modules; Added unit tests for new and refactored UI components; Expanded end-to-end test coverage for collaborative retro features; New JavaScript test infrastructure and helpers; Refactored test support infrastructure and helpers.
Dependencies
Major dependency upgrades across Elixir, Phoenix, and React ecosystems
This release performs a comprehensive upgrade of the project's core dependencies. On the backend, the application has been upgraded from Phoenix 0.14 to 1.6.11, Elixir to 1.11.4, and Ecto to 3.7.2, alongside updates to Plug, Postgrex, and the introduction of Phoenix Live View and Live Dashboard. On the frontend, React and ReactDOM have been upgraded to 16.8.6, and the build pipeline has shifted from Brunch to Webpack 4 with Babel 7 and PostCSS, adding support for modern JavaScript features and improved asset compilation.
(dependencies) · high confidence
Upgrade jQuery to version 3.4.1
The jQuery library has been updated to version 3.4.1. This upgrade includes a security patch to address known vulnerabilities in previous versions, ensuring improved stability and security for client-side interactions.
priv/static/js · high 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 52 → 53 (+1.1)
- Rubric changed (rubric-2026.09.15 → rubric-2026.10.1) — scores are not directly comparable.
Lenses
- Code Health 70 → 72 (+1.9)
- Architecture 62 → 58 (-3.9)
- Maturity 57 → 57 (+0.0)
- Readiness 47 → 46 (-0.6)
- Security 70 → 62 (-7.6)
- Accessibility 51 → 65 (+13.5)
Resolved (6)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
New (8)
- End-of-life runtime: Elixir 1.11
- End-of-life runtime: Erlang/OTP 22
- End-of-life runtime: Node.js 14
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- High CVE: [GHSA redacted] (yarn.lock)
- Projects may be oversized for their cohesion
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
stride-nyc/remote_retro 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 3 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 1dc882535ceeb23b37869904d9610826d1e06127 — the exact code this score is about.
- Scored under rubric-2026.10.1 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-8fe32cd45d00.