Skip to content
CAI
Software that uses CAICheck a score

ambleside138/TimeRecorder

48.0

Weak · 21 September 2026

12.5k

lines of production code

C#

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

TimeRecorder is a Windows desktop application designed for granular time tracking and task management. It allows users to log working hours, manage to-do lists, and organize work processes, clients, and products. The system supports calendar synchronization, CSV data import/export, and local or cloud-based persistence via SQLite and Firebase.

How it got here

2020 — Initial architecture and feature implementation

67 changes.

This period established the foundational architecture of the TimeRecorder application, introducing a multi-layered structure with domain models, repositories, and a WPF-based user interface. Key features implemented include time tracking, task management, and data persistence via SQLite, alongside system utilities for configuration and reporting.

2021–2023 — Todo feature and Firebase integration

9 changes.

This period focused on implementing a new Todo management feature, including domain models, use cases, and a complete Firebase-based repository layer for persistence. Concurrently, the project introduced SQLite-based storage for time segments and time card links, expanding the application's data handling capabilities.

Features

Add CSV import for working hours

Users can now import working hour data from CSV files. The new CsvWorkingHourImportDriver reads Shift-JIS encoded CSVs, mapping date and time fields to domain models for processing.

src/TimeRecorder.Driver.CsvDriver/Import · high confidence

Add Firebase repository implementations for Todo lists and items

Users can now have their todo lists and individual todo items persisted to Firebase Firestore. This change introduces the data access layer for the Todo feature, including DAOs and document models for TodoList and TodoItem, along with the corresponding repository classes (FirestoreTodoListRepository and FirestoreTodoItemRepository) that handle CRUD operations against the NoSQL database.

src/TimeRecorder.Repository.Firebase/Todo · high confidence

Add Firebase-based user authentication and account management

Introduces a new Firebase-based implementation of the account repository, enabling Google OAuth sign-in and user registration in Firestore. The system now persists user profiles (display name, email, photo URL) and tracks the latest sign-in timestamp, while also providing a local login cache mechanism to support quick re-authentication and logout functionality.

src/TimeRecorder.Repository.Firebase/System · medium confidence

Add Google Calendar event import via new repository

The application can now import scheduled events from a user's Google Calendar. A new \GoogleApiScheduledEventRepository\ was added to fetch events within a specified time range, filtering out events without specific start/end times, non-matching types, and zero-duration events. This enables the system to sync calendar data for time tracking purposes.

src/TimeRecorder.Repository.GoogleAPI/Calendar · high confidence

Add Google Sheets API integration for client source data

Users can now retrieve client lists from a Google Spreadsheet. The new \GoogleApiClientSourceRepository\ uses the Google Sheets API to fetch data from a 'Client Master' sheet, with the specific column (A or B) determined by the task category. A new \CredentialProvider\ handles authentication using a \credentials.json\ file and manages token storage.

src/TimeRecorder.Repository.GoogleAPI · high confidence

Add SQLite connection and repository action utilities

Introduced three new utility classes in the SQLite repository layer: ConnectionFactory, which manages SQLite database connections; DaoBase, an abstract base class providing connection and transaction access; and RepositoryAction, which provides static methods for executing queries and transactions with automatic connection management and transaction rollback on failure.

src/TimeRecorder.Repository.SQLite/Utilities · high confidence

Add SQLite data access for working hours and working time tracking

Users can now have their daily working hours and specific time-tracking entries for tasks persisted to the local SQLite database. This change introduces new Data Access Objects (DAOs) and table row models for 'WorkingHour' and 'WorkingTime', enabling the application to store, update, and retrieve records of daily work hours and individual time entries linked to specific tasks.

src/TimeRecorder.Repository.SQLite/Tracking/Dao · high confidence

Add SQLite persistence for product data

The application now stores and retrieves product information using a SQLite database. This change introduces a new data access layer that maps product records to domain objects, enabling the system to persist product details such as name, short name, and category filters in the local database.

src/TimeRecorder.Repository.SQLite/Products · high confidence

Add SQLite persistence for work processes

The application now stores and retrieves work processes using SQLite. A new repository layer (SQLiteWorkProcessRepository) and data access objects (WorkProcessDao, WorkProcessTableRow) have been introduced to handle the 'processes' table, including fields for title, invalid status, and task category filters. This change enables the UI to load and display work processes from the database rather than relying on in-memory or other storage mechanisms.

src/TimeRecorder.Repository.SQLite/WorkProcesses · high confidence

