Skip to content
CAI
Software that uses CAICheck a score

Team-B1ND/dodamdodam-ios

47.1

Weak · 20 September 2026

16.6k

lines of production code

Swift

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is an iOS application for school community management, supporting students, parents, and administrators. It provides features for managing club memberships, academic divisions, and night study sessions, alongside utilities for meal tracking, bus applications, and point systems. The app facilitates user authentication via deep links and push notifications, while offering a modular architecture for data handling and UI components.

How it got here

2024 — Modular architecture and core feature implementation

63 changes.

The project underwent a significant architectural restructuring, migrating to a multi-module design with distinct Domain, Data, Feature, and Shared layers, while upgrading build tooling to mise. This period focused on implementing core student management features, including authentication, club and division administration, night study applications, and meal tracking, supported by a new widget and comprehensive UI components.

2025 — Community and organizational management features

18 changes.

This period focused on implementing comprehensive management interfaces for divisions, clubs, and night study projects. The work introduced features for creating and organizing these groups, managing membership applications and permissions, and handling administrative approvals and bans. Additionally, student registration via code and deep link authentication were added to support user onboarding and access.

Features

Add Club management view and view model

Introduces the ClubView SwiftUI component and its associated ClubViewModel to display and manage club data. The view presents a segmented interface for 'Activity' and 'Direct Activity' clubs, utilizing ClubCell components for list items and handling navigation to ClubDetailView. The view model handles data fetching via ClubRepository, supports pull-to-refresh functionality, and manages empty state displays with a link to create new clubs.

Projects/Feature/Source/Club · high confidence

Add Division Detail view with member management

Users can now view detailed information for a specific division, including its name, description, and a categorized list of members (Admins, Writers, Readers). Admins gain the ability to manage the division by adding new members, viewing pending join requests, and promoting or demoting existing members' permissions. Non-admin users can apply to join the division via a dedicated button. The view also supports pulling to refresh the data.

Projects/Feature/Source/Division/Detail · high confidence

Add DodamMealWidget for displaying daily meal menus on the home screen

Users can now add a new 'DodamMealWidget' (labeled '급식') to their iOS home screen to quickly view breakfast, lunch, and dinner menus along with calorie counts. The widget supports small and medium sizes (plus Apple Watch accessory sizes) and fetches meal data via a repository that combines remote API calls with local caching. It handles empty meal scenarios and network errors gracefully, displaying appropriate fallback text, and updates its timeline hourly or when the day rolls over after 8 PM.

Projects/App/iOS-Widget/Source · high confidence

Add MealCell component for displaying meal details

A new MealCell SwiftUI view has been introduced to render individual meal items. This component displays the meal type as a primary tag, shows the calorie count, and lists the meal details, providing a structured visual representation for meal data within the application.

Projects/Feature/Source/Meal/Component · high confidence

Add Member screen for divisions

Users can now add members to a division via a new screen that displays a list of divisions. Each division is presented in an expandable accordion; expanding a division reveals its current members, allowing users to select individual members or select all. A bottom control bar provides options to cancel selections or confirm the addition of the chosen members to the target division.

Projects/Feature/Source/Division/AddMember · high confidence

Add Shared module project definition

A new Xcode project file for the Shared module has been added, defining a static framework target named 'Shared' for iOS 15.0+ that includes SwiftLint and depends on the external FlowKit and DDS libraries.

Projects/Shared · high confidence

Add WakeupSong cell components for displaying song lists

Introduced two new SwiftUI views, \WakeupSongCell\ and \TomorrowWakeupSongCell\, within the WakeupSong feature module to render lists of scheduled or upcoming wake-up songs. These components display video thumbnails, titles, channel names, and status indicators, linking directly to the associated video URLs.

Projects/Feature/Source/WakeupSong/Component · high confidence

Add children management view for registering students by code

The ChildrenManageView now allows parents to register additional children by entering an 8-character student code and selecting a relationship (e.g., Father, Mother, Grandfather, or custom). The interface displays existing connected students and provides a sheet for adding new ones, validating input and handling API calls to fetch student details and establish the relationship.

Projects/Feature/Source/ChildrenManage · high confidence

Add club detail UI components for listing and member display

The club detail view now includes dedicated SwiftUI components to render club listings and member information. ClubCell displays club details including images, names, descriptions, and approval status tags. LeaderCell shows member profiles with permission indicators and status marks. MemberCell provides a simpler member list view. StateTypeTag component standardizes status badge styling across these views.

Projects/Feature/Source/Club/Detail/Component · high confidence

Add division creation interface

Users can now create a new division by entering a name and a description (up to 300 characters) in the new CreateDivisionView. The interface includes a character counter that turns red when the limit is exceeded and disables the 'Create' button until both fields are valid. Upon successful creation, a confirmation dialog is displayed before returning to the previous screen.

Projects/Feature/Source/Division/CreateDivision · high confidence

Add division listing and search interface

Introduces the DivisionView and supporting components to display a paginated list of all divisions and the user's personal divisions, separated by tabs. The view includes a search field that filters both lists in real-time and allows users to tap a division to navigate to its detail view.

Projects/Feature/Source/Division · high confidence

Add domain models for school entities and meal data

