markupr 2.1.8 → 2.5.0

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 (300) hide show
  1. package/README.md +292 -15
  2. package/dist/cli/index.mjs +3593 -0
  3. package/dist/main/index.mjs +743 -220
  4. package/dist/mcp/index.mjs +4053 -0
  5. package/package.json +32 -7
  6. package/.claude/commands/review-feedback.md +0 -47
  7. package/.eslintrc.json +0 -35
  8. package/.github/CODEOWNERS +0 -16
  9. package/.github/FUNDING.yml +0 -1
  10. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -56
  11. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -54
  12. package/.github/PULL_REQUEST_TEMPLATE.md +0 -89
  13. package/.github/dependabot.yml +0 -70
  14. package/.github/workflows/ci.yml +0 -184
  15. package/.github/workflows/deploy-landing.yml +0 -134
  16. package/.github/workflows/nightly.yml +0 -288
  17. package/.github/workflows/release.yml +0 -318
  18. package/CHANGELOG.md +0 -127
  19. package/CLAUDE.md +0 -137
  20. package/CODE_OF_CONDUCT.md +0 -9
  21. package/CONTRIBUTING.md +0 -390
  22. package/PRODUCT_VISION.md +0 -277
  23. package/SECURITY.md +0 -51
  24. package/SIGNING_INSTRUCTIONS.md +0 -284
  25. package/assets/DMG_BACKGROUND_INSTRUCTIONS.md +0 -130
  26. package/assets/svg-source/dmg-background.svg +0 -70
  27. package/assets/svg-source/icon.svg +0 -20
  28. package/assets/svg-source/tray-icon-processing.svg +0 -7
  29. package/assets/svg-source/tray-icon-recording.svg +0 -7
  30. package/assets/svg-source/tray-icon.svg +0 -6
  31. package/assets/tray-complete.png +0 -0
  32. package/assets/tray-complete@2x.png +0 -0
  33. package/assets/tray-completeTemplate.png +0 -0
  34. package/assets/tray-completeTemplate@2x.png +0 -0
  35. package/assets/tray-error.png +0 -0
  36. package/assets/tray-error@2x.png +0 -0
  37. package/assets/tray-errorTemplate.png +0 -0
  38. package/assets/tray-errorTemplate@2x.png +0 -0
  39. package/assets/tray-icon-processing.png +0 -0
  40. package/assets/tray-icon-processing@2x.png +0 -0
  41. package/assets/tray-icon-processingTemplate.png +0 -0
  42. package/assets/tray-icon-processingTemplate@2x.png +0 -0
  43. package/assets/tray-icon-recording.png +0 -0
  44. package/assets/tray-icon-recording@2x.png +0 -0
  45. package/assets/tray-icon-recordingTemplate.png +0 -0
  46. package/assets/tray-icon-recordingTemplate@2x.png +0 -0
  47. package/assets/tray-icon.png +0 -0
  48. package/assets/tray-icon@2x.png +0 -0
  49. package/assets/tray-iconTemplate.png +0 -0
  50. package/assets/tray-iconTemplate@2x.png +0 -0
  51. package/assets/tray-idle.png +0 -0
  52. package/assets/tray-idle@2x.png +0 -0
  53. package/assets/tray-idleTemplate.png +0 -0
  54. package/assets/tray-idleTemplate@2x.png +0 -0
  55. package/assets/tray-processing-0.png +0 -0
  56. package/assets/tray-processing-0@2x.png +0 -0
  57. package/assets/tray-processing-0Template.png +0 -0
  58. package/assets/tray-processing-0Template@2x.png +0 -0
  59. package/assets/tray-processing-1.png +0 -0
  60. package/assets/tray-processing-1@2x.png +0 -0
  61. package/assets/tray-processing-1Template.png +0 -0
  62. package/assets/tray-processing-1Template@2x.png +0 -0
  63. package/assets/tray-processing-2.png +0 -0
  64. package/assets/tray-processing-2@2x.png +0 -0
  65. package/assets/tray-processing-2Template.png +0 -0
  66. package/assets/tray-processing-2Template@2x.png +0 -0
  67. package/assets/tray-processing-3.png +0 -0
  68. package/assets/tray-processing-3@2x.png +0 -0
  69. package/assets/tray-processing-3Template.png +0 -0
  70. package/assets/tray-processing-3Template@2x.png +0 -0
  71. package/assets/tray-processing.png +0 -0
  72. package/assets/tray-processing@2x.png +0 -0
  73. package/assets/tray-processingTemplate.png +0 -0
  74. package/assets/tray-processingTemplate@2x.png +0 -0
  75. package/assets/tray-recording.png +0 -0
  76. package/assets/tray-recording@2x.png +0 -0
  77. package/assets/tray-recordingTemplate.png +0 -0
  78. package/assets/tray-recordingTemplate@2x.png +0 -0
  79. package/build/DMG_BACKGROUND_SPEC.md +0 -50
  80. package/build/dmg-background.png +0 -0
  81. package/build/dmg-background@2x.png +0 -0
  82. package/build/entitlements.mac.inherit.plist +0 -27
  83. package/build/entitlements.mac.plist +0 -41
  84. package/build/favicon-16.png +0 -0
  85. package/build/favicon-180.png +0 -0
  86. package/build/favicon-192.png +0 -0
  87. package/build/favicon-32.png +0 -0
  88. package/build/favicon-48.png +0 -0
  89. package/build/favicon-512.png +0 -0
  90. package/build/favicon-64.png +0 -0
  91. package/build/icon-128.png +0 -0
  92. package/build/icon-16.png +0 -0
  93. package/build/icon-24.png +0 -0
  94. package/build/icon-256.png +0 -0
  95. package/build/icon-32.png +0 -0
  96. package/build/icon-48.png +0 -0
  97. package/build/icon-64.png +0 -0
  98. package/build/icon.icns +0 -0
  99. package/build/icon.ico +0 -0
  100. package/build/icon.iconset/icon_128x128.png +0 -0
  101. package/build/icon.iconset/icon_128x128@2x.png +0 -0
  102. package/build/icon.iconset/icon_16x16.png +0 -0
  103. package/build/icon.iconset/icon_16x16@2x.png +0 -0
  104. package/build/icon.iconset/icon_256x256.png +0 -0
  105. package/build/icon.iconset/icon_256x256@2x.png +0 -0
  106. package/build/icon.iconset/icon_32x32.png +0 -0
  107. package/build/icon.iconset/icon_32x32@2x.png +0 -0
  108. package/build/icon.iconset/icon_512x512.png +0 -0
  109. package/build/icon.iconset/icon_512x512@2x.png +0 -0
  110. package/build/icon.png +0 -0
  111. package/build/installer-header.bmp +0 -0
  112. package/build/installer-header.png +0 -0
  113. package/build/installer-sidebar.bmp +0 -0
  114. package/build/installer-sidebar.png +0 -0
  115. package/build/installer.nsh +0 -45
  116. package/build/overlay-processing.png +0 -0
  117. package/build/overlay-recording.png +0 -0
  118. package/build/toolbar-record.png +0 -0
  119. package/build/toolbar-screenshot.png +0 -0
  120. package/build/toolbar-settings.png +0 -0
  121. package/build/toolbar-stop.png +0 -0
  122. package/dist/preload/index.mjs +0 -907
  123. package/dist/renderer/assets/index-CCmUjl9K.js +0 -19495
  124. package/dist/renderer/assets/index-CUqz_Gs6.css +0 -2270
  125. package/dist/renderer/index.html +0 -27
  126. package/docs/AI_AGENT_QUICKSTART.md +0 -42
  127. package/docs/AI_PIPELINE_DESIGN.md +0 -595
  128. package/docs/API.md +0 -514
  129. package/docs/ARCHITECTURE.md +0 -460
  130. package/docs/CONFIGURATION.md +0 -336
  131. package/docs/DEVELOPMENT.md +0 -508
  132. package/docs/EXPORT_FORMATS.md +0 -451
  133. package/docs/GETTING_STARTED.md +0 -236
  134. package/docs/KEYBOARD_SHORTCUTS.md +0 -334
  135. package/docs/TROUBLESHOOTING.md +0 -418
  136. package/docs/landing/index.html +0 -672
  137. package/docs/landing/script.js +0 -342
  138. package/docs/landing/styles.css +0 -1543
  139. package/electron-builder.yml +0 -140
  140. package/electron.vite.config.ts +0 -63
  141. package/railway.json +0 -12
  142. package/scripts/build.mjs +0 -51
  143. package/scripts/generate-icons.mjs +0 -314
  144. package/scripts/generate-installer-images.cjs +0 -253
  145. package/scripts/generate-tray-icons.mjs +0 -258
  146. package/scripts/notarize.cjs +0 -180
  147. package/scripts/one-click-clean-test.sh +0 -147
  148. package/scripts/postinstall.mjs +0 -36
  149. package/scripts/setup-markupr.sh +0 -55
  150. package/setup +0 -17
  151. package/site/index.html +0 -1835
  152. package/site/package.json +0 -11
  153. package/site/railway.json +0 -12
  154. package/site/server.js +0 -31
  155. package/src/main/AutoUpdater.ts +0 -392
  156. package/src/main/CrashRecovery.ts +0 -655
  157. package/src/main/ErrorHandler.ts +0 -703
  158. package/src/main/HotkeyManager.ts +0 -399
  159. package/src/main/MenuManager.ts +0 -529
  160. package/src/main/PermissionManager.ts +0 -420
  161. package/src/main/SessionController.ts +0 -1465
  162. package/src/main/TrayManager.ts +0 -540
  163. package/src/main/ai/AIPipelineManager.ts +0 -199
  164. package/src/main/ai/ClaudeAnalyzer.ts +0 -339
  165. package/src/main/ai/ImageOptimizer.ts +0 -176
  166. package/src/main/ai/StructuredMarkdownBuilder.ts +0 -379
  167. package/src/main/ai/index.ts +0 -16
  168. package/src/main/ai/types.ts +0 -258
  169. package/src/main/analysis/ClarificationGenerator.ts +0 -385
  170. package/src/main/analysis/FeedbackAnalyzer.ts +0 -531
  171. package/src/main/analysis/index.ts +0 -19
  172. package/src/main/audio/AudioCapture.ts +0 -978
  173. package/src/main/audio/audioUtils.ts +0 -100
  174. package/src/main/audio/index.ts +0 -20
  175. package/src/main/capture/index.ts +0 -1
  176. package/src/main/index.ts +0 -1693
  177. package/src/main/ipc/captureHandlers.ts +0 -272
  178. package/src/main/ipc/index.ts +0 -45
  179. package/src/main/ipc/outputHandlers.ts +0 -302
  180. package/src/main/ipc/sessionHandlers.ts +0 -56
  181. package/src/main/ipc/settingsHandlers.ts +0 -471
  182. package/src/main/ipc/types.ts +0 -56
  183. package/src/main/ipc/windowHandlers.ts +0 -277
  184. package/src/main/output/ClipboardService.ts +0 -369
  185. package/src/main/output/ExportService.ts +0 -539
  186. package/src/main/output/FileManager.ts +0 -416
  187. package/src/main/output/MarkdownGenerator.ts +0 -791
  188. package/src/main/output/MarkdownPatcher.ts +0 -299
  189. package/src/main/output/index.ts +0 -186
  190. package/src/main/output/sessionAdapter.ts +0 -207
  191. package/src/main/output/templates/html-template.ts +0 -553
  192. package/src/main/pipeline/FrameExtractor.ts +0 -330
  193. package/src/main/pipeline/PostProcessor.ts +0 -399
  194. package/src/main/pipeline/TranscriptAnalyzer.ts +0 -226
  195. package/src/main/pipeline/index.ts +0 -36
  196. package/src/main/platform/WindowsTaskbar.ts +0 -600
  197. package/src/main/platform/index.ts +0 -16
  198. package/src/main/settings/SettingsManager.ts +0 -730
  199. package/src/main/settings/index.ts +0 -19
  200. package/src/main/transcription/ModelDownloadManager.ts +0 -494
  201. package/src/main/transcription/TierManager.ts +0 -219
  202. package/src/main/transcription/TranscriptionRecoveryService.ts +0 -340
  203. package/src/main/transcription/WhisperService.ts +0 -748
  204. package/src/main/transcription/index.ts +0 -56
  205. package/src/main/transcription/types.ts +0 -135
  206. package/src/main/windows/PopoverManager.ts +0 -284
  207. package/src/main/windows/TaskbarIntegration.ts +0 -452
  208. package/src/main/windows/index.ts +0 -23
  209. package/src/preload/index.ts +0 -1047
  210. package/src/renderer/App.tsx +0 -515
  211. package/src/renderer/AppWrapper.tsx +0 -28
  212. package/src/renderer/assets/logo-dark.svg +0 -7
  213. package/src/renderer/assets/logo.svg +0 -7
  214. package/src/renderer/audio/AudioCaptureRenderer.ts +0 -454
  215. package/src/renderer/capture/ScreenRecordingRenderer.ts +0 -492
  216. package/src/renderer/components/AnnotationOverlay.tsx +0 -836
  217. package/src/renderer/components/AudioWaveform.tsx +0 -811
  218. package/src/renderer/components/ClarificationQuestions.tsx +0 -656
  219. package/src/renderer/components/CountdownTimer.tsx +0 -495
  220. package/src/renderer/components/CrashRecoveryDialog.tsx +0 -632
  221. package/src/renderer/components/DonateButton.tsx +0 -127
  222. package/src/renderer/components/ErrorBoundary.tsx +0 -308
  223. package/src/renderer/components/ExportDialog.tsx +0 -872
  224. package/src/renderer/components/HotkeyHint.tsx +0 -261
  225. package/src/renderer/components/KeyboardShortcuts.tsx +0 -787
  226. package/src/renderer/components/ModelDownloadDialog.tsx +0 -844
  227. package/src/renderer/components/Onboarding.tsx +0 -1830
  228. package/src/renderer/components/ProcessingOverlay.tsx +0 -157
  229. package/src/renderer/components/RecordingOverlay.tsx +0 -423
  230. package/src/renderer/components/SessionHistory.tsx +0 -1746
  231. package/src/renderer/components/SessionReview.tsx +0 -1321
  232. package/src/renderer/components/SettingsPanel.tsx +0 -217
  233. package/src/renderer/components/Skeleton.tsx +0 -347
  234. package/src/renderer/components/StatusIndicator.tsx +0 -86
  235. package/src/renderer/components/ThemeProvider.tsx +0 -429
  236. package/src/renderer/components/Tooltip.tsx +0 -370
  237. package/src/renderer/components/TranscriptionPreview.tsx +0 -183
  238. package/src/renderer/components/TranscriptionTierSelector.tsx +0 -640
  239. package/src/renderer/components/UpdateNotification.tsx +0 -377
  240. package/src/renderer/components/WindowSelector.tsx +0 -947
  241. package/src/renderer/components/index.ts +0 -99
  242. package/src/renderer/components/primitives/ApiKeyInput.tsx +0 -98
  243. package/src/renderer/components/primitives/ColorPicker.tsx +0 -65
  244. package/src/renderer/components/primitives/DangerButton.tsx +0 -45
  245. package/src/renderer/components/primitives/DirectoryPicker.tsx +0 -41
  246. package/src/renderer/components/primitives/Dropdown.tsx +0 -34
  247. package/src/renderer/components/primitives/KeyRecorder.tsx +0 -117
  248. package/src/renderer/components/primitives/SettingsSection.tsx +0 -32
  249. package/src/renderer/components/primitives/Slider.tsx +0 -43
  250. package/src/renderer/components/primitives/Toggle.tsx +0 -36
  251. package/src/renderer/components/primitives/index.ts +0 -10
  252. package/src/renderer/components/settings/AdvancedTab.tsx +0 -174
  253. package/src/renderer/components/settings/AppearanceTab.tsx +0 -77
  254. package/src/renderer/components/settings/GeneralTab.tsx +0 -40
  255. package/src/renderer/components/settings/HotkeysTab.tsx +0 -79
  256. package/src/renderer/components/settings/RecordingTab.tsx +0 -84
  257. package/src/renderer/components/settings/index.ts +0 -9
  258. package/src/renderer/components/settings/settingsStyles.ts +0 -673
  259. package/src/renderer/components/settings/tabConfig.tsx +0 -85
  260. package/src/renderer/components/settings/useSettingsPanel.ts +0 -447
  261. package/src/renderer/contexts/ProcessingContext.tsx +0 -227
  262. package/src/renderer/contexts/RecordingContext.tsx +0 -683
  263. package/src/renderer/contexts/UIContext.tsx +0 -326
  264. package/src/renderer/contexts/index.ts +0 -24
  265. package/src/renderer/donateMessages.ts +0 -69
  266. package/src/renderer/hooks/index.ts +0 -75
  267. package/src/renderer/hooks/useAnimation.tsx +0 -544
  268. package/src/renderer/hooks/useTheme.ts +0 -313
  269. package/src/renderer/index.html +0 -26
  270. package/src/renderer/main.tsx +0 -52
  271. package/src/renderer/styles/animations.css +0 -1093
  272. package/src/renderer/styles/app-shell.css +0 -662
  273. package/src/renderer/styles/globals.css +0 -515
  274. package/src/renderer/styles/theme.ts +0 -578
  275. package/src/renderer/types/electron.d.ts +0 -385
  276. package/src/shared/hotkeys.ts +0 -283
  277. package/src/shared/types.ts +0 -809
  278. package/tests/clipboard.test.ts +0 -228
  279. package/tests/e2e/criticalPaths.test.ts +0 -594
  280. package/tests/feedbackAnalyzer.test.ts +0 -303
  281. package/tests/integration/sessionFlow.test.ts +0 -583
  282. package/tests/markdownGenerator.test.ts +0 -418
  283. package/tests/output.test.ts +0 -96
  284. package/tests/setup.ts +0 -486
  285. package/tests/unit/appIntegration.test.ts +0 -676
  286. package/tests/unit/appViewState.test.ts +0 -281
  287. package/tests/unit/audioIpcChannels.test.ts +0 -17
  288. package/tests/unit/exportService.test.ts +0 -492
  289. package/tests/unit/hotkeys.test.ts +0 -92
  290. package/tests/unit/navigationPreload.test.ts +0 -94
  291. package/tests/unit/onboardingFlow.test.ts +0 -345
  292. package/tests/unit/permissionManager.test.ts +0 -175
  293. package/tests/unit/permissionManagerExpanded.test.ts +0 -296
  294. package/tests/unit/screenRecordingRenderer.test.ts +0 -368
  295. package/tests/unit/sessionController.test.ts +0 -515
  296. package/tests/unit/tierManager.test.ts +0 -61
  297. package/tests/unit/tierManagerExpanded.test.ts +0 -142
  298. package/tests/unit/transcriptAnalyzer.test.ts +0 -64
  299. package/tsconfig.json +0 -25
  300. package/vitest.config.ts +0 -46