Add daily work record query service for SQLite

A new \SQLiteDailyWorkRecordQueryService\ has been introduced to handle querying daily work records from the SQLite database. This service implements the \IDailyWorkRecordQueryService\ interface, executing a SQL query to retrieve working time data and joining it with task, process, product, client, and segment information. It returns \DailyWorkResults\ containing both the list of working time records and working hours for a specified year and month.

src/TimeRecorder.Repository.SQLite/Tracking/Reports · high confidence

Add dialog for editing work time ranges

Users can now edit the date and time of a work unit via a new 'WorkingTimeRangeEditDialog' interface. This dialog allows users to select a date and enter start and end times in HHmm format, with validation ensuring the input is in the correct format. The change introduces the XAML view, the associated ViewModel classes (WorkingTimeRangeEditDialogViewModel and WorkingTimeViewModel) that handle the binding and validation logic for the editing process.

src/TimeRecorder/Contents/WorkUnitRecorder/Tracking · high confidence

Add in-memory repositories for clients, todos, and work processes

The in-memory data access layer now includes concrete repository implementations for managing clients, todo items, and work processes. ClientRepository provides a static list of hospital and clinic records, while InMemoryTodoRepository handles the creation, deletion, and retrieval of todo items. ProcessRepository manages work process entries, and a shared RepositoryBase class provides common add, edit, and delete operations for these entities.

src/TimeRecorder.Repository.InMemory · high confidence

Add segment persistence via SQLite

Users can now retrieve all time segments from the database. This change introduces a new repository layer for segments, including the ISegmentRepository interface, a SQLite implementation (SQLiteSegmentRepository), and the necessary Data Access Objects (SegmentDao, SegmentTableRow) to map database rows to domain objects.

src/TimeRecorder.Domain/Domain/Segments, src/TimeRecorder.Repository.SQLite/Segments · high confidence

Added Archive feature for browsing and editing past time records

Users can now access the Archive section to view a list of past working time records. The new ArchiveManager provides a date picker to select specific days, displaying a list of time records with options to edit the time range or the associated task details via modal dialogs.

src/TimeRecorder/Contents/Archive · high confidence

Added ClientUseCase for client management

A new ClientUseCase class has been introduced in the domain layer to handle interactions with the client repository. It provides methods to retrieve all clients and add new client records, serving as the primary interface for client-related operations within the application.

src/TimeRecorder.Domain/UseCase/Clients · high confidence

Added Firebase authentication and Firestore client infrastructure

Introduced new shared classes to support Firebase integration: \FirebaseAuthenticator\ handles Google OAuth and Firebase sign-in, \FirestoreAccessor\ manages Firestore database connections with automatic token refresh, and \FirebaseCredentialConfig\/\FirebaseCredentialConfigLoader\ manage project credentials. These changes enable the application to authenticate users via Firebase and interact with Firestore.

src/TimeRecorder.Repository.Firebase/Shared · high confidence

Added UserConfigurationManager for centralized configuration management

A new UserConfigurationManager class has been introduced in the Configurations folder to manage application settings. This singleton manager loads configuration items via a ConfigurationUseCase and provides generic GetConfiguration and SetConfiguration methods, allowing the application to persist and retrieve user-specific settings through a unified interface.

src/TimeRecorder/Configurations · high confidence

Added WPF value converters for UI binding

Added a new set of value converters in the TimeRecorder application to support data binding in the user interface. These include: DateTimeToFormattedStringConverter for formatting dates, EnumToBooleanConverter for radio button state binding, EnumToDisplayTextConverter and EnumToIconKeyConverter for resolving enum display text and icon keys via attributes, IntToVisibilityConverter and StringToVisibilityConverter for controlling element visibility based on integer or string values, and TaskCategoryToSolidBrushConverter for mapping task categories to specific UI colors.

src/TimeRecorder/Converters · high confidence

Added Windows release build script

A new batch script, build/ReleaseBuild.bat, was added to automate the release build process for Windows. This script cleans the Release directory, creates it, and then executes a .NET publish command to produce a single-file, self-contained executable for win10-x64.

build · high confidence

Added custom exception types for domain errors

The domain layer now includes two new exception classes: NotFoundException, which is thrown when a requested resource cannot be found, and SpecificationCheckException, which wraps validation results to provide structured error details. These exceptions allow the application to handle specific failure modes more precisely.

src/TimeRecorder.Domain/Utility/Exceptions · high confidence

Added demo mode with sample master data