Introduces a new set of domain models in the \Projects/Domain/Source/Model\ directory to support core school application features. This includes data structures for user entities (\Member\, \Student\, \Teacher\, \ConnectStudent\), organizational units (\Club\), and meal tracking (\MealModel\, \MealDetail\, \MealMenu\). Additionally, a \ModelProtocol\ is added to standardize model conformance, and \PointReason\ is introduced to handle point system data.

Projects/Domain/Source/Model · high confidence

Add interface for managing division membership requests

Users can now view and manage pending membership applications for a division. A new list displays members awaiting approval, and tapping a member opens a detail sheet where administrators can approve or reject the request, updating the division's membership status accordingly.

Projects/Feature/Source/Division/Waiting · high confidence

Add member profile editing interface

Users can now edit their profile information, including name, email, and phone number, via a new screen in the settings. The interface allows uploading a new profile image through the device's photo library and automatically formats phone numbers for input. Changes are saved by updating the member info on the server, with success or failure confirmed via dialog notifications.

Projects/Feature/Source/All/Setting/EditMemberInfo · high confidence

Add out-leave and overnight-stay application screen

The OutApply feature now provides a dedicated UI for users to submit requests for leaving campus (out-leave) or staying overnight. The screen includes a segmented control to toggle between 'Out-leave' and 'Overnight-stay' modes, dynamically adjusting input fields for reasons, dates, and times. For out-leave requests, the system validates that the return time is after the start time and disables submission if the reason is empty. Additionally, if an out-leave request is submitted on a Wednesday, a dialog prompts the user to confirm whether they will eat dinner, integrating this data into the submission payload.

Projects/Feature/Source/Out/OutApply · high confidence

Add request protocol and reusable container UI component

Introduces a new \RequestProtocol\ in the Domain layer to standardize request encoding, and adds a \DodamContainer\ SwiftUI component in the Shared layer that provides a consistent visual wrapper for content sections, featuring a customizable title, icon, and background styling.

Projects/Domain/Source/Request, Projects/Shared/Source/Component · high confidence

Added ClubApplyRequest model for club applications

A new \ClubApplyRequest\ struct has been introduced in the Domain layer to support club application submissions. This model defines the data structure for applying to a club, including the club identifier, an optional priority level, and an optional introduction text, enabling the backend to receive and process these specific application details.

Projects/Domain/Source/Request/Club · high confidence

Added Domain module project definition

The Domain module's project configuration has been added, defining an iOS framework target named 'Domain' with a bundle ID of 'com.b1nd.dodam.studentDomain', a minimum deployment target of iOS 15.0, and SwiftLint integration.

Projects/Domain · high confidence

Added domain request models for fetching notices

Introduced two new domain request structures, FetchNoticeRequest and FetchNoticeByDivisionRequest, to support fetching notice data. FetchNoticeRequest allows filtering by a search key, notice status, and pagination parameters (lastId, limit), while FetchNoticeByDivisionRequest supports fetching notices by division ID with similar pagination controls.

Projects/Domain/Source/Request/Notice · high confidence

Added request model for submitting outgoing meal requests

A new domain request model, PostOutGoingRequest, has been introduced to handle the data structure for submitting outgoing meal requests. This model captures the reason for the request, the start and end times, and whether the request pertains to dinner, enabling the application to transmit these specific details to the backend API.

Projects/Domain/Source/Request/OutGoing · high confidence

Added reusable list cell component for feature items

A new SwiftUI view, AllCell, has been introduced to provide a consistent UI for displaying feature items in a list. This component renders a row containing an icon, a title, and a chevron indicator, and handles tap actions via a closure, allowing other parts of the application to easily display interactive list entries with a standardized appearance.

Projects/Feature/Source/All/Component · high confidence

Adds shared Swift foundation extensions

The Shared/Foundation module now includes a set of new utility extensions to simplify common development tasks. These include Comparable clamping, comprehensive Date formatting and manipulation (including Korean locale support and calendar views), standardized DateFormatter types, array search helpers for Identifiable elements, String indexing and date parsing, and an async Task sleep utility.

Projects/Shared/Source/Foundation · high confidence

Bus application screen with selection and status feedback

Users can now select a bus to apply for, view real-time occupancy status (applied count vs. limit), and receive immediate feedback via alerts for success, failure, or when a bus is full. The interface displays available buses, allows toggling selection, and handles edge cases like no available buses or full capacity through dialog prompts.

Projects/Feature/Source/Bus · high confidence

Club application interface for activity and free clubs

Users can now apply to join clubs through a new view that supports two modes: 'Activity Clubs' (창체), where users select up to three ranked preferences, and 'Free Clubs' (자율), where users select clubs and provide a self-introduction with a 300-character limit. The interface validates selections, allows adding multiple free club entries, and presents a confirmation dialog summarizing the choices before submitting the application request.

Projects/Feature/Source/Club/Apply · high confidence

Club detail view with member list and markdown description

Users can now view detailed information for a specific club, including its subject, name, short description, and a full description rendered as Markdown. The view also displays a sorted list of club members (leaders first) and provides a button to navigate to the application screen for joining the club.

Projects/Feature/Source/Club/Detail · high confidence

