17 KiB
TheNoiseClock - Product Requirements Document
Overview
TheNoiseClock is a SwiftUI-based iOS application that combines a customizable digital clock display with white noise playback and alarm functionality. The app is designed with a dark theme and focuses on providing a clean, distraction-free interface for time display and ambient sound management.
Core Features
1. Digital Clock Display
- Real-time clock with automatic updates every second
- Customizable time format: 12-hour or 24-hour display
- Optional seconds display with toggle control
- AM/PM badge for 12-hour format (optional)
- Segmented time display with colon separators that adapt to orientation
- Dynamic scaling that fits available screen space
- Portrait and landscape orientation support
2. Clock Customization
- Color customization: User-selectable digit colors with color picker
- Background color: Customizable background with color picker
- Glow effects: Adjustable glow intensity (0-100%)
- Size control: Manual scaling (0-100%) or auto-fit mode
- Opacity controls: Separate opacity for clock digits and overlays
- Random color mode: Automatically changes digit color every minute
- Preset themes: Quick "Night" (black/white) and "Day" (white/black) themes
3. Display Modes
- Normal mode: Standard interface with navigation and settings
- Display mode: Full-screen clock activated by long-press (0.6 seconds)
- Automatic UI hiding: Tab bar and navigation elements hide in display mode
- Smooth transitions: Animated transitions between modes
4. Information Overlays
- Battery level display: Real-time battery percentage with icon
- Date display: Current date in "d MMMM EEE" format (e.g., "7 September Mon")
- Overlay opacity control: Independent opacity for battery/date overlays
- Automatic updates: Battery and date update in real-time
5. White Noise Player
- Multiple sound options:
- White Noise (
white-noise.mp3) - Heavy Rain White Noise (
heavy-rain-white-noise.mp3) - Fan White Noise (
fan-white-noise-heater-303207.mp3)
- White Noise (
- Continuous playback: Sounds loop indefinitely
- Simple controls: Play/Stop button with visual feedback
- Sound selection: Dropdown picker for sound selection
6. Advanced Alarm System
- Multiple alarms: Create and manage unlimited alarms
- Rich alarm editor: Full-featured alarm creation and editing interface
- Time selection: Wheel-style date picker for precise alarm time
- Custom labels: User-defined alarm names and descriptions
- Repeat schedules: Set alarms to repeat on specific weekdays or daily
- Sound selection: Choose from extensive system sounds with live preview
- Volume control: Adjustable alarm volume (0-100%)
- Vibration settings: Enable/disable vibration for each alarm
- Snooze functionality: Configurable snooze duration (5, 7, 8, 9, 10, 15, 20 minutes)
- Smart notifications: Automatic scheduling for one-time and repeating alarms
- Enable/disable toggles: Individual alarm control with instant feedback
- Notification integration: Uses iOS UserNotifications framework with proper scheduling
- Persistent storage: Alarms saved to UserDefaults with backward compatibility
- Alarm management: Add, edit, delete, and duplicate alarms
- Next trigger preview: Shows when the next alarm will fire
Technical Architecture
Code Organization Principles
TOP PRIORITY: The codebase must be built with the following architectural principles from the beginning:
-
True Separation of Concerns:
- Many small files with focused responsibilities
- Each module/class should have a single, well-defined purpose
- Avoid monolithic files with mixed responsibilities
-
Constants and Enums:
- Create constants, enums, and configuration objects to avoid duplicate code or values
- Centralize magic numbers, strings, and configuration values
- Use enums for type safety and clarity
-
Readability and Maintainability:
- Code should be self-documenting with clear naming conventions
- Easy to understand, extend, and refactor
- Consistent patterns throughout the codebase
-
Extensibility:
- Design for future growth and feature additions
- Modular architecture that allows easy integration of new components
- Clear interfaces between modules
-
Refactorability:
- Code structure should make future refactoring straightforward
- Minimize coupling between components
- Use dependency injection and abstraction where appropriate
These principles are fundamental to the project's long-term success and must be applied consistently throughout development.
App Structure
- Main App:
TheNoiseClockApp.swift- Entry point with WindowGroup - Tab-based navigation: Three main tabs (Clock, Alarms, Noise)
- SwiftUI framework: Modern declarative UI framework with iOS 18+ and iOS 26 features
- Dark theme: Preferred color scheme set to dark
Data Models
- ClockStyle: @Observable class for clock customization settings
- Time format preferences (24-hour, seconds, AM/PM)
- Visual settings (colors, glow, scale, opacity)
- Overlay settings (battery, date, opacity)
- Background settings
- Color caching for performance optimization
- Alarm: Codable struct for comprehensive alarm data
- UUID identifier
- Time and enabled state
- Custom label and description
- Repeat schedule (weekdays)
- Sound name with volume control
- Vibration settings
- Snooze duration configuration
- Sound: Simple struct for noise file management
- Display name and file name
- LegacyAlarm: Backward compatibility struct for old alarm data
Data Persistence
- AppStorage: ClockStyle settings persisted as JSON
- UserDefaults: Alarm data persisted as JSON
- Bundle resources: Audio files stored in app bundle
Audio System
- AVFoundation: AVAudioPlayer for noise playback
- @Observable NoisePlayer: Modern state management with preloading
- Looping playback: Infinite loop for ambient sounds
- Audio session management: Proper audio session configuration
- Error handling: Graceful handling of missing audio files
- AlarmTonePlayer: Dedicated player for alarm sound previews
Notification System
- UserNotifications: iOS notification framework
- Permission handling: Automatic permission requests
- Smart scheduling: One-time and repeating alarm support
- Calendar triggers: Precise alarm scheduling with weekday support
- Sound customization: System sound selection with volume control
- Multiple notifications: Support for repeating alarms with unique identifiers
User Interface Design
Navigation
- TabView: Three-tab interface (Clock, Alarms, Noise)
- NavigationStack: Modern navigation with back button support
- Navigation destinations: Deep linking for alarm editing
- Toolbar integration: Settings and add buttons in navigation bars
- Sheet presentations: Modal settings and alarm creation
Visual Design
- Rounded corners: Modern iOS design language
- Modern animations: iOS 18+ smooth and bouncy animations
- Color consistency: Blue accent color throughout
- Accessibility: Proper labels and hidden decorative elements
- Form-based layouts: Organized sections for settings and alarm editing
- Interactive controls: Toggles, sliders, color pickers, and date pickers
Settings Interface
- Form-based layout: Organized sections for different setting categories
- Interactive controls: Toggles, sliders, color pickers
- Real-time updates: Changes apply immediately
- Sheet presentation: Modal settings with detents
File Structure and Organization
Recommended File Organization
Following the separation of concerns principle, the codebase should be organized into focused, single-responsibility files:
TheNoiseClock/
├── App/
│ ├── TheNoiseClockApp.swift # App entry point and configuration
│ └── ContentView.swift # Main tab navigation coordinator
├── Core/
│ ├── Constants/
│ │ ├── AppConstants.swift # App-wide constants and configuration
│ │ ├── UIConstants.swift # UI-specific constants (colors, sizes, etc.)
│ │ └── AudioConstants.swift # Audio-related constants
│ ├── Extensions/
│ │ ├── Color+Extensions.swift # Color utilities and extensions
│ │ ├── Date+Extensions.swift # Date formatting and utilities
│ │ └── View+Extensions.swift # Common view modifiers
│ └── Utilities/
│ ├── ColorUtils.swift # Color manipulation utilities
│ └── NotificationUtils.swift # Notification helper functions
├── Models/
│ ├── ClockStyle.swift # Clock customization data model
│ ├── Alarm.swift # Alarm data model
│ ├── Sound.swift # Sound data model
│ └── LegacyAlarm.swift # Backward compatibility model
├── ViewModels/
│ ├── ClockViewModel.swift # Clock display logic and state
│ ├── AlarmViewModel.swift # Alarm management logic
│ └── NoiseViewModel.swift # Audio playback state management
├── Views/
│ ├── Clock/
│ │ ├── ClockView.swift # Main clock display
│ │ ├── ClockSettingsView.swift # Clock settings interface
│ │ └── Components/
│ │ ├── TimeDisplayView.swift # Time display component
│ │ ├── BatteryOverlayView.swift # Battery display component
│ │ └── DateOverlayView.swift # Date display component
│ ├── Alarms/
│ │ ├── AlarmView.swift # Alarm list and management
│ │ ├── AddAlarmView.swift # Alarm creation interface
│ │ └── Components/
│ │ ├── AlarmRowView.swift # Individual alarm row
│ │ ├── TimePickerView.swift # Time selection component
│ │ └── SoundPickerView.swift # Sound selection component
│ └── Noise/
│ ├── NoiseView.swift # White noise player interface
│ └── Components/
│ └── SoundControlView.swift # Audio controls component
├── Services/
│ ├── NoisePlayer.swift # Audio playback service
│ ├── AlarmService.swift # Alarm management service
│ └── NotificationService.swift # Notification handling service
└── Resources/
├── Audio/
│ ├── white-noise.mp3
│ ├── heavy-rain-white-noise.mp3
│ └── fan-white-noise-heater-303207.mp3
└── Assets.xcassets/
└── [Asset catalogs]
File Naming Conventions
- Views: Use descriptive names ending in
View(e.g.,ClockView,AlarmRowView) - ViewModels: End with
ViewModel(e.g.,ClockViewModel,AlarmViewModel) - Services: End with
Service(e.g.,AlarmService,NotificationService) - Models: Use noun names (e.g.,
Alarm,Sound,ClockStyle) - Extensions: Use
Type+Extensionsformat (e.g.,Color+Extensions) - Constants: Use descriptive names ending in
Constants(e.g.,AppConstants)
Code Organization Best Practices
- Single Responsibility: Each file should have one clear purpose
- Dependency Injection: Use protocols and dependency injection for testability
- Protocol-Oriented Design: Define protocols for services and data sources
- Error Handling: Centralized error types and handling patterns
- Testing: Separate test targets with comprehensive coverage
Key User Interactions
Clock Tab
- View time: Real-time clock display
- Access settings: Tap gear icon in navigation bar
- Enter display mode: Long-press anywhere on clock (0.6 seconds)
- Exit display mode: Long-press again to return to normal mode
Settings
- Time format: Toggle 24-hour, seconds, AM/PM display
- Appearance: Adjust colors, glow, size, opacity
- Overlays: Control battery and date display
- Background: Set background color and use presets
Alarms Tab
- View alarms: List of all created alarms with labels and repeat schedules
- Add alarm: Tap + button to create new alarm with full editor
- Edit alarm: Tap any alarm to open comprehensive editor
- Toggle alarm: Use switch to enable/disable
- Delete alarm: Swipe to delete or use delete button in editor
- Alarm editor features:
- Time picker with next trigger preview
- Custom label editing
- Repeat schedule selection
- Sound picker with live preview
- Volume and vibration controls
- Snooze duration settings
Noise Tab
- Select sound: Choose from dropdown menu
- Play/Stop: Single button to control playback
- Continuous playback: Sounds loop until stopped
Technical Requirements
iOS Compatibility
- Minimum iOS version: iOS 18.0+ (Latest SwiftUI features and performance optimizations)
- Target devices: iPhone and iPad with full adaptive layout support
- Orientation support: Portrait and landscape with dynamic type support
- Accessibility: Full VoiceOver and Dynamic Type support
Modern iOS Technology Stack
- SwiftUI: Latest declarative UI framework with iOS 18+ and iOS 26 features
- Observation Framework: Modern @Observable pattern for state management
- SwiftData: Advanced data persistence with iOS 18+ SwiftData features
- Async/Await: Modern concurrency patterns throughout
- Structured Concurrency: Task groups and actors for complex operations
- Swift 6: Latest language features and safety improvements
- iOS 26 Features: Latest platform capabilities where available
Dependencies
- SwiftUI: Native iOS UI framework with latest features
- AVFoundation: Audio playback with modern async patterns
- UserNotifications: Alarm notifications with rich content support
- Combine: Timer publishers and reactive programming
- Observation: Modern state management with @Observable
- Foundation: Core system frameworks and utilities
Performance Considerations
- Smart timer management: Conditional timers based on settings
- Debounced persistence: Batched UserDefaults writes
- Memory management: Proper cleanup of audio players
- Battery optimization: Efficient update mechanisms
- Color caching: Avoid repeated hex-to-Color conversions
- Dictionary lookups: O(1) alarm access instead of linear search
- Smooth animations: Hardware-accelerated transitions
- Preloaded audio: Instant sound playback
Future Enhancement Opportunities
- Additional sound types: More white noise variants
- Sleep timer: Auto-stop noise after specified time
- Widget support: Home screen clock widget
- Apple Watch companion: Watch app for quick time check
- In-app purchases: Premium sound packs
- Custom sounds: User-imported audio files
- Multiple time zones: World clock functionality
- Alarm categories: Group alarms by type (work, sleep, etc.)
- Smart alarms: Gradual volume increase
- Weather integration: Weather-based alarm sounds
- Health integration: Sleep tracking integration
Development Notes
Project Information
- Created: September 7, 2025
- Framework: SwiftUI with iOS 18.0+ target (latest stable features)
- Architecture: Modern SwiftUI with @Observable pattern and MVVM
- Testing: Comprehensive unit and UI test targets with Swift Testing
- Version control: Git repository with feature branch workflow
- Performance: Optimized for battery life and smooth operation
- Modern iOS: Uses latest iOS 18+ and iOS 26 features with Swift 6 language improvements
Modern iOS Development Practices
- Swift 6: Latest language features including strict concurrency checking
- Async/Await: Modern concurrency patterns throughout the codebase
- Observation Framework: @Observable for reactive state management
- SwiftUI Navigation: Latest NavigationStack and navigation APIs with iOS 18+ features
- Accessibility: Full VoiceOver and Dynamic Type support with iOS 26 enhancements
- Adaptive Layout: Support for all device sizes and orientations
- Performance: Optimized for 120Hz ProMotion displays and iOS 26 performance improvements
- Memory Management: ARC with proper weak references and cleanup
- Error Handling: Result types and proper error propagation
- Testing: Swift Testing framework for modern test writing
- iOS 26 Integration: Latest platform features and capabilities where applicable
Code Quality Standards
- SwiftLint: Automated code style enforcement
- Documentation: Comprehensive inline documentation with DocC
- Type Safety: Leverage Swift's type system for compile-time safety
- Protocol-Oriented: Use protocols for abstraction and testability
- Dependency Injection: Constructor injection for better testability
- SOLID Principles: Single responsibility, open/closed, dependency inversion