- GitFlow: Use standard GitFlow branching strategy
main- Production releases onlydevelop- Integration branch (default)feature/- Feature developmentrelease/- Release preparationhotfix/- Emergency production fixes
- Semantic Versioning: Follow semver (MAJOR.MINOR.PATCH)
- Changelog: Maintain detailed changelog following Keep a Changelog format
- Git Tags: Tag all releases with version numbers
- Explore - Research (Think) and understand requirements
- Plan - Create detailed implementation plan
- Code - Implement features following best practices
- Commit - Make atomic, well-documented commits
- Test-Driven Development (TDD) preferred approach
- Write tests first, then implement
- Commit tests separately from implementation
- Iterate: Code → Test → Refactor → Commit cycle
# List available devices
xcrun xctrace list devices
# Build for connected iPad Pro 11-inch
xcodebuild -project "Flow Console.xcodeproj" \
-scheme "Flow Console" \
-destination "platform=iOS,name=iPad Pro (11-inch)" \
clean build
# Build for iPad Pro 11-inch M4 Simulator
xcodebuild -project "Flow Console.xcodeproj" \
-scheme "Flow Console" \
-destination "platform=iOS Simulator,id=FF15DE22-1F53-4B6F-881F-96BE884AE3D9" \
clean build
# Build and install to device
xcodebuild -project "Flow Console.xcodeproj" \
-scheme "Flow Console" \
-destination "platform=iOS,name=iPad Pro (11-inch)" \
-derivedDataPath ./build \
clean build
# Archive for distribution
xcodebuild -project "Flow Console.xcodeproj" \
-scheme "Flow Console" \
-destination "generic/platform=iOS" \
-archivePath ./Flow_Console.xcarchive \
clean archive
# Install and launch on simulator
xcrun simctl install FF15DE22-1F53-4B6F-881F-96BE884AE3D9 "path/to/Flow Console.app"
xcrun simctl launch FF15DE22-1F53-4B6F-881F-96BE884AE3D9 com.flowconsole.Flow-Console- Follow Swift coding conventions
- Maintain iPad-first design principles
- Use SwiftUI for all UI components
- Keep architecture modular and testable
- Document public APIs
- Use conventional commit messages
- Make atomic commits with single responsibility
- Write descriptive commit messages
- Reference issues/features when applicable
- IMPORTANT: Never mention Claude, Anthropic, or AI assistance in commits/PRs
- Maintain clean, professional codebase
- Focus on core terminal functionality
- Keep free and open source principles
- Prioritize performance and user experience
Key Insight: Changing bundle identifiers in complex iOS apps requires careful consideration of associated entitlements and capabilities.
- App ID Limit: 10 App IDs per 7-day rolling period
- Impact: Can block device deployment when limit reached
- Workaround: Use iOS Simulator for development during limit period
When changing bundle identifiers, verify all associated components:
-
App Groups - Must exist in Apple Developer account
- Used for: Data sharing between main app and extensions
- Format:
group.{bundle.identifier.prefix} - Required for: File Provider Extensions, shared data access
-
iCloud Containers - Must match bundle identifier pattern
- Used for: Cross-device data synchronization
- Format:
iCloud.{bundle.identifier} - Required for: User data sync, document storage
-
Keychain Groups - For secure credential sharing
- Used for: SSH keys, certificates, secure storage
- Format: Typically matches bundle identifier
- Required for: Secure authentication, certificate management
-
Provisioning Profiles - Must include all required capabilities
- Data Protection (for file encryption)
- App Groups (for extension communication)
- iCloud (for data synchronization)
- Keychain Sharing (for secure storage)
- File Provider (for file system integration)
- Verify entitlements before changing bundle identifiers
- Check App Group availability in Apple Developer account
- Test on simulator first to validate configuration
- Document bundle identifier dependencies for future reference
- Consider iOS capabilities when reusing existing App IDs
- Bundle ID:
com.rafli.flowconsole - App Group:
com.rafli.flowconsole - iCloud Container:
com.flowconsole.app - Keychain Group:
com.rafli.flowconsole
- Objective: Remove all subscription dependencies to make project completely free and open source
- Status: Successfully completed with comprehensive verification
- Key Results:
- Removed entire
/Blink/Subscriptions/directory (8 files) - Eliminated RevenueCat SDK dependency
- Created unlimited access stubs for EntitlementsManager
- Project builds successfully on both simulator and device
- All features unlocked and freely available
- Removed entire
- Objective: Transform from "Blink Shell" to "Flow Console" across entire codebase
- Status: Successfully completed with full functionality verification
- Key Results:
- Renamed
Blink.xcodeproj→Flow Console.xcodeproj(cleanup completed) - Updated 285+ files with Flow Console branding
- Changed bundle identifiers:
sh.blink.*→com.flowconsole.* - Updated terminal prompt: "blink>" → "flow>"
- Fixed all runtime crashes and UI elements
- App launches successfully with working terminal
- Final cleanup: Removed orphaned
Blink.xcodeprojdirectory and updated all project references
- Renamed
The Flow Console project is now fully transformed and ready for:
- ✅ Distribution via App Store or direct installation
- ✅ Open source community contributions
- ✅ Further feature development
- ✅ Commercial or non-commercial use
- Project Structure Cleanup: Removed orphaned
Blink.xcodeprojdirectory - Asset Rebranding: Renamed
blink.png→flow-console.pngandblink-uio.min.js→flow-console-uio.min.js - Build Configuration: Updated legacy
BLINK_OTHER_CFLAGSandBLINK_OTHER_LDFLAGSreferences - Verification: Project builds successfully with complete Flow Console branding
# Verify successful build
xcodebuild -project "Flow Console.xcodeproj" -scheme "Flow Console" \
-destination "platform=iOS Simulator,id=FF15DE22-1F53-4B6F-881F-96BE884AE3D9" clean build
# Expected: BUILD SUCCEEDED
# Verify app functionality
xcrun simctl launch FF15DE22-1F53-4B6F-881F-96BE884AE3D9 com.flowconsole.Flow-Console
# Expected: App launches with "flow>" terminal prompt