The app now supports processing deep links (universal links) for student authentication. When a user opens a link containing a clientId and code, the DeepLinkManager parses the URL and posts a notification. The DeepLinkViewModel observes this notification and triggers the DeepLinkLoginUseCase to perform the login, notifying the UI of success or failure via callbacks.

Projects/Feature/Source/DeepLink · high confidence

Expanded domain entity definitions for club, schedule, and authentication features

The domain layer now includes a comprehensive set of new entity types to support recent feature additions. These include enums for club management (ClubType, ClubPriority, ClubTeacher, PermissionType), scheduling (ScheduleType, SchedulePlace), and night study projects (NightStudyType, NightStudyProjectType, NightStudyPlace, NightProjectPlace). Additionally, new entities define authentication methods (AuthType), user roles (Role), meal types (MealType), and various status/permission states (ActiveStatus, AllowStatus, DivisionPermission, NoticeStatus, StateType, ScoreType, PointType, FileType, Grade). This provides the necessary data structures for the UI and application logic to handle these new capabilities.

Projects/Domain/Source/Entity · high confidence

Initial iOS app resource configuration

This change introduces the foundational resource files for the iOS application, including the entitlements file which enables push notifications and configures associated domains for deep linking (applinks:deeplink.b1nd.com), the GoogleService-Info.plist for Firebase integration, and the LaunchScreen.storyboard defining the initial app launch UI with the Dodam and B1ND logos.

Projects/App/iOS/Resource · high confidence

Initial iOS app structure with push notifications and deep linking

The iOS application now includes core infrastructure for handling push notifications via Firebase Cloud Messaging, including token registration and in-app notification display. It also supports deep linking through universal links, enabling QR-based login flows that present confirmation dialogs to the user. The app entry point initializes necessary providers and sets up the navigation controller with custom styling.

Projects/App/iOS/Source · high confidence

Introduce DIContainer module with Swinject-based dependency injection

A new DIContainer module has been added to the project, providing a centralized dependency injection setup using the Swinject library. This includes a shared DependencyProvider that exposes a Swinject Container, and an @propertyWrapper named Inject that allows classes to automatically resolve dependencies from the container, failing with a fatal error if resolution is unsuccessful.

Projects/DIContainer · high confidence

Introduce MyClub view for club affiliation and application management

The MyClubView screen has been added to display the user's club affiliation status, including joined clubs, pending applications, and club creation options. It presents a dynamic banner indicating whether club applications are open or closed based on the registration deadline, allowing users to apply for new clubs directly within the app or redirect to the web portal for additional applications. The view integrates with MyClubViewModel to fetch data on appear and supports pull-to-refresh functionality.

Projects/Feature/Source/Club/MyClub · high confidence

Introduce Wakeup Song feature view and view model

Added the WakeupSongView and WakeupSongViewModel to the Feature module, enabling users to view approved and pending wakeup songs, manage their personal list (including deletion), and apply for new songs. The view integrates with the authentication system to show login prompts for unauthenticated users and utilizes the DodamDialog component for confirmation alerts.

Projects/Feature/Source/WakeupSong · high confidence

Introduce local Realm-based meal caching with safe write handling

The Local data module now persists meal data using Realm, introducing entities for meals, meal details, and menu items alongside an expiration protocol to manage cache validity (defaulting to 14 days). A new \MealCache\ service provides methods to fetch, save, and delete meal records, while a \safeWrite\ extension on Realm ensures write transactions are handled correctly whether already inside a transaction or not.

Projects/Data/Local · high confidence

Introduce new Notice screen with category filtering and media support

The Notice feature now includes a dedicated view (NoticeView) that displays announcements in a scrollable list, supporting pagination and pull-to-refresh. Users can filter notices by division using a horizontal category selector (NoticeViewHeader/NoticeDivisionCell). Each notice item (NoticeCell) renders the title, content, author, and date, and displays attached images (single or multi-image with a count overlay) and downloadable files (NoticeFile). The view model (NoticeViewModel) handles fetching notices and divisions, managing the selected division state to trigger filtered fetches.

Projects/Feature/Source/Notice · high confidence

Introduce new data source layer for core app features

The application now includes a comprehensive set of new data source implementations in the DataSource module, providing the data access layer for authentication, club management, division administration, meal caching, night study operations, notices, and member relations. This change adds the underlying data connectivity required for these features to function, including local meal caching and remote API integration for club join requests and night study approvals.

Projects/Data/DataSource · high confidence

Introduce unified AllView dashboard with role-based navigation and reusable UI components

Users now have a centralized 'All' (전체) dashboard view that adapts its content based on their login status and role. Logged-in students see their profile, student code (with a copy-to-clipboard feature), and access to features like point history, bus applications, club management, and night study approvals (if they are managers). Parents see options to manage their children and view groups. Non-logged-in users are prompted to log in. This entry also introduces reusable UI components, including a \SettingCell\ for consistent settings list styling and an \OnAppearProtocol\ to standardize data fetching logic in view models.

Projects/Feature/Source/All · high confidence

Introduces comprehensive domain response models for the application