A new demo mode is now available, allowing users to run the application with pre-configured sample master data. To use this, users must copy the 'timeRecorder.sqlite' file to the same directory as the executable. The demo includes sample data for products, work processes, and users, which are managed via a database master.

demo · high confidence

Added domain shared infrastructure classes

Added new base classes and interfaces to the domain layer to support domain-driven design patterns. This includes an abstract Entity base class for identity and equality comparison, a ValueObject base class for immutable value types, an Identity value object for managing entity IDs, and a NotificationDomainModel base class that provides property change notification capabilities. Additionally, an IRepository marker interface and an IIdentifiable interface were introduced to support repository patterns and identity checks.

src/TimeRecorder.Domain/Domain/Shared · high confidence

Added helper methods for Firestore document and timestamp conversion

Added two new internal helper classes in the Firebase repository layer. DocumentSnapshotHelper provides a generic conversion method that attaches the document ID to a converted object. TimestampHelper adds extension methods to convert DateTime values to and from Firestore Timestamps, handling UTC conversion and local time zone adjustments.

src/TimeRecorder.Repository.Firebase/Shared/Helpers · medium confidence

Added helper utilities for collection, JSON I/O, modal transitions, and reactive properties

New helper classes have been introduced in the TimeRecorder project to support core application functionality. CollectionHelper provides an extension method to add ranges of items to collections. JsonFileIO handles serializing and deserializing JSON files with built-in retry logic for file operations. TransitionHelper manages modal dialog transitions and responses (Yes/No/Cancel) using a messenger pattern. ValidatableReactiveProperty offers factory methods to create ReactiveProperty instances that ignore initial validation errors. These utilities support data persistence, UI navigation, and state management within the application.

src/TimeRecorder/Helpers · high confidence

Added new WPF behaviors for UI and messaging interactions

Users will see frozen group headers in list controls, enabling easier reading of grouped data. Additionally, new interaction message actions allow for smoother visual transitions and modal window state management within the application's UI.

src/TimeRecorder/Behaviors · medium confidence

Added product retrieval capability via new repository and use case

Users can now retrieve a list of all products. This is enabled by the new IProductRepository interface, which defines a SelectAll method, and the ProductUseCase class, which exposes a GetProducts method that delegates to the repository.

src/TimeRecorder.Domain/Domain/Products, src/TimeRecorder.Domain/UseCase/Products · medium confidence

Adds new UI styles and controls for the Material Design theme

The application introduces a comprehensive set of new styles and helper classes to support the Material Design UI framework. This includes custom styles for CheckBox, ListBoxItem, Expander, and TabControl, along with a Mac-like scrollbar and text block styles. These changes enhance the visual consistency and interactivity of the user interface, providing a modern, polished look across various controls.

src/TimeRecorder/Styles · high confidence

Calendar import now maps scheduled events to work tasks with full segment and client context

The domain layer for calendar integration has been expanded to support importing scheduled events as work tasks. A new repository interface (IScheduledEventFetch) and model (ScheduledEvent) enable fetching events by time range and kind. The core logic now uses a configurable builder (WorkTaskBuilder) that maps calendar titles to internal tasks using both legacy title mappers and a new schedule-title mapping system that includes product, client, process, and segment associations. This ensures that imported tasks are fully contextualized with segmentation and client data.

src/TimeRecorder.Domain/Domain/Calendar · high confidence

Initial project structure and configuration for TimeRecorder

The src directory now contains the foundational project structure for the TimeRecorder application, including the solution file (TimeRecorder.sln) that defines the multi-project architecture (Domain, Repository, Driver, etc.), an .editorconfig for C\# code style and analyzer settings, and an AssemblyInfo.cs file that grants internal visibility to the test project.

src · high confidence

Initial release of the TimeRecorder desktop application

The TimeRecorder application is now available, providing a WPF-based desktop interface for time tracking and task management. The release introduces core features including a work unit recorder, an archive manager, an exporter, configuration settings, and a todo list. The application supports window position and state persistence, ensuring the UI layout is remembered between sessions. It also includes a system tray icon for quick access and notifications, along with a double-startup prevention mechanism to ensure only one instance runs at a time.

src/TimeRecorder · high confidence

Introduce SQLite repository setup and version management

The SQLite repository now includes a new Setup class that handles database initialization and schema versioning. Users benefit from automated database file creation and the ability to upgrade the database schema to the latest version, ensuring the application can manage its data structure over time.

src/TimeRecorder.Repository.SQLite · high confidence

