@@ -77,23 +77,118 @@ During development, enable unsigned extensions:
7777
7878> ** Note:** This setting resets each time Safari is quit.
7979
80+ ### Testing
81+
82+ Run the CDN detection test suite:
83+
84+ ``` bash
85+ just test
86+ ```
87+
88+ ### Build Commands
89+
90+ The project uses [ Just] ( https://github.com/casey/just ) for build automation:
91+
92+ ``` bash
93+ just # List all commands
94+ just build-dev # Build for development (unsigned)
95+ just build-release # Build release (unsigned, for testing)
96+ just clean # Clean build artifacts
97+ just xcode # Open project in Xcode
98+ ```
99+
100+ ## Release Process
101+
102+ Creating a signed and notarized release requires Apple Developer credentials.
103+
104+ ### Prerequisites
105+
106+ 1 . ** Apple Developer Account** with a Developer ID certificate
107+
108+ 2 . ** Create ` .env ` ** in the project root:
109+
110+ ``` bash
111+ cp .env.example .env
112+ ```
113+
114+ Then edit ` .env ` with your credentials:
115+
116+ | Variable | Description |
117+ | -------------------- | --------------------------------------------------------------------------- |
118+ | ` APPLE_ID ` | Your Apple ID email |
119+ | ` APPLE_TEAM_ID ` | 10-character Team ID from [ developer.apple.com/account] ( https://developer.apple.com/account ) → Membership |
120+ | ` APPLE_APP_PASSWORD ` | App-specific password from [ appleid.apple.com] ( https://appleid.apple.com/account/manage ) → Sign-In and Security → App-Specific Passwords |
121+
122+ 3 . ** Configure Xcode signing** with your Developer ID certificate
123+
124+ ### Release Commands
125+
126+ ** Full automated release** (archive → submit → wait → staple):
127+
128+ ``` bash
129+ just release v0.0.5
130+ ```
131+
132+ ** Step-by-step release** (useful when notarization takes time):
133+
134+ ``` bash
135+ # 1. Build and sign
136+ just archive v0.0.5
137+
138+ # 2. Submit for notarization
139+ just submit
140+
141+ # 3. Check status (optional)
142+ just status
143+
144+ # 4. Wait for completion (can take minutes to hours)
145+ just wait
146+
147+ # 5. Staple ticket and create final zip
148+ just staple
149+ ```
150+
151+ ** Other commands:**
152+
153+ ``` bash
154+ just history # Show notarization history
155+ just log < id> # Get notarization log for a submission
156+ just builds # List available builds
157+ ```
158+
159+ ### Build Output
160+
161+ Builds are organized by version in ` build/<version>/ ` :
162+
163+ ```
164+ build/
165+ ├── v0.0.4/
166+ │ ├── archive/CF Cache Status.xcarchive
167+ │ ├── export/CF Cache Status.app
168+ │ ├── CacheStatus-v0.0.4.zip # Final notarized release
169+ │ └── .submission_id # Notarization tracking
170+ └── .current_version # Tracks active build
171+ ```
172+
80173## Project Structure
81174
82175```
83176CF Cache Status/
84- ├── CF Cache Status/ # macOS container app
85- │ ├── AppDelegate .swift
86- │ ├── ViewController .swift
177+ ├── CF Cache Status/ # macOS container app (SwiftUI)
178+ │ ├── CacheStatusApp .swift
179+ │ ├── ContentView .swift
87180│ └── Assets.xcassets/
88181└── CF Cache Status Extension/ # Safari Web Extension
182+ ├── content.js # Performance metrics collection
89183 └── Resources/
90184 ├── manifest.json # Extension configuration
185+ ├── constants.js # Shared CDN detection rules
91186 ├── background.js # Header capture & badge updates
92- ├── popup.html # Popup structure
93- ├── popup.js # Popup logic & edge location mapping
94- ├── popup.css # iOS Settings-style design
187+ ├── popup.html/js/css # Popup UI
95188 └── images/
96- └── icon.svg # Toolbar icon
189+ scripts/ # Release automation
190+ tests/ # CDN detection tests
191+ Justfile # Build commands
97192```
98193
99194## Permissions
0 commit comments