This change adds a complete set of new domain response models to the \Projects/Domain/Source/Response\ directory, establishing the data structures for the app's API layer. The update includes a base \ResponseProtocol\ and a generic \Response\ wrapper, alongside specific models for authentication (Login, Reissue), user profiles (Member, ConnectStudent), club management (ClubDetail, ClubApply, ClubJoinRequests, MyClub), divisions (DivisionDetail, DivisionMember), meal schedules, night study applications and bans, notices with file attachments, and various utility responses (Banner, Bus, Point, Schedule, WakeupSong). These models define the shape of data returned by the backend for these features.

Projects/Domain/Source/Response · high confidence

Introduces new network service layer for club, division, and night study management

This change adds a comprehensive set of new network service definitions (using Moya) to handle API interactions for clubs, divisions, night studies, and related administrative features. Specifically, it introduces \ClubService\ to support club joining requests, member management, and application tracking; \DivisionService\ to enable division creation, member assignment, and permission updates; and \NightStudyService\ to support student applications, project management, and administrative controls like banning or approving night study sessions. These services provide the data-fetching and mutation capabilities required for the new club and division domain features.

Projects/Data/Network/Source/Service · high confidence

This update establishes the foundational domain layer by introducing a comprehensive set of repository protocols (Auth, Banner, Bus, Club, Division, Meal, Member, NightStudy, Notice, OutGoing, OutSleeping, Point, Schedule, Upload, and WakeupSong) that define the application's data access contracts. Additionally, it introduces a new Deep Link login feature, implemented via the \DeepLinkLoginUseCase\ and \AuthRepository.postQRLogin\ method, enabling users to authenticate through deep link mechanisms.

Projects/Domain/Source/Repository · high confidence

Introduction of the Feature module with new dependencies

A new 'Feature' module has been added to the project structure, targeting iOS 15.0 as a static framework. This module integrates several external dependencies, specifically SwiftUIIntrospect, CachedAsyncImage, and MarkdownUI, and relies on internal modules including Domain, DIContainer, and Shared.

Projects/Feature · high confidence

Introduction of the Main navigation view

A new MainView has been added to the Feature module, serving as the primary entry point for the application. It implements a tab-based interface using DodamTabView, allowing users to navigate between five distinct sections: Home, Meal, Out, NightStudy, and All.

Projects/Feature/Source/Main · high confidence

New CalendarDateCell and PhotoPicker components

Added a new CalendarDateCell view for displaying individual dates in a calendar interface, featuring selection styling and date formatting, and a new PhotoPicker component that wraps iOS PHPicker to allow users to select a single image for upload.

Projects/Feature/Source/Component · high confidence

New Flow and FlowPreview SwiftUI components

Added Flow.swift and FlowPresenter.swift to the Shared/Source/Flow module, introducing a FlowPreview view for quick previews and a FlowPresenter view that wraps a FlowProvider to present its content with safe area handling and environment object injection.

Projects/Shared/Source/Flow · high confidence

New Home screen with consolidated dashboard and meal logic

The Home screen has been rebuilt to present a unified dashboard featuring banners, the daily meal menu, wake-up songs, upcoming schedules, and quick-access cards for leave and night-study applications. The meal display now intelligently shows tomorrow's breakfast if today's meal data is unavailable, and access to leave and night-study features requires login, redirecting unauthenticated users to the login view.

Projects/Feature/Source/Home · high confidence

New Meal View with interactive calendar and meal display

The app now features a dedicated MealView that displays monthly meal data alongside an interactive calendar. Users can select specific dates to view corresponding meals, with the calendar collapsing and expanding based on scroll position. The view includes a ViewModel that fetches meal data from the repository and handles date selection logic, providing a unified interface for browsing and selecting meal information.

Projects/Feature/Source/Meal · high confidence

New MyClub screen components for club management

Added a new set of SwiftUI views and a ViewModel to the MyClub feature, enabling users to view their joined clubs, manage club creation applications, track their own club applications, and handle incoming join requests. The new components include AffiliationCell for displaying joined clubs, CreateClubCell for showing the status of created clubs, MyApplyCell for listing applied clubs, and SugestCell for accepting or rejecting join requests, all powered by MyClubViewModel which fetches and manages the relevant data from the club repository.

Projects/Feature/Source/Club/MyClub/Component · high confidence

New Night Study Application Interface

Users can now apply for night study sessions through a new dedicated view. This interface allows users to input a reason for the application, select the study type, and specify the start and end dates (with the end date defaulting to 14 days after the start date). Additionally, users can indicate if they need to use a mobile phone during the session and provide a reason if required.

Projects/Feature/Source/NightStudy/NightStudyApply · high confidence

New Night Study Project Application Interface

Users can now apply for night study projects through a dedicated view that allows them to enter a project name and description, select a project type, and set start and end dates. The interface also includes a student search feature, enabling users to find and select specific students to include in their project application.

Projects/Feature/Source/NightStudy/NightProjectApply · high confidence

New Out/Outsleep Request Management View

The Out feature module now includes a dedicated OutView and OutViewModel that allow logged-in users to view, manage, and delete their existing out-going and out-sleeping requests. The view presents a segmented interface to switch between 'Out' and 'Outsleep' tabs, displaying lists of current requests or empty states prompting users to apply for new ones. Users can delete specific requests via confirmation dialogs, with changes reflected immediately through a refresh mechanism. The view handles authentication states, redirecting unauthenticated users to the login screen, and utilizes the DDS design system for consistent UI components like dialogs and segmented buttons.