Introduce Todo domain interfaces and identity types

Added repository interfaces for managing todo items and todo lists, along with the TodoItemIdentity record. The ITodoItemRepository defines methods to select, add, edit, and delete todo items, while ITodoListRepository provides similar operations for todo lists. These changes establish the data access contracts for the new Todo feature.

src/TimeRecorder.Domain/Domain/Todo · high confidence

Introduce Todo list management and item editing capabilities

Users can now create, edit, and manage Todo lists and individual tasks. This includes adding new tasks, marking them as complete or important, setting due dates, and filtering by completion status. The update also introduces a shared ConfirmDialog for user confirmations and a DateTimePicker for date selection, supporting the new scheduling features.

src/TimeRecorder/Contents/Todo · high confidence

Introduce WorkUnitRecorder for time tracking and task management

Added a new WorkUnitRecorder component that provides the core UI and logic for recording work time and managing tasks. This includes a main view (WorkUnitRecorderView) displaying scheduled tasks and active work sessions, a model (WorkUnitRecorderModel) handling data loading and state, and a view model (WorkUnitRecorderViewModel) binding the UI to the domain logic. The feature adds support for manual and shortcut-based task creation, time card link management, and lunch time notifications, all integrated into the application's navigation rail.

src/TimeRecorder/Contents/WorkUnitRecorder · high confidence

Introduce YearMonth and YmdString domain value objects

Added new domain value objects for handling dates without time components. The YmdString class represents a date string (e.g., '20231025') with utilities for comparison, empty/now/tomorrow states, and conversion to DateTime. The YearMonth class represents a year and month pair, providing methods to check if a date falls within that month and to calculate the start and end dates of the month. These changes support more robust date handling in the TimeRecorder domain.

src/TimeRecorder.Domain/Domain/Terms · high confidence

Introduce domain models and repositories for tracking working hours and time ranges

The domain layer for time tracking now includes new entities and value objects to manage working hours and time ranges. Users can now track work periods via the new TimePeriod and WorkingHour domain models, which handle start/end times, duration calculation, and overlap detection. The system also introduces repository interfaces (IWorkingHourRepository, IWorkingTimeRangeRepository) and a specification (WorkingTimeRegistSpecification) to enforce business rules, such as preventing overlapping time entries and ensuring tasks are properly assigned. Additionally, a WorkTimeRuleDomainService defines the logic for determining the working date based on a 7 AM cutoff.

src/TimeRecorder.Domain/Domain/Tracking · high confidence

Introduce task domain models and category filtering

Added new domain models for task management: IWorkTaskRepository for data access, ImportedTask to track imported calendar events, and TaskCategory to categorize tasks (e.g., Development, Research, Maintenance). Also added TaskCategoryFilter to enable filtering tasks by category, and TaskSource to distinguish between normal, favorite, and schedule-sourced tasks.

src/TimeRecorder.Domain/Domain/Tasks · high confidence

Introduce task management and time tracking capabilities

Users can now create, edit, complete, and delete tasks, as well as start, stop, and edit time tracking for those tasks. This includes a new WorkTaskModel and ViewModel that bridge the UI with domain use cases, enabling features like task completion status, time range editing, and task deletion.

src/TimeRecorder/Contents/WorkUnitRecorder/Tasks · high confidence

Introduces a new navigation rail UI component

A new vertical navigation rail is added to the application, featuring a tabbed interface with custom styling for selected and hover states. The implementation includes view models (NavigationIconButtonViewModel, NotSelectableNavigationItem) and a XAML resource dictionary that defines the visual template for the rail, allowing users to switch between different sections of the app via a side panel.

src/TimeRecorder/NavigationRail · high confidence

Introduces core host infrastructure: theme management, toast notifications, and health checks

The application now supports dynamic theme switching via a new \ThemeService\ that applies Material Design swatches, and includes a \NotificationService\ that delivers Windows toast notifications for task reminders and lunch breaks. A \SnackbarService\ is added to display status messages to the user, and a \DialogHostHelper\ provides a standardized way to show dialogs. Additionally, \MainModel\ implements a health check that automatically upgrades the local database or creates it if missing, ensuring the application initializes correctly on first run or after schema changes.

src/TimeRecorder/Host · high confidence

Introduces daily and monthly report structures for time tracking

The domain layer for tracking reports now includes new classes to structure time data for reporting. DailyWorkRecordHeader and DailyWorkTaskUnit are introduced to group and summarize work tasks by day, including logic to calculate expected total work time with statutory break deductions. Additionally, MonthlyReportBuilder is added to aggregate daily records into a monthly report, iterating through each day of the month to compile working hours and task units.

