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
package/CONTRIBUTING.md DELETED
@@ -1,390 +0,0 @@
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/PRODUCT_VISION.md DELETED
@@ -1,277 +0,0 @@
1
- # markupr Product Vision
2
-
3
- **Version 1.2** | February 2026
4
- **Author**: Eddie San Juan
5
- **License**: MIT (Open Source)
6
- **Status**: Public Release
7
-
8
- ---
9
-
10
- ## The Problem Nobody Talks About
11
-
12
- Developers using AI coding assistants have a broken feedback loop.
13
-
14
- You spend 30 minutes working with Claude Code or Cursor to build a feature. You deploy. You test. You find problems. Now you need to communicate what you found -- but your AI session context is gone. Re-explaining everything takes as long as the original work.
15
-
16
- The existing tools don't solve this:
17
-
18
- - **Loom** caps at 5 minutes and produces video files AI tools can't read.
19
- - **Jam.dev** is browser-only and assumes something is broken. Development feedback isn't just bugs -- it's reasoning, preferences, and context.
20
- - **Screen Studio** produces beautiful recordings with zero structured output.
21
- - **Screenshots + typing** interrupts your thought process. By the time you switch apps and type, you've lost the nuance.
22
-
23
- Bug reporting tools assume something is *broken*. Development feedback captures *reasoning*. No existing tool bridges this gap.
24
-
25
- ---
26
-
27
- ## What markupr Does
28
-
29
- markupr is a menu bar app that intelligently captures your development feedback. Press a hotkey, talk through what you see, and markupr records your screen while transcribing your voice in real time. When you stop, an intelligent post-processing pipeline correlates your transcript timestamps with the screen recording to extract the right frames at the right moments -- then stitches everything into a structured, AI-ready markdown document.
30
-
31
- One hotkey to start. One hotkey to stop. A markdown file with your words, contextually-placed screenshots, and intelligent structure -- ready to hand to your AI coding agent, paste into a GitHub issue, or drop in a Slack thread. The output isn't a transcript with screenshots attached. It's a document that understands the relationship between what you said and what was on screen.
32
-
33
- ---
34
-
35
- ## The User Journey
36
-
37
- ### Starting a Session
38
-
39
- You're testing a feature you just deployed. Something feels off about the layout. A button is in the wrong place. The loading state is confusing.
40
-
41
- You press `Cmd+Shift+F`.
42
-
43
- The menu bar icon shifts from a gray outline to a pulsing red dot. Recording has started. No window pops up. No app switcher. No interruption. You stay exactly where you are.
44
-
45
- ### During a Session
46
-
47
- You talk naturally:
48
-
49
- *"This button is way too small on mobile. And it's competing with the header -- look, they're practically overlapping."*
50
-
51
- You pause for a beat. markupr detects the silence -- about 1.2 seconds of quiet -- and captures a screenshot of exactly what you're looking at.
52
-
53
- You scroll down.
54
-
55
- *"The loading spinner here feels sluggish. It shows up but then the content pops in with no transition. Feels janky."*
56
-
57
- Another natural pause. Another screenshot.
58
-
59
- You click through to a different page.
60
-
61
- *"Actually, I love how this card animation works. We should use this pattern on the dashboard too."*
62
-
63
- Screenshot.
64
-
65
- You don't switch apps. You don't break your train of thought. You don't reach for your phone to take a photo of your screen. You just talk and navigate like you normally would.
66
-
67
- If you need a screenshot at a specific moment -- mid-sentence, before you pause -- hit `Cmd+Shift+S` for a manual capture.
68
-
69
- ### Ending a Session
70
-
71
- Press `Cmd+Shift+F` again. The menu bar icon spins briefly while the session processes. A few seconds later, a notification tells you the session is complete.
72
-
73
- ### What You Get
74
-
75
- Everything is saved to an organized folder on your machine:
76
-
77
- ```
78
- ~/markupr/sessions/2026-02-05_14-23-41/
79
- feedback.md
80
- screenshots/
81
- fb-001.png
82
- fb-002.png
83
- fb-003.png
84
- ```
85
-
86
- The markdown file is the core output. The post-processing pipeline:
87
-
88
- 1. Analyzes your transcript timestamps against the screen recording
89
- 2. Extracts the most relevant frames at the exact moments you described each issue
90
- 3. Places screenshots inline with the corresponding narration
91
- 4. Structures the document with clear sections, timestamps, and context
92
- 5. Produces a summary with item counts and session duration
93
-
94
- The result is a document purpose-built for AI consumption -- your coding agent can read it and immediately understand every issue, see exactly what you saw, and act on it.
95
-
96
- On the premium tier, Claude AI reads your transcript alongside your screenshots and produces an even more intelligent document -- grouping related feedback, identifying patterns across items, surfacing what matters most, and writing actionable summaries.
97
-
98
- ### The Clipboard Bridge
99
-
100
- When the session ends, the **file path** to your markdown document is copied to your clipboard. Not the content. The path.
101
-
102
- This is deliberate:
103
-
104
- - If your clipboard gets overwritten, your feedback isn't gone. The file lives on disk permanently.
105
- - AI coding tools like Claude Code can read a file path and process the full document, including the screenshots.
106
- - You paste the path into your AI tool, your IDE, a Slack message, an issue tracker -- wherever it needs to go.
107
- - The file is yours. Local. Private. No cloud dependency.
108
-
109
- The path is the bridge between "I captured feedback" and "something acts on it."
110
-
111
- ---
112
-
113
- ## Who This Is For
114
-
115
- **Primary users**: Individual developers and small teams (2-10 people) who use AI coding assistants daily. They deploy frequently, prefer keyboard-driven workflows, and care more about structured output than polished video.
116
-
117
- **Secondary users**: Senior developers and tech leads who review AI-assisted work, need visibility into development decisions, and want to build team knowledge bases over time.
118
-
119
- The common thread: these are people who think faster than they type, test their own code regularly, and want their feedback to be immediately actionable by both humans and AI tools.
120
-
121
- ---
122
-
123
- ## How Pricing Works
124
-
125
- ### Free Tier (Open Source, MIT License)
126
-
127
- markupr is free and fully functional with no feature gates:
128
-
129
- - **Local Whisper transcription** runs entirely on your machine. No API key. No internet required after the initial model download (~500MB).
130
- - **BYOK (Bring Your Own Key)** for AI analysis. Plug in any API key you want -- Anthropic, OpenAI, whatever you prefer.
131
- - **All features unlocked.** Screenshots, transcription, markdown output, crash recovery, silence detection, manual capture -- everything works.
132
- - **Offline capable.** Once the Whisper model is downloaded, markupr works without a network connection.
133
-
134
- A donate button rotates through messages like "Buy Eddie a Taco" and "Fund Eddie's Caffeine Addiction" -- a single link to Ko-fi. It never blocks your workflow. It never nags. It's there if you feel like it.
135
-
136
- ### Premium Tier (~$12/month)
137
-
138
- Everything in Free, plus:
139
-
140
- - **Built-in Claude AI analysis.** No API key setup. No configuration. Press stop, and Anthropic's Claude reads your transcript alongside your screenshots to produce an intelligent, contextualized feedback document.
141
- - **Smart summaries.** Claude identifies patterns across your feedback items, groups related observations, flags the most critical issues, and writes concise action items.
142
- - **Zero setup.** Eddie's API key is proxied through a Cloudflare Worker. You sign up, you pay, it works.
143
- - **Stripe billing.** Standard monthly subscription. Cancel anytime.
144
-
145
- The premium value is Claude's intelligence applied to your feedback -- not better transcription. Transcription is always local Whisper, always free. The AI analysis layer is what you pay for.
146
-
147
- This is not an OpenAI integration. The analysis is powered by Anthropic's Claude because it produces better structured reasoning about visual and textual content.
148
-
149
- ---
150
-
151
- ## Design Principles
152
-
153
- **Zero-config first run.** markupr works the moment you open it. No API keys. No account creation. No onboarding wizard with seven steps. You click the menu bar icon, press the hotkey, and start talking.
154
-
155
- **Menu bar native.** No dock icon. No window chrome. markupr lives in your menu bar like a system utility. It's there when you need it and invisible when you don't. Inspired by how the Claude Status app behaves -- minimal, professional, out of the way.
156
-
157
- **Never lose work.** Session state is written to disk every 5 seconds. If the app crashes, your data is recovered on restart. If your clipboard gets overwritten, the file is still on disk. If processing hangs, a watchdog timer forces recovery within 10 seconds. You will never lose a feedback session.
158
-
159
- **AI is the luxury, not the baseline.** The free tier is a complete, production-quality tool. AI analysis makes the output smarter and more structured, but markupr is useful without it. This is not a demo that upsells you.
160
-
161
- **Open source first.** MIT license. Fork it, improve it, ship it. Contributions welcome. The codebase is designed to be readable and well-documented. Community-driven development, not SaaS-driven.
162
-
163
- **Ship fast, polish later.** The core loop -- record, capture, generate, copy -- matters more than animation polish or pixel-perfect design. Functionality first. Always.
164
-
165
- ---
166
-
167
- ## How It Works Under the Hood
168
-
169
- markupr is an Electron app with a React frontend. The recording session is governed by a 7-state finite state machine:
170
-
171
- **idle** -- ready to record
172
- **starting** -- initializing microphone and transcription (5-second timeout)
173
- **recording** -- capturing audio and screenshots (30-minute max)
174
- **stopping** -- finalizing audio capture (3-second timeout)
175
- **processing** -- generating the output document (10-second timeout)
176
- **complete** -- session saved, path copied (auto-returns to idle after 30 seconds)
177
- **error** -- something went wrong (auto-recovers to idle after 5 seconds)
178
-
179
- Every state has a maximum duration. A watchdog timer monitors state age in the background and forces recovery if anything gets stuck. There is no state the app can enter and not exit. This is the "bulletproof" guarantee.
180
-
181
- ### Three-Tier Transcription
182
-
183
- Transcription degrades gracefully:
184
-
185
- 1. **OpenAI** (optional, best quality) -- cloud-based, 95%+ accuracy, ~300ms latency. Requires an API key and internet.
186
- 2. **Local Whisper** (default) -- runs on your machine, 90%+ accuracy, 1-2 second latency. No API key. No internet.
187
- 3. **macOS Dictation** (emergency fallback) -- real-time, ~85% accuracy. Uses the system's built-in speech recognition.
188
-
189
- If OpenAI fails mid-session, markupr falls back to Whisper. If Whisper isn't available, it falls back to macOS Dictation. If nothing works, it continues capturing screenshots on a timer and saves whatever audio it has.
190
-
191
- ### Intelligent Screen Recording & Frame Extraction
192
-
193
- During a session, markupr continuously records your screen (up to 4K@30fps, VP9/VP8 encoded). Simultaneously, silence detection monitors audio input using RMS amplitude analysis -- when you pause for ~1.2 seconds, the system notes a capture point. You can also trigger a manual capture at any time with `Cmd+Shift+S`.
194
-
195
- The real intelligence happens in post-processing. When you end a session, the pipeline:
196
-
197
- 1. Walks through the transcript with timestamps
198
- 2. Correlates each narration segment with the screen recording timeline
199
- 3. Extracts frames at the exact moments that correspond to what you were describing
200
- 4. Stitches the frames and transcript into a structured markdown document
201
-
202
- This means the output isn't just "screenshots taken during pauses" -- it's contextually-aware frame extraction that ensures every image in the document shows exactly what you were talking about.
203
-
204
- ### Crash Recovery
205
-
206
- Session state persists to disk every 5 seconds. If the app is force-quit or crashes during a recording:
207
-
208
- 1. On next launch, markupr detects the incomplete session.
209
- 2. It presents a recovery dialog with the partial data.
210
- 3. You can resume or discard the session.
211
-
212
- This means even a power failure mid-session doesn't lose your work.
213
-
214
- ---
215
-
216
- ## What Makes markupr Different
217
-
218
- | | markupr | Loom | Jam.dev | Screenshots + Notes |
219
- |---|---|---|---|---|
220
- | Voice + Screen Recording | Yes | Video only | Browser only | Manual |
221
- | AI-Ready Output | Structured markdown | No | Partial | No |
222
- | Intelligent Frame Extraction | Timestamp-correlated | No | Auto (browser) | No |
223
- | Works Offline | Yes (local Whisper) | No | No | Yes |
224
- | Works with Any App | Yes (desktop-wide) | Yes | No (browser) | Yes |
225
- | Free | Fully functional | Limited | Limited | Yes |
226
- | Open Source | MIT | No | No | N/A |
227
- | Output format | Markdown + images | MP4 | Web report | Scattered files |
228
-
229
- The core differentiator: markupr's intelligent pipeline understands the relationship between what you said and what was on screen, then produces a structured document optimized for AI consumption. Video files can't do that -- AI tools can't read them. Browser-only tools miss everything outside the browser. Manual note-taking breaks your flow. markupr captures everything, then intelligently assembles the output.
230
-
231
- ---
232
-
233
- ## Roadmap
234
-
235
- ### Shipped (v1.0 - v1.2)
236
-
237
- - Bulletproof state machine with watchdog timer
238
- - Menu bar native interface (no dock icon)
239
- - Three-tier transcription (OpenAI, Whisper, macOS Dictation)
240
- - Silence-triggered screenshot capture
241
- - Crash recovery with 5-second auto-save
242
- - Multiple export formats (Markdown, PDF, HTML, JSON)
243
- - Session history browser
244
- - Annotation tools (arrows, circles, rectangles, freehand, text)
245
- - Audio waveform visualization
246
- - Auto-updater
247
- - Cross-platform support (macOS primary, Windows secondary)
248
- - Donate button with rotating messages
249
-
250
- ### Next
251
-
252
- - Premium tier with Claude AI analysis (Stripe billing, Cloudflare Worker proxy)
253
- - Improved AI-powered document structuring and pattern detection
254
- - Team sharing via file system or git integration
255
- - Custom vocabulary for technical domain terms
256
- - Session tagging and search across history
257
- - Integration hooks for issue trackers (GitHub Issues, Linear)
258
-
259
- ### Future
260
-
261
- - Linux support (full parity)
262
- - Browser extension companion for web-specific capture
263
- - Multi-language transcription
264
- - Voice commands during recording ("mark this as critical", "new section")
265
- - API for automation and CI/CD integration
266
-
267
- ---
268
-
269
- ## The Vision in One Sentence
270
-
271
- markupr turns the way you naturally think about software -- talking through what you see -- into intelligently structured documents where every screenshot is placed exactly where it belongs, ready for humans and AI tools to act on immediately.
272
-
273
- ---
274
-
275
- *Built by Eddie San Juan. Open source. MIT licensed.*
276
- *[github.com/eddiesanjuan/markupr](https://github.com/eddiesanjuan/markupr)*
277
- *[ko-fi.com/eddiesanjuan](https://ko-fi.com/eddiesanjuan)*