jitterted/ensembler
54.7
Adequate · 21 September 2026
4.5k
lines of production code
Java
primary language
4
measurements over time
What this system is
Ensembler is a web-based platform for managing structured group sessions, or 'ensembles,' where participants rotate roles and follow timed intervals. The system facilitates user authentication via GitHub, manages ensemble scheduling and state transitions, and provides real-time updates through WebSocket. It integrates with external services to send email and push notifications, schedule Zoom meetings, and sync timer states with a conductor service.
How it got here
2021 — Ensembler platform migration
31 changes.
The project underwent a significant rebranding and technical migration from 'Moborg' to 'Ensembler', upgrading to Spring Boot 3 and Java 25. This period focused on rebuilding the core domain model for ensembles and timers, implementing GitHub OAuth2 authentication, and adding features for Zoom integration, email notifications, and an admin dashboard.
2022–2024 — Real-time synchronization and test coverage
9 changes.
This period focused on implementing real-time updates via WebSocket and HTTP integrations with external services like Zoom and Conductor, supported by comprehensive test coverage for these new features. The work also included building a composite broadcaster to handle multiple update destinations and ensuring robustness through extensive unit and integration tests.
Features
Add GitHub collaborator lookup capability
Introduces a new GitHubCollaboratorFinder component that queries the GitHub API to check if a user is a collaborator on a specific repository, supporting future user signup flows.
src/main/java/com/jitterted/mobreg/adapter/out/membership · medium confidence
Added HTTP integration to sync timer state with Conductor service
A new HTTP client implementation (ConductorHttpBroadcaster) was added to send timer updates to the Conductor service via PUT requests. The request payload (SyncConductorTimerRequest) maps internal timer states (Waiting, Running, Paused, Finished) and rotation details to the external API. Error handling was updated to catch RestClientException, covering both client and server errors.
src/main/java/com/jitterted/mobreg/adapter/out/conductor · high confidence
Added Pushover push notification support for ensemble scheduling
Users will now receive push notifications via Pushover when a new Ensemble is scheduled. This change introduces the Pushover integration, including configuration properties and a notifier component that sends messages about newly scheduled Ensembles. The implementation currently supports the ensembleScheduled event, while memberAccepted and ensembleCompleted events are not yet implemented.
src/main/java/com/jitterted/mobreg/adapter/out/notification · high confidence
Admin dashboard and ensemble management features
The admin dashboard now displays a summary of all ensembles, including their state, accepted and declined member counts, and scheduled times. Administrators can create, edit, cancel, and complete ensembles, as well as manage member registrations and invitations. The admin interface also supports managing ensemble timers, allowing admins to create, delete, and view the status of active timers for each ensemble. Additionally, the admin members view allows for manual registration of new members and displays a sorted list of all members.
src/main/java/com/jitterted/mobreg/adapter/in/web/admin · high confidence
Email notifications for Ensembles and Members
The system now sends email notifications for key events: new Ensembles are announced to all members, registration confirmations are sent to individual members, and completion emails are sent to participants. The implementation uses the Brevo email service, with each email customized to the recipient's time zone and locale.
src/main/java/com/jitterted/mobreg/adapter/out/email · high confidence
Implemented scheduled seconds ticker for timer ticks
Added a new ScheduledExecutorSecondsTicker that uses a ScheduledExecutorService to fire a tick every second, ensuring only one countdown timer is active at a time and properly stopping the timer when the timer is deleted.
src/main/java/com/jitterted/mobreg/adapter/out/clock · high confidence
Introduced domain models for Ensembles, Members, and Timers
Added new domain classes to the application's core logic, including \Ensemble\, \Member\, \CountdownTimer\, and \EnsembleTimer\. These changes introduce the foundational structures for managing user participation, session timing, and role rotation, enabling features like timer control and ensemble state tracking.
src/main/java/com/jitterted/mobreg/domain · high confidence
Introduces application-layer services and infrastructure for timer and member management
The application layer now includes new services and infrastructure to support timer and member management. A new \DefaultMemberService\ implements the \MemberService\ interface, handling member lookups and profile updates (email, time zone, first name). The \EnsembleService\ is introduced to manage ensemble scheduling, updates, and state transitions (join, complete, cancel). A new \EnsembleTimerHolder\ manages the lifecycle of \EnsembleTimer\ instances, handling start, pause, resume, and reset operations, and integrates with a \Broadcaster\ to send timer state updates. Additionally, \GoogleCalendarLinkCreator\ is added to generate calendar links for ensembles. These changes provide the core application logic for managing ensembles, timers, and members.
src/main/java/com/jitterted/mobreg/application · high confidence
New application ports for timers, notifications, and video conferences
The application layer now exposes several new ports that define the system's external interfaces: Broadcaster for sending timer events, SecondsTicker for managing the ensemble timer, Notifier for sending emails about scheduled, accepted, or completed ensembles, VideoConferenceScheduler for creating and deleting Zoom meetings, and Shuffler for randomizing participant order. Additionally, in-memory repositories for Ensembles, Members, and Invites have been added to support these operations.
src/main/java/com/jitterted/mobreg/application/port · high confidence
New home page and static assets for the Ensembler application
The static resources for the application's home page have been added, including a new index.html template that provides a landing page with GitHub sign-in and registration options. This update also introduces the necessary CSS files (tailwind.css, ensembler.css) and a site.webmanifest for browser support, establishing the visual foundation for the user-facing entry point.
src/main/resources/static · high confidence
New web controllers and security mappers for GitHub authentication
The application introduces three new components in the web layer to handle GitHub OAuth2 authentication and user routing. A new \GitHubGrantedAuthoritiesMapper\ resolves user roles by looking up the GitHub username in the member repository, assigning \ROLE\_USER\ for non-members or specific roles for existing members. A \GitHubUsernamePrincipalExtractor\ utility extracts the GitHub login name from the authenticated principal. Additionally, a \WelcomeController\ provides endpoints for anonymous users (redirecting to registration) and authenticated users (displaying the username on the \/user\ page).
src/main/java/com/jitterted/mobreg/adapter/in/web · medium confidence
Zoom video conference scheduling and management
Users can now schedule and manage Zoom meetings directly from the platform. The system creates scheduled meetings with specific settings (e.g., host video on, mute on entry) and provides join links. Additionally, when an ensemble is cancelled, the system now deletes the associated Zoom meeting and sends a confirmation email to participants.
src/main/java/com/jitterted/mobreg/adapter/out/zoom · medium confidence
Removals
Removed Spring Boot application entry point
The main entry point for the Spring Boot application (MoborgApplication.java) has been removed from the codebase.
src/main/java/com/jitterted/moborg · high confidence
Behavioural changes
Application renamed to Ensembler and restructured with new configuration and security setup
The application has been renamed from MobReg to Ensembler, reflected in the new EnsemblerApplication.java entry point and package structure. A new EnsemblerConfiguration.java centralizes bean definitions, including a single-query loading enabler for JDBC, member and ensemble services, and a composite broadcaster for WebSocket updates. Security is now explicitly configured via WebSecurityConfig, enforcing ROLE\_USER, ROLE\_MEMBER, and ROLE\ADMIN for respective paths (/user/\\, /member/\\, /admin/\\*), while disabling CSRF and configuring logout behavior. Additionally, a VersionInfoContributor exposes app version, name, and build timestamp via the actuator/info endpoint.
src/main/java/com/jitterted/mobreg · high confidence
Configuration updates for OAuth2, Zoom, and Actuator endpoints
The application's configuration files have been updated to support GitHub OAuth2 authentication, Zoom video conference scheduling, and enhanced Actuator monitoring. New properties define client IDs and secrets for GitHub and Zoom integrations, while the actuator endpoints (health, info, metrics, prometheus) are explicitly exposed. Additionally, the build timestamp and project version are now included in the /info endpoint, and virtual threads are enabled for performance improvements.
src/main/resources · high confidence
Database schema updates for ensemble state, conference details, and member data
The database schema has been updated to support new features and data structures. The 'ensembles' table now tracks state (scheduled, completed, canceled) instead of a boolean, and includes fields for conference join URL, meeting ID, and start URL. A new 'invites' table has been added to manage invitations with unique GitHub username constraints. Additionally, a 'spectator\_member' table was created to track spectators, while other migrations handle renaming tables from 'huddle' to 'ensemble', adding email and time zone fields to members, and creating a declined member table.
src/main/resources/db · high confidence
Introduces a composite broadcaster to aggregate multiple broadcast destinations
A new CompositeBroadcaster class has been added to the outbound adapter layer. This component aggregates multiple Broadcaster implementations, allowing timer updates to be sent to multiple destinations simultaneously. The implementation includes error handling that catches exceptions from individual broadcasters and logs them, ensuring that a failure in one destination does not prevent updates from being sent to others.
src/main/java/com/jitterted/mobreg/adapter/out · medium confidence
Member profile updates and ensemble management enhancements
Members can now update their first name, email, and time zone via the Member Profile page. The ensemble listing now supports sorting by date (ascending for upcoming, descending for past) and displays distinct action buttons for participants and spectators, with the 'Participate' button disabled when an ensemble is full. A new timer controller allows starting, pausing, and rotating the timer for in-progress ensembles, and the member registration view separates upcoming and past ensembles.
src/main/java/com/jitterted/mobreg/adapter/in/web/member · medium confidence
Migrated Huddle persistence to Ensemble with new DBOs and repositories
The JDBC adapter layer has been refactored to persist Ensembles instead of Huddles. This introduces new Data Base Object (DBO) classes (EnsembleDbo, MemberDbo, InviteDbo) and their corresponding Spring Data JDBC repositories and adapters. The EnsembleDbo now maps to the 'ensembles' table and includes collections for AcceptedMember, DeclinedMember, and SpectatorMember, enabling the system to store and retrieve ensemble state and member relationships directly from the database.
src/main/java/com/jitterted/mobreg/adapter/out/jdbc · high confidence
New Admin dashboard and member registration pages with Tailwind CSS
The admin dashboard and member registration pages have been redesigned using Tailwind CSS for a modern, responsive layout. The admin dashboard now displays a table of all ensembles with status badges (Scheduled, Completed, Canceled) and participant counts. The member registration page is split into 'Upcoming' and 'In Progress' sections, showing ensemble details, participant lists, and links to Zoom and timer pages. Additionally, new templates for the ensemble timer, member profile, and invite management have been added, all styled with Tailwind CSS.
src/main/resources/templates · high confidence
Real-time timer and audio updates via WebSocket
The WebSocket adapter now pushes live HTML updates to the browser for the timer's state (Waiting to Start, Running, Paused, Finished) and plays specific audio cues (horn, arp\_up, arp\_down) for state transitions. This replaces the previous mechanism where the client listened to raw WebSocket messages, enabling immediate UI updates and sound playback without page reloads.
src/main/java/com/jitterted/mobreg/adapter/out/websocket · high confidence
Standardized date/time handling and clarified role mapping in the adapter layer
The adapter layer now centralizes date and time formatting logic in a new DateTimeFormatting utility, which converts browser-sent date and time strings into ZonedDateTime objects using the Pacific timezone. This supports accurate display of huddle times based on the browser's time zone. Additionally, the RotationRole enum was introduced to explicitly map internal role identifiers (driver, navigator, nextDriver, restOfParticipants) to their string representations, improving clarity in the adapter's interaction with the rest of the system.
src/main/java/com/jitterted/mobreg/adapter · medium confidence
Updated Maven wrapper to version 3.9.9
The project's Maven wrapper has been upgraded from version 0.5.6 to 3.2.0, and the underlying Maven distribution has been updated from 3.8.1 to 3.9.9. This change ensures that developers and CI systems use a consistent, modern version of the build tool. Additionally, the configuration for the jgitver-maven-plugin has been added to .mvn/extensions.xml (though currently commented out), and the custom MavenWrapperDownloader.java has been removed as it is no longer needed with the new wrapper.
.mvn · medium confidence
Test coverage
Added domain tests for ensemble timer, rotation, and state management; Added hexagonal architecture and security test configurations; Added integration tests for Zoom scheduler API; Added manual integration test for Pushover notifications; Added manual test for GitHub API integration; Added test configuration for Spring Boot 3.2.1 and email services; Added test infrastructure for web adapter; Added tests for JDBC adapters and domain mapping; Added tests for date and time formatting logic; Added tests for email notification logic; Added tests for ensemble cancellation and completion workflows; Added tests for member web adapter components; Added tests for the SecondsTicker behavior; Added tests for timer and event HTML transformation; Added unit tests for SyncConductorTimerRequest; Removed obsolete Spring Boot context test.
Dependencies
Major upgrade to Spring Boot 3.5.16 and Java 25
The project has been upgraded to Spring Boot 3.5.16, moving from the 2.x/3.2.x lineage to a significantly newer major version, alongside a Java version bump to 25. This change introduces several new dependencies including Spring Security, OAuth2 client support, WebSocket, and JDBC, while removing H2 in favor of PostgreSQL and Flyway for database migrations. Additionally, the project name was changed to 'ensembler' and the artifact ID was updated accordingly.
(dependencies) · 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
This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.
Score
- CAI 56 → 55 (-0.9)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 98 → 97 (-1.0)
- Architecture 100 → 66 (-34.3)
- Maturity 55 → 62 (+7.7)
- Readiness 56 → 57 (+1.4)
- Security 85 → 84 (-0.7)
- Domain Modelling 100 → 80 (-20.2)
- Accessibility 44 → 44 (+0.4)
Resolved (10)
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- High: security finding (details withheld)
- High: security finding (details withheld)
- LLM evaluation failed
- Medium IaC: CKV_DOCKER_2 (Dockerfile)
- No exposed public API
- Off-boarding risk: anonymized user #1
- Scanner failed to run — not a clean result
- Test reliability not included
New (85)
- Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- High: security finding (details withheld)
- High: security finding (details withheld)
- Medium IaC: WD-COMPOSE-0002 (compose.yml)
- Medium IaC: WD-DOCKER-0003 (Dockerfile)
- Medium IaC: WD-DOCKER-0003 (Dockerfile)
- No ADRs found
- No assertions: adaptersMustNotDependOnEachOther (src/test/java/com/jitterted/mobreg/HexagonalArchitectureTest.java)
- No assertions: applicationMustNotDependOnAdapters (src/test/java/com/jitterted/mobreg/HexagonalArchitectureTest.java)
- No assertions: askForTimerButNoTimerExists (src/test/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerHolderTest.java)
- No assertions: attemptingToCancelEnsembleWithNoMeetingIdDoesNotCallConferenceScheduler (src/test/java/com/jitterted/mobreg/application/EnsembleServiceCancelTest.java)
- No assertions: domainAndApplicationMustNotAccessRandom (src/test/java/com/jitterted/mobreg/HexagonalArchitectureTest.java)
- No assertions: domainAndApplicationMustNotAccessSystemTime (src/test/java/com/jitterted/mobreg/HexagonalArchitectureTest.java)
- No assertions: domainMustNotDependOnAnythingOutsideOfDomain (src/test/java/com/jitterted/mobreg/HexagonalArchitectureTest.java)
- No assertions: exceptionThrownIfStartTimerWhenFinished (src/test/java/com/jitterted/mobreg/domain/CountdownTimerTest.java)
- No assertions: exceptionThrownIfStartTimerWhenPaused (src/test/java/com/jitterted/mobreg/domain/CountdownTimerTest.java)
- No assertions: exceptionThrownIfStartTimerWhenRunning (src/test/java/com/jitterted/mobreg/domain/CountdownTimerTest.java)
- No assertions: exceptionThrownWhenStartInvokedButCountdownAlreadyScheduled (src/test/java/com/jitterted/mobreg/adapter/out/clock/ScheduledExecutorSecondsTickerTest.java)
- …and 65 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
jitterted/ensembler 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 264ad3daaef8bfa15fe0e04670a0bf7aa184a8ae — 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-fa71c66cabd8.