src/TimeRecorder.Domain/Domain/Tracking/Reports · medium confidence

Introduces domain models and interfaces for account, configuration, and system health

New domain classes and interfaces have been added to the system layer to support account management, configuration storage, and health checking. Specifically, the Account model now exposes EmailAddress, DisplayName, and Password properties. A ConfigurationItem class with JSON serialization/deserialization capabilities has been introduced alongside an IConfigurationRepository interface. Additionally, an IAccountRepository interface defines signin, signout, and sign-in status checking, while an IHealthChecker interface and SystemStatus enum provide the foundation for system health checks.

src/TimeRecorder.Domain/Domain/System · high confidence

Introduces domain models for clients, products, segments, and work tasks

The TimeRecorder.Domain layer now includes new domain entities: Client, Product, Segment, WorkProcess, and WorkTask, each with identity, properties, and factory methods. WorkTask links to clients, products, processes, and segments, and supports completion states. Todo-related models (TodoItem, TodoList, TodoListFactory) are also added, enabling todo list management with categories like Today, Important, and Future. These changes expand the domain model to support more granular time tracking and task organization.

TimeRecorder.Domain · high confidence

New Exporter module with CSV export, clipboard copy, and working-hour import

A new Exporter module has been introduced to the application, providing a dedicated interface for managing time and work-hour data. Users can now export monthly reports as CSV files, with an option to automatically adjust or complete missing work hours. The export process also copies the generated data to the clipboard for easy pasting. Additionally, the module supports importing working hours, either via a configured API endpoint or by uploading a CSV file, allowing users to synchronize external time-tracking data into the system.

src/TimeRecorder/Contents/Exporter · high confidence

Added four new components to the application's UI layer: a \CallMethodButton\ that triggers specified methods on click, a \RunnableHyperlink\ that opens URIs in the default browser, a \HeaderAdorner\ for custom header rendering, and a \VisualTreeUtil\ helper for traversing the visual tree. These additions provide new interactive elements and debugging utilities for the time recorder interface.

src/TimeRecorder/Controls · high confidence

New configuration interface for theme, backup, and task settings

The application now provides a dedicated Configuration view that allows users to manage several settings: select a UI theme color, specify a local folder for automatic database backups, set start and end times for lunch breaks, and register or edit favorite tasks. The view also displays the current version number and includes settings for schedule title mapping and todo list usage.

src/TimeRecorder/Contents/Configuration · high confidence

New configuration items for theme, favorites, and other settings

The application now supports configuration for various user preferences and features. Users can now set a visual theme, manage a list of favorite work tasks, configure a schedule title map, define working hour import parameters, set lunch break times, enable or disable a to-do list feature, and specify a backup path. These changes introduce new configuration classes that map to these specific settings, allowing the application to remember and apply these user choices.

src/TimeRecorder/Configurations/Items · high confidence

New domain attributes for display text and icon keys

Two new C\# attributes have been added to the domain layer: DisplayTextAttribute, which stores a display text string for fields, and IconKeyAttribute, which stores an icon key string for fields. These attributes are now available for use in the TimeRecorder.Domain.Utility namespace.

src/TimeRecorder.Domain/Utility/Attributes · medium confidence

New domain models and use cases for monthly report export

The domain layer for tracking reports now includes new abstractions and implementations for exporting monthly reports. Specifically, \ExportMonthlyReportUseCase\ orchestrates the export process, while \GetDailyWorkRecordHeadersUseCase\ retrieves daily work headers. The diff introduces \IDailyWorkRecordQueryService\ and \IReportDriver\ interfaces to decouple data access and export logic, alongside a new \WorkingTimeRecordForReport\ model that aggregates task, product, client, and segment details for reporting purposes.

src/TimeRecorder.Domain/UseCase/Tracking/Reports · medium confidence

New domain utilities and query service interface

Added a new \IQueryService\ marker interface in the UseCase namespace. Introduced \DateTimeParser\ utility for flexible date/time string parsing and formatting, and \JsonSerializerHelper\ to configure JSON serialization options (e.g., allowing trailing commas, pretty-printing, and full Unicode support). These utilities support new functionality such as importing working hours from CSV and calculating summary reports, as indicated by the addition of \ImportWorkingHourUseCase\ and related repository/driver interfaces.

src/TimeRecorder.Domain/Utility · high confidence