Projects/Feature/Source/Out · high confidence

New Points (Rewards/Penalties) screen with dormitory/school filtering

Users can now view their reward and penalty points history via a new dedicated screen. The interface displays a summary of bonus and penalty scores alongside a scrollable list of issuance records, allowing users to toggle between 'Dormitory' and 'School' contexts using a segmented control. The view includes loading states and an empty-state message when no records exist, with data fetched asynchronously from the point repository.

Projects/Feature/Source/All/Point · high confidence

The app now includes a dedicated Settings view that displays the logged-in user's profile information (avatar and name) with a link to edit member details. It provides direct access to the service operation policy and privacy policy, shows the current app version, and offers action cells for logging out or deactivating the account (with a multi-step confirmation dialog for account deletion). If no user is logged in, the screen presents a login option instead.

Projects/Feature/Source/All/Setting · high confidence

New SwiftUI view extensions for shared UI components

The Shared SwiftUI module now includes a set of reusable view extensions to enhance UI consistency and developer productivity. Users can apply a scaled press effect to buttons via \scaledButtonStyle()\, conditionally display loading states with \DodamLoadingView.conditional\, and enforce character limits on text inputs using the \maxLength\ modifier. Additional utilities include \hideKeyboardWhenTap()\ for dismissing keyboards on background taps, \onReadSize\ for observing view dimensions, and a conditional \if\ modifier for cleaner view transformations.

Projects/Shared/Source/SwiftUI · high confidence

New UI components for Night Study application cells

This change introduces three new SwiftUI view components for the Night Study feature: DodamStudentCell, NightProjectApplyCell, and NightStudyApplyCell. DodamStudentCell displays student profile information with an avatar and selection state. NightProjectApplyCell and NightStudyApplyCell render application status (allowed, pending, rejected) with corresponding tags, remaining time countdowns, progress bars, and start/end dates. NightStudyApplyCell specifically handles rejection reasons and optional phone usage reasons, while NightProjectApplyCell shows a generic rejection message. These components provide the visual structure for displaying student lists and application statuses within the Night Study module.

Projects/Feature/Source/NightStudy/Component · high confidence

New UI components for Outgoing and OutSleeping request cells

Added \OutGoingCell\ and \OutSleepingCell\ SwiftUI views to display detailed information for outgoing and overnight stay requests. These components render request status (allowed, pending, rejected), reasons, remaining time, and start/end dates, including a progress bar for active requests and specific rejection reasons when applicable.

Projects/Feature/Source/Out/Component · high confidence

New domain request models for division and member management

The domain layer now includes a set of new request models to support division operations. Users can now create divisions, search for them, and manage members by adding or removing them, as well as updating member permissions and status. These changes provide the underlying data structures required for these new division-related capabilities.

Projects/Domain/Source/Request/Division · high confidence

New domain request models for meal, points, and wake-up songs

The domain layer now includes specific request structs for fetching daily and monthly meals, posting out-sleeping requests, fetching point details and scores, and managing wake-up songs (fetching allowed songs by date, searching by keyword, and posting new songs). These new types implement the \RequestProtocol\, providing a structured way to define input parameters for these specific domain operations.

(repo-wide) · high confidence

New domain request models for member authentication, profile updates, and family relations

This change introduces a set of new domain request models in the Member module to support updated API interactions. Users can now authenticate via verification codes (PostAuthCodeRequest, PostVerifyAuthCodeRequest), update their personal profiles (PatchMemberInfoRequest), change passwords (PatchPasswordRequest), or modify student-specific details like grade and room (PatchStudentInfoRequest). Additionally, the system now supports parent account creation with student association (PostJoinParentRequest), student registration (PostJoinStudentRequest), and explicit linking of students to parents via relation codes (ConnectStudentRequest, PostRelationRequest).

Projects/Domain/Source/Request/Member · high confidence

New domain request models for schedule fetching

The domain layer now includes four new request structs (FetchScheduleBetweenRequest, FetchScheduleByDateRequest, FetchScheduleByKeywordRequest, FetchScheduleByPageRequest) that define the input parameters for retrieving schedule data by date range, specific date, keyword, and pagination.

Projects/Domain/Source/Request/Schedule · high confidence

New home screen components for banners, meals, schedules, and status updates

The home screen now displays dedicated containers for key information: a banner carousel, a meal menu viewer with type selection, a schedule list showing upcoming events, and status trackers for night study, outings, and wakeup songs. Each component handles loading states, empty states with appropriate calls-to-action, and displays specific data like remaining time for active requests or meal details.

Projects/Feature/Source/Home/Component · high confidence

New property wrappers for shared dialog and picker providers

A new ModalProvider.swift file introduces three SwiftUI property wrappers—DodamDialog, DodamTimePicker, and DodamDatePicker—that expose DialogProvider, TimePickerProvider, and DatePickerProvider instances via EnvironmentObject, enabling views to access these shared providers more conveniently.

Projects/Shared/Source/DDS · high confidence

New registration authentication view with step-based UI

