markupr 2.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/.claude/commands/review-feedback.md +47 -0
  2. package/.eslintrc.json +35 -0
  3. package/.github/CODEOWNERS +16 -0
  4. package/.github/FUNDING.yml +1 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.md +56 -0
  6. package/.github/ISSUE_TEMPLATE/feature_request.md +54 -0
  7. package/.github/PULL_REQUEST_TEMPLATE.md +89 -0
  8. package/.github/dependabot.yml +70 -0
  9. package/.github/workflows/ci.yml +184 -0
  10. package/.github/workflows/deploy-landing.yml +134 -0
  11. package/.github/workflows/nightly.yml +288 -0
  12. package/.github/workflows/release.yml +318 -0
  13. package/CHANGELOG.md +127 -0
  14. package/CLAUDE.md +137 -0
  15. package/CODE_OF_CONDUCT.md +9 -0
  16. package/CONTRIBUTING.md +390 -0
  17. package/LICENSE +21 -0
  18. package/PRODUCT_VISION.md +277 -0
  19. package/README.md +517 -0
  20. package/SECURITY.md +51 -0
  21. package/SIGNING_INSTRUCTIONS.md +284 -0
  22. package/assets/DMG_BACKGROUND_INSTRUCTIONS.md +130 -0
  23. package/assets/svg-source/dmg-background.svg +70 -0
  24. package/assets/svg-source/icon.svg +20 -0
  25. package/assets/svg-source/tray-icon-processing.svg +7 -0
  26. package/assets/svg-source/tray-icon-recording.svg +7 -0
  27. package/assets/svg-source/tray-icon.svg +6 -0
  28. package/assets/tray-complete.png +0 -0
  29. package/assets/tray-complete@2x.png +0 -0
  30. package/assets/tray-completeTemplate.png +0 -0
  31. package/assets/tray-completeTemplate@2x.png +0 -0
  32. package/assets/tray-error.png +0 -0
  33. package/assets/tray-error@2x.png +0 -0
  34. package/assets/tray-errorTemplate.png +0 -0
  35. package/assets/tray-errorTemplate@2x.png +0 -0
  36. package/assets/tray-icon-processing.png +0 -0
  37. package/assets/tray-icon-processing@2x.png +0 -0
  38. package/assets/tray-icon-processingTemplate.png +0 -0
  39. package/assets/tray-icon-processingTemplate@2x.png +0 -0
  40. package/assets/tray-icon-recording.png +0 -0
  41. package/assets/tray-icon-recording@2x.png +0 -0
  42. package/assets/tray-icon-recordingTemplate.png +0 -0
  43. package/assets/tray-icon-recordingTemplate@2x.png +0 -0
  44. package/assets/tray-icon.png +0 -0
  45. package/assets/tray-icon@2x.png +0 -0
  46. package/assets/tray-iconTemplate.png +0 -0
  47. package/assets/tray-iconTemplate@2x.png +0 -0
  48. package/assets/tray-idle.png +0 -0
  49. package/assets/tray-idle@2x.png +0 -0
  50. package/assets/tray-idleTemplate.png +0 -0
  51. package/assets/tray-idleTemplate@2x.png +0 -0
  52. package/assets/tray-processing-0.png +0 -0
  53. package/assets/tray-processing-0@2x.png +0 -0
  54. package/assets/tray-processing-0Template.png +0 -0
  55. package/assets/tray-processing-0Template@2x.png +0 -0
  56. package/assets/tray-processing-1.png +0 -0
  57. package/assets/tray-processing-1@2x.png +0 -0
  58. package/assets/tray-processing-1Template.png +0 -0
  59. package/assets/tray-processing-1Template@2x.png +0 -0
  60. package/assets/tray-processing-2.png +0 -0
  61. package/assets/tray-processing-2@2x.png +0 -0
  62. package/assets/tray-processing-2Template.png +0 -0
  63. package/assets/tray-processing-2Template@2x.png +0 -0
  64. package/assets/tray-processing-3.png +0 -0
  65. package/assets/tray-processing-3@2x.png +0 -0
  66. package/assets/tray-processing-3Template.png +0 -0
  67. package/assets/tray-processing-3Template@2x.png +0 -0
  68. package/assets/tray-processing.png +0 -0
  69. package/assets/tray-processing@2x.png +0 -0
  70. package/assets/tray-processingTemplate.png +0 -0
  71. package/assets/tray-processingTemplate@2x.png +0 -0
  72. package/assets/tray-recording.png +0 -0
  73. package/assets/tray-recording@2x.png +0 -0
  74. package/assets/tray-recordingTemplate.png +0 -0
  75. package/assets/tray-recordingTemplate@2x.png +0 -0
  76. package/build/DMG_BACKGROUND_SPEC.md +50 -0
  77. package/build/dmg-background.png +0 -0
  78. package/build/dmg-background@2x.png +0 -0
  79. package/build/entitlements.mac.inherit.plist +27 -0
  80. package/build/entitlements.mac.plist +41 -0
  81. package/build/favicon-16.png +0 -0
  82. package/build/favicon-180.png +0 -0
  83. package/build/favicon-192.png +0 -0
  84. package/build/favicon-32.png +0 -0
  85. package/build/favicon-48.png +0 -0
  86. package/build/favicon-512.png +0 -0
  87. package/build/favicon-64.png +0 -0
  88. package/build/icon-128.png +0 -0
  89. package/build/icon-16.png +0 -0
  90. package/build/icon-24.png +0 -0
  91. package/build/icon-256.png +0 -0
  92. package/build/icon-32.png +0 -0
  93. package/build/icon-48.png +0 -0
  94. package/build/icon-64.png +0 -0
  95. package/build/icon.icns +0 -0
  96. package/build/icon.ico +0 -0
  97. package/build/icon.iconset/icon_128x128.png +0 -0
  98. package/build/icon.iconset/icon_128x128@2x.png +0 -0
  99. package/build/icon.iconset/icon_16x16.png +0 -0
  100. package/build/icon.iconset/icon_16x16@2x.png +0 -0
  101. package/build/icon.iconset/icon_256x256.png +0 -0
  102. package/build/icon.iconset/icon_256x256@2x.png +0 -0
  103. package/build/icon.iconset/icon_32x32.png +0 -0
  104. package/build/icon.iconset/icon_32x32@2x.png +0 -0
  105. package/build/icon.iconset/icon_512x512.png +0 -0
  106. package/build/icon.iconset/icon_512x512@2x.png +0 -0
  107. package/build/icon.png +0 -0
  108. package/build/installer-header.bmp +0 -0
  109. package/build/installer-header.png +0 -0
  110. package/build/installer-sidebar.bmp +0 -0
  111. package/build/installer-sidebar.png +0 -0
  112. package/build/installer.nsh +45 -0
  113. package/build/overlay-processing.png +0 -0
  114. package/build/overlay-recording.png +0 -0
  115. package/build/toolbar-record.png +0 -0
  116. package/build/toolbar-screenshot.png +0 -0
  117. package/build/toolbar-settings.png +0 -0
  118. package/build/toolbar-stop.png +0 -0
  119. package/dist/main/index.mjs +12612 -0
  120. package/dist/preload/index.mjs +907 -0
  121. package/dist/renderer/assets/index-CCmUjl9K.js +19495 -0
  122. package/dist/renderer/assets/index-CUqz_Gs6.css +2270 -0
  123. package/dist/renderer/index.html +27 -0
  124. package/docs/AI_AGENT_QUICKSTART.md +42 -0
  125. package/docs/AI_PIPELINE_DESIGN.md +595 -0
  126. package/docs/API.md +514 -0
  127. package/docs/ARCHITECTURE.md +460 -0
  128. package/docs/CONFIGURATION.md +336 -0
  129. package/docs/DEVELOPMENT.md +508 -0
  130. package/docs/EXPORT_FORMATS.md +451 -0
  131. package/docs/GETTING_STARTED.md +236 -0
  132. package/docs/KEYBOARD_SHORTCUTS.md +334 -0
  133. package/docs/TROUBLESHOOTING.md +418 -0
  134. package/docs/landing/index.html +672 -0
  135. package/docs/landing/script.js +342 -0
  136. package/docs/landing/styles.css +1543 -0
  137. package/electron-builder.yml +140 -0
  138. package/electron.vite.config.ts +63 -0
  139. package/package.json +108 -0
  140. package/railway.json +12 -0
  141. package/scripts/build.mjs +51 -0
  142. package/scripts/generate-icons.mjs +314 -0
  143. package/scripts/generate-installer-images.cjs +253 -0
  144. package/scripts/generate-tray-icons.mjs +258 -0
  145. package/scripts/notarize.cjs +180 -0
  146. package/scripts/one-click-clean-test.sh +147 -0
  147. package/scripts/postinstall.mjs +36 -0
  148. package/scripts/setup-markupr.sh +55 -0
  149. package/setup +17 -0
  150. package/site/index.html +1835 -0
  151. package/site/package.json +11 -0
  152. package/site/railway.json +12 -0
  153. package/site/server.js +31 -0
  154. package/src/main/AutoUpdater.ts +392 -0
  155. package/src/main/CrashRecovery.ts +655 -0
  156. package/src/main/ErrorHandler.ts +703 -0
  157. package/src/main/HotkeyManager.ts +399 -0
  158. package/src/main/MenuManager.ts +529 -0
  159. package/src/main/PermissionManager.ts +420 -0
  160. package/src/main/SessionController.ts +1465 -0
  161. package/src/main/TrayManager.ts +540 -0
  162. package/src/main/ai/AIPipelineManager.ts +199 -0
  163. package/src/main/ai/ClaudeAnalyzer.ts +339 -0
  164. package/src/main/ai/ImageOptimizer.ts +176 -0
  165. package/src/main/ai/StructuredMarkdownBuilder.ts +379 -0
  166. package/src/main/ai/index.ts +16 -0
  167. package/src/main/ai/types.ts +258 -0
  168. package/src/main/analysis/ClarificationGenerator.ts +385 -0
  169. package/src/main/analysis/FeedbackAnalyzer.ts +531 -0
  170. package/src/main/analysis/index.ts +19 -0
  171. package/src/main/audio/AudioCapture.ts +978 -0
  172. package/src/main/audio/audioUtils.ts +100 -0
  173. package/src/main/audio/index.ts +20 -0
  174. package/src/main/capture/index.ts +1 -0
  175. package/src/main/index.ts +1693 -0
  176. package/src/main/ipc/captureHandlers.ts +272 -0
  177. package/src/main/ipc/index.ts +45 -0
  178. package/src/main/ipc/outputHandlers.ts +302 -0
  179. package/src/main/ipc/sessionHandlers.ts +56 -0
  180. package/src/main/ipc/settingsHandlers.ts +471 -0
  181. package/src/main/ipc/types.ts +56 -0
  182. package/src/main/ipc/windowHandlers.ts +277 -0
  183. package/src/main/output/ClipboardService.ts +369 -0
  184. package/src/main/output/ExportService.ts +539 -0
  185. package/src/main/output/FileManager.ts +416 -0
  186. package/src/main/output/MarkdownGenerator.ts +791 -0
  187. package/src/main/output/MarkdownPatcher.ts +299 -0
  188. package/src/main/output/index.ts +186 -0
  189. package/src/main/output/sessionAdapter.ts +207 -0
  190. package/src/main/output/templates/html-template.ts +553 -0
  191. package/src/main/pipeline/FrameExtractor.ts +330 -0
  192. package/src/main/pipeline/PostProcessor.ts +399 -0
  193. package/src/main/pipeline/TranscriptAnalyzer.ts +226 -0
  194. package/src/main/pipeline/index.ts +36 -0
  195. package/src/main/platform/WindowsTaskbar.ts +600 -0
  196. package/src/main/platform/index.ts +16 -0
  197. package/src/main/settings/SettingsManager.ts +730 -0
  198. package/src/main/settings/index.ts +19 -0
  199. package/src/main/transcription/ModelDownloadManager.ts +494 -0
  200. package/src/main/transcription/TierManager.ts +219 -0
  201. package/src/main/transcription/TranscriptionRecoveryService.ts +340 -0
  202. package/src/main/transcription/WhisperService.ts +748 -0
  203. package/src/main/transcription/index.ts +56 -0
  204. package/src/main/transcription/types.ts +135 -0
  205. package/src/main/windows/PopoverManager.ts +284 -0
  206. package/src/main/windows/TaskbarIntegration.ts +452 -0
  207. package/src/main/windows/index.ts +23 -0
  208. package/src/preload/index.ts +1047 -0
  209. package/src/renderer/App.tsx +515 -0
  210. package/src/renderer/AppWrapper.tsx +28 -0
  211. package/src/renderer/assets/logo-dark.svg +7 -0
  212. package/src/renderer/assets/logo.svg +7 -0
  213. package/src/renderer/audio/AudioCaptureRenderer.ts +454 -0
  214. package/src/renderer/capture/ScreenRecordingRenderer.ts +492 -0
  215. package/src/renderer/components/AnnotationOverlay.tsx +836 -0
  216. package/src/renderer/components/AudioWaveform.tsx +811 -0
  217. package/src/renderer/components/ClarificationQuestions.tsx +656 -0
  218. package/src/renderer/components/CountdownTimer.tsx +495 -0
  219. package/src/renderer/components/CrashRecoveryDialog.tsx +632 -0
  220. package/src/renderer/components/DonateButton.tsx +127 -0
  221. package/src/renderer/components/ErrorBoundary.tsx +308 -0
  222. package/src/renderer/components/ExportDialog.tsx +872 -0
  223. package/src/renderer/components/HotkeyHint.tsx +261 -0
  224. package/src/renderer/components/KeyboardShortcuts.tsx +787 -0
  225. package/src/renderer/components/ModelDownloadDialog.tsx +844 -0
  226. package/src/renderer/components/Onboarding.tsx +1830 -0
  227. package/src/renderer/components/ProcessingOverlay.tsx +157 -0
  228. package/src/renderer/components/RecordingOverlay.tsx +423 -0
  229. package/src/renderer/components/SessionHistory.tsx +1746 -0
  230. package/src/renderer/components/SessionReview.tsx +1321 -0
  231. package/src/renderer/components/SettingsPanel.tsx +217 -0
  232. package/src/renderer/components/Skeleton.tsx +347 -0
  233. package/src/renderer/components/StatusIndicator.tsx +86 -0
  234. package/src/renderer/components/ThemeProvider.tsx +429 -0
  235. package/src/renderer/components/Tooltip.tsx +370 -0
  236. package/src/renderer/components/TranscriptionPreview.tsx +183 -0
  237. package/src/renderer/components/TranscriptionTierSelector.tsx +640 -0
  238. package/src/renderer/components/UpdateNotification.tsx +377 -0
  239. package/src/renderer/components/WindowSelector.tsx +947 -0
  240. package/src/renderer/components/index.ts +99 -0
  241. package/src/renderer/components/primitives/ApiKeyInput.tsx +98 -0
  242. package/src/renderer/components/primitives/ColorPicker.tsx +65 -0
  243. package/src/renderer/components/primitives/DangerButton.tsx +45 -0
  244. package/src/renderer/components/primitives/DirectoryPicker.tsx +41 -0
  245. package/src/renderer/components/primitives/Dropdown.tsx +34 -0
  246. package/src/renderer/components/primitives/KeyRecorder.tsx +117 -0
  247. package/src/renderer/components/primitives/SettingsSection.tsx +32 -0
  248. package/src/renderer/components/primitives/Slider.tsx +43 -0
  249. package/src/renderer/components/primitives/Toggle.tsx +36 -0
  250. package/src/renderer/components/primitives/index.ts +10 -0
  251. package/src/renderer/components/settings/AdvancedTab.tsx +174 -0
  252. package/src/renderer/components/settings/AppearanceTab.tsx +77 -0
  253. package/src/renderer/components/settings/GeneralTab.tsx +40 -0
  254. package/src/renderer/components/settings/HotkeysTab.tsx +79 -0
  255. package/src/renderer/components/settings/RecordingTab.tsx +84 -0
  256. package/src/renderer/components/settings/index.ts +9 -0
  257. package/src/renderer/components/settings/settingsStyles.ts +673 -0
  258. package/src/renderer/components/settings/tabConfig.tsx +85 -0
  259. package/src/renderer/components/settings/useSettingsPanel.ts +447 -0
  260. package/src/renderer/contexts/ProcessingContext.tsx +227 -0
  261. package/src/renderer/contexts/RecordingContext.tsx +683 -0
  262. package/src/renderer/contexts/UIContext.tsx +326 -0
  263. package/src/renderer/contexts/index.ts +24 -0
  264. package/src/renderer/donateMessages.ts +69 -0
  265. package/src/renderer/hooks/index.ts +75 -0
  266. package/src/renderer/hooks/useAnimation.tsx +544 -0
  267. package/src/renderer/hooks/useTheme.ts +313 -0
  268. package/src/renderer/index.html +26 -0
  269. package/src/renderer/main.tsx +52 -0
  270. package/src/renderer/styles/animations.css +1093 -0
  271. package/src/renderer/styles/app-shell.css +662 -0
  272. package/src/renderer/styles/globals.css +515 -0
  273. package/src/renderer/styles/theme.ts +578 -0
  274. package/src/renderer/types/electron.d.ts +385 -0
  275. package/src/shared/hotkeys.ts +283 -0
  276. package/src/shared/types.ts +809 -0
  277. package/tests/clipboard.test.ts +228 -0
  278. package/tests/e2e/criticalPaths.test.ts +594 -0
  279. package/tests/feedbackAnalyzer.test.ts +303 -0
  280. package/tests/integration/sessionFlow.test.ts +583 -0
  281. package/tests/markdownGenerator.test.ts +418 -0
  282. package/tests/output.test.ts +96 -0
  283. package/tests/setup.ts +486 -0
  284. package/tests/unit/appIntegration.test.ts +676 -0
  285. package/tests/unit/appViewState.test.ts +281 -0
  286. package/tests/unit/audioIpcChannels.test.ts +17 -0
  287. package/tests/unit/exportService.test.ts +492 -0
  288. package/tests/unit/hotkeys.test.ts +92 -0
  289. package/tests/unit/navigationPreload.test.ts +94 -0
  290. package/tests/unit/onboardingFlow.test.ts +345 -0
  291. package/tests/unit/permissionManager.test.ts +175 -0
  292. package/tests/unit/permissionManagerExpanded.test.ts +296 -0
  293. package/tests/unit/screenRecordingRenderer.test.ts +368 -0
  294. package/tests/unit/sessionController.test.ts +515 -0
  295. package/tests/unit/tierManager.test.ts +61 -0
  296. package/tests/unit/tierManagerExpanded.test.ts +142 -0
  297. package/tests/unit/transcriptAnalyzer.test.ts +64 -0
  298. package/tsconfig.json +25 -0
  299. package/vitest.config.ts +46 -0