New system use cases for authentication, status checking, and configuration

Added three new use-case classes in the System domain: AuthenticationUseCase (providing sign-in, sign-out, and sign-in status checks), CheckStatusUseCase (exposing system health via IHealthChecker), and ConfigurationUseCase (allowing retrieval and updates of configuration items). These classes implement the domain logic for system-level operations, delegating to their respective repositories or checkers.

src/TimeRecorder.Domain/UseCase/System · high confidence

New task configuration editor dialog

A new TaskConfigEditDialog has been added to the application, providing a user interface for editing task configurations. The dialog includes fields for title, task category (such as development, research and development, introduction after contract, maintenance, and other), product, work process, client, and segment. The implementation includes the XAML layout, the code-behind, and a corresponding ViewModel that binds to the UI elements, enabling users to create and modify task settings through a dedicated configuration window.

src/TimeRecorder/Contents/Configuration/TaskConfigEditor · high confidence

New task editor dialog with comprehensive field selection

The application introduces a new \TaskEditDialog\ and its supporting view models (\WorkTaskEditDialogViewModel\, \WorkTaskViewModel\, \ProcessViewModel\) located in the \Tasks/Editor\ directory. This new UI component allows users to edit tasks with a full set of fields including title, task category (e.g., Development, Research & Development), product, client, work process, and segment. The editor includes validation for required fields (title, process, segment) and supports quick-start and delete actions.

src/TimeRecorder/Contents/WorkUnitRecorder/Tasks/Editor · medium confidence

New timeline view for tracking work units

A new timeline-based interface for visualizing and managing work units has been introduced. This includes a \TimelineCanvas\ for rendering the time grid, a \TimelineProperties\ class to manage display settings like hour height and start time, and a \TimelineWorkingTimeCard\ component that displays individual work items with their titles, categories, and durations. The view supports real-time duration updates and visually distinguishes between planned and unplanned tasks.

src/TimeRecorder/Contents/WorkUnitRecorder/Timeline · high confidence

New tracking use cases for managing and querying working time

The domain layer now includes new use cases for tracking working time: \WorkingHourUseCase\ for importing and managing start/end times, \WorkingTimeRangeUseCase\ for starting, stopping, editing, and deleting working time ranges, and \GetDailyWorkRecordUseCase\/\GetWorkingTimeForTimelineUseCase\ for retrieving daily and timeline data. These changes introduce new interfaces and DTOs to support the time-tracking feature.

src/TimeRecorder.Domain/UseCase/Tracking · high confidence

SQLite persistence layer for Client entities

Added SQLite repository and data access objects for the Client domain entity, enabling storage and retrieval of client records (name, kana name) in the local database.

src/TimeRecorder.Repository.SQLite/Clients · high confidence

SQLite persistence layer for system configuration and health checks

Added SQLite-backed implementations for system-level concerns: a new BackupWorker for database file backups, a ConfigDao and SQLiteConfigurationRepository to persist and retrieve system configuration items, and a SQLiteHealthChecker that validates the database file's existence and version consistency.

src/TimeRecorder.Repository.SQLite/System · high confidence

SQLite persistence layer for tasks and completed tasks

Added new Data Access Objects (DAOs) and row models for managing work tasks and completed task records in the SQLite repository. The new \WorkTaskDao\ and \WorkTaskTableRow\ classes handle the full lifecycle (insert, update, delete, select) for the \worktasks\ table, including support for filtering by completion status. Additionally, \WorkTaskCompletedDao\ provides methods to track and query completed tasks, while \ImportedTaskDao\ and \ImportedTaskTableRow\ introduce storage for imported task data, enabling the system to persist and retrieve imported task information alongside regular work tasks.

src/TimeRecorder.Repository.SQLite/Tasks/Dao · high confidence

SQLite persistence layer for working time and hours tracking

Added new repository implementations for the SQLite database: SQLiteWorkingTimeRangeRepository handles CRUD operations for individual time ranges, SQLiteWorkingTimeQueryService provides read access to time entries with task and process details, and SQLiteWorkingHoursRepository manages daily working hour records. These changes enable the application to store and retrieve time tracking data using SQLite.

src/TimeRecorder.Repository.SQLite/Tracking · high confidence

SQLite repository for work tasks and time tracking

The application now persists work tasks, their completion status, and associated time entries in a local SQLite database. This change introduces the data access layer for the 'Tasks' domain, including a repository for creating, editing, and deleting work tasks, as well as a query service that retrieves tasks along with their related client, product, and work process metadata, sorted by scheduled and active status.