@@ -1,318 +0,0 @@
1
- # =============================================================================
2
- # markupr Release Pipeline
3
- # =============================================================================
4
- # Triggered on version tags (v*)
5
- # Builds signed installers for macOS and Windows
6
- # Creates GitHub Release with changelog and assets
7
- # =============================================================================
8
-
9
- name: Release
10
-
11
- on:
12
- push:
13
- tags:
14
- - 'v*'
15
-
16
- # Only one release at a time
17
- concurrency:
18
- group: release
19
- cancel-in-progress: false
20
-
21
- env:
22
- NODE_VERSION: '20'
23
-
24
- jobs:
25
- # ===========================================================================
26
- # Validate Release Tag
27
- # ===========================================================================
28
- validate-tag:
29
- name: Validate Release Tag
30
- runs-on: ubuntu-latest
31
- outputs:
32
- version: ${{ steps.version.outputs.version }}
33
- is-prerelease: ${{ steps.version.outputs.is-prerelease }}
34
- steps:
35
- - name: Checkout repository
36
- uses: actions/checkout@v6
37
-
38
- - name: Extract version from tag
39
- id: version
40
- run: |
41
- TAG_VERSION=${GITHUB_REF#refs/tags/v}
42
- echo "version=$TAG_VERSION" >> $GITHUB_OUTPUT
43
-
44
- # Check if this is a prerelease (alpha, beta, rc)
45
- if [[ "$TAG_VERSION" =~ (alpha|beta|rc) ]]; then
46
- echo "is-prerelease=true" >> $GITHUB_OUTPUT
47
- else
48
- echo "is-prerelease=false" >> $GITHUB_OUTPUT
49
- fi
50
-
51
- echo "Release version: $TAG_VERSION"
52
-
53
- - name: Validate version matches package.json
54
- run: |
55
- PACKAGE_VERSION=$(node -p "require('./package.json').version")
56
- TAG_VERSION=${{ steps.version.outputs.version }}
57
-
58
- if [ "$PACKAGE_VERSION" != "$TAG_VERSION" ]; then
59
- echo "Error: Tag version ($TAG_VERSION) does not match package.json version ($PACKAGE_VERSION)"
60
- exit 1
61
- fi
62
- echo "Version validated: $TAG_VERSION"
63
-
64
- # ===========================================================================
65
- # Build macOS (Intel + Apple Silicon)
66
- # ===========================================================================
67
- build-macos:
68
- name: Build macOS
69
- runs-on: macos-latest
70
- needs: validate-tag
71
- env:
72
- APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
73
- APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
74
- KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
75
- APPLE_ID: ${{ secrets.APPLE_ID }}
76
- APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
77
- APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
78
- steps:
79
- - name: Checkout repository
80
- uses: actions/checkout@v6
81
-
82
- - name: Setup Node.js
83
- uses: actions/setup-node@v6
84
- with:
85
- node-version: ${{ env.NODE_VERSION }}
86
- cache: 'npm'
87
-
88
- - name: Install dependencies
89
- run: npm ci
90
-
91
- # Cache Electron binaries
92
- - name: Cache Electron
93
- uses: actions/cache@v5
94
- with:
95
- path: ~/Library/Caches/electron
96
- key: macos-electron-${{ hashFiles('package-lock.json') }}
97
- restore-keys: |
98
- macos-electron-
99
-
100
- - name: Build application
101
- run: npm run build
102
-
103
- # Install certificates for code signing
104
- - name: Install Apple certificates
105
- if: ${{ env.APPLE_CERTIFICATE != '' }}
106
- run: |
107
- # Create variables
108
- CERTIFICATE_PATH=$RUNNER_TEMP/certificate.p12
109
- KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
110
-
111
- # Import certificate
112
- echo -n "$APPLE_CERTIFICATE" | base64 --decode -o $CERTIFICATE_PATH
113
-
114
- # Create temporary keychain
115
- security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
116
- security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
117
- security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
118
-
119
- # Import certificate to keychain
120
- security import $CERTIFICATE_PATH -P "$APPLE_CERTIFICATE_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
121
- security list-keychain -d user -s $KEYCHAIN_PATH
122
-
123
- # Allow codesign to access keychain
124
- security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
125
-
126
- # Build and sign for macOS
127
- - name: Package macOS (signed)
128
- if: ${{ env.APPLE_ID != '' && env.APPLE_CERTIFICATE != '' }}
129
- run: npx electron-builder --mac --publish never --config electron-builder.yml
130
- env:
131
- # Code signing
132
- APPLE_ID: ${{ secrets.APPLE_ID }}
133
- APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
134
- APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
135
- # Notarization
136
- APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
137
- CSC_LINK: ${{ secrets.APPLE_CERTIFICATE }}
138
- CSC_KEY_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
139
-
140
- # Build unsigned if no signing credentials
141
- - name: Package macOS (unsigned)
142
- if: ${{ env.APPLE_ID == '' || env.APPLE_CERTIFICATE == '' }}
143
- run: CSC_IDENTITY_AUTO_DISCOVERY=false npx electron-builder --mac --publish never --config electron-builder.yml
144
- env:
145
- CSC_IDENTITY_AUTO_DISCOVERY: false
146
-
147
- - name: List build artifacts
148
- run: ls -la release/
149
-
150
- - name: Upload macOS artifacts
151
- uses: actions/upload-artifact@v6
152
- with:
153
- name: release-macos
154
- path: |
155
- release/*.dmg
156
- release/*.zip
157
- release/*.blockmap
158
- release/latest-mac.yml
159
- if-no-files-found: error
160
- retention-days: 30
161
-
162
- # ===========================================================================
163
- # Build Windows
164
- # ===========================================================================
165
- build-windows:
166
- name: Build Windows
167
- runs-on: windows-latest
168
- needs: validate-tag
169
- env:
170
- WIN_SIGNING_AVAILABLE: ${{ secrets.WIN_CSC_LINK != '' }}
171
- steps:
172
- - name: Checkout repository
173
- uses: actions/checkout@v6
174
-
175
- - name: Setup Node.js
176
- uses: actions/setup-node@v6
177
- with:
178
- node-version: ${{ env.NODE_VERSION }}
179
- cache: 'npm'
180
-
181
- - name: Install dependencies
182
- run: npm ci
183
-
184
- # Cache Electron binaries
185
- - name: Cache Electron
186
- uses: actions/cache@v5
187
- with:
188
- path: ~/AppData/Local/electron/Cache
189
- key: windows-electron-${{ hashFiles('package-lock.json') }}
190
- restore-keys: |
191
- windows-electron-
192
-
193
- - name: Build application
194
- run: npm run build
195
-
196
- # Build and sign for Windows
197
- - name: Package Windows (signed)
198
- if: ${{ env.WIN_SIGNING_AVAILABLE == 'true' }}
199
- run: npx electron-builder --win --x64 --publish never --config electron-builder.yml
200
- env:
201
- WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
202
- WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}
203
-
204
- # Build unsigned if no signing credentials
205
- - name: Package Windows (unsigned)
206
- if: ${{ env.WIN_SIGNING_AVAILABLE != 'true' }}
207
- run: npx electron-builder --win --x64 --publish never --config electron-builder.yml
208
- env:
209
- CSC_IDENTITY_AUTO_DISCOVERY: false
210
-
211
- - name: List build artifacts
212
- run: dir release
213
-
214
- - name: Upload Windows artifacts
215
- uses: actions/upload-artifact@v6
216
- with:
217
- name: release-windows
218
- path: |
219
- release/*.exe
220
- release/*.msi
221
- release/*.zip
222
- release/*.blockmap
223
- release/latest.yml
224
- if-no-files-found: error
225
- retention-days: 30
226
-
227
- # ===========================================================================
228
- # Create GitHub Release
229
- # ===========================================================================
230
- create-release:
231
- name: Create GitHub Release
232
- runs-on: ubuntu-latest
233
- needs: [validate-tag, build-macos, build-windows]
234
- permissions:
235
- contents: write
236
- steps:
237
- - name: Checkout repository
238
- uses: actions/checkout@v6
239
- with:
240
- fetch-depth: 0
241
-
242
- - name: Download all artifacts
243
- uses: actions/download-artifact@v7
244
- with:
245
- path: artifacts
246
-
247
- - name: Display artifact structure
248
- run: find artifacts -type f | head -50
249
-
250
- - name: Generate changelog
251
- id: changelog
252
- run: |
253
- # Get previous tag
254
- PREVIOUS_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
255
- CURRENT_TAG=${{ github.ref_name }}
256
-
257
- echo "## What's Changed" > CHANGELOG.md
258
- echo "" >> CHANGELOG.md
259
-
260
- if [ -n "$PREVIOUS_TAG" ]; then
261
- echo "Changes since $PREVIOUS_TAG:" >> CHANGELOG.md
262
- echo "" >> CHANGELOG.md
263
- git log $PREVIOUS_TAG..$CURRENT_TAG --pretty=format:"- %s (%h)" >> CHANGELOG.md
264
- else
265
- echo "Initial release" >> CHANGELOG.md
266
- fi
267
-
268
- echo "" >> CHANGELOG.md
269
- echo "" >> CHANGELOG.md
270
- echo "## Downloads" >> CHANGELOG.md
271
- echo "" >> CHANGELOG.md
272
- echo "| Platform | Download |" >> CHANGELOG.md
273
- echo "|----------|----------|" >> CHANGELOG.md
274
- echo "| macOS (Apple Silicon) | \`markupr-${{ needs.validate-tag.outputs.version }}-arm64.dmg\` |" >> CHANGELOG.md
275
- echo "| macOS (Intel) | \`markupr-${{ needs.validate-tag.outputs.version }}-x64.dmg\` |" >> CHANGELOG.md
276
- echo "| Windows | \`markupr-Setup-${{ needs.validate-tag.outputs.version }}.exe\` |" >> CHANGELOG.md
277
- echo "" >> CHANGELOG.md
278
- echo "## Checksums" >> CHANGELOG.md
279
- echo "" >> CHANGELOG.md
280
- echo "\`\`\`" >> CHANGELOG.md
281
- find artifacts -type f \( -name "*.dmg" -o -name "*.exe" -o -name "*.zip" \) -exec sha256sum {} \; >> CHANGELOG.md
282
- echo "\`\`\`" >> CHANGELOG.md
283
-
284
- cat CHANGELOG.md
285
-
286
- - name: Create GitHub Release
287
- uses: softprops/action-gh-release@v2
288
- with:
289
- tag_name: ${{ github.ref_name }}
290
- name: markupr v${{ needs.validate-tag.outputs.version }}
291
- body_path: CHANGELOG.md
292
- draft: false
293
- prerelease: ${{ needs.validate-tag.outputs.is-prerelease == 'true' }}
294
- files: |
295
- artifacts/release-macos/*.dmg
296
- artifacts/release-macos/*.zip
297
- artifacts/release-macos/*.blockmap
298
- artifacts/release-macos/*.yml
299
- artifacts/release-windows/*.exe
300
- artifacts/release-windows/*.msi
301
- artifacts/release-windows/*.zip
302
- artifacts/release-windows/*.blockmap
303
- artifacts/release-windows/*.yml
304
- fail_on_unmatched_files: false
305
- env:
306
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
307
-
308
- - name: Release Summary
309
- run: |
310
- echo "## Release Summary" >> $GITHUB_STEP_SUMMARY
311
- echo "" >> $GITHUB_STEP_SUMMARY
312
- echo "**Version:** v${{ needs.validate-tag.outputs.version }}" >> $GITHUB_STEP_SUMMARY
313
- echo "**Prerelease:** ${{ needs.validate-tag.outputs.is-prerelease }}" >> $GITHUB_STEP_SUMMARY
314
- echo "" >> $GITHUB_STEP_SUMMARY
315
- echo "### Artifacts" >> $GITHUB_STEP_SUMMARY
316
- find artifacts -type f \( -name "*.dmg" -o -name "*.exe" -o -name "*.zip" \) | while read f; do
317
- echo "- $(basename $f)" >> $GITHUB_STEP_SUMMARY
318
- done
package/CHANGELOG.md DELETED
@@ -1,127 +0,0 @@
1
- # Changelog
2
-
3
- All notable changes to markupr will be documented in this file.
4
-
5
- The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
- and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
-
8
- ## [Unreleased]
9
-
10
- ## [1.0.0] - 2026-02-04
11
-
12
- ### Highlights
13
- **markupr Initial Public Release** - Voice-to-AI feedback for developers. Free and open source.
14
-
15
- ### Added
16
- - **Bulletproof State Machine**: 7-state finite state machine with watchdog timer - can never get stuck
17
- - **Menu Bar Native**: Runs entirely from the menu bar (no dock icon)
18
- - **Three-Tier Transcription**: OpenAI (premium) -> Whisper (default) -> Timer fallback
19
- - **Crash Recovery**: 5-second auto-save ensures no work is lost
20
- - **Offline Mode**: Local Whisper transcription works without internet
21
- - **Platform-Aware Hotkeys**: Cmd on Mac, Ctrl on Windows - just works
22
- - **Donate Button**: Rotating messages for supporting the developer
23
- - **Windows Taskbar Integration**: Overlay icons and toolbar buttons
24
-
25
- ### Changed
26
- - Default transcription now uses local Whisper (no API key required)
27
- - Improved documentation with comprehensive guides
28
- - Enhanced stability across all platforms
29
-
30
- ### Technical
31
- - State machine: IDLE -> STARTING -> RECORDING -> STOPPING -> PROCESSING -> REVIEWING -> EXPORTING
32
- - Watchdog monitors state transitions with configurable timeouts
33
- - Recovery manager handles unexpected exits gracefully
34
-
35
- ## [0.4.0] - 2026-02-02
36
-
37
- ### Added
38
- - **Export Options**: PDF, HTML, and JSON export formats
39
- - **AI-Powered Categorization**: Automatic feedback categorization (Bug, Feature, UX)
40
- - **Crash Recovery**: Automatic session recovery after unexpected crashes
41
- - **Auto-Updater**: Seamless application updates with release notes
42
- - **Keyboard Shortcuts Panel**: In-app cheatsheet with customization
43
- - **Session History Browser**: View and manage past recording sessions
44
- - **Multi-Monitor Support**: Full support for multiple displays with source preview
45
- - **Screenshot Annotations**: Arrow, circle, rectangle, freehand, and text tools
46
- - **Audio Waveform Visualization**: Real-time audio level display
47
- - **Countdown Timer**: Optional countdown before recording starts
48
- - **Clarification Questions**: AI-generated follow-up questions for unclear feedback
49
- - **Native macOS Menu Bar**: Full menu bar integration
50
-
51
- ### Changed
52
- - Improved Settings panel with live preview
53
- - Enhanced onboarding wizard with better guidance
54
- - Better error messages and user feedback
55
- - Upgraded to Electron 28
56
-
57
- ### Fixed
58
- - Fixed screenshot timing during rapid speech
59
- - Fixed hotkey registration on Windows
60
- - Fixed memory leak during long sessions
61
- - Fixed clipboard copy on some macOS versions
62
-
63
- ## [0.3.0] - 2026-01-15
64
-
65
- ### Added
66
- - **Real-time Transcription Preview**: See transcription as you speak
67
- - **Intelligent Screenshot Timing**: Voice activity detection triggers captures
68
- - **Tray Icon States**: Visual feedback for idle/recording/processing/error
69
- - **Settings Panel**: Comprehensive configuration UI
70
- - **Session Review**: Edit, reorder, and delete feedback items before export
71
- - **Theme System**: Dark, light, and system theme options
72
-
73
- ### Changed
74
- - Improved OpenAI integration with better error handling
75
- - Enhanced Markdown output format for AI consumption
76
- - Better screenshot compression
77
-
78
- ### Fixed
79
- - Fixed audio capture on Windows
80
- - Fixed window selector thumbnail generation
81
- - Fixed crash when OpenAI connection drops
82
-
83
- ## [0.2.0] - 2026-01-01
84
-
85
- ### Added
86
- - **Window Selector**: Choose specific windows or screens to capture
87
- - **Manual Screenshot**: Hotkey to capture screenshots on demand
88
- - **Output Directory Setting**: Choose where sessions are saved
89
- - **Clipboard Integration**: Auto-copy summary to clipboard
90
-
91
- ### Changed
92
- - Improved UI responsiveness
93
- - Better error messages
94
-
95
- ### Fixed
96
- - Fixed hotkey conflicts with system shortcuts
97
- - Fixed screenshot resolution on Retina displays
98
-
99
- ## [0.1.0] - 2025-12-15
100
-
101
- ### Added
102
- - Initial release
103
- - Voice narration capture with OpenAI transcription
104
- - Automatic screenshot capture on voice pauses
105
- - Markdown document generation
106
- - Global hotkey to start/stop recording (`Cmd+Shift+F`)
107
- - System tray icon
108
- - Basic settings (API key configuration)
109
-
110
- ---
111
-
112
- ## Version History Summary
113
-
114
- | Version | Date | Highlights |
115
- |---------|------|------------|
116
- | 1.0.0 | 2026-02-04 | **Initial Public Release** - Bulletproof state machine, offline Whisper |
117
- | 0.4.0 | 2026-02-02 | Export formats, crash recovery, auto-updater |
118
- | 0.3.0 | 2026-01-15 | Transcription preview, intelligent capture, settings |
119
- | 0.2.0 | 2026-01-01 | Window selector, manual screenshots |
120
- | 0.1.0 | 2025-12-15 | Initial scaffold |
121
-
122
- [Unreleased]: https://github.com/eddiesanjuan/markupr/compare/v1.0.0...HEAD
123
- [1.0.0]: https://github.com/eddiesanjuan/markupr/compare/v0.4.0...v1.0.0
124
- [0.4.0]: https://github.com/eddiesanjuan/markupr/compare/v0.3.0...v0.4.0
125
- [0.3.0]: https://github.com/eddiesanjuan/markupr/compare/v0.2.0...v0.3.0
126
- [0.2.0]: https://github.com/eddiesanjuan/markupr/compare/v0.1.0...v0.2.0
127
- [0.1.0]: https://github.com/eddiesanjuan/markupr/releases/tag/v0.1.0
package/CLAUDE.md DELETED
@@ -1,137 +0,0 @@
1
- # CLAUDE.md - markupr
2
-
3
- ## Project Overview
4
-
5
- markupr is a macOS menu bar app that intelligently captures developer feedback. It records your screen and voice simultaneously, then uses an intelligent post-processing pipeline to correlate transcript timestamps with the screen recording — extracting the right frames at the right moments and stitching everything into a structured, AI-ready Markdown document. The output is purpose-built for AI coding agents: every screenshot placed exactly where it belongs, every issue clearly documented.
6
-
7
- **Version:** 1.2.0
8
- **License:** MIT (Open Source)
9
-
10
- ## Tech Stack
11
-
12
- - **Framework:** Electron + React + TypeScript
13
- - **Build:** electron-vite + Vite
14
- - **Transcription:** Local Whisper (default), OpenAI Whisper-1 API (optional cloud)
15
- - **AI Analysis:** Anthropic Claude API (BYOK or premium tier)
16
- - **Testing:** Vitest (356 tests)
17
- - **Package:** electron-builder
18
- - **Styling:** Tailwind CSS
19
-
20
- ## Architecture
21
-
22
- ```
23
- src/
24
- ├── main/ # Electron main process
25
- │ ├── index.ts # Entry point, window management, IPC orchestration
26
- │ ├── SessionController.ts # 7-state FSM with watchdog timer
27
- │ ├── CrashRecovery.ts # Auto-save every 5s, crash detection, recovery dialog
28
- │ ├── ErrorHandler.ts # Centralized error handling
29
- │ ├── HotkeyManager.ts # Global hotkey registration
30
- │ ├── MenuManager.ts # Application menu
31
- │ ├── TrayManager.ts # Menu bar tray icon and status
32
- │ ├── PermissionManager.ts # macOS permission checks
33
- │ ├── AutoUpdater.ts # Auto-update via electron-updater
34
- │ ├── ai/ # AI analysis pipeline (Claude)
35
- │ │ ├── AIPipelineManager.ts # Orchestrates AI analysis (free/byok/premium tiers)
36
- │ │ ├── ClaudeAnalyzer.ts # Claude API integration
37
- │ │ ├── ImageOptimizer.ts # Screenshot optimization for API
38
- │ │ ├── StructuredMarkdownBuilder.ts # AI-enhanced markdown output
39
- │ │ └── types.ts # AI pipeline types
40
- │ ├── analysis/ # Feedback analysis and categorization
41
- │ ├── audio/ # Microphone capture, VAD
42
- │ ├── capture/ # Screen capture via desktopCapturer
43
- │ ├── output/ # Document generation and export
44
- │ │ ├── MarkdownGenerator.ts # llms.txt-inspired markdown output
45
- │ │ ├── ExportService.ts # Multi-format export (MD, PDF, HTML, JSON)
46
- │ │ ├── ClipboardService.ts # Clipboard bridge (copies file path)
47
- │ │ ├── FileManager.ts # Session file management
48
- │ │ └── sessionAdapter.ts # Type conversion utilities
49
- │ ├── pipeline/ # Post-processing pipeline
50
- │ │ ├── PostProcessor.ts # Pipeline orchestrator (transcribe → analyze → extract → generate)
51
- │ │ ├── TranscriptAnalyzer.ts # Heuristic key-moment detection
52
- │ │ └── FrameExtractor.ts # ffmpeg-based video frame extraction
53
- │ ├── platform/ # Platform-specific code (Windows taskbar)
54
- │ ├── settings/ # Persistent settings with secure API key storage
55
- │ ├── transcription/ # Transcription tier management
56
- │ │ ├── TierManager.ts # Tier selection (Whisper, timer-only)
57
- │ │ ├── WhisperService.ts # Local Whisper integration
58
- │ │ └── ModelDownloadManager.ts # Whisper model download from HuggingFace
59
- │ └── windows/ # Window management (popover, taskbar)
60
- ├── renderer/ # React UI
61
- │ ├── App.tsx # Main component with state machine UI
62
- │ ├── AppWrapper.tsx # Root wrapper with providers
63
- │ ├── components/ # UI components
64
- │ │ ├── AnnotationOverlay.tsx # Drawing tools (arrow, circle, rect, freehand, text)
65
- │ │ ├── AudioWaveform.tsx # Real-time audio level visualization
66
- │ │ ├── CrashRecoveryDialog.tsx # Crash recovery UI
67
- │ │ ├── DonateButton.tsx # Rotating donate messages
68
- │ │ ├── ModelDownloadDialog.tsx # Whisper model download UI
69
- │ │ ├── Onboarding.tsx # First-run experience
70
- │ │ ├── SessionHistory.tsx # Session browser
71
- │ │ ├── SessionReview.tsx # Post-recording review/edit
72
- │ │ ├── SettingsPanel.tsx # Settings configuration
73
- │ │ └── ... # Other UI components
74
- │ ├── audio/ # Renderer-side audio capture bridge
75
- │ ├── capture/ # Renderer-side screen recording (MediaRecorder)
76
- │ └── hooks/ # React hooks (theme, animation)
77
- ├── preload/ # Context bridge (secure IPC)
78
- └── shared/ # Types shared between processes
79
- ├── types.ts # IPC channels, payload types, state types
80
- └── hotkeys.ts # Hotkey configuration types
81
- ```
82
-
83
- ## Commands
84
-
85
- ```bash
86
- npm run dev # Development mode with hot reload
87
- npm run build # Build for production
88
- npm run build:desktop # Build desktop app only
89
- npm test # Run all tests (356 tests)
90
- npm run test:unit # Run unit tests only
91
- npm run test:watch # Run tests in watch mode
92
- npm run lint # Lint code
93
- npm run lint:fix # Auto-fix lint issues
94
- npm run typecheck # TypeScript check
95
- npm run package # Package for current platform
96
- npm run package:mac # Package for macOS
97
- npm run package:win # Package for Windows
98
- ```
99
-
100
- ## Key Architecture Decisions
101
-
102
- ### State Machine
103
- The recording session is governed by a 7-state FSM: `idle → starting → recording → stopping → processing → complete → error`. Every state has a maximum duration enforced by a watchdog timer that forces recovery if anything gets stuck.
104
-
105
- ### Post-Processing Pipeline
106
- When recording stops, the pipeline runs: audio transcription (Whisper) → transcript analysis (key-moment detection) → video frame extraction (ffmpeg) → markdown generation. Each step degrades gracefully if a dependency is missing.
107
-
108
- ### Three-Tier Transcription
109
- 1. **OpenAI Whisper-1 API** (optional, best quality) — cloud-based, requires API key
110
- 2. **Local Whisper** (default) — runs on device, no API key needed
111
- 3. **Timer-only** (fallback) — captures screenshots on a timer when no transcription is available
112
-
113
- ### Crash Recovery
114
- Session state auto-saves to disk every 5 seconds. On restart after a crash, the app detects the incomplete session and offers recovery.
115
-
116
- ### Clipboard Bridge
117
- When a session completes, the **file path** to the markdown document is copied to clipboard — not the content. This is deliberate: the file persists on disk, and AI tools can read the full document including screenshots.
118
-
119
- ## IPC Communication
120
-
121
- All main/renderer communication goes through the preload script. See `src/shared/types.ts` for IPC channel names.
122
-
123
- ## Configuration
124
-
125
- No configuration required for first run. Local Whisper transcription works out of the box after downloading a model (~75MB for tiny, ~500MB for base).
126
-
127
- Optional API keys (stored securely in OS keychain):
128
- - **OpenAI** — for cloud post-session transcription
129
- - **Anthropic** — for AI-enhanced document analysis (BYOK mode)
130
-
131
- ## Development Notes
132
-
133
- - Menu bar popover window, frameless, always-on-top
134
- - Screenshots saved as PNG files in session directories
135
- - Voice activity detection uses RMS amplitude analysis
136
- - All settings validated against JSON schema
137
- - Secure API key storage via keytar (macOS Keychain, Windows Credential Manager) with encrypted fallback
@@ -1,9 +0,0 @@
1
- # Code of Conduct
2
-
3
- This project follows the [Contributor Covenant v2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/).
4
-
5
- ## Enforcement
6
-
7
- Report violations to: **conduct@markupr.app**
8
-
9
- All reports will be reviewed and investigated promptly.