The registration flow now uses a new RegisterAuthView that presents input fields for ID, password, and password confirmation in a sequential, step-based manner. Users see fields appear one by one as they progress through the steps, with smooth slide animations and automatic focus management. The view includes validation hints for ID format (5-20 alphanumeric characters) and displays a success toast message upon successful registration before navigating to the main view.

Projects/Feature/Source/Auth/Register/Auth · high confidence

New registration info collection screen with role-based flow

The new RegisterInfoView introduces a multi-step registration form that collects name, student information, phone number, and email details. The flow adapts based on the user's role: parents skip the student information step and proceed directly from name to phone verification, while other users must enter student info first. The screen handles phone and email verification codes, allowing users to send and verify codes before proceeding to the next step or completing registration.

Projects/Feature/Source/Auth/Register/Info · high confidence

New remote API layer for club, division, and night study management

The app now includes dedicated remote networking implementations for managing clubs, divisions, and night study sessions. Users can apply to join clubs, view club details and members, and manage join requests. The system supports creating and managing academic divisions, including adding/removing members and adjusting permissions. Night study features have been expanded to allow users to apply for sessions, view pending approvals, and for authorized managers to approve or reject applications and ban users.

Projects/Data/Network/Source/Remote · high confidence

New request models for Night Study ban and project creation

The Night Study domain now includes specific request structures for managing bans and projects. Users can now submit requests to ban a student from Night Study (specifying student ID, reason, and end date) and to create new Night Study projects (defining type, name, description, start/end times, and associated students). These additions support the backend communication for these specific Night Study management actions.

Projects/Domain/Source/Request/NightStudy · high confidence

New shared utility functions for app data and formatting

The Shared/Util module now includes several new helper functions to support application logic. AppUtil provides a way to retrieve the current app version string. DataUtil introduces a function to calculate progress between two dates. FormatUtil adds capabilities to format phone numbers and member information strings. ArrayUtil offers functions to split arrays into halves or at specific positions. PagingUtil provides a helper to determine if the current index represents the last page of a paginated list.

Projects/Shared/Source/Util · high confidence

New user registration flow for students and parents

This change introduces the initial screens for the user registration process. Users can now select their role (Student or Parent) via the RegisterSelectRoleView. Based on the selection, the flow proceeds to either the standard information entry steps (Name, Student Info, Phone, Email) for students, or a Children Management view for parents, utilizing the new RegisterViewModel to handle state and repository interactions for account creation.

Projects/Feature/Source/Auth/Register · high confidence

Night Study application and management interface

Users can now apply for and manage night study sessions through a new dedicated interface. The feature supports two modes—individual and project-based applications—accessible via a segmented toggle. The main view allows users to submit applications with required details (reasons for individual, name/description/team for projects) and handles success or failure states with alerts. The list view displays existing applications, enables deletion via confirmation dialogs, and respects ban restrictions by showing a specific message when a user is prohibited from applying. The implementation includes the main view, list view, view models for data fetching and state management, and integration with the ban-checking repository.

Projects/Feature/Source/NightStudy · high confidence

Night Study management now supports approval and banning

The Night Study management interface has been expanded to allow administrators to approve pending requests and ban currently active sessions. The new Approve view lets staff filter and search for students with pending requests, then approve or reject them via a confirmation sheet. The new Ban view displays students currently engaged in night study, allowing staff to select a student and issue a ban by specifying an end date and reason through a dedicated sheet.

Projects/Feature/Source/NightStudy/ManageNightStudy · high confidence

Repository layer implementations for core domain features

The data layer now includes concrete repository implementations for Auth, Banner, Bus, Club, Division, Meal, Member, NightStudy, Notice, OutGoing, OutSleeping, Point, Schedule, Upload, and WakeupSong. These implementations bridge the domain interfaces with data sources, introducing capabilities such as club application and join-request management, division creation and member permission handling, night study ban and approval workflows, and local caching for meal data.

Projects/Data/Repository · high confidence

Wakeup Song Application Screen

A new WakeupSongApplyView and its associated ViewModel have been added to the Feature module, enabling users to search for and apply for wake-up songs. The interface displays a list of popular songs from a chart and allows keyword-based searches via a text field. Users can select a song to apply, triggering a confirmation dialog that posts the request to the backend via the WakeupSongRepository, with error handling for failed searches or applications.

Projects/Feature/Source/WakeupSong/Apply · high confidence

Architecture

Data module restructured into granular sub-modules

The Data module has been refactored from a single unit into four distinct static libraries: Repository, DataSource, Network, and Local. This change introduces a more modular architecture where Repository depends on DataSource, while DataSource relies on both Network and Local components. All sub-modules target iOS 15.0 and depend on the Domain and Shared modules, with Network integrating Moya and SignKit, and Local integrating RealmSwift and Realm.

Projects/Data · high confidence

New modular dependency injection structure for core app features

The app's dependency injection setup has been reorganized into a modular architecture using Swinject. New assembly files (DataSourceAssembly, RemoteAssembly, RepositoryAssembly, UseCaseAssembly, LocalAssembly, and FlowAssembly) explicitly wire up data sources, remote clients, repositories, and use cases for features including Division, Meal (with local caching), Club, Notice, and Deep Linking. The DependencyProvider now registers these assemblies, centralizing the initialization of the app's core data flow and feature modules.