src/TimeRecorder.Repository.SQLite/Tasks · high confidence

Behavioural changes

Users can now associate a URL with a time card for a specific year and month. This change introduces a new domain model (TimeCardLink) and a corresponding SQLite repository implementation to persist and retrieve these links.

src/TimeRecorder.Domain/Domain/TimeCards, src/TimeRecorder.Repository.SQLite/TimeCards · high confidence

Add validation for completing a work task

A new specification, WorkTaskCompletionSpecification, has been introduced to validate whether a work task can be completed. This check ensures that the task has at least one recorded time entry and that no time range is currently marked as 'doing' (active), preventing completion if the task is still in progress.

src/TimeRecorder.Domain/Domain/Tasks/Specifications · high confidence

Add work process selection and registration capabilities

The application now supports selecting and registering work processes. A new domain model introduces an IWorkProcessRepository interface and a WorkProcessService that checks for title duplicates. The WorkProcessUseCase exposes GetProcesses to retrieve all processes and a Regist method that creates a new WorkProcess, validates for duplicates, and persists it via the repository.

src/TimeRecorder.Domain/Domain/WorkProcesses, src/TimeRecorder.Domain/UseCase/WorkProcesses · medium confidence

Added Todo and TodoList use cases for item and list management

New use-case classes, TodoItemUseCase and TodoListUseCase, have been added to the domain layer. These classes expose standard CRUD operations (Add, Edit, Delete, Select) for managing individual todo items and todo lists, with the list selection method ordering results by display order.

src/TimeRecorder.Domain/UseCase/Todo · medium confidence

Added commands to complete and restart work tasks

Introduced the WorkTaskCompletionCommand class, which provides methods to complete a work task (validating against a completion specification) and to restart a previously completed task, allowing users to manage the lifecycle of their tracked work sessions.

src/TimeRecorder.Domain/Domain/Tasks/Commands · medium confidence

Introduce client repository interfaces

Added new repository interfaces for managing clients: IClientRepository for basic CRUD operations and IClientSourceRepository for retrieving clients by task category, enabling domain logic to interact with client data.

src/TimeRecorder.Domain/Domain/Clients · high confidence

Introduce system clock abstraction for time management

Added a new system clock utility in the domain layer, featuring an ISystemClock interface with a Now property, a DefaultSystemClock implementation that returns the current system time, and a FixedSystemClock for testing with a fixed time. A SystemClockServiceLocator is also introduced to manage the current clock instance, allowing the application to switch between real and fixed time sources.

src/TimeRecorder.Domain/Utility/SystemClocks · high confidence

New CSV report export with dual-format support and clipboard copy

The CSV report driver now supports both the new and legacy export formats. Users can choose which format to use when generating monthly reports. Additionally, the generated CSV data is automatically copied to the system clipboard, and warnings about input errors are handled without triggering a warning state.

src/TimeRecorder.Driver.CsvDriver/Export · medium confidence

New task management and calendar import capabilities

The domain layer for tasks has been expanded with new use cases and services. A new \GetWorkTaskWithTimesUseCase\ and \IWorkTaskWithTimesQueryService\ provide a way to retrieve work tasks along with their associated time tracking data. An \ImportTaskFromCalendarUseCase\ has been added to import and update tasks from calendar events, handling both new and existing task synchronization. Additionally, the \WorkTaskUseCase\ now exposes methods to complete, uncomplete, and delete tasks, with deletion cascading to remove associated working time ranges.

src/TimeRecorder.Domain/UseCase/Tasks · medium confidence

SQLite database schema migrations for versioning, new tables, and column additions

The SQLite repository introduces a versioned schema migration system, starting at version 000.000.000.000 and progressing through 000.017.000.002. This includes the creation of initial tables (worktasks, workingtimes, processes, clients, products, systemversionlog), followed by incremental changes: adding columns like source, importkey, istemporary, displayorder, invalid, reportnameonly, and segmentid to existing tables; creating new tables for configs, workinghours, importedtasks, worktasksarchive, worktaskscompleted, segments, and timecardlinks; and dropping the worktasksarchive table. The VersionManager static class manages these versions, allowing the application to track and apply database schema changes over time.

src/TimeRecorder.Repository.SQLite/System/Versions · high confidence

Test coverage

Added tests for Identity equality logic; Added tests for monthly report builder; Added unit tests for Client and Process use cases; Added unit tests for Entity identity verification; Added unit tests for TimePeriod domain logic.