@@ -0,0 +1,451 @@
1
+ # Export Formats
2
+
3
+ markupr supports multiple export formats to suit different use cases. This guide covers each format in detail.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Overview](#overview)
8
+ - [Markdown Format](#markdown-format)
9
+ - [PDF Format](#pdf-format)
10
+ - [HTML Format](#html-format)
11
+ - [JSON Format](#json-format)
12
+ - [Export Options](#export-options)
13
+ - [Best Practices](#best-practices)
14
+
15
+ ## Overview
16
+
17
+ | Format | Best For | File Size | Images |
18
+ |--------|----------|-----------|--------|
19
+ | Markdown | AI assistants, GitHub, documentation | Small | Referenced |
20
+ | PDF | Sharing, printing, archival | Large | Embedded |
21
+ | HTML | Web viewing, email | Medium | Embedded (base64) |
22
+ | JSON | APIs, integrations, automation | Small | Referenced |
23
+
24
+ ## Markdown Format
25
+
26
+ The Markdown format is optimized for AI coding assistants and follows conventions inspired by [llms.txt](https://llms.txt).
27
+
28
+ ### Structure
29
+
30
+ ```markdown
31
+ # Feedback Report: {Project Name}
32
+
33
+ > Generated by markupr v0.4.0
34
+ > Date: 2026-02-02 10:30:00
35
+
36
+ ## Summary
37
+
38
+ | Metric | Value |
39
+ |--------|-------|
40
+ | Duration | 2m 34s |
41
+ | Feedback Items | 5 |
42
+ | Screenshots | 3 |
43
+ | Source | My App - Chrome |
44
+
45
+ ## Feedback Items
46
+
47
+ ### FB-001: Login button not visible on mobile
48
+
49
+ **Timestamp**: 00:15 | **Type**: Bug | **Confidence**: 95%
50
+
51
+ > The login button appears to be hidden behind the sticky header when viewing
52
+ > on mobile viewport. Users cannot access the login functionality without
53
+ > scrolling, which is not intuitive.
54
+
55
+ **Screenshot**: [FB-001.png](./screenshots/FB-001.png)
56
+
57
+ ---
58
+
59
+ ### FB-002: Consider adding social login options
60
+
61
+ **Timestamp**: 00:45 | **Type**: Feature | **Confidence**: 92%
62
+
63
+ > It would be helpful to have social login options like Google or GitHub
64
+ > authentication. This is a common pattern that users expect.
65
+
66
+ ---
67
+
68
+ ### FB-003: Form validation errors unclear
69
+
70
+ **Timestamp**: 01:12 | **Type**: UX | **Confidence**: 89%
71
+
72
+ > When I enter an invalid email, the error message just says "Invalid input".
73
+ > It should specifically say "Please enter a valid email address" with
74
+ > guidance on the expected format.
75
+
76
+ **Screenshot**: [FB-003.png](./screenshots/FB-003.png)
77
+
78
+ ---
79
+
80
+ ## Technical Details
81
+
82
+ - **App Version**: 0.4.0
83
+ - **Platform**: darwin (macOS)
84
+ - **Transcription**: OpenAI Nova-2
85
+ - **Session ID**: session-abc123
86
+ ```
87
+
88
+ ### Image Handling
89
+
90
+ By default, images are stored as separate files and referenced:
91
+ ```markdown
92
+ **Screenshot**: [FB-001.png](./screenshots/FB-001.png)
93
+ ```
94
+
95
+ With "Include Images" enabled, images are embedded as base64:
96
+ ```markdown
97
+ **Screenshot**: ![FB-001](data:image/png;base64,iVBORw0KGgo...)
98
+ ```
99
+
100
+ ### Metadata Block
101
+
102
+ The Markdown includes a YAML frontmatter block (hidden in rendered view):
103
+
104
+ ```yaml
105
+ ---
106
+ markupr_version: 0.4.0
107
+ session_id: session-abc123
108
+ created: 2026-02-02T10:30:00Z
109
+ source: My App - Chrome
110
+ items: 5
111
+ screenshots: 3
112
+ ---
113
+ ```
114
+
115
+ ### Use Cases
116
+
117
+ - **Claude, ChatGPT, Cursor**: Paste directly for AI analysis
118
+ - **GitHub Issues**: Copy into issue descriptions
119
+ - **Documentation**: Include in project docs
120
+ - **Notes**: Add to Notion, Obsidian, etc.
121
+
122
+ ## PDF Format
123
+
124
+ Professional document format for sharing and archival.
125
+
126
+ ### Features
127
+
128
+ - **Embedded screenshots**: All images included in the PDF
129
+ - **Print-ready**: Proper margins and page breaks
130
+ - **Themes**: Dark or light mode
131
+ - **Typography**: Professional fonts
132
+
133
+ ### Layout
134
+
135
+ ```
136
+ ┌──────────────────────────────────────────┐
137
+ │ markupr │
138
+ │ Feedback Report │
139
+ │ │
140
+ │ Project: My App │
141
+ │ Date: February 2, 2026 │
142
+ │ Items: 5 feedback points │
143
+ ├──────────────────────────────────────────┤
144
+ │ │
145
+ │ 1. Login button not visible │
146
+ │ ┌────────────────────────┐ │
147
+ │ │ [Screenshot] │ │
148
+ │ └────────────────────────┘ │
149
+ │ │
150
+ │ The login button appears to be... │
151
+ │ │
152
+ │ Type: Bug | Confidence: 95% │
153
+ │ │
154
+ ├──────────────────────────────────────────┤
155
+ │ 2. Consider adding social login... │
156
+ │ ... │
157
+ └──────────────────────────────────────────┘
158
+ ```
159
+
160
+ ### Theme Options
161
+
162
+ **Dark Theme**:
163
+ - Dark background (#0f172a)
164
+ - Light text (#f8fafc)
165
+ - Blue accents (#3b82f6)
166
+ - Best for screen viewing
167
+
168
+ **Light Theme**:
169
+ - White background
170
+ - Dark text (#1e293b)
171
+ - Blue accents (#2563eb)
172
+ - Best for printing
173
+
174
+ ### Use Cases
175
+
176
+ - **Client presentations**: Professional appearance
177
+ - **Stakeholder reports**: Print-friendly
178
+ - **Archival**: Long-term storage
179
+ - **Email attachments**: Universal compatibility
180
+
181
+ ## HTML Format
182
+
183
+ Self-contained web page with no external dependencies.
184
+
185
+ ### Features
186
+
187
+ - **No dependencies**: Single HTML file, works offline
188
+ - **Responsive**: Mobile-friendly layout
189
+ - **Interactive**: Theme toggle, expandable items
190
+ - **Embedded images**: Base64-encoded screenshots
191
+
192
+ ### Structure
193
+
194
+ ```html
195
+ <!DOCTYPE html>
196
+ <html lang="en">
197
+ <head>
198
+ <meta charset="UTF-8">
199
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
200
+ <title>Feedback Report: My App</title>
201
+ <style>
202
+ /* All CSS embedded - supports dark/light themes */
203
+ </style>
204
+ </head>
205
+ <body>
206
+ <header>
207
+ <h1>Feedback Report: My App</h1>
208
+ <div class="metadata">...</div>
209
+ <button id="theme-toggle">Toggle Theme</button>
210
+ </header>
211
+
212
+ <main>
213
+ <section class="summary">
214
+ <table>...</table>
215
+ </section>
216
+
217
+ <section class="feedback-items">
218
+ <article class="feedback-item">
219
+ <h2>FB-001: Login button not visible</h2>
220
+ <div class="meta">Bug | 95% confidence | 00:15</div>
221
+ <img src="data:image/png;base64,..." alt="Screenshot">
222
+ <blockquote>The login button appears to be...</blockquote>
223
+ </article>
224
+ <!-- More items... -->
225
+ </section>
226
+ </main>
227
+
228
+ <footer>
229
+ Generated by markupr v0.4.0
230
+ </footer>
231
+
232
+ <script>
233
+ /* Theme toggle and interactivity */
234
+ </script>
235
+ </body>
236
+ </html>
237
+ ```
238
+
239
+ ### Interactive Features
240
+
241
+ - **Theme Toggle**: Switch between dark and light modes
242
+ - **Collapsible Items**: Expand/collapse feedback items
243
+ - **Image Zoom**: Click to enlarge screenshots
244
+ - **Copy Button**: Copy individual items as text
245
+
246
+ ### Use Cases
247
+
248
+ - **Web sharing**: Host on any web server
249
+ - **Email**: Attach as HTML or inline
250
+ - **Local viewing**: Double-click to open in browser
251
+ - **Collaboration**: Share via Slack, Discord, etc.
252
+
253
+ ## JSON Format
254
+
255
+ Machine-readable format for integrations and automation.
256
+
257
+ ### Schema
258
+
259
+ ```json
260
+ {
261
+ "$schema": "https://markupr.app/schemas/export-v1.json",
262
+ "version": "1.0",
263
+ "generator": {
264
+ "name": "markupr",
265
+ "version": "0.4.0"
266
+ },
267
+ "session": {
268
+ "id": "session-abc123",
269
+ "startTime": 1706871000000,
270
+ "endTime": 1706871154000,
271
+ "duration": 154000,
272
+ "source": {
273
+ "id": "window:123:456",
274
+ "name": "My App - Chrome",
275
+ "type": "window"
276
+ }
277
+ },
278
+ "summary": {
279
+ "itemCount": 5,
280
+ "screenshotCount": 3,
281
+ "categories": {
282
+ "bug": 2,
283
+ "feature": 1,
284
+ "ux": 2
285
+ }
286
+ },
287
+ "feedbackItems": [
288
+ {
289
+ "id": "FB-001",
290
+ "index": 1,
291
+ "timestamp": 1706871015000,
292
+ "relativeTime": 15000,
293
+ "transcription": "The login button appears to be hidden...",
294
+ "category": "bug",
295
+ "confidence": 0.95,
296
+ "wordCount": 24,
297
+ "screenshot": {
298
+ "id": "screenshot-001",
299
+ "filename": "FB-001.png",
300
+ "path": "./screenshots/FB-001.png",
301
+ "width": 1920,
302
+ "height": 1080,
303
+ "format": "png",
304
+ "size": 245678
305
+ },
306
+ "annotations": [
307
+ {
308
+ "type": "arrow",
309
+ "x1": 100,
310
+ "y1": 50,
311
+ "x2": 200,
312
+ "y2": 100,
313
+ "color": "#ef4444"
314
+ }
315
+ ]
316
+ }
317
+ ],
318
+ "metadata": {
319
+ "platform": "darwin",
320
+ "transcriptionService": "openai",
321
+ "transcriptionModel": "nova-2",
322
+ "exportedAt": "2026-02-02T10:35:00.000Z"
323
+ }
324
+ }
325
+ ```
326
+
327
+ ### Field Reference
328
+
329
+ #### Session Object
330
+
331
+ | Field | Type | Description |
332
+ |-------|------|-------------|
333
+ | `id` | string | Unique session identifier |
334
+ | `startTime` | number | Unix timestamp (ms) of session start |
335
+ | `endTime` | number | Unix timestamp (ms) of session end |
336
+ | `duration` | number | Duration in milliseconds |
337
+ | `source.id` | string | Capture source ID |
338
+ | `source.name` | string | Human-readable source name |
339
+ | `source.type` | string | "screen" or "window" |
340
+
341
+ #### Feedback Item Object
342
+
343
+ | Field | Type | Description |
344
+ |-------|------|-------------|
345
+ | `id` | string | Item ID (e.g., "FB-001") |
346
+ | `index` | number | 1-based index |
347
+ | `timestamp` | number | Unix timestamp (ms) |
348
+ | `relativeTime` | number | Time since session start (ms) |
349
+ | `transcription` | string | Full transcription text |
350
+ | `category` | string | Auto-detected category |
351
+ | `confidence` | number | Transcription confidence (0-1) |
352
+ | `screenshot` | object | Screenshot metadata (if captured) |
353
+ | `annotations` | array | Drawing annotations |
354
+
355
+ #### Screenshot Object
356
+
357
+ | Field | Type | Description |
358
+ |-------|------|-------------|
359
+ | `id` | string | Screenshot ID |
360
+ | `filename` | string | Original filename |
361
+ | `path` | string | Relative path to image |
362
+ | `width` | number | Image width in pixels |
363
+ | `height` | number | Image height in pixels |
364
+ | `format` | string | "png" or "jpeg" |
365
+ | `size` | number | File size in bytes |
366
+
367
+ ### Use Cases
368
+
369
+ - **API integrations**: Send to issue trackers, project management
370
+ - **Automation**: Process with scripts
371
+ - **Custom tooling**: Build your own viewers/processors
372
+ - **Data analysis**: Aggregate feedback across sessions
373
+
374
+ ### Parsing Example (JavaScript)
375
+
376
+ ```javascript
377
+ const fs = require('fs');
378
+
379
+ const data = JSON.parse(fs.readFileSync('feedback.json', 'utf8'));
380
+
381
+ // Get all bugs
382
+ const bugs = data.feedbackItems.filter(item => item.category === 'bug');
383
+
384
+ // Calculate average confidence
385
+ const avgConfidence = data.feedbackItems.reduce(
386
+ (sum, item) => sum + item.confidence, 0
387
+ ) / data.feedbackItems.length;
388
+
389
+ // Get items with screenshots
390
+ const withScreenshots = data.feedbackItems.filter(item => item.screenshot);
391
+
392
+ console.log(`Bugs: ${bugs.length}`);
393
+ console.log(`Average confidence: ${(avgConfidence * 100).toFixed(1)}%`);
394
+ console.log(`Items with screenshots: ${withScreenshots.length}`);
395
+ ```
396
+
397
+ ## Export Options
398
+
399
+ ### Include Images
400
+
401
+ **Available for**: Markdown, PDF, HTML
402
+
403
+ - **On**: Images are embedded in the export file
404
+ - **Off**: Images are referenced by path (Markdown) or not included (PDF/HTML)
405
+
406
+ **Trade-offs**:
407
+ - Embedded: Larger file size, but self-contained
408
+ - Referenced: Smaller file, but requires separate image folder
409
+
410
+ ### Theme
411
+
412
+ **Available for**: PDF, HTML
413
+
414
+ - **Dark**: Dark background, light text
415
+ - **Light**: Light background, dark text
416
+
417
+ ### Project Name
418
+
419
+ Customize the title that appears in the export:
420
+ - Default: Captured source name (e.g., "My App - Chrome")
421
+ - Custom: Enter any project name
422
+
423
+ ## Best Practices
424
+
425
+ ### For AI Assistants
426
+
427
+ 1. Use **Markdown** format
428
+ 2. Enable **Include Images** (some assistants support image analysis)
429
+ 3. Review and edit transcriptions before export
430
+ 4. Remove irrelevant items
431
+
432
+ ### For Sharing with Team
433
+
434
+ 1. Use **PDF** for formal reports
435
+ 2. Use **HTML** for interactive viewing
436
+ 3. Choose **Light theme** for printing
437
+ 4. Add project context in the name
438
+
439
+ ### For Integrations
440
+
441
+ 1. Use **JSON** format
442
+ 2. Parse with appropriate library
443
+ 3. Handle missing fields gracefully
444
+ 4. Validate against schema
445
+
446
+ ### For Archival
447
+
448
+ 1. Use **PDF** for long-term storage
449
+ 2. Also export **JSON** for data preservation
450
+ 3. Keep original screenshots folder
451
+ 4. Document session context externally
@@ -0,0 +1,236 @@
1
+ # Getting Started with markupr
2
+
3
+ This guide walks you through setting up markupr for the first time.
4
+
5
+ ## Table of Contents
6
+
7
+ - [System Requirements](#system-requirements)
8
+ - [Installation](#installation)
9
+ - [First-Time Setup](#first-time-setup)
10
+ - [Obtaining a OpenAI API Key](#obtaining-a-openai-api-key)
11
+ - [Granting Permissions](#granting-permissions)
12
+ - [Your First Recording](#your-first-recording)
13
+
14
+ ## System Requirements
15
+
16
+ ### macOS
17
+ - macOS 10.15 (Catalina) or later
18
+ - Apple Silicon or Intel processor
19
+ - 4 GB RAM minimum
20
+ - 100 MB disk space
21
+
22
+ ### Windows
23
+ - Windows 10 or later
24
+ - x64 processor
25
+ - 4 GB RAM minimum
26
+ - 100 MB disk space
27
+
28
+ ### Linux
29
+ - Ubuntu 18.04+ or equivalent
30
+ - x64 processor
31
+ - 4 GB RAM minimum
32
+ - 100 MB disk space
33
+
34
+ ## Installation
35
+
36
+ ### macOS
37
+
38
+ 1. Download the latest `.dmg` file from the [releases page](https://github.com/eddiesanjuan/markupr/releases)
39
+ 2. Open the downloaded DMG file
40
+ 3. Drag the markupr icon to your Applications folder
41
+ 4. Eject the DMG
42
+ 5. Open markupr from your Applications folder
43
+
44
+ **Note**: On first launch, macOS may show a security warning. Click "Open" to continue, or go to System Preferences > Security & Privacy to allow the app.
45
+
46
+ ### Windows
47
+
48
+ 1. Download the latest `.exe` installer from the [releases page](https://github.com/eddiesanjuan/markupr/releases)
49
+ 2. Run the installer
50
+ 3. Follow the installation wizard
51
+ 4. Launch markupr from the Start menu or desktop shortcut
52
+
53
+ ### Linux
54
+
55
+ **AppImage:**
56
+ ```bash
57
+ # Download the AppImage
58
+ wget https://github.com/eddiesanjuan/markupr/releases/latest/download/markupr.AppImage
59
+
60
+ # Make it executable
61
+ chmod +x markupr.AppImage
62
+
63
+ # Run
64
+ ./markupr.AppImage
65
+ ```
66
+
67
+ **Debian/Ubuntu:**
68
+ ```bash
69
+ # Download and install
70
+ wget https://github.com/eddiesanjuan/markupr/releases/latest/download/markupr.deb
71
+ sudo dpkg -i markupr.deb
72
+ sudo apt-get install -f # Install dependencies if needed
73
+ ```
74
+
75
+ ## First-Time Setup
76
+
77
+ When you launch markupr for the first time, the onboarding wizard will guide you through:
78
+
79
+ 1. **Welcome** - Introduction to markupr
80
+ 2. **Permissions** - Granting required system permissions
81
+ 3. **API Key** - Configuring your OpenAI API key
82
+ 4. **Quick Tour** - Learning the basic workflow
83
+
84
+ You can skip the wizard and configure settings manually, but we recommend completing it.
85
+
86
+ ## Obtaining a OpenAI API Key
87
+
88
+ markupr uses OpenAI for real-time speech-to-text transcription. Here's how to get your API key:
89
+
90
+ ### Step 1: Create a OpenAI Account
91
+
92
+ 1. Go to [platform.openai.com/api-keys](https://platform.openai.com/api-keys)
93
+ 2. Click "Sign Up" (or "Sign In" if you have an account)
94
+ 3. Complete the registration process
95
+
96
+ ### Step 2: Create an API Key
97
+
98
+ 1. Once logged in, go to **API Keys** in the left sidebar
99
+ 2. Click **Create a New API Key**
100
+ 3. Give your key a descriptive name (e.g., "markupr")
101
+ 4. Select the following permissions:
102
+ - **Usage** (required for transcription)
103
+ 5. Click **Create Key**
104
+ 6. **Copy the key immediately** - you won't be able to see it again!
105
+
106
+ ### Step 3: Add the Key to markupr
107
+
108
+ 1. Open markupr
109
+ 2. Go to **Settings** (`Cmd+,` on macOS, `Ctrl+,` on Windows)
110
+ 3. Navigate to **Advanced** > **Transcription Service**
111
+ 4. Paste your API key in the input field
112
+ 5. Click **Test Connection** to verify
113
+ 6. You should see "API key verified and saved securely"
114
+
115
+ ### OpenAI Free Tier
116
+
117
+ OpenAI offers a generous free tier:
118
+ - **200 hours** of transcription per month
119
+ - **No credit card required** to start
120
+ - Perfect for individual developers
121
+
122
+ For higher volume usage, OpenAI offers paid plans starting at pay-as-you-go pricing.
123
+
124
+ ## Granting Permissions
125
+
126
+ markupr requires certain system permissions to function properly.
127
+
128
+ ### macOS Permissions
129
+
130
+ #### Microphone Access
131
+
132
+ markupr needs microphone access to capture your voice narration.
133
+
134
+ 1. When prompted, click **OK** to allow microphone access
135
+ 2. If you denied access, go to:
136
+ - System Preferences > Security & Privacy > Privacy > Microphone
137
+ - Check the box next to markupr
138
+
139
+ #### Screen Recording
140
+
141
+ markupr needs screen recording permission to capture screenshots.
142
+
143
+ 1. When prompted, click **Open System Preferences**
144
+ 2. Go to Security & Privacy > Privacy > Screen Recording
145
+ 3. Check the box next to markupr
146
+ 4. **Restart markupr** for the change to take effect
147
+
148
+ #### Accessibility (Optional)
149
+
150
+ For global hotkeys to work in all applications:
151
+
152
+ 1. Go to System Preferences > Security & Privacy > Privacy > Accessibility
153
+ 2. Click the lock icon and enter your password
154
+ 3. Check the box next to markupr
155
+
156
+ ### Windows Permissions
157
+
158
+ Windows typically handles permissions automatically. If you encounter issues:
159
+
160
+ 1. Right-click on markupr in the Start menu
161
+ 2. Select "Run as administrator" (for first run only)
162
+ 3. Follow any Windows Security prompts
163
+
164
+ ### Linux Permissions
165
+
166
+ Depending on your distribution, you may need to:
167
+
168
+ ```bash
169
+ # Add your user to the audio group for microphone access
170
+ sudo usermod -a -G audio $USER
171
+
172
+ # Log out and log back in for changes to take effect
173
+ ```
174
+
175
+ ## Your First Recording
176
+
177
+ Now that everything is set up, let's capture your first feedback!
178
+
179
+ ### Step 1: Start Recording
180
+
181
+ Press the global hotkey:
182
+ - **macOS**: `Cmd+Shift+F`
183
+ - **Windows/Linux**: `Ctrl+Shift+F`
184
+
185
+ ### Step 2: Select a Source
186
+
187
+ The Window Selector will appear. Choose what to capture:
188
+ - **Entire Screen** - Capture everything on one monitor
189
+ - **Specific Window** - Capture just one application window
190
+
191
+ Click on your selection to start.
192
+
193
+ ### Step 3: Narrate Your Feedback
194
+
195
+ Start speaking! Some tips:
196
+ - Speak naturally and clearly
197
+ - Pause briefly when you want a screenshot captured
198
+ - The live transcription preview shows what markupr hears
199
+
200
+ ### Step 4: Screenshots
201
+
202
+ markupr captures screenshots automatically when you pause speaking. You can also:
203
+ - Press `Cmd+Shift+S` (or `Ctrl+Shift+S`) to manually capture
204
+ - Watch the screenshot count in the overlay
205
+
206
+ ### Step 5: Stop Recording
207
+
208
+ Press the hotkey again (`Cmd+Shift+F` or `Ctrl+Shift+F`) to stop.
209
+
210
+ ### Step 6: Review and Export
211
+
212
+ After stopping:
213
+ 1. The Session Review panel opens
214
+ 2. Review your feedback items
215
+ 3. Edit or delete items as needed
216
+ 4. Click **Copy to Clipboard** or choose an export format
217
+
218
+ ### Step 7: Use Your Feedback
219
+
220
+ Paste the copied feedback into your AI assistant:
221
+ - Claude
222
+ - ChatGPT
223
+ - Cursor
224
+ - GitHub Copilot
225
+
226
+ The Markdown format is optimized for AI consumption.
227
+
228
+ ## Next Steps
229
+
230
+ - [Configure settings](CONFIGURATION.md) to customize markupr
231
+ - [Learn keyboard shortcuts](KEYBOARD_SHORTCUTS.md) for efficient workflows
232
+ - [Explore export formats](EXPORT_FORMATS.md) for different use cases
233
+
234
+ ## Troubleshooting
235
+
236
+ Having issues? Check our [Troubleshooting Guide](TROUBLESHOOTING.md) for common solutions.