markupr 2.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/review-feedback.md +47 -0
- package/.eslintrc.json +35 -0
- package/.github/CODEOWNERS +16 -0
- package/.github/FUNDING.yml +1 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +56 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +54 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +89 -0
- package/.github/dependabot.yml +70 -0
- package/.github/workflows/ci.yml +184 -0
- package/.github/workflows/deploy-landing.yml +134 -0
- package/.github/workflows/nightly.yml +288 -0
- package/.github/workflows/release.yml +318 -0
- package/CHANGELOG.md +127 -0
- package/CLAUDE.md +137 -0
- package/CODE_OF_CONDUCT.md +9 -0
- package/CONTRIBUTING.md +390 -0
- package/LICENSE +21 -0
- package/PRODUCT_VISION.md +277 -0
- package/README.md +517 -0
- package/SECURITY.md +51 -0
- package/SIGNING_INSTRUCTIONS.md +284 -0
- package/assets/DMG_BACKGROUND_INSTRUCTIONS.md +130 -0
- package/assets/svg-source/dmg-background.svg +70 -0
- package/assets/svg-source/icon.svg +20 -0
- package/assets/svg-source/tray-icon-processing.svg +7 -0
- package/assets/svg-source/tray-icon-recording.svg +7 -0
- package/assets/svg-source/tray-icon.svg +6 -0
- package/assets/tray-complete.png +0 -0
- package/assets/tray-complete@2x.png +0 -0
- package/assets/tray-completeTemplate.png +0 -0
- package/assets/tray-completeTemplate@2x.png +0 -0
- package/assets/tray-error.png +0 -0
- package/assets/tray-error@2x.png +0 -0
- package/assets/tray-errorTemplate.png +0 -0
- package/assets/tray-errorTemplate@2x.png +0 -0
- package/assets/tray-icon-processing.png +0 -0
- package/assets/tray-icon-processing@2x.png +0 -0
- package/assets/tray-icon-processingTemplate.png +0 -0
- package/assets/tray-icon-processingTemplate@2x.png +0 -0
- package/assets/tray-icon-recording.png +0 -0
- package/assets/tray-icon-recording@2x.png +0 -0
- package/assets/tray-icon-recordingTemplate.png +0 -0
- package/assets/tray-icon-recordingTemplate@2x.png +0 -0
- package/assets/tray-icon.png +0 -0
- package/assets/tray-icon@2x.png +0 -0
- package/assets/tray-iconTemplate.png +0 -0
- package/assets/tray-iconTemplate@2x.png +0 -0
- package/assets/tray-idle.png +0 -0
- package/assets/tray-idle@2x.png +0 -0
- package/assets/tray-idleTemplate.png +0 -0
- package/assets/tray-idleTemplate@2x.png +0 -0
- package/assets/tray-processing-0.png +0 -0
- package/assets/tray-processing-0@2x.png +0 -0
- package/assets/tray-processing-0Template.png +0 -0
- package/assets/tray-processing-0Template@2x.png +0 -0
- package/assets/tray-processing-1.png +0 -0
- package/assets/tray-processing-1@2x.png +0 -0
- package/assets/tray-processing-1Template.png +0 -0
- package/assets/tray-processing-1Template@2x.png +0 -0
- package/assets/tray-processing-2.png +0 -0
- package/assets/tray-processing-2@2x.png +0 -0
- package/assets/tray-processing-2Template.png +0 -0
- package/assets/tray-processing-2Template@2x.png +0 -0
- package/assets/tray-processing-3.png +0 -0
- package/assets/tray-processing-3@2x.png +0 -0
- package/assets/tray-processing-3Template.png +0 -0
- package/assets/tray-processing-3Template@2x.png +0 -0
- package/assets/tray-processing.png +0 -0
- package/assets/tray-processing@2x.png +0 -0
- package/assets/tray-processingTemplate.png +0 -0
- package/assets/tray-processingTemplate@2x.png +0 -0
- package/assets/tray-recording.png +0 -0
- package/assets/tray-recording@2x.png +0 -0
- package/assets/tray-recordingTemplate.png +0 -0
- package/assets/tray-recordingTemplate@2x.png +0 -0
- package/build/DMG_BACKGROUND_SPEC.md +50 -0
- package/build/dmg-background.png +0 -0
- package/build/dmg-background@2x.png +0 -0
- package/build/entitlements.mac.inherit.plist +27 -0
- package/build/entitlements.mac.plist +41 -0
- package/build/favicon-16.png +0 -0
- package/build/favicon-180.png +0 -0
- package/build/favicon-192.png +0 -0
- package/build/favicon-32.png +0 -0
- package/build/favicon-48.png +0 -0
- package/build/favicon-512.png +0 -0
- package/build/favicon-64.png +0 -0
- package/build/icon-128.png +0 -0
- package/build/icon-16.png +0 -0
- package/build/icon-24.png +0 -0
- package/build/icon-256.png +0 -0
- package/build/icon-32.png +0 -0
- package/build/icon-48.png +0 -0
- package/build/icon-64.png +0 -0
- package/build/icon.icns +0 -0
- package/build/icon.ico +0 -0
- package/build/icon.iconset/icon_128x128.png +0 -0
- package/build/icon.iconset/icon_128x128@2x.png +0 -0
- package/build/icon.iconset/icon_16x16.png +0 -0
- package/build/icon.iconset/icon_16x16@2x.png +0 -0
- package/build/icon.iconset/icon_256x256.png +0 -0
- package/build/icon.iconset/icon_256x256@2x.png +0 -0
- package/build/icon.iconset/icon_32x32.png +0 -0
- package/build/icon.iconset/icon_32x32@2x.png +0 -0
- package/build/icon.iconset/icon_512x512.png +0 -0
- package/build/icon.iconset/icon_512x512@2x.png +0 -0
- package/build/icon.png +0 -0
- package/build/installer-header.bmp +0 -0
- package/build/installer-header.png +0 -0
- package/build/installer-sidebar.bmp +0 -0
- package/build/installer-sidebar.png +0 -0
- package/build/installer.nsh +45 -0
- package/build/overlay-processing.png +0 -0
- package/build/overlay-recording.png +0 -0
- package/build/toolbar-record.png +0 -0
- package/build/toolbar-screenshot.png +0 -0
- package/build/toolbar-settings.png +0 -0
- package/build/toolbar-stop.png +0 -0
- package/dist/main/index.mjs +12612 -0
- package/dist/preload/index.mjs +907 -0
- package/dist/renderer/assets/index-CCmUjl9K.js +19495 -0
- package/dist/renderer/assets/index-CUqz_Gs6.css +2270 -0
- package/dist/renderer/index.html +27 -0
- package/docs/AI_AGENT_QUICKSTART.md +42 -0
- package/docs/AI_PIPELINE_DESIGN.md +595 -0
- package/docs/API.md +514 -0
- package/docs/ARCHITECTURE.md +460 -0
- package/docs/CONFIGURATION.md +336 -0
- package/docs/DEVELOPMENT.md +508 -0
- package/docs/EXPORT_FORMATS.md +451 -0
- package/docs/GETTING_STARTED.md +236 -0
- package/docs/KEYBOARD_SHORTCUTS.md +334 -0
- package/docs/TROUBLESHOOTING.md +418 -0
- package/docs/landing/index.html +672 -0
- package/docs/landing/script.js +342 -0
- package/docs/landing/styles.css +1543 -0
- package/electron-builder.yml +140 -0
- package/electron.vite.config.ts +63 -0
- package/package.json +108 -0
- package/railway.json +12 -0
- package/scripts/build.mjs +51 -0
- package/scripts/generate-icons.mjs +314 -0
- package/scripts/generate-installer-images.cjs +253 -0
- package/scripts/generate-tray-icons.mjs +258 -0
- package/scripts/notarize.cjs +180 -0
- package/scripts/one-click-clean-test.sh +147 -0
- package/scripts/postinstall.mjs +36 -0
- package/scripts/setup-markupr.sh +55 -0
- package/setup +17 -0
- package/site/index.html +1835 -0
- package/site/package.json +11 -0
- package/site/railway.json +12 -0
- package/site/server.js +31 -0
- package/src/main/AutoUpdater.ts +392 -0
- package/src/main/CrashRecovery.ts +655 -0
- package/src/main/ErrorHandler.ts +703 -0
- package/src/main/HotkeyManager.ts +399 -0
- package/src/main/MenuManager.ts +529 -0
- package/src/main/PermissionManager.ts +420 -0
- package/src/main/SessionController.ts +1465 -0
- package/src/main/TrayManager.ts +540 -0
- package/src/main/ai/AIPipelineManager.ts +199 -0
- package/src/main/ai/ClaudeAnalyzer.ts +339 -0
- package/src/main/ai/ImageOptimizer.ts +176 -0
- package/src/main/ai/StructuredMarkdownBuilder.ts +379 -0
- package/src/main/ai/index.ts +16 -0
- package/src/main/ai/types.ts +258 -0
- package/src/main/analysis/ClarificationGenerator.ts +385 -0
- package/src/main/analysis/FeedbackAnalyzer.ts +531 -0
- package/src/main/analysis/index.ts +19 -0
- package/src/main/audio/AudioCapture.ts +978 -0
- package/src/main/audio/audioUtils.ts +100 -0
- package/src/main/audio/index.ts +20 -0
- package/src/main/capture/index.ts +1 -0
- package/src/main/index.ts +1693 -0
- package/src/main/ipc/captureHandlers.ts +272 -0
- package/src/main/ipc/index.ts +45 -0
- package/src/main/ipc/outputHandlers.ts +302 -0
- package/src/main/ipc/sessionHandlers.ts +56 -0
- package/src/main/ipc/settingsHandlers.ts +471 -0
- package/src/main/ipc/types.ts +56 -0
- package/src/main/ipc/windowHandlers.ts +277 -0
- package/src/main/output/ClipboardService.ts +369 -0
- package/src/main/output/ExportService.ts +539 -0
- package/src/main/output/FileManager.ts +416 -0
- package/src/main/output/MarkdownGenerator.ts +791 -0
- package/src/main/output/MarkdownPatcher.ts +299 -0
- package/src/main/output/index.ts +186 -0
- package/src/main/output/sessionAdapter.ts +207 -0
- package/src/main/output/templates/html-template.ts +553 -0
- package/src/main/pipeline/FrameExtractor.ts +330 -0
- package/src/main/pipeline/PostProcessor.ts +399 -0
- package/src/main/pipeline/TranscriptAnalyzer.ts +226 -0
- package/src/main/pipeline/index.ts +36 -0
- package/src/main/platform/WindowsTaskbar.ts +600 -0
- package/src/main/platform/index.ts +16 -0
- package/src/main/settings/SettingsManager.ts +730 -0
- package/src/main/settings/index.ts +19 -0
- package/src/main/transcription/ModelDownloadManager.ts +494 -0
- package/src/main/transcription/TierManager.ts +219 -0
- package/src/main/transcription/TranscriptionRecoveryService.ts +340 -0
- package/src/main/transcription/WhisperService.ts +748 -0
- package/src/main/transcription/index.ts +56 -0
- package/src/main/transcription/types.ts +135 -0
- package/src/main/windows/PopoverManager.ts +284 -0
- package/src/main/windows/TaskbarIntegration.ts +452 -0
- package/src/main/windows/index.ts +23 -0
- package/src/preload/index.ts +1047 -0
- package/src/renderer/App.tsx +515 -0
- package/src/renderer/AppWrapper.tsx +28 -0
- package/src/renderer/assets/logo-dark.svg +7 -0
- package/src/renderer/assets/logo.svg +7 -0
- package/src/renderer/audio/AudioCaptureRenderer.ts +454 -0
- package/src/renderer/capture/ScreenRecordingRenderer.ts +492 -0
- package/src/renderer/components/AnnotationOverlay.tsx +836 -0
- package/src/renderer/components/AudioWaveform.tsx +811 -0
- package/src/renderer/components/ClarificationQuestions.tsx +656 -0
- package/src/renderer/components/CountdownTimer.tsx +495 -0
- package/src/renderer/components/CrashRecoveryDialog.tsx +632 -0
- package/src/renderer/components/DonateButton.tsx +127 -0
- package/src/renderer/components/ErrorBoundary.tsx +308 -0
- package/src/renderer/components/ExportDialog.tsx +872 -0
- package/src/renderer/components/HotkeyHint.tsx +261 -0
- package/src/renderer/components/KeyboardShortcuts.tsx +787 -0
- package/src/renderer/components/ModelDownloadDialog.tsx +844 -0
- package/src/renderer/components/Onboarding.tsx +1830 -0
- package/src/renderer/components/ProcessingOverlay.tsx +157 -0
- package/src/renderer/components/RecordingOverlay.tsx +423 -0
- package/src/renderer/components/SessionHistory.tsx +1746 -0
- package/src/renderer/components/SessionReview.tsx +1321 -0
- package/src/renderer/components/SettingsPanel.tsx +217 -0
- package/src/renderer/components/Skeleton.tsx +347 -0
- package/src/renderer/components/StatusIndicator.tsx +86 -0
- package/src/renderer/components/ThemeProvider.tsx +429 -0
- package/src/renderer/components/Tooltip.tsx +370 -0
- package/src/renderer/components/TranscriptionPreview.tsx +183 -0
- package/src/renderer/components/TranscriptionTierSelector.tsx +640 -0
- package/src/renderer/components/UpdateNotification.tsx +377 -0
- package/src/renderer/components/WindowSelector.tsx +947 -0
- package/src/renderer/components/index.ts +99 -0
- package/src/renderer/components/primitives/ApiKeyInput.tsx +98 -0
- package/src/renderer/components/primitives/ColorPicker.tsx +65 -0
- package/src/renderer/components/primitives/DangerButton.tsx +45 -0
- package/src/renderer/components/primitives/DirectoryPicker.tsx +41 -0
- package/src/renderer/components/primitives/Dropdown.tsx +34 -0
- package/src/renderer/components/primitives/KeyRecorder.tsx +117 -0
- package/src/renderer/components/primitives/SettingsSection.tsx +32 -0
- package/src/renderer/components/primitives/Slider.tsx +43 -0
- package/src/renderer/components/primitives/Toggle.tsx +36 -0
- package/src/renderer/components/primitives/index.ts +10 -0
- package/src/renderer/components/settings/AdvancedTab.tsx +174 -0
- package/src/renderer/components/settings/AppearanceTab.tsx +77 -0
- package/src/renderer/components/settings/GeneralTab.tsx +40 -0
- package/src/renderer/components/settings/HotkeysTab.tsx +79 -0
- package/src/renderer/components/settings/RecordingTab.tsx +84 -0
- package/src/renderer/components/settings/index.ts +9 -0
- package/src/renderer/components/settings/settingsStyles.ts +673 -0
- package/src/renderer/components/settings/tabConfig.tsx +85 -0
- package/src/renderer/components/settings/useSettingsPanel.ts +447 -0
- package/src/renderer/contexts/ProcessingContext.tsx +227 -0
- package/src/renderer/contexts/RecordingContext.tsx +683 -0
- package/src/renderer/contexts/UIContext.tsx +326 -0
- package/src/renderer/contexts/index.ts +24 -0
- package/src/renderer/donateMessages.ts +69 -0
- package/src/renderer/hooks/index.ts +75 -0
- package/src/renderer/hooks/useAnimation.tsx +544 -0
- package/src/renderer/hooks/useTheme.ts +313 -0
- package/src/renderer/index.html +26 -0
- package/src/renderer/main.tsx +52 -0
- package/src/renderer/styles/animations.css +1093 -0
- package/src/renderer/styles/app-shell.css +662 -0
- package/src/renderer/styles/globals.css +515 -0
- package/src/renderer/styles/theme.ts +578 -0
- package/src/renderer/types/electron.d.ts +385 -0
- package/src/shared/hotkeys.ts +283 -0
- package/src/shared/types.ts +809 -0
- package/tests/clipboard.test.ts +228 -0
- package/tests/e2e/criticalPaths.test.ts +594 -0
- package/tests/feedbackAnalyzer.test.ts +303 -0
- package/tests/integration/sessionFlow.test.ts +583 -0
- package/tests/markdownGenerator.test.ts +418 -0
- package/tests/output.test.ts +96 -0
- package/tests/setup.ts +486 -0
- package/tests/unit/appIntegration.test.ts +676 -0
- package/tests/unit/appViewState.test.ts +281 -0
- package/tests/unit/audioIpcChannels.test.ts +17 -0
- package/tests/unit/exportService.test.ts +492 -0
- package/tests/unit/hotkeys.test.ts +92 -0
- package/tests/unit/navigationPreload.test.ts +94 -0
- package/tests/unit/onboardingFlow.test.ts +345 -0
- package/tests/unit/permissionManager.test.ts +175 -0
- package/tests/unit/permissionManagerExpanded.test.ts +296 -0
- package/tests/unit/screenRecordingRenderer.test.ts +368 -0
- package/tests/unit/sessionController.test.ts +515 -0
- package/tests/unit/tierManager.test.ts +61 -0
- package/tests/unit/tierManagerExpanded.test.ts +142 -0
- package/tests/unit/transcriptAnalyzer.test.ts +64 -0
- package/tsconfig.json +25 -0
- package/vitest.config.ts +46 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
# Code Signing & Notarization Guide for markupr
|
|
2
|
+
|
|
3
|
+
This guide explains how to set up Apple code signing and notarization for distributing markupr.
|
|
4
|
+
|
|
5
|
+
## Why Code Signing Matters
|
|
6
|
+
|
|
7
|
+
Without code signing, macOS Gatekeeper will:
|
|
8
|
+
- Block the app from opening
|
|
9
|
+
- Show scary "unidentified developer" warnings
|
|
10
|
+
- Require users to go through Security settings to allow the app
|
|
11
|
+
|
|
12
|
+
With code signing AND notarization:
|
|
13
|
+
- App opens without warnings
|
|
14
|
+
- Users feel confident installing your app
|
|
15
|
+
- Apple has verified the app is free of malware
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Prerequisites
|
|
20
|
+
|
|
21
|
+
1. **Apple Developer Account** ($99/year)
|
|
22
|
+
- Sign up at https://developer.apple.com
|
|
23
|
+
- Required for distribution outside the Mac App Store
|
|
24
|
+
|
|
25
|
+
2. **Xcode Command Line Tools**
|
|
26
|
+
```bash
|
|
27
|
+
xcode-select --install
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Step 1: Create Certificates
|
|
33
|
+
|
|
34
|
+
### Via Xcode (Recommended)
|
|
35
|
+
|
|
36
|
+
1. Open Xcode > Preferences > Accounts
|
|
37
|
+
2. Select your Apple ID > Manage Certificates
|
|
38
|
+
3. Click `+` and create:
|
|
39
|
+
- "Developer ID Application" certificate
|
|
40
|
+
|
|
41
|
+
### Via Apple Developer Portal
|
|
42
|
+
|
|
43
|
+
1. Go to https://developer.apple.com/account/resources/certificates
|
|
44
|
+
2. Click `+` to create a new certificate
|
|
45
|
+
3. Select "Developer ID Application"
|
|
46
|
+
4. Follow the CSR (Certificate Signing Request) instructions
|
|
47
|
+
5. Download and double-click to install in Keychain
|
|
48
|
+
|
|
49
|
+
### Verify Installation
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
security find-identity -v -p codesigning
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
You should see your "Developer ID Application: Your Name (TEAM_ID)" certificate.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Step 2: Create App-Specific Password
|
|
60
|
+
|
|
61
|
+
Apple requires an app-specific password for notarization (not your regular Apple ID password).
|
|
62
|
+
|
|
63
|
+
1. Go to https://appleid.apple.com
|
|
64
|
+
2. Sign in with your Apple ID
|
|
65
|
+
3. Navigate to "App-Specific Passwords"
|
|
66
|
+
4. Click "Generate Password"
|
|
67
|
+
5. Name it "markupr Notarization"
|
|
68
|
+
6. **Save this password securely** - you'll need it for builds
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Step 3: Find Your Team ID
|
|
73
|
+
|
|
74
|
+
Your Team ID is a 10-character alphanumeric code.
|
|
75
|
+
|
|
76
|
+
### Method 1: Xcode
|
|
77
|
+
Open Xcode > Preferences > Accounts > Select your team > View the Team ID
|
|
78
|
+
|
|
79
|
+
### Method 2: Developer Portal
|
|
80
|
+
Go to https://developer.apple.com/account > Membership > Team ID
|
|
81
|
+
|
|
82
|
+
### Method 3: Command Line
|
|
83
|
+
```bash
|
|
84
|
+
security find-identity -v -p codesigning | grep "Developer ID"
|
|
85
|
+
# Output: ... "Developer ID Application: Your Name (ABCD1234XY)"
|
|
86
|
+
# Your Team ID is the part in parentheses: ABCD1234XY
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Step 4: Set Environment Variables
|
|
92
|
+
|
|
93
|
+
### For Local Development
|
|
94
|
+
|
|
95
|
+
Add to your shell profile (`~/.zshrc` or `~/.bashrc`):
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# markupr Code Signing
|
|
99
|
+
export APPLE_ID="your.email@example.com"
|
|
100
|
+
export APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx"
|
|
101
|
+
export APPLE_TEAM_ID="ABCD1234XY"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Then reload:
|
|
105
|
+
```bash
|
|
106
|
+
source ~/.zshrc
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### For CI/CD (GitHub Actions)
|
|
110
|
+
|
|
111
|
+
Add these as repository secrets:
|
|
112
|
+
- `APPLE_ID`
|
|
113
|
+
- `APPLE_APP_SPECIFIC_PASSWORD`
|
|
114
|
+
- `APPLE_TEAM_ID`
|
|
115
|
+
- `CSC_LINK` (base64-encoded .p12 certificate)
|
|
116
|
+
- `CSC_KEY_PASSWORD` (certificate password)
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Step 5: Export Certificate for CI
|
|
121
|
+
|
|
122
|
+
To sign in CI, you need to export your certificate as a base64-encoded .p12 file.
|
|
123
|
+
|
|
124
|
+
### Export from Keychain
|
|
125
|
+
|
|
126
|
+
1. Open Keychain Access
|
|
127
|
+
2. Find your "Developer ID Application" certificate
|
|
128
|
+
3. Right-click > Export
|
|
129
|
+
4. Save as `.p12` format
|
|
130
|
+
5. Set a strong password (this becomes `CSC_KEY_PASSWORD`)
|
|
131
|
+
|
|
132
|
+
### Convert to Base64
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
base64 -i Certificates.p12 -o certificate-base64.txt
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
The contents of `certificate-base64.txt` is your `CSC_LINK` secret.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Step 6: Build & Sign
|
|
143
|
+
|
|
144
|
+
### Local Build
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
# Build the app
|
|
148
|
+
npm run build
|
|
149
|
+
|
|
150
|
+
# Package for macOS (will sign and notarize)
|
|
151
|
+
npm run package:mac
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Build Without Signing (for testing)
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
# Skip signing
|
|
158
|
+
CSC_IDENTITY_AUTO_DISCOVERY=false npm run package:mac
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Troubleshooting
|
|
164
|
+
|
|
165
|
+
### "No identity found for signing"
|
|
166
|
+
|
|
167
|
+
Your certificate isn't installed or recognized:
|
|
168
|
+
```bash
|
|
169
|
+
# Check installed certificates
|
|
170
|
+
security find-identity -v -p codesigning
|
|
171
|
+
|
|
172
|
+
# If empty, reinstall your certificate from Keychain
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### "Notarization failed: invalid credentials"
|
|
176
|
+
|
|
177
|
+
1. Regenerate your app-specific password
|
|
178
|
+
2. Verify APPLE_ID matches your developer account email exactly
|
|
179
|
+
3. Check APPLE_TEAM_ID is correct
|
|
180
|
+
|
|
181
|
+
### "The signature is invalid"
|
|
182
|
+
|
|
183
|
+
The app was modified after signing:
|
|
184
|
+
```bash
|
|
185
|
+
# Verify signature
|
|
186
|
+
codesign --verify --deep --strict /path/to/markupr.app
|
|
187
|
+
|
|
188
|
+
# Re-sign if needed
|
|
189
|
+
codesign --deep --force --verify --verbose --sign "Developer ID Application: Your Name" /path/to/markupr.app
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### "This app is damaged"
|
|
193
|
+
|
|
194
|
+
Gatekeeper quarantine issue:
|
|
195
|
+
```bash
|
|
196
|
+
# Remove quarantine attribute
|
|
197
|
+
xattr -cr /Applications/markupr.app
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Notarization timeout
|
|
201
|
+
|
|
202
|
+
Apple's servers can be slow. The process typically takes 2-10 minutes but can take longer. The script will wait automatically.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## GitHub Actions CI Setup
|
|
207
|
+
|
|
208
|
+
Add this to your workflow:
|
|
209
|
+
|
|
210
|
+
```yaml
|
|
211
|
+
jobs:
|
|
212
|
+
build-mac:
|
|
213
|
+
runs-on: macos-latest
|
|
214
|
+
steps:
|
|
215
|
+
- uses: actions/checkout@v4
|
|
216
|
+
|
|
217
|
+
- name: Setup Node.js
|
|
218
|
+
uses: actions/setup-node@v4
|
|
219
|
+
with:
|
|
220
|
+
node-version: '20'
|
|
221
|
+
|
|
222
|
+
- name: Install dependencies
|
|
223
|
+
run: npm ci
|
|
224
|
+
|
|
225
|
+
- name: Build
|
|
226
|
+
run: npm run build
|
|
227
|
+
|
|
228
|
+
- name: Package & Sign
|
|
229
|
+
env:
|
|
230
|
+
APPLE_ID: ${{ secrets.APPLE_ID }}
|
|
231
|
+
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
|
|
232
|
+
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
|
233
|
+
CSC_LINK: ${{ secrets.CSC_LINK }}
|
|
234
|
+
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
|
|
235
|
+
run: npm run package:mac
|
|
236
|
+
|
|
237
|
+
- name: Upload Artifact
|
|
238
|
+
uses: actions/upload-artifact@v4
|
|
239
|
+
with:
|
|
240
|
+
name: markupr-mac
|
|
241
|
+
path: release/*.dmg
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## Environment Variables Reference
|
|
247
|
+
|
|
248
|
+
| Variable | Description | Example |
|
|
249
|
+
|----------|-------------|---------|
|
|
250
|
+
| `APPLE_ID` | Apple Developer account email | `dev@example.com` |
|
|
251
|
+
| `APPLE_APP_SPECIFIC_PASSWORD` | App-specific password from appleid.apple.com | `xxxx-xxxx-xxxx-xxxx` |
|
|
252
|
+
| `APPLE_TEAM_ID` | 10-char Apple Team ID | `ABCD1234XY` |
|
|
253
|
+
| `CSC_LINK` | Base64-encoded .p12 certificate | (long string) |
|
|
254
|
+
| `CSC_KEY_PASSWORD` | Password for .p12 certificate | (your password) |
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Quick Reference Commands
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
# Build and package
|
|
262
|
+
npm run build && npm run package:mac
|
|
263
|
+
|
|
264
|
+
# Release (builds, signs, notarizes, publishes to GitHub)
|
|
265
|
+
npm run release
|
|
266
|
+
|
|
267
|
+
# Check what will be included in the package
|
|
268
|
+
npx electron-builder --mac --dir
|
|
269
|
+
|
|
270
|
+
# Verify signature
|
|
271
|
+
codesign --verify --deep --strict "release/mac/markupr.app"
|
|
272
|
+
|
|
273
|
+
# Check notarization status
|
|
274
|
+
xcrun stapler validate "release/markupr-0.2.0.dmg"
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## Security Notes
|
|
280
|
+
|
|
281
|
+
- **Never commit** certificates, passwords, or keys to git
|
|
282
|
+
- Use environment variables or CI secrets only
|
|
283
|
+
- Rotate app-specific passwords periodically
|
|
284
|
+
- Keep your .p12 certificate file secure and backed up
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# DMG Background Image Instructions
|
|
2
|
+
|
|
3
|
+
Create a professional DMG background for markupr installation.
|
|
4
|
+
|
|
5
|
+
## Specifications
|
|
6
|
+
|
|
7
|
+
| Property | Value |
|
|
8
|
+
|----------|-------|
|
|
9
|
+
| **Dimensions** | 540 x 400 pixels |
|
|
10
|
+
| **Format** | PNG |
|
|
11
|
+
| **Filename** | `dmg-background.png` |
|
|
12
|
+
| **Location** | `assets/dmg-background.png` |
|
|
13
|
+
|
|
14
|
+
## Design Guidelines
|
|
15
|
+
|
|
16
|
+
### Background
|
|
17
|
+
- Use a gradient matching the app theme
|
|
18
|
+
- Primary color: `#0f172a` (slate-900)
|
|
19
|
+
- Secondary color: `#1e293b` (slate-800)
|
|
20
|
+
- Gradient direction: top-left to bottom-right
|
|
21
|
+
|
|
22
|
+
### Layout
|
|
23
|
+
The DMG window has two drop zones:
|
|
24
|
+
- **App icon** at position (130, 220) - left side
|
|
25
|
+
- **Applications folder** at position (410, 220) - right side
|
|
26
|
+
|
|
27
|
+
### Visual Elements
|
|
28
|
+
|
|
29
|
+
1. **Arrow Indicator**
|
|
30
|
+
- Subtle arrow pointing from left (app) to right (Applications)
|
|
31
|
+
- Color: `#38bdf8` (sky-400) with 50% opacity
|
|
32
|
+
- Positioned between the two icons at y=220
|
|
33
|
+
|
|
34
|
+
2. **Install Text** (optional)
|
|
35
|
+
- "Drag to Applications to install"
|
|
36
|
+
- Font: SF Pro Display or system font
|
|
37
|
+
- Color: `#94a3b8` (slate-400)
|
|
38
|
+
- Position: centered, below the arrow (y~280)
|
|
39
|
+
|
|
40
|
+
3. **App Branding** (optional)
|
|
41
|
+
- Small markupr logo in top-left corner
|
|
42
|
+
- Very subtle, ~40px height
|
|
43
|
+
|
|
44
|
+
### Color Palette
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
Background gradient:
|
|
48
|
+
Start: #0f172a (slate-900)
|
|
49
|
+
End: #1e293b (slate-800)
|
|
50
|
+
|
|
51
|
+
Accent:
|
|
52
|
+
Primary: #38bdf8 (sky-400)
|
|
53
|
+
|
|
54
|
+
Text:
|
|
55
|
+
Muted: #94a3b8 (slate-400)
|
|
56
|
+
Light: #e2e8f0 (slate-200)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Creating the Background
|
|
60
|
+
|
|
61
|
+
### Option 1: Figma/Sketch
|
|
62
|
+
1. Create a 540x400 artboard
|
|
63
|
+
2. Apply background gradient
|
|
64
|
+
3. Add arrow and optional text
|
|
65
|
+
4. Export as PNG
|
|
66
|
+
|
|
67
|
+
### Option 2: Command Line (Simple Gradient Only)
|
|
68
|
+
```bash
|
|
69
|
+
# Using ImageMagick
|
|
70
|
+
convert -size 540x400 gradient:'#0f172a'-'#1e293b' assets/dmg-background.png
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Option 3: Online Tools
|
|
74
|
+
- Canva (free tier works)
|
|
75
|
+
- Figma (free tier works)
|
|
76
|
+
- Photopea (free Photoshop alternative)
|
|
77
|
+
|
|
78
|
+
## Icon Requirements
|
|
79
|
+
|
|
80
|
+
### Application Icon (`icon.icns`)
|
|
81
|
+
- Required sizes: 16, 32, 64, 128, 256, 512, 1024 pixels
|
|
82
|
+
- Format: .icns (macOS icon format)
|
|
83
|
+
- Location: `assets/icon.icns`
|
|
84
|
+
|
|
85
|
+
To create from PNG:
|
|
86
|
+
```bash
|
|
87
|
+
# Create iconset directory
|
|
88
|
+
mkdir icon.iconset
|
|
89
|
+
|
|
90
|
+
# Create all required sizes (starting from 1024x1024 source)
|
|
91
|
+
sips -z 16 16 icon-1024.png --out icon.iconset/icon_16x16.png
|
|
92
|
+
sips -z 32 32 icon-1024.png --out icon.iconset/icon_16x16@2x.png
|
|
93
|
+
sips -z 32 32 icon-1024.png --out icon.iconset/icon_32x32.png
|
|
94
|
+
sips -z 64 64 icon-1024.png --out icon.iconset/icon_32x32@2x.png
|
|
95
|
+
sips -z 128 128 icon-1024.png --out icon.iconset/icon_128x128.png
|
|
96
|
+
sips -z 256 256 icon-1024.png --out icon.iconset/icon_128x128@2x.png
|
|
97
|
+
sips -z 256 256 icon-1024.png --out icon.iconset/icon_256x256.png
|
|
98
|
+
sips -z 512 512 icon-1024.png --out icon.iconset/icon_256x256@2x.png
|
|
99
|
+
sips -z 512 512 icon-1024.png --out icon.iconset/icon_512x512.png
|
|
100
|
+
sips -z 1024 1024 icon-1024.png --out icon.iconset/icon_512x512@2x.png
|
|
101
|
+
|
|
102
|
+
# Convert to icns
|
|
103
|
+
iconutil -c icns icon.iconset -o assets/icon.icns
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### DMG Icon (`dmg-icon.icns`)
|
|
107
|
+
- Same process as above
|
|
108
|
+
- Can be the same as app icon or a variation
|
|
109
|
+
- Location: `assets/dmg-icon.icns`
|
|
110
|
+
|
|
111
|
+
## File Checklist
|
|
112
|
+
|
|
113
|
+
Before building, ensure these files exist:
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
assets/
|
|
117
|
+
├── dmg-background.png (540x400 PNG)
|
|
118
|
+
├── icon.icns (macOS app icon)
|
|
119
|
+
└── dmg-icon.icns (DMG volume icon)
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Quick Placeholder
|
|
123
|
+
|
|
124
|
+
For testing, create a simple placeholder:
|
|
125
|
+
```bash
|
|
126
|
+
# Solid color placeholder (just for testing builds)
|
|
127
|
+
convert -size 540x400 xc:'#0f172a' assets/dmg-background.png
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
The build will work with a simple background - polish it before release.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg width="660" height="400" viewBox="0 0 660 400" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<defs>
|
|
4
|
+
<!-- Background gradient -->
|
|
5
|
+
<linearGradient id="dmgBgGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
6
|
+
<stop offset="0%" style="stop-color:#1E1E2E"/>
|
|
7
|
+
<stop offset="50%" style="stop-color:#2D2D44"/>
|
|
8
|
+
<stop offset="100%" style="stop-color:#1E1E2E"/>
|
|
9
|
+
</linearGradient>
|
|
10
|
+
|
|
11
|
+
<!-- Accent gradient -->
|
|
12
|
+
<linearGradient id="dmgAccent" x1="0%" y1="0%" x2="100%" y2="0%">
|
|
13
|
+
<stop offset="0%" style="stop-color:#6366F1" stop-opacity="0.3"/>
|
|
14
|
+
<stop offset="50%" style="stop-color:#8B5CF6" stop-opacity="0.5"/>
|
|
15
|
+
<stop offset="100%" style="stop-color:#EC4899" stop-opacity="0.3"/>
|
|
16
|
+
</linearGradient>
|
|
17
|
+
|
|
18
|
+
<!-- Glow filter -->
|
|
19
|
+
<filter id="dmgGlow" x="-50%" y="-50%" width="200%" height="200%">
|
|
20
|
+
<feGaussianBlur stdDeviation="20" result="blur"/>
|
|
21
|
+
<feComposite in="SourceGraphic" in2="blur" operator="over"/>
|
|
22
|
+
</filter>
|
|
23
|
+
</defs>
|
|
24
|
+
|
|
25
|
+
<!-- Background -->
|
|
26
|
+
<rect width="660" height="400" fill="url(#dmgBgGrad)"/>
|
|
27
|
+
|
|
28
|
+
<!-- Subtle grid pattern -->
|
|
29
|
+
<g opacity="0.05">
|
|
30
|
+
<pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
|
|
31
|
+
<path d="M 40 0 L 0 0 0 40" fill="none" stroke="white" stroke-width="1"/>
|
|
32
|
+
</pattern>
|
|
33
|
+
<rect width="660" height="400" fill="url(#grid)"/>
|
|
34
|
+
</g>
|
|
35
|
+
|
|
36
|
+
<!-- Accent glow orbs -->
|
|
37
|
+
<circle cx="165" cy="180" r="120" fill="url(#dmgAccent)" filter="url(#dmgGlow)" opacity="0.4"/>
|
|
38
|
+
<circle cx="495" cy="180" r="120" fill="url(#dmgAccent)" filter="url(#dmgGlow)" opacity="0.4"/>
|
|
39
|
+
|
|
40
|
+
<!-- App icon placeholder area (left side) -->
|
|
41
|
+
<g transform="translate(105, 110)">
|
|
42
|
+
<rect width="120" height="120" rx="27" fill="#6366F1" opacity="0.2" stroke="#6366F1" stroke-width="2" stroke-dasharray="8 4"/>
|
|
43
|
+
<text x="60" y="150" text-anchor="middle" font-family="system-ui, sans-serif" font-size="14" fill="#94A3B8">markupr</text>
|
|
44
|
+
</g>
|
|
45
|
+
|
|
46
|
+
<!-- Arrow indicating drag direction -->
|
|
47
|
+
<g transform="translate(280, 155)">
|
|
48
|
+
<!-- Arrow body -->
|
|
49
|
+
<rect x="0" y="20" width="100" height="10" rx="5" fill="white" opacity="0.3"/>
|
|
50
|
+
<!-- Arrow head -->
|
|
51
|
+
<polygon points="100,25 130,25 115,5" fill="white" opacity="0.4"/>
|
|
52
|
+
<polygon points="100,25 130,25 115,45" fill="white" opacity="0.4"/>
|
|
53
|
+
</g>
|
|
54
|
+
|
|
55
|
+
<!-- Applications folder placeholder (right side) -->
|
|
56
|
+
<g transform="translate(435, 110)">
|
|
57
|
+
<rect width="120" height="120" rx="27" fill="#64748B" opacity="0.2" stroke="#64748B" stroke-width="2" stroke-dasharray="8 4"/>
|
|
58
|
+
<!-- Folder icon hint -->
|
|
59
|
+
<path d="M45 50 L45 90 L95 90 L95 55 L70 55 L65 50 Z" fill="#64748B" opacity="0.3"/>
|
|
60
|
+
<text x="60" y="150" text-anchor="middle" font-family="system-ui, sans-serif" font-size="14" fill="#94A3B8">Applications</text>
|
|
61
|
+
</g>
|
|
62
|
+
|
|
63
|
+
<!-- Install instruction text -->
|
|
64
|
+
<text x="330" y="320" text-anchor="middle" font-family="system-ui, sans-serif" font-size="18" font-weight="600" fill="#F8FAFC" opacity="0.8">
|
|
65
|
+
Drag to install
|
|
66
|
+
</text>
|
|
67
|
+
|
|
68
|
+
<!-- Subtle brand line -->
|
|
69
|
+
<rect x="200" y="360" width="260" height="3" rx="1.5" fill="url(#dmgAccent)" opacity="0.6"/>
|
|
70
|
+
</svg>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<defs>
|
|
4
|
+
<linearGradient id="bg" x1="128" y1="96" x2="896" y2="928" gradientUnits="userSpaceOnUse">
|
|
5
|
+
<stop offset="0" stop-color="#FFFFFF"/>
|
|
6
|
+
<stop offset="1" stop-color="#EEF1F4"/>
|
|
7
|
+
</linearGradient>
|
|
8
|
+
<linearGradient id="glass" x1="512" y1="128" x2="512" y2="896" gradientUnits="userSpaceOnUse">
|
|
9
|
+
<stop offset="0" stop-color="#FFFFFF" stop-opacity="0.68"/>
|
|
10
|
+
<stop offset="1" stop-color="#FFFFFF" stop-opacity="0"/>
|
|
11
|
+
</linearGradient>
|
|
12
|
+
</defs>
|
|
13
|
+
|
|
14
|
+
<rect x="96" y="96" width="832" height="832" rx="220" fill="url(#bg)"/>
|
|
15
|
+
<rect x="96" y="96" width="832" height="832" rx="220" stroke="#D7DCE2" stroke-width="18"/>
|
|
16
|
+
<rect x="132" y="132" width="760" height="360" rx="184" fill="url(#glass)"/>
|
|
17
|
+
|
|
18
|
+
<path d="M292 714V314L512 524L732 314V714" stroke="#111827" stroke-width="74" stroke-linecap="round" stroke-linejoin="round"/>
|
|
19
|
+
<circle cx="732" cy="714" r="36" fill="#111827"/>
|
|
20
|
+
</svg>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<rect x="3" y="3" width="16" height="16" rx="4" stroke="black" stroke-width="1.6" fill="none"/>
|
|
4
|
+
<path d="M7 15V8L11 12L15 8V15" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
5
|
+
<circle cx="15" cy="15" r="1.2" fill="black"/>
|
|
6
|
+
<circle cx="18" cy="4" r="2.5" stroke="black" stroke-width="1.3" fill="none" stroke-dasharray="7 5" stroke-linecap="round"/>
|
|
7
|
+
</svg>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<rect x="3" y="3" width="16" height="16" rx="4" stroke="black" stroke-width="1.6" fill="none"/>
|
|
4
|
+
<path d="M7 15V8L11 12L15 8V15" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
5
|
+
<circle cx="15" cy="15" r="1.2" fill="black"/>
|
|
6
|
+
<circle cx="18" cy="4" r="2.5" fill="#FF3B30"/>
|
|
7
|
+
</svg>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<rect x="3" y="3" width="16" height="16" rx="4" stroke="black" stroke-width="1.6" fill="none"/>
|
|
4
|
+
<path d="M7 15V8L11 12L15 8V15" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
5
|
+
<circle cx="15" cy="15" r="1.2" fill="black"/>
|
|
6
|
+
</svg>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|