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
package/CHANGELOG.md ADDED
@@ -0,0 +1,127 @@
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 ADDED
@@ -0,0 +1,137 @@
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
@@ -0,0 +1,9 @@
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.
@@ -0,0 +1,390 @@
1
+ # Contributing to markupr
2
+
3
+ Thank you for your interest in contributing to markupr! This document provides guidelines and information about contributing.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Code of Conduct](#code-of-conduct)
8
+ - [Getting Started](#getting-started)
9
+ - [How to Contribute](#how-to-contribute)
10
+ - [Development Workflow](#development-workflow)
11
+ - [Pull Request Process](#pull-request-process)
12
+ - [Style Guide](#style-guide)
13
+ - [Reporting Issues](#reporting-issues)
14
+
15
+ ## Code of Conduct
16
+
17
+ By participating in this project, you agree to maintain a respectful and inclusive environment. Please:
18
+
19
+ - Be respectful and considerate in all interactions
20
+ - Welcome newcomers and help them learn
21
+ - Focus on constructive feedback
22
+ - Accept responsibility for mistakes and learn from them
23
+
24
+ ## Getting Started
25
+
26
+ ### Prerequisites
27
+
28
+ - Node.js 18+
29
+ - npm 9+
30
+ - Git
31
+ - A code editor (VS Code recommended)
32
+
33
+ ### Setup
34
+
35
+ 1. **Fork the repository** on GitHub
36
+
37
+ 2. **Clone your fork**:
38
+ ```bash
39
+ git clone https://github.com/YOUR_USERNAME/markupr.git
40
+ cd markupr
41
+ ```
42
+
43
+ 3. **Add upstream remote**:
44
+ ```bash
45
+ git remote add upstream https://github.com/eddiesanjuan/markupr.git
46
+ ```
47
+
48
+ 4. **Install dependencies**:
49
+ ```bash
50
+ npm install
51
+ # or
52
+ bun install
53
+ ```
54
+
55
+ 5. **Start development**:
56
+ ```bash
57
+ npm run dev
58
+ # or
59
+ bun run dev
60
+ ```
61
+
62
+ See [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for detailed development instructions.
63
+
64
+ ## How to Contribute
65
+
66
+ ### Types of Contributions
67
+
68
+ We welcome many types of contributions:
69
+
70
+ - **Bug fixes**: Fix issues in existing code
71
+ - **Features**: Add new functionality
72
+ - **Documentation**: Improve or add documentation
73
+ - **Tests**: Add or improve test coverage
74
+ - **Performance**: Optimize existing code
75
+ - **Accessibility**: Improve accessibility
76
+ - **Translations**: Help translate the UI
77
+
78
+ ### Finding Issues to Work On
79
+
80
+ - Check [issues labeled "good first issue"](https://github.com/eddiesanjuan/markupr/labels/good%20first%20issue) for beginner-friendly tasks
81
+ - Check [issues labeled "help wanted"](https://github.com/eddiesanjuan/markupr/labels/help%20wanted) for tasks where we need help
82
+ - Feel free to propose your own ideas by opening an issue first
83
+
84
+ ### Before Starting Work
85
+
86
+ 1. **Check existing issues** to avoid duplicate work
87
+ 2. **Comment on the issue** to let others know you're working on it
88
+ 3. **For significant changes**, open an issue first to discuss the approach
89
+ 4. **For new features**, wait for approval before starting implementation
90
+
91
+ ## Development Workflow
92
+
93
+ ### Branch Naming
94
+
95
+ Use descriptive branch names:
96
+
97
+ - `feature/add-pdf-export`
98
+ - `fix/hotkey-conflict`
99
+ - `docs/update-readme`
100
+ - `refactor/settings-panel`
101
+
102
+ ### Making Changes
103
+
104
+ 1. **Create a branch**:
105
+ ```bash
106
+ git checkout -b feature/my-feature
107
+ ```
108
+
109
+ 2. **Make your changes**:
110
+ - Follow the [style guide](#style-guide)
111
+ - Keep commits focused and atomic
112
+ - Write clear commit messages
113
+
114
+ 3. **Test your changes**:
115
+ ```bash
116
+ npm test
117
+ npm run lint
118
+ npm run typecheck
119
+ # bun equivalents:
120
+ # bun run test
121
+ # bun run lint
122
+ # bun run typecheck
123
+ ```
124
+
125
+ 4. **Update documentation** if needed
126
+
127
+ 5. **Commit your changes**:
128
+ ```bash
129
+ git commit -m "feat: add new export format"
130
+ ```
131
+
132
+ ### Commit Message Format
133
+
134
+ We use [Conventional Commits](https://www.conventionalcommits.org/):
135
+
136
+ ```
137
+ <type>(<scope>): <description>
138
+
139
+ [optional body]
140
+
141
+ [optional footer]
142
+ ```
143
+
144
+ **Types**:
145
+ - `feat`: New feature
146
+ - `fix`: Bug fix
147
+ - `docs`: Documentation only
148
+ - `style`: Code style (formatting, etc.)
149
+ - `refactor`: Code change that neither fixes nor adds
150
+ - `perf`: Performance improvement
151
+ - `test`: Adding or updating tests
152
+ - `chore`: Maintenance tasks
153
+
154
+ **Examples**:
155
+ ```
156
+ feat(export): add PDF export format
157
+ fix(hotkey): resolve conflict with system shortcuts
158
+ docs(readme): update installation instructions
159
+ refactor(settings): simplify settings manager
160
+ ```
161
+
162
+ ### Keeping Your Fork Updated
163
+
164
+ ```bash
165
+ git fetch upstream
166
+ git checkout main
167
+ git merge upstream/main
168
+ git push origin main
169
+ ```
170
+
171
+ ## Pull Request Process
172
+
173
+ ### Before Submitting
174
+
175
+ Ensure your PR:
176
+
177
+ 1. **Follows the style guide**
178
+ 2. **Passes all tests**: `npm test`
179
+ 3. **Passes linting**: `npm run lint`
180
+ 4. **Passes type checking**: `npm run typecheck`
181
+ 5. **Has been tested manually**
182
+ 6. **Includes documentation updates** (if applicable)
183
+ 7. **Has a clear description**
184
+
185
+ ### Submitting a PR
186
+
187
+ 1. **Push your branch**:
188
+ ```bash
189
+ git push origin feature/my-feature
190
+ ```
191
+
192
+ 2. **Open a Pull Request** on GitHub
193
+
194
+ 3. **Fill out the PR template**:
195
+ - Describe what the PR does
196
+ - Link related issues
197
+ - List any breaking changes
198
+ - Include screenshots for UI changes
199
+
200
+ 4. **Request review** if not automatically assigned
201
+
202
+ ### PR Template
203
+
204
+ ```markdown
205
+ ## Description
206
+ Brief description of changes.
207
+
208
+ ## Related Issues
209
+ Fixes #123
210
+
211
+ ## Type of Change
212
+ - [ ] Bug fix
213
+ - [ ] New feature
214
+ - [ ] Documentation
215
+ - [ ] Refactoring
216
+ - [ ] Other (describe)
217
+
218
+ ## Testing
219
+ Describe how you tested the changes.
220
+
221
+ ## Screenshots
222
+ (If applicable)
223
+
224
+ ## Checklist
225
+ - [ ] Tests pass (`npm test`)
226
+ - [ ] Lint passes (`npm run lint`)
227
+ - [ ] Types check (`npm run typecheck`)
228
+ - [ ] Documentation updated
229
+ - [ ] Manually tested
230
+ ```
231
+
232
+ ### Review Process
233
+
234
+ 1. **Automated checks** must pass
235
+ 2. **At least one maintainer** must approve
236
+ 3. **All comments** must be resolved
237
+ 4. **No merge conflicts** with main
238
+
239
+ ### After Merging
240
+
241
+ - Delete your branch
242
+ - Pull changes to your local main
243
+ - Celebrate your contribution! 🎉
244
+
245
+ ## Style Guide
246
+
247
+ ### TypeScript
248
+
249
+ ```typescript
250
+ // Use explicit types
251
+ function createSession(sourceId: string): Session {
252
+ // ...
253
+ }
254
+
255
+ // Use interfaces for objects
256
+ interface SessionOptions {
257
+ sourceId: string;
258
+ sourceName?: string;
259
+ }
260
+
261
+ // Use const assertions for literals
262
+ const STATUS = {
263
+ IDLE: 'idle',
264
+ RECORDING: 'recording',
265
+ } as const;
266
+ ```
267
+
268
+ ### React
269
+
270
+ ```tsx
271
+ // Use functional components
272
+ export function SessionStatus({ state }: SessionStatusProps) {
273
+ const [isActive, setIsActive] = useState(false);
274
+
275
+ useEffect(() => {
276
+ // Cleanup subscriptions
277
+ return () => cleanup();
278
+ }, []);
279
+
280
+ return <div className="status">{state}</div>;
281
+ }
282
+
283
+ // Prefer named exports
284
+ export { SessionStatus };
285
+ ```
286
+
287
+ ### CSS / Tailwind
288
+
289
+ ```tsx
290
+ // Use Tailwind utilities
291
+ <div className="bg-gray-900 text-white p-4 rounded-lg shadow-md">
292
+
293
+ // For complex styles, use cn() helper
294
+ <div className={cn(
295
+ "base-styles",
296
+ isActive && "active-styles",
297
+ className
298
+ )}>
299
+ ```
300
+
301
+ ### File Organization
302
+
303
+ ```
304
+ src/
305
+ ├── main/
306
+ │ ├── services/ # Service classes
307
+ │ ├── utils/ # Utility functions
308
+ │ └── types/ # Main-specific types
309
+ ├── renderer/
310
+ │ ├── components/ # React components
311
+ │ ├── hooks/ # Custom hooks
312
+ │ └── utils/ # Utility functions
313
+ └── shared/
314
+ └── types.ts # Shared types
315
+ ```
316
+
317
+ ### Naming Conventions
318
+
319
+ | Type | Convention | Example |
320
+ |------|------------|---------|
321
+ | Components | PascalCase | `SessionReview.tsx` |
322
+ | Hooks | camelCase, `use` prefix | `useSessionState.ts` |
323
+ | Utilities | camelCase | `formatTime.ts` |
324
+ | Types | PascalCase | `SessionState` |
325
+ | Constants | UPPER_SNAKE_CASE | `MAX_RETRIES` |
326
+
327
+ ## Reporting Issues
328
+
329
+ ### Before Reporting
330
+
331
+ 1. **Check existing issues** for duplicates
332
+ 2. **Try latest version** - issue may be fixed
333
+ 3. **Collect information**:
334
+ - OS and version
335
+ - markupr version
336
+ - Steps to reproduce
337
+ - Error messages/logs
338
+
339
+ ### Bug Report Template
340
+
341
+ ```markdown
342
+ ## Description
343
+ Clear description of the bug.
344
+
345
+ ## Steps to Reproduce
346
+ 1. Go to '...'
347
+ 2. Click on '...'
348
+ 3. See error
349
+
350
+ ## Expected Behavior
351
+ What should happen.
352
+
353
+ ## Actual Behavior
354
+ What actually happens.
355
+
356
+ ## Environment
357
+ - OS: macOS 14.0
358
+ - markupr: 0.4.0
359
+ - Node: 18.19.0
360
+
361
+ ## Screenshots/Logs
362
+ (If applicable)
363
+
364
+ ## Additional Context
365
+ Any other relevant information.
366
+ ```
367
+
368
+ ### Feature Request Template
369
+
370
+ ```markdown
371
+ ## Problem
372
+ Describe the problem this feature would solve.
373
+
374
+ ## Proposed Solution
375
+ How you envision the feature working.
376
+
377
+ ## Alternatives Considered
378
+ Other approaches you've thought about.
379
+
380
+ ## Additional Context
381
+ Mockups, examples, or references.
382
+ ```
383
+
384
+ ## Questions?
385
+
386
+ - Open a [discussion](https://github.com/eddiesanjuan/markupr/discussions)
387
+ - Check [documentation](docs/)
388
+ - Review existing [issues](https://github.com/eddiesanjuan/markupr/issues)
389
+
390
+ Thank you for contributing to markupr!
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Eddie San Juan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.