Projects/App/iOS/Source/DI · high confidence

Behavioural changes

Added Periphery static analysis and configured SwiftLint

The build scripts now include a new Periphery scan to detect unused code, automatically handling the PATH for Apple Silicon (arm64) machines. SwiftLint execution has been updated to explicitly use a new configuration file (.swiftlint.yml) located in the Scripts directory, which disables specific rules like leading and trailing whitespace and excludes Carthage, Pods, and Modules directories.

Scripts · high confidence

Added Periphery static analysis and disabled dependency analysis for SwiftLint

The Tuist project configuration now includes a pre-build script to run Periphery for unused code detection. Additionally, the existing SwiftLint script has been updated to disable dependency-based analysis, ensuring it runs regardless of dependency changes.

Tuist · high confidence

Added URL parameter encoding support for array types in network requests

A new extension for RequestProtocol has been added to the network layer, providing methods to convert request data into Moya tasks with specific parameter encodings. This change introduces specialized handling for array parameters when using URL encoding, automatically joining integer and string arrays into comma-separated values (e.g., converting \[1, 2\] to "1,2") to ensure compatibility with server-side expectations for query string parameters.

Projects/Data/Network/Source · high confidence

App structure reorganized with new Widget target and updated bundle identifiers

The app's entry point has been removed, and the project configuration now defines three distinct targets: the main app, a new widget extension, and an aggregate bundle. The main app target's bundle identifier has changed from 'com.b1nd.dodam' to 'com.b1nd.dodam.student', and its deployment target is set to iOS 15.0. The new 'DodamDodamWidget' target is configured as an app extension using the DDS design system, while the main app now depends on internal modules (Feature, Repository, DIContainer) and FirebaseMessaging instead of the previous external Alamofire dependency. Additionally, the app's Info.plist now includes specific keys for Firebase, background modes, and file/photo library permissions, and the source/resource directories have been relocated to 'iOS/Source' and 'iOS/Resource'.

Projects/App · high confidence

The authentication request structures have been modified to support new login flows. DeepLinkLoginRequest is introduced to handle authentication via deep links, requiring code, clientId, access, and refresh tokens. PostLoginRequest now includes a pushToken field alongside id and password, enabling the app to register its push notification token during login. PostReissueRequest remains unchanged, continuing to handle token refresh with a refreshToken field.

Projects/Domain/Source/Request/Auth · high confidence

Custom swipe-to-back gesture for navigation controllers

The app now uses a custom pan gesture to handle the back navigation in navigation controllers, replacing the default system behavior. This change hides the standard navigation bar and disables the built-in interactive pop gesture, instead relying on a custom UIPanGestureRecognizer to trigger the transition. This allows for a more consistent or customized swipe-back experience across the application.

Projects/App/iOS/Source/Extension · high confidence

Introduce new login screen with agreement modal and push token submission

Users now see a new login interface that requires acceptance of mandatory privacy and service agreements before registration. The login flow has been updated to automatically include the device's push notification token during the authentication request, ensuring push notifications are properly linked to the user account upon successful login.

Projects/Feature/Source/Auth/Login · high confidence

Migrate build tooling to mise and update project scaffolding

The project now uses mise as the primary tool manager for installing and executing Tuist, replacing direct command calls in the Makefile with mise-exec wrappers. A .mise.toml file has been added to specify Tuist version 4.43.2, while the legacy .tuist-version file has been removed. The .gitignore has been updated to exclude Firebase configuration files and re-include Xcode project/workspace artifacts, and the README has been expanded with Korean documentation, preview images, and detailed setup instructions for provisioning profiles.

(repo-wide) · high confidence

Dependencies

Updated dependencies and deployment target

The project has updated its dependency manifest to include several new libraries (DDS 0.2.41, Moya 15.0.3, Swinject 2.8.0, FlowKit, SignKit, SwiftUI-CachedAsyncImage 2.1.1, Firebase 10.0.0+, Realm 20.0.0, SwiftUI-Introspect 1.3.0+, and Swift-Markdown-UI 2.4.1) and bumped the minimum iOS deployment target to 15.0 for both the base project and the SwiftUIIntrospect target.

