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.
Files changed (299) hide show
  1. package/.claude/commands/review-feedback.md +47 -0
  2. package/.eslintrc.json +35 -0
  3. package/.github/CODEOWNERS +16 -0
  4. package/.github/FUNDING.yml +1 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.md +56 -0
  6. package/.github/ISSUE_TEMPLATE/feature_request.md +54 -0
  7. package/.github/PULL_REQUEST_TEMPLATE.md +89 -0
  8. package/.github/dependabot.yml +70 -0
  9. package/.github/workflows/ci.yml +184 -0
  10. package/.github/workflows/deploy-landing.yml +134 -0
  11. package/.github/workflows/nightly.yml +288 -0
  12. package/.github/workflows/release.yml +318 -0
  13. package/CHANGELOG.md +127 -0
  14. package/CLAUDE.md +137 -0
  15. package/CODE_OF_CONDUCT.md +9 -0
  16. package/CONTRIBUTING.md +390 -0
  17. package/LICENSE +21 -0
  18. package/PRODUCT_VISION.md +277 -0
  19. package/README.md +517 -0
  20. package/SECURITY.md +51 -0
  21. package/SIGNING_INSTRUCTIONS.md +284 -0
  22. package/assets/DMG_BACKGROUND_INSTRUCTIONS.md +130 -0
  23. package/assets/svg-source/dmg-background.svg +70 -0
  24. package/assets/svg-source/icon.svg +20 -0
  25. package/assets/svg-source/tray-icon-processing.svg +7 -0
  26. package/assets/svg-source/tray-icon-recording.svg +7 -0
  27. package/assets/svg-source/tray-icon.svg +6 -0
  28. package/assets/tray-complete.png +0 -0
  29. package/assets/tray-complete@2x.png +0 -0
  30. package/assets/tray-completeTemplate.png +0 -0
  31. package/assets/tray-completeTemplate@2x.png +0 -0
  32. package/assets/tray-error.png +0 -0
  33. package/assets/tray-error@2x.png +0 -0
  34. package/assets/tray-errorTemplate.png +0 -0
  35. package/assets/tray-errorTemplate@2x.png +0 -0
  36. package/assets/tray-icon-processing.png +0 -0
  37. package/assets/tray-icon-processing@2x.png +0 -0
  38. package/assets/tray-icon-processingTemplate.png +0 -0
  39. package/assets/tray-icon-processingTemplate@2x.png +0 -0
  40. package/assets/tray-icon-recording.png +0 -0
  41. package/assets/tray-icon-recording@2x.png +0 -0
  42. package/assets/tray-icon-recordingTemplate.png +0 -0
  43. package/assets/tray-icon-recordingTemplate@2x.png +0 -0
  44. package/assets/tray-icon.png +0 -0
  45. package/assets/tray-icon@2x.png +0 -0
  46. package/assets/tray-iconTemplate.png +0 -0
  47. package/assets/tray-iconTemplate@2x.png +0 -0
  48. package/assets/tray-idle.png +0 -0
  49. package/assets/tray-idle@2x.png +0 -0
  50. package/assets/tray-idleTemplate.png +0 -0
  51. package/assets/tray-idleTemplate@2x.png +0 -0
  52. package/assets/tray-processing-0.png +0 -0
  53. package/assets/tray-processing-0@2x.png +0 -0
  54. package/assets/tray-processing-0Template.png +0 -0
  55. package/assets/tray-processing-0Template@2x.png +0 -0
  56. package/assets/tray-processing-1.png +0 -0
  57. package/assets/tray-processing-1@2x.png +0 -0
  58. package/assets/tray-processing-1Template.png +0 -0
  59. package/assets/tray-processing-1Template@2x.png +0 -0
  60. package/assets/tray-processing-2.png +0 -0
  61. package/assets/tray-processing-2@2x.png +0 -0
  62. package/assets/tray-processing-2Template.png +0 -0
  63. package/assets/tray-processing-2Template@2x.png +0 -0
  64. package/assets/tray-processing-3.png +0 -0
  65. package/assets/tray-processing-3@2x.png +0 -0
  66. package/assets/tray-processing-3Template.png +0 -0
  67. package/assets/tray-processing-3Template@2x.png +0 -0
  68. package/assets/tray-processing.png +0 -0
  69. package/assets/tray-processing@2x.png +0 -0
  70. package/assets/tray-processingTemplate.png +0 -0
  71. package/assets/tray-processingTemplate@2x.png +0 -0
  72. package/assets/tray-recording.png +0 -0
  73. package/assets/tray-recording@2x.png +0 -0
  74. package/assets/tray-recordingTemplate.png +0 -0
  75. package/assets/tray-recordingTemplate@2x.png +0 -0
  76. package/build/DMG_BACKGROUND_SPEC.md +50 -0
  77. package/build/dmg-background.png +0 -0
  78. package/build/dmg-background@2x.png +0 -0
  79. package/build/entitlements.mac.inherit.plist +27 -0
  80. package/build/entitlements.mac.plist +41 -0
  81. package/build/favicon-16.png +0 -0
  82. package/build/favicon-180.png +0 -0
  83. package/build/favicon-192.png +0 -0
  84. package/build/favicon-32.png +0 -0
  85. package/build/favicon-48.png +0 -0
  86. package/build/favicon-512.png +0 -0
  87. package/build/favicon-64.png +0 -0
  88. package/build/icon-128.png +0 -0
  89. package/build/icon-16.png +0 -0
  90. package/build/icon-24.png +0 -0
  91. package/build/icon-256.png +0 -0
  92. package/build/icon-32.png +0 -0
  93. package/build/icon-48.png +0 -0
  94. package/build/icon-64.png +0 -0
  95. package/build/icon.icns +0 -0
  96. package/build/icon.ico +0 -0
  97. package/build/icon.iconset/icon_128x128.png +0 -0
  98. package/build/icon.iconset/icon_128x128@2x.png +0 -0
  99. package/build/icon.iconset/icon_16x16.png +0 -0
  100. package/build/icon.iconset/icon_16x16@2x.png +0 -0
  101. package/build/icon.iconset/icon_256x256.png +0 -0
  102. package/build/icon.iconset/icon_256x256@2x.png +0 -0
  103. package/build/icon.iconset/icon_32x32.png +0 -0
  104. package/build/icon.iconset/icon_32x32@2x.png +0 -0
  105. package/build/icon.iconset/icon_512x512.png +0 -0
  106. package/build/icon.iconset/icon_512x512@2x.png +0 -0
  107. package/build/icon.png +0 -0
  108. package/build/installer-header.bmp +0 -0
  109. package/build/installer-header.png +0 -0
  110. package/build/installer-sidebar.bmp +0 -0
  111. package/build/installer-sidebar.png +0 -0
  112. package/build/installer.nsh +45 -0
  113. package/build/overlay-processing.png +0 -0
  114. package/build/overlay-recording.png +0 -0
  115. package/build/toolbar-record.png +0 -0
  116. package/build/toolbar-screenshot.png +0 -0
  117. package/build/toolbar-settings.png +0 -0
  118. package/build/toolbar-stop.png +0 -0
  119. package/dist/main/index.mjs +12612 -0
  120. package/dist/preload/index.mjs +907 -0
  121. package/dist/renderer/assets/index-CCmUjl9K.js +19495 -0
  122. package/dist/renderer/assets/index-CUqz_Gs6.css +2270 -0
  123. package/dist/renderer/index.html +27 -0
  124. package/docs/AI_AGENT_QUICKSTART.md +42 -0
  125. package/docs/AI_PIPELINE_DESIGN.md +595 -0
  126. package/docs/API.md +514 -0
  127. package/docs/ARCHITECTURE.md +460 -0
  128. package/docs/CONFIGURATION.md +336 -0
  129. package/docs/DEVELOPMENT.md +508 -0
  130. package/docs/EXPORT_FORMATS.md +451 -0
  131. package/docs/GETTING_STARTED.md +236 -0
  132. package/docs/KEYBOARD_SHORTCUTS.md +334 -0
  133. package/docs/TROUBLESHOOTING.md +418 -0
  134. package/docs/landing/index.html +672 -0
  135. package/docs/landing/script.js +342 -0
  136. package/docs/landing/styles.css +1543 -0
  137. package/electron-builder.yml +140 -0
  138. package/electron.vite.config.ts +63 -0
  139. package/package.json +108 -0
  140. package/railway.json +12 -0
  141. package/scripts/build.mjs +51 -0
  142. package/scripts/generate-icons.mjs +314 -0
  143. package/scripts/generate-installer-images.cjs +253 -0
  144. package/scripts/generate-tray-icons.mjs +258 -0
  145. package/scripts/notarize.cjs +180 -0
  146. package/scripts/one-click-clean-test.sh +147 -0
  147. package/scripts/postinstall.mjs +36 -0
  148. package/scripts/setup-markupr.sh +55 -0
  149. package/setup +17 -0
  150. package/site/index.html +1835 -0
  151. package/site/package.json +11 -0
  152. package/site/railway.json +12 -0
  153. package/site/server.js +31 -0
  154. package/src/main/AutoUpdater.ts +392 -0
  155. package/src/main/CrashRecovery.ts +655 -0
  156. package/src/main/ErrorHandler.ts +703 -0
  157. package/src/main/HotkeyManager.ts +399 -0
  158. package/src/main/MenuManager.ts +529 -0
  159. package/src/main/PermissionManager.ts +420 -0
  160. package/src/main/SessionController.ts +1465 -0
  161. package/src/main/TrayManager.ts +540 -0
  162. package/src/main/ai/AIPipelineManager.ts +199 -0
  163. package/src/main/ai/ClaudeAnalyzer.ts +339 -0
  164. package/src/main/ai/ImageOptimizer.ts +176 -0
  165. package/src/main/ai/StructuredMarkdownBuilder.ts +379 -0
  166. package/src/main/ai/index.ts +16 -0
  167. package/src/main/ai/types.ts +258 -0
  168. package/src/main/analysis/ClarificationGenerator.ts +385 -0
  169. package/src/main/analysis/FeedbackAnalyzer.ts +531 -0
  170. package/src/main/analysis/index.ts +19 -0
  171. package/src/main/audio/AudioCapture.ts +978 -0
  172. package/src/main/audio/audioUtils.ts +100 -0
  173. package/src/main/audio/index.ts +20 -0
  174. package/src/main/capture/index.ts +1 -0
  175. package/src/main/index.ts +1693 -0
  176. package/src/main/ipc/captureHandlers.ts +272 -0
  177. package/src/main/ipc/index.ts +45 -0
  178. package/src/main/ipc/outputHandlers.ts +302 -0
  179. package/src/main/ipc/sessionHandlers.ts +56 -0
  180. package/src/main/ipc/settingsHandlers.ts +471 -0
  181. package/src/main/ipc/types.ts +56 -0
  182. package/src/main/ipc/windowHandlers.ts +277 -0
  183. package/src/main/output/ClipboardService.ts +369 -0
  184. package/src/main/output/ExportService.ts +539 -0
  185. package/src/main/output/FileManager.ts +416 -0
  186. package/src/main/output/MarkdownGenerator.ts +791 -0
  187. package/src/main/output/MarkdownPatcher.ts +299 -0
  188. package/src/main/output/index.ts +186 -0
  189. package/src/main/output/sessionAdapter.ts +207 -0
  190. package/src/main/output/templates/html-template.ts +553 -0
  191. package/src/main/pipeline/FrameExtractor.ts +330 -0
  192. package/src/main/pipeline/PostProcessor.ts +399 -0
  193. package/src/main/pipeline/TranscriptAnalyzer.ts +226 -0
  194. package/src/main/pipeline/index.ts +36 -0
  195. package/src/main/platform/WindowsTaskbar.ts +600 -0
  196. package/src/main/platform/index.ts +16 -0
  197. package/src/main/settings/SettingsManager.ts +730 -0
  198. package/src/main/settings/index.ts +19 -0
  199. package/src/main/transcription/ModelDownloadManager.ts +494 -0
  200. package/src/main/transcription/TierManager.ts +219 -0
  201. package/src/main/transcription/TranscriptionRecoveryService.ts +340 -0
  202. package/src/main/transcription/WhisperService.ts +748 -0
  203. package/src/main/transcription/index.ts +56 -0
  204. package/src/main/transcription/types.ts +135 -0
  205. package/src/main/windows/PopoverManager.ts +284 -0
  206. package/src/main/windows/TaskbarIntegration.ts +452 -0
  207. package/src/main/windows/index.ts +23 -0
  208. package/src/preload/index.ts +1047 -0
  209. package/src/renderer/App.tsx +515 -0
  210. package/src/renderer/AppWrapper.tsx +28 -0
  211. package/src/renderer/assets/logo-dark.svg +7 -0
  212. package/src/renderer/assets/logo.svg +7 -0
  213. package/src/renderer/audio/AudioCaptureRenderer.ts +454 -0
  214. package/src/renderer/capture/ScreenRecordingRenderer.ts +492 -0
  215. package/src/renderer/components/AnnotationOverlay.tsx +836 -0
  216. package/src/renderer/components/AudioWaveform.tsx +811 -0
  217. package/src/renderer/components/ClarificationQuestions.tsx +656 -0
  218. package/src/renderer/components/CountdownTimer.tsx +495 -0
  219. package/src/renderer/components/CrashRecoveryDialog.tsx +632 -0
  220. package/src/renderer/components/DonateButton.tsx +127 -0
  221. package/src/renderer/components/ErrorBoundary.tsx +308 -0
  222. package/src/renderer/components/ExportDialog.tsx +872 -0
  223. package/src/renderer/components/HotkeyHint.tsx +261 -0
  224. package/src/renderer/components/KeyboardShortcuts.tsx +787 -0
  225. package/src/renderer/components/ModelDownloadDialog.tsx +844 -0
  226. package/src/renderer/components/Onboarding.tsx +1830 -0
  227. package/src/renderer/components/ProcessingOverlay.tsx +157 -0
  228. package/src/renderer/components/RecordingOverlay.tsx +423 -0
  229. package/src/renderer/components/SessionHistory.tsx +1746 -0
  230. package/src/renderer/components/SessionReview.tsx +1321 -0
  231. package/src/renderer/components/SettingsPanel.tsx +217 -0
  232. package/src/renderer/components/Skeleton.tsx +347 -0
  233. package/src/renderer/components/StatusIndicator.tsx +86 -0
  234. package/src/renderer/components/ThemeProvider.tsx +429 -0
  235. package/src/renderer/components/Tooltip.tsx +370 -0
  236. package/src/renderer/components/TranscriptionPreview.tsx +183 -0
  237. package/src/renderer/components/TranscriptionTierSelector.tsx +640 -0
  238. package/src/renderer/components/UpdateNotification.tsx +377 -0
  239. package/src/renderer/components/WindowSelector.tsx +947 -0
  240. package/src/renderer/components/index.ts +99 -0
  241. package/src/renderer/components/primitives/ApiKeyInput.tsx +98 -0
  242. package/src/renderer/components/primitives/ColorPicker.tsx +65 -0
  243. package/src/renderer/components/primitives/DangerButton.tsx +45 -0
  244. package/src/renderer/components/primitives/DirectoryPicker.tsx +41 -0
  245. package/src/renderer/components/primitives/Dropdown.tsx +34 -0
  246. package/src/renderer/components/primitives/KeyRecorder.tsx +117 -0
  247. package/src/renderer/components/primitives/SettingsSection.tsx +32 -0
  248. package/src/renderer/components/primitives/Slider.tsx +43 -0
  249. package/src/renderer/components/primitives/Toggle.tsx +36 -0
  250. package/src/renderer/components/primitives/index.ts +10 -0
  251. package/src/renderer/components/settings/AdvancedTab.tsx +174 -0
  252. package/src/renderer/components/settings/AppearanceTab.tsx +77 -0
  253. package/src/renderer/components/settings/GeneralTab.tsx +40 -0
  254. package/src/renderer/components/settings/HotkeysTab.tsx +79 -0
  255. package/src/renderer/components/settings/RecordingTab.tsx +84 -0
  256. package/src/renderer/components/settings/index.ts +9 -0
  257. package/src/renderer/components/settings/settingsStyles.ts +673 -0
  258. package/src/renderer/components/settings/tabConfig.tsx +85 -0
  259. package/src/renderer/components/settings/useSettingsPanel.ts +447 -0
  260. package/src/renderer/contexts/ProcessingContext.tsx +227 -0
  261. package/src/renderer/contexts/RecordingContext.tsx +683 -0
  262. package/src/renderer/contexts/UIContext.tsx +326 -0
  263. package/src/renderer/contexts/index.ts +24 -0
  264. package/src/renderer/donateMessages.ts +69 -0
  265. package/src/renderer/hooks/index.ts +75 -0
  266. package/src/renderer/hooks/useAnimation.tsx +544 -0
  267. package/src/renderer/hooks/useTheme.ts +313 -0
  268. package/src/renderer/index.html +26 -0
  269. package/src/renderer/main.tsx +52 -0
  270. package/src/renderer/styles/animations.css +1093 -0
  271. package/src/renderer/styles/app-shell.css +662 -0
  272. package/src/renderer/styles/globals.css +515 -0
  273. package/src/renderer/styles/theme.ts +578 -0
  274. package/src/renderer/types/electron.d.ts +385 -0
  275. package/src/shared/hotkeys.ts +283 -0
  276. package/src/shared/types.ts +809 -0
  277. package/tests/clipboard.test.ts +228 -0
  278. package/tests/e2e/criticalPaths.test.ts +594 -0
  279. package/tests/feedbackAnalyzer.test.ts +303 -0
  280. package/tests/integration/sessionFlow.test.ts +583 -0
  281. package/tests/markdownGenerator.test.ts +418 -0
  282. package/tests/output.test.ts +96 -0
  283. package/tests/setup.ts +486 -0
  284. package/tests/unit/appIntegration.test.ts +676 -0
  285. package/tests/unit/appViewState.test.ts +281 -0
  286. package/tests/unit/audioIpcChannels.test.ts +17 -0
  287. package/tests/unit/exportService.test.ts +492 -0
  288. package/tests/unit/hotkeys.test.ts +92 -0
  289. package/tests/unit/navigationPreload.test.ts +94 -0
  290. package/tests/unit/onboardingFlow.test.ts +345 -0
  291. package/tests/unit/permissionManager.test.ts +175 -0
  292. package/tests/unit/permissionManagerExpanded.test.ts +296 -0
  293. package/tests/unit/screenRecordingRenderer.test.ts +368 -0
  294. package/tests/unit/sessionController.test.ts +515 -0
  295. package/tests/unit/tierManager.test.ts +61 -0
  296. package/tests/unit/tierManagerExpanded.test.ts +142 -0
  297. package/tests/unit/transcriptAnalyzer.test.ts +64 -0
  298. package/tsconfig.json +25 -0
  299. 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