Dependencies

Upgrade to .NET 6 and update dependencies

The project has been upgraded to the .NET 6.0 Windows target framework, replacing the previous .NET 5 configuration. This change updates the build environment and includes specific dependency updates such as Microsoft.Extensions.DependencyInjection 6.0.0 and MessagePipe 1.7.1, ensuring compatibility with the new runtime.

(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 48 → 48 (+0.2)
  • Rubric changed (rubric-2026.08.18 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 50 → 49 (-1.3)
  • Architecture 91 → 91 (-0.0)
  • Maturity 46 → 46 (+0.0)
  • Readiness 37 → 37 (+0.0)
  • Security 92 → 82 (-10.8)
  • Domain Modelling 99 (new)

Resolved (11)

  • Bounded contexts not declared
  • LLM evaluation failed
  • No exposed public API
  • XML-doc coverage: TimeRecorder (src/TimeRecorder/TimeRecorder.csproj)
  • XML-doc coverage: TimeRecorder.Domain (src/TimeRecorder.Domain/TimeRecorder.Domain.csproj)
  • XML-doc coverage: TimeRecorder.Driver.CsvDriver (src/TimeRecorder.Driver.CsvDriver/TimeRecorder.Driver.CsvDriver.csproj)
  • XML-doc coverage: TimeRecorder.Repository.Firebase (src/TimeRecorder.Repository.Firebase/TimeRecorder.Repository.Firebase.csproj)
  • XML-doc coverage: TimeRecorder.Repository.GoogleAPI (src/TimeRecorder.Repository.GoogleAPI/TimeRecorder.Repository.GoogleAPI.csproj)
  • XML-doc coverage: TimeRecorder.Repository.InMemory (src/TimeRecorder.Repository.InMemory/TimeRecorder.Repository.InMemory.csproj)
  • XML-doc coverage: TimeRecorder.Repository.SQLite (src/TimeRecorder.Repository.SQLite/TimeRecorder.Repository.SQLite.csproj)
  • dormant codebase — no living knowledge left to concentrate

New (16)

  • CommentedOutCode (src/TimeRecorder/Behaviors/GroupHeaderFrozenBehavior.cs)
  • CommentedOutCode (src/TimeRecorder/WindowActivator.cs)
  • Duplicated block (13 lines × 2) (src/TimeRecorder.Repository.SQLite/Tasks/Dao/WorkTaskTableRow.cs)
  • Duplicated block (18 lines × 2) (src/TimeRecorder.Repository.Firebase/Todo/Dao/TodoItemDao.cs)
  • Duplicated block (7 lines × 2) (src/TimeRecorder/Contents/WorkUnitRecorder/Tasks/WorkTaskModel.cs)
  • End-of-life runtime: .NET net6.0
  • WriteOnlyPrivateField (src/TimeRecorder.Domain.Test/Domain/Tracking/Reports/MonthlyReportBuilderTest.cs)
  • WriteOnlyPrivateField (src/TimeRecorder.Domain.Test/Domain/Tracking/Reports/MonthlyReportBuilderTest.cs)
  • WriteOnlyPrivateField (src/TimeRecorder.Domain.Test/Domain/Tracking/Reports/MonthlyReportBuilderTest.cs)
  • WriteOnlyPrivateField (src/TimeRecorder.Domain.Test/Domain/Tracking/Reports/MonthlyReportBuilderTest.cs)
  • WriteOnlyPrivateField (src/TimeRecorder.Domain.Test/Domain/Tracking/Reports/MonthlyReportBuilderTest.cs)
  • WriteOnlyPrivateField (src/TimeRecorder.Domain.Test/Domain/Tracking/Reports/MonthlyReportBuilderTest.cs)
  • WriteOnlyPrivateField (src/TimeRecorder.Domain.Test/Domain/Tracking/Reports/MonthlyReportBuilderTest.cs)
  • WriteOnlyPrivateField (src/TimeRecorder.Domain/UseCase/Tracking/GetDailyWorkRecordUseCase.cs)
  • WriteOnlyPrivateField (src/TimeRecorder/Contents/Todo/TodoModel.cs)
  • redundant comment (src/TimeRecorder/Messaging/Windows/ModalWindowActionMessage.cs)

Architecture

  • Unchanged — 2 containers · 1 contexts · 0 edges

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

ambleside138/TimeRecorder 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 b12225279aaa0a5ebfd6b4a4698366e785d0e886 — 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.