(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

Score

  • CAI 46 → 47 (+1.4)
  • Rubric changed (rubric-2026.08.17 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 100 → 91 (-9.2)
  • Architecture 97 → 90 (-7.9)
  • Maturity 42 → 43 (+0.9)
  • Readiness 15 → 22 (+6.5)
  • Security 100 → 100 (+0.0)
  • Domain Modelling 100 → 100 (+0.0)

Resolved (15)

  • Change coupling: NightProjectApplyViewModel.swift ↔ NightStudyView.swift (Projects/Feature/Source/NightStudy/NightProjectApply/NightProjectApplyViewModel.swift)
  • Change coupling: NightStudyDataSource.swift ↔ NightStudyRepository.swift (Projects/Data/DataSource/Source/NightStudy/NightStudyDataSource.swift)
  • Change coupling: NightStudyRemote.swift ↔ NightStudyRepository.swift (Projects/Data/Network/Source/Remote/NightStudy/NightStudyRemote.swift)
  • Change coupling: NightStudyRemote.swift ↔ NightStudyRepositoryImpl.swift (Projects/Data/Network/Source/Remote/NightStudy/NightStudyRemote.swift)
  • Change coupling: NightStudyRepository.swift ↔ NightProjectApplyView.swift (Projects/Domain/Source/Repository/NightStudy/NightStudyRepository.swift)
  • Change coupling: NightStudyRepositoryImpl.swift ↔ NightProjectApplyViewModel.swift (Projects/Data/Repository/Source/NightStudy/NightStudyRepositoryImpl.swift)
  • Change coupling: NightStudyService.swift ↔ NightProjectApplyView.swift (Projects/Data/Network/Source/Service/NightStudy/NightStudyService.swift)
  • Change coupling: NightStudyService.swift ↔ NightStudyRepository.swift (Projects/Data/Network/Source/Service/NightStudy/NightStudyService.swift)
  • Change coupling: NightStudyService.swift ↔ NightStudyRepositoryImpl.swift (Projects/Data/Network/Source/Service/NightStudy/NightStudyService.swift)
  • Dependency hygiene not measured — no supported dependency manifest was read
  • Dormant codebase
  • No exposed public API
  • Off-boarding risk: anonymized user #1
  • Off-boarding risk: anonymized user #2
  • complexity unreadable for .swift — churn × complexity hotspots could not be measured

New (105)

  • AffiliationCell.body (cognitive 19) (Projects/Feature/Source/Club/MyClub/Component/AffiliationCell.swift)
  • Boundary-crossing change coupling: MealView.swift ↔ DataUtil.swift (Projects/Feature/Source/Meal/MealView.swift)
  • Boundary-crossing change coupling: NightStudyApplyCell.swift ↔ DataUtil.swift (Projects/Feature/Source/NightStudy/Component/NightStudyApplyCell.swift)
  • Boundary-crossing change coupling: OutGoingCell.swift ↔ DataUtil.swift (Projects/Feature/Source/Out/Component/OutGoingCell.swift)
  • Boundary-crossing change coupling: OutSleepingCell.swift ↔ DataUtil.swift (Projects/Feature/Source/Out/Component/OutSleepingCell.swift)
  • Change coupling: HomeViewModel.swift ↔ MealViewModel.swift (Projects/Feature/Source/Home/HomeViewModel.swift)
  • Change coupling: NightProjectApplyViewModel.swift ↔ NightStudyApplyView.swift (Projects/Feature/Source/NightStudy/NightProjectApply/NightProjectApplyViewModel.swift)
  • Change coupling: NightStudyApplyCell.swift ↔ OutGoingCell.swift (Projects/Feature/Source/NightStudy/Component/NightStudyApplyCell.swift)
  • Change coupling: NightStudyApplyCell.swift ↔ OutSleepingCell.swift (Projects/Feature/Source/NightStudy/Component/NightStudyApplyCell.swift)
  • Change coupling: NightStudyStatusContainer.swift ↔ OutStatusContainer.swift (Projects/Feature/Source/Home/Component/NightStudyStatusContainer.swift)
  • Change coupling: OutGoingCell.swift ↔ OutSleepingCell.swift (Projects/Feature/Source/Out/Component/OutGoingCell.swift)
  • Change coupling: Project.swift ↔ Project.swift (Projects/App/Project.swift)
  • Change coupling: TomorrowWakeupSongCell.swift ↔ WakeupSongCell.swift (Projects/Feature/Source/WakeupSong/Component/TomorrowWakeupSongCell.swift)
  • Change coupling: WakeupSongApplyViewModel.swift ↔ WakeupSongView.swift (Projects/Feature/Source/WakeupSong/Apply/WakeupSongApplyViewModel.swift)
  • Change coupling: WakeupSongApplyViewModel.swift ↔ WakeupSongViewModel.swift (Projects/Feature/Source/WakeupSong/Apply/WakeupSongApplyViewModel.swift)
  • Change-coupling hub: NightStudyRepository.swift → NightStudyDataSource.swift, NightStudyRemote.swift, NightStudyService.swift, NightProjectApplyView.swift (Projects/Domain/Source/Repository/NightStudy/NightStudyRepository.swift)
  • Change-coupling hub: NightStudyRepositoryImpl.swift → NightStudyRemote.swift, NightStudyService.swift, NightProjectApplyViewModel.swift, NightStudyView.swift, NightStudyViewModel.swift (Projects/Data/Repository/Source/NightStudy/NightStudyRepositoryImpl.swift)
  • Change-coupling hub: NightStudyView.swift → NightStudyDataSource.swift, NightStudyRemote.swift, NightProjectApplyViewModel.swift (Projects/Feature/Source/NightStudy/NightStudyView.swift)
  • ClubApplyView.body (cognitive 24) (Projects/Feature/Source/Club/Apply/ClubApplyView.swift)
  • ClubApplyView.body (cyclomatic 17) (Projects/Feature/Source/Club/Apply/ClubApplyView.swift)
  • …and 85 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

Team-B1ND/dodamdodam-ios 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 20 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 57717f1f84ef81654a9633dc8cfda98b62b62954 — 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-28e75b8e3254.