CHARETTE
UNCOLOR (uncolor-ios)
Location: https://github.com/unparty-app/uncolor-ios
Status: Active Development
Primary Purpose: Native iOS color palette management application for brand designers and creative professionals
Overview
UNCOLOR is a sophisticated color palette management app for iOS that empowers designers, brand managers, and creative professionals to organize, visualize, and export their brand color systems. Built with SwiftUI and featuring a local-first architecture, UNCOLOR provides a privacy-focused, offline-capable solution for managing brand identity colors, typography settings, and design guidelines.
Tech Stack
- Framework: SwiftUI (iOS 14+)
- Language: Swift
- Storage: Local JSON files (Application Support directory)
- Primary: Atomic JSON file operations with thread safety
- Legacy: CloudKit integration (deprecated/sunset)
- Platform: iOS (iPhone and iPad)
- Build Tool: Xcode with standard iOS development workflows
- Testing: Swift Testing framework (not XCTest)
- Architecture Pattern: MVVM (Model-View-ViewModel)
Key Technologies
- Vision Framework: For color extraction from images
- PDFKit: For PDF export of brand palettes
- File Sharing: iOS Files app integration for import/export
- Custom Typography: Brandon Grotesque font family
- SwiftUI Animations: Smooth transitions and interactive UI elements
Key Features
šØ Color Management
- Custom Color Palettes: Create and organize unlimited brand color collections
- Color Groups: Categorize colors within palettes (Primary, Secondary, Accent, Neutral, etc.)
- Hex Color Support: Standard hex color codes for cross-platform compatibility
- Visual Color Picker: Custom SwiftUI color picker with real-time preview
- Image Color Extraction: Use Vision framework to extract colors from photos
- Color Export: Share colors as CSS files or PDF brand guides
šÆ Brand Identity Management
- Brand Profiles: Store brand name, tagline, and description with each palette
- Typography Settings: Configure font families and sizes for brand elements
- Brand name font and size
- Tagline font and size
- Description font and size
- Custom Fonts: Brandon Grotesque family with multiple weights (Black, Thin, Light, Medium, Regular)
- Brand Categories: Organize palettes by type or client
š¦ Local-First Storage
- JSON-Based Persistence: Human-readable, inspectable data format
- Atomic Operations: Thread-safe file operations with file locking
- Configurable Storage Limits: User-defined limits from 5MB to 500MB
- Storage Usage Monitoring: Real-time tracking with color-coded progress indicators
- Proactive Warnings: Alerts at 80% storage capacity
- Automatic Migration: Seamless migration from legacy UserDefaults storage
š Import/Export
- Files App Integration: Native iOS file picker and sharing
- PDF Export: Generate professional brand style guides
- CSS Export: Export color palettes as CSS custom properties
- AirDrop Support: Quick sharing to other devices
- Data Portability: Full export/import of palette data
š User Experience
- Grid/List Toggle: Switch between grid and list views for palette display
- Search & Filter: Real-time search across palette names
- Sort Options: By date created, last modified, or alphabetical
- Welcome/Onboarding: Guided experience for first-time users
- Dark Mode Ready: Adaptive color system with neon accents
- Smooth Animations: Polished transitions and interactions
š Privacy & Control
- No Cloud Sync Required: All data stored locally on device
- Optional Telemetry: Opt-in analytics (privacy-first approach)
- Transparent Data Format: JSON files users can inspect and backup
- No Account Required: Fully functional without sign-in
Architecture
Code
UNCOLOR (SwiftUI iOS App)
āāā Views (SwiftUI)
ā āāā ContentView.swift (Main interface with grid/list toggle)
ā āāā WelcomeView.swift (Onboarding/empty state)
ā āāā AddColorView.swift (Color creation with Vision integration)
ā āāā TypographyView.swift (Font management)
ā āāā Settings/
ā āāā SettingsView.swift
ā āāā StorageSettingsView.swift (Storage management UI)
āāā Models (Data)
ā āāā ColorPalette.swift (Main entity: brand + colors + typography)
ā āāā CustomColor.swift (Individual color with metadata)
ā āāā StorageSettings.swift (User preferences)
ā āāā StorageSettingsData.swift (Codable bridge for JSON)
āāā Storage (Persistence)
ā āāā LocalJSONStorageManager.swift (Primary storage system)
ā ā - Atomic JSON operations with file locking
ā ā - Thread-safe DispatchQueue
ā ā - Auto-migration from UserDefaults
ā ā - Files: colors.json, palettes.json, settings.json
ā ā - Location: ~/Library/Application Support/UNCOLOR/
ā āāā StorageSettings.swift (Singleton for preferences)
āāā BrandInfo (Export & Visualization)
ā āāā ExportManager.swift (PDF/CSS generation)
ā āāā PDFContent.swift (PDF layout)
ā āāā BrandCircle.swift (Visual components)
ā āāā BrandCategory.swift
ā āāā BrandScroll.swift
ā āāā FullScreenPanel.swift
ā āāā FullScreenPanelScroll.swift
āāā Typography
ā āāā TypographyFonts.swift (Centralized font management)
āāā Color Utilities
ā āāā Color.swift (Extensions)
ā āāā CustomColors.swift
ā āāā WelcomeColors.swift
ā āāā ColorPalette.swift (Color groups and organization)
āāā Design Components
ā āāā NeonText.swift (Neon UI effects)
ā āāā AppTitle.swift (Branded header)
āāā UI Components & Utilities
ā āāā UnpartyColorPicker.swift (Custom picker)
āāā CloudKit (Legacy - Deprecated)
āāā [Sunset code to be removed]Storage Architecture
Local-First Design:
- Primary Storage: Local JSON files with atomic write operations
- Storage Location:
~/Library/Application Support/UNCOLOR/ - Data Files:
colors.json- Individual color definitionspalettes.json- Brand palette collectionssettings.json- User preferences and limits
- Thread Safety: Dedicated
fileAccessQueuefor serialized access - Atomic Writes: Temporary files +
FileManager.replaceItem()for consistency - Migration: Automatic UserDefaults ā JSON on first launch
Data Model
Code
ColorPalette
āāā id: String (UUID)
āāā name: String
āāā timestamp: Date
āāā Brand Identity
ā āāā brandName: String
ā āāā brandTagline: String
ā āāā brandDescription: String
ā āāā brandCategory: String
āāā Typography Settings
ā āāā brandNameFont: String
ā āāā brandNameSize: Int
ā āāā brandTaglineFont: String
ā āāā brandTaglineSize: Int
ā āāā brandDescriptionSize: Int
āāā colorGroups: [String: [CustomColor]]
āāā CustomColor
āāā id: String (UUID)
āāā name: String
āāā hexCode: String
āāā category: String
āāā timestamp: DateIntegration Points
External Services
- Files App: Native iOS document picker and file sharing
- Vision Framework: Apple's ML framework for image color extraction
- PDFKit: Apple's framework for PDF generation
- AirDrop: iOS native sharing protocol
File Format Support
- Import: JSON palette files, images (for color extraction)
- Export: PDF (brand guides), CSS (color variables), JSON (data backup)
Legacy Integration (Deprecated)
- CloudKit: Previously used for iCloud sync (sunset in favor of local storage)
- Note: CloudKit code remains in codebase but is no longer active
Business Value
ABOUT - Understanding Brand Identity
UNCOLOR helps users understand and organize their brand color systems:
- Visual exploration of brand color relationships
- Color palette templates and inspiration
- Typography pairing with color schemes
- Brand guideline documentation
User Insight: Designers and brand managers gain clarity on their brand's visual identity by seeing all colors organized in one place, with context and relationships clearly defined.
BUILD - Creating Brand Assets
UNCOLOR enables users to create professional brand resources:
- Generate PDF brand style guides for client presentations
- Export CSS files for web development handoff
- Create multiple palette variations for A/B testing
- Document brand evolution over time
Creator Control: Users maintain full ownership of their color data with local storage, no vendor lock-in, and complete export capabilities.
CONNECT - Sharing Brand Guidelines
UNCOLOR facilitates sharing brand assets with teams and clients:
- AirDrop brand guides to colleagues instantly
- Share CSS files directly with developers
- Export palettes for use in other design tools
- Document and communicate brand standards
Privacy & Cost-Sensitivity:
- No subscription required - one-time purchase model
- No cloud storage costs - everything stays on device
- No data collection - optional telemetry only
- Transparent pricing - no hidden fees
Relationship to UNPARTY Ecosystem
Position in Ecosystem
UNCOLOR is a user-facing creative tool within the UNPARTY ecosystem, focusing on empowering designers and brand managers with professional color management capabilities while maintaining privacy and local control.
Integration with Other Repositories
- theunpartyapp: Could integrate color palettes for web design consistency
- theunpartyunppp: Shares MVVM architecture patterns and SwiftUI best practices
- theunpartyrunway: Subject to development velocity tracking and cost analysis
- theunpartycrawler: Could analyze color usage patterns in design conversations
Data Flow
Code
Users ā UNCOLOR (Color Management) ā Export Files ā Design Tools
ā
Local JSON Storage (Privacy-First)
ā
Export Formats:
- PDF (Brand Guides)
- CSS (Web Development)
- JSON (Data Portability)Alignment with UNPARTY Principles
Creator Ownership ā
- Local-first storage: Users own their data, stored on their device
- No cloud dependency: Full functionality without external services
- Export capabilities: Complete data portability in standard formats
Privacy Protection ā
- No required accounts: App works fully without sign-in
- Optional telemetry: Analytics are opt-in only
- Transparent data: Human-readable JSON format users can inspect
Cost Sensitivity ā
- No subscription model: One-time purchase (when applicable)
- No cloud storage fees: All storage is local
- Configurable limits: Users control storage usage (5MB-500MB)
- Efficient storage: Proactive warnings at 80% capacity
Getting Started
Prerequisites
- Xcode: Version 14+ (for iOS 14+ deployment target)
- macOS: Big Sur (11.0) or later
- iOS Device/Simulator: iOS 14+
Opening the Project
bash
# Clone the repository
git clone https://github.com/unparty-app/uncolor-ios.git
cd uncolor-ios
# Open in Xcode
open UNCOLOR.xcodeprojBuilding
- Open
UNCOLOR.xcodeprojin Xcode - Select your target device or simulator
- Press
ā+Bto build orā+Rto run
Running Tests
- Open Xcode Test Navigator (
ā+6) - Press
ā+Uto run all tests - Primary test suite:
UNCOLORTests/LocalJSONStorageTests.swift
Project Structure
- UNCOLOR/: Main app source code
- UNCOLORTests/: Unit tests (Swift Testing framework)
- UNCOLORUITests/: UI and integration tests
- UNCOLOR.xcodeproj/: Xcode project file
Development
Architecture Pattern
MVVM (Model-View-ViewModel):
- Models:
ColorPalette,CustomColor,StorageSettings - Views: SwiftUI views in
Views/directory - ViewModels: ObservableObject classes (e.g.,
LocalJSONStorageManager)
Key Components
1. LocalJSONStorageManager
Primary storage system (UNCOLOR/Storage/LocalJSONStorageManager.swift):
- Singleton pattern with
@Publishedproperties for SwiftUI reactivity - Thread-safe operations using dedicated
DispatchQueue - Atomic file operations for data consistency
- Automatic migration from legacy storage
Key Methods:
savePalettes(): Atomic write topalettes.jsonloadPalettes(): Read from JSON with error handlingexportData(): Generate shareable data filesimportData(): Parse and validate imported files
2. StorageSettings
User preferences manager (UNCOLOR/Storage/StorageSettings.swift):
- Singleton pattern with ObservableObject
- Configurable storage limits with real-time tracking
- Privacy controls (telemetry opt-in)
- Persistent settings in
settings.json
3. ContentView
Main app interface (UNCOLOR/ContentView.swift):
- Grid/list toggle for palette display
- Search and sort functionality
- Integration with storage manager
- Navigation to add/edit views
Custom Fonts
Brandon Grotesque family loaded via Info.plist (UIAppFonts):
BrandonGrotesque-Black.otfBrandonGrotesque-Thin.otfBrandonGrotesque-Light.otfBrandonGrotesque-Medium.otfBrandonGrotesque-Regular.otf
Managed centrally through TypographyFonts.swift.
Storage Management
- Default Limit: 50MB
- Range: 5MB - 500MB (user-configurable)
- Warning Threshold: 80% of limit
- Real-time Tracking: Async size calculation to prevent UI blocking
Testing
Test Framework
Uses Swift Testing framework (not XCTest).
Primary Test Suite
UNCOLORTests/LocalJSONStorageTests.swift:
- Atomic operation validation
- Data consistency checks
- Migration scenario testing
- Thread safety verification
- Performance benchmarks
Running Tests
bash
# In Xcode
ā+U (Run all tests)
# Or use Test Navigator (ā+6)Test Coverage Areas
- ā JSON serialization/deserialization
- ā Atomic file operations
- ā Storage limit enforcement
- ā Migration from UserDefaults
- ā Thread safety and race conditions
- ā Error handling and recovery
Configuration
Bundle Identifier
- App:
UNPARTY.UNCOLOR(Xcode project) - Info.plist:
com.unparty.uncolor
Capabilities
- File Sharing: Enabled (
UIFileSharingEnabled) - Documents in Place: Supported (
LSSupportsOpeningDocumentsInPlace) - iCloud Containers: Configured (legacy from CloudKit era)
- Background Modes: Remote notifications
Supported File Types
- CSS Files: Viewer role
- PDF Documents: Viewer role
Important Implementation Details
CloudKit Sunset ā ļø
- Status: CloudKit integration is deprecated
- Current State: Legacy code remains in codebase but is inactive
- Future Work: CloudKit code should be removed/refactored out
- Migration: Automatic migration from CloudKit data to local JSON (if applicable)
Thread Safety š
- All file operations use
fileAccessQueuefor serialization - Prevents race conditions and data corruption
- Async updates to storage size to prevent UI blocking
Atomic Operations āļø
- Uses temporary files and
FileManager.replaceItem()for consistency - Ensures data integrity even if app crashes during write
- All-or-nothing write guarantees
Storage Strategy š¾
- Primary: Local JSON files in Application Support
- Format: Human-readable JSON for transparency
- Backup: Users can manually backup/restore via Files app
- Privacy: No data sent to external servers
Documentation
Key Documentation Files
- CLAUDE.md: AI assistance guidance and architecture overview
- README.md: This file - comprehensive project documentation
- Info.plist: App configuration and capabilities
- UNCOLOR.entitlements: App permissions and entitlements
Code Documentation
- Inline comments for complex logic
- MARK comments for code organization
- SwiftDoc-style documentation for public APIs
Roadmap
Current Focus
- ā Local-first storage implementation
- ā Storage management UI
- ā Export/import functionality
- š§ CloudKit code removal/refactoring
Future Enhancements
- Color accessibility checker (WCAG compliance)
- Gradient palette support
- Color harmony suggestions (complementary, analogous, etc.)
- Multi-device sync (iCloud Drive integration)
- Collaboration features (shared palettes)
- Integration with design tools (Figma, Sketch plugins)
- Advanced export formats (Adobe Swatch, Procreate palette)
Contributing
Development Guidelines
- Follow existing MVVM architecture patterns
- Use SwiftUI best practices
- Ensure thread-safe operations for storage
- Write tests for new storage functionality
- Update CLAUDE.md for significant architecture changes
- Use Swift Testing framework (not XCTest)
Commit Standards
- Use clear, descriptive commit messages
- Reference issue numbers when applicable
- Follow conventional commits format when possible
Code Quality
- Linting: SwiftLint (if configured)
- Type Safety: Leverage Swift's strong typing
- Error Handling: Use Result types and proper error propagation
- Performance: Profile storage operations for large datasets
License
[License information to be added]
Contact & Support
Repository: https://github.com/unparty-app/uncolor-ios
Organization: UNPARTY LLC
Ecosystem: Part of the UNPARTY creative tools ecosystem
For questions, issues, or contributions, please use GitHub Issues.
Acknowledgments
- SwiftUI: Apple's declarative UI framework
- Vision Framework: Apple's ML framework for image analysis
- Brandon Grotesque: Custom typography
- UNPARTY Ecosystem: Integration with broader creator tools platform
Status: ā
Active Development
Documentation Version: 1.0.0
Last Updated: 2024-10-29
Maintained By: UNPARTY LLC Development Team
Quick Links
- CLAUDE.md: Development guidance for AI assistance
- Issue Tracker: GitHub Issues
- Ecosystem Overview: See UNPARTY ecosystem documentation
- Related Repositories:
- theunpartyapp - Web platform
- theunpartyunppp - Native journaling app
- theunpartyrunway - Dev automation
- theunpartycrawler - Analytics intelligence
Focus: Empowering creators with professional color management while protecting ownership, privacy, and cost-sensitivity through local-first architecture. šØ