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,47 @@
1
+ # Review markupr Session
2
+
3
+ You are reviewing a markupr session -- a structured feedback report with voice transcription and screenshots captured while a developer reviewed their application.
4
+
5
+ ## Instructions
6
+
7
+ 1. **Read the session directory** at: $ARGUMENTS
8
+ - Read `feedback-report.md` for the full structured feedback with FB-XXX items
9
+ - Read `metadata.json` for session context (source app, duration, environment)
10
+ - Read each screenshot in `screenshots/` that is referenced by feedback items -- these are PNG files showing exactly what the user was looking at when they spoke
11
+ - If `session-recording.webm` exists, note its path (video can't be played in CLI but the screenshots provide the visual context)
12
+
13
+ 2. **Parse each feedback item** (FB-001, FB-002, etc.) and extract:
14
+ - The severity (Critical / High / Medium / Low) and category (Bug / UX Issue / Suggestion / Performance / Question / General)
15
+ - The transcribed observation (the blockquote under "What Happened")
16
+ - Associated screenshot(s) -- READ the image files to see what the user was looking at
17
+ - The suggested next step from the report
18
+
19
+ 3. **Create an action plan** prioritized by severity:
20
+ - **Critical/High items first** -- bugs and broken functionality
21
+ - **Medium items next** -- UX issues and performance problems
22
+ - **Low items last** -- suggestions and enhancements
23
+
24
+ 4. **For each item, determine the action type:**
25
+ - Code fix -- identify the file and make the change
26
+ - UI change -- adjust layout, styling, or component behavior
27
+ - Documentation -- update docs or add comments
28
+ - Investigation needed -- reproduce first, then fix
29
+ - Future enhancement -- note for backlog, no immediate action
30
+
31
+ 5. **Work through items systematically:**
32
+ - State which FB-XXX item you're addressing
33
+ - Reference the screenshot to ground your understanding in what the user saw
34
+ - Make the code change or explain why it should be deferred
35
+ - After each fix, note: "FB-XXX addressed"
36
+
37
+ 6. **After all items are processed**, provide a summary:
38
+ - Items addressed with code changes
39
+ - Items deferred with reasoning
40
+ - Patterns or architectural concerns noticed across multiple feedback items
41
+
42
+ ## Important Notes
43
+ - Screenshots are visual evidence -- always read them to understand context before acting
44
+ - The user's spoken words (in blockquotes) capture intent and nuance that the severity/category labels alone may miss
45
+ - Treat "Suggested Next Step" as guidance, not a strict instruction -- use your judgment
46
+ - If the report has 0 feedback items, tell the user the session captured no actionable feedback
47
+ - The session directory path is typically copied to the clipboard by markupr when a session ends
package/.eslintrc.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "root": true,
3
+ "parser": "@typescript-eslint/parser",
4
+ "plugins": ["@typescript-eslint", "react", "react-hooks"],
5
+ "extends": [
6
+ "eslint:recommended",
7
+ "plugin:@typescript-eslint/recommended",
8
+ "plugin:react/recommended",
9
+ "plugin:react-hooks/recommended"
10
+ ],
11
+ "parserOptions": {
12
+ "ecmaVersion": 2022,
13
+ "sourceType": "module",
14
+ "ecmaFeatures": {
15
+ "jsx": true
16
+ }
17
+ },
18
+ "settings": {
19
+ "react": {
20
+ "version": "detect"
21
+ }
22
+ },
23
+ "env": {
24
+ "browser": true,
25
+ "node": true,
26
+ "es2022": true
27
+ },
28
+ "rules": {
29
+ "react/react-in-jsx-scope": "off",
30
+ "@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }],
31
+ "@typescript-eslint/explicit-function-return-type": "off",
32
+ "@typescript-eslint/no-explicit-any": "warn"
33
+ },
34
+ "ignorePatterns": ["dist", "node_modules", "release"]
35
+ }
@@ -0,0 +1,16 @@
1
+ # =============================================================================
2
+ # CODEOWNERS for markupr (low-noise)
3
+ # =============================================================================
4
+ # Intentionally scoped to runtime/security-critical areas.
5
+ # Dependency/workflow/docs-only PRs are not auto-assigned by CODEOWNERS.
6
+
7
+ # Core runtime
8
+ /src/main/ @eddiesanjuan
9
+ /src/renderer/ @eddiesanjuan
10
+ /src/preload/ @eddiesanjuan
11
+ /src/shared/ @eddiesanjuan
12
+
13
+ # Distribution and security-sensitive files
14
+ electron-builder.yml @eddiesanjuan
15
+ /build/entitlements*.plist @eddiesanjuan
16
+ /scripts/notarize.cjs @eddiesanjuan
@@ -0,0 +1 @@
1
+ ko_fi: eddiesanjuan
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: Bug Report
3
+ about: Report a bug to help us improve markupr
4
+ title: '[Bug] '
5
+ labels: bug
6
+ assignees: ''
7
+ ---
8
+
9
+ ## Description
10
+
11
+ A clear and concise description of the bug.
12
+
13
+ ## Steps to Reproduce
14
+
15
+ 1. Go to '...'
16
+ 2. Click on '...'
17
+ 3. See error '...'
18
+
19
+ ## Expected Behavior
20
+
21
+ What you expected to happen.
22
+
23
+ ## Actual Behavior
24
+
25
+ What actually happened.
26
+
27
+ ## Screenshots
28
+
29
+ If applicable, add screenshots to help explain the problem.
30
+
31
+ ## Environment
32
+
33
+ - **OS**: [e.g., macOS 14.0, Windows 11]
34
+ - **markupr Version**: [e.g., 0.4.0]
35
+ - **Installation Method**: [e.g., DMG, installer, AppImage]
36
+
37
+ ## Logs
38
+
39
+ <details>
40
+ <summary>Debug Logs</summary>
41
+
42
+ ```
43
+ Paste logs here (Settings > Advanced > Debug Mode to enable)
44
+ ```
45
+
46
+ </details>
47
+
48
+ ## Additional Context
49
+
50
+ Add any other context about the problem here.
51
+
52
+ ## Checklist
53
+
54
+ - [ ] I have searched existing issues to ensure this is not a duplicate
55
+ - [ ] I have tried the latest version of markupr
56
+ - [ ] I have included all relevant information above
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: Feature Request
3
+ about: Suggest a new feature or improvement for markupr
4
+ title: '[Feature] '
5
+ labels: enhancement
6
+ assignees: ''
7
+ ---
8
+
9
+ ## Problem Statement
10
+
11
+ A clear description of the problem you're trying to solve.
12
+
13
+ **Example**: "I'm always frustrated when I have to manually take screenshots because..."
14
+
15
+ ## Proposed Solution
16
+
17
+ Describe the feature you'd like to see implemented.
18
+
19
+ ## Alternatives Considered
20
+
21
+ What other approaches have you thought about?
22
+
23
+ ## Use Case
24
+
25
+ How would you use this feature in your workflow?
26
+
27
+ **Example workflow**:
28
+ 1. Start recording feedback session
29
+ 2. [Your feature would help here]
30
+ 3. Export session
31
+
32
+ ## Mockups / Examples
33
+
34
+ If applicable, add mockups, wireframes, or examples from other tools.
35
+
36
+ ## Additional Context
37
+
38
+ - How often would you use this feature?
39
+ - Would this benefit other users?
40
+ - Are there any potential downsides?
41
+
42
+ ## Priority
43
+
44
+ How important is this feature to you?
45
+
46
+ - [ ] Nice to have - Would improve my workflow
47
+ - [ ] Important - Significantly impacts my productivity
48
+ - [ ] Critical - Can't use markupr effectively without it
49
+
50
+ ## Checklist
51
+
52
+ - [ ] I have searched existing issues to ensure this is not a duplicate
53
+ - [ ] I have checked the roadmap/documentation for planned features
54
+ - [ ] I am willing to help implement this feature (optional)
@@ -0,0 +1,89 @@
1
+ ## Description
2
+
3
+ Brief description of what this PR does.
4
+
5
+ ## Related Issues
6
+
7
+ Fixes #(issue number)
8
+
9
+ <!-- Or use: Closes #, Relates to #, Part of # -->
10
+
11
+ ## Type of Change
12
+
13
+ - [ ] Bug fix (non-breaking change that fixes an issue)
14
+ - [ ] New feature (non-breaking change that adds functionality)
15
+ - [ ] Breaking change (fix or feature that would cause existing functionality to change)
16
+ - [ ] Documentation update
17
+ - [ ] Refactoring (no functional changes)
18
+ - [ ] Performance improvement
19
+ - [ ] Test coverage improvement
20
+ - [ ] Build/CI configuration change
21
+
22
+ ## Changes Made
23
+
24
+ <!-- List the specific changes made in this PR -->
25
+
26
+ -
27
+ -
28
+ -
29
+
30
+ ## Screenshots / Videos
31
+
32
+ <!-- If applicable, add screenshots or videos demonstrating the changes -->
33
+
34
+ | Before | After |
35
+ |--------|-------|
36
+ | | |
37
+
38
+ ## Testing
39
+
40
+ ### How to Test
41
+
42
+ 1.
43
+ 2.
44
+ 3.
45
+
46
+ ### Test Coverage
47
+
48
+ - [ ] Unit tests added/updated
49
+ - [ ] Integration tests added/updated
50
+ - [ ] Manual testing completed
51
+
52
+ ### Platforms Tested
53
+
54
+ - [ ] macOS
55
+ - [ ] Windows
56
+ - [ ] Linux
57
+
58
+ ## Checklist
59
+
60
+ ### Code Quality
61
+
62
+ - [ ] My code follows the project's style guidelines
63
+ - [ ] I have performed a self-review of my code
64
+ - [ ] I have commented my code, particularly in hard-to-understand areas
65
+ - [ ] I have made corresponding changes to the documentation
66
+
67
+ ### Testing
68
+
69
+ - [ ] All tests pass locally (`npm test`)
70
+ - [ ] Linting passes (`npm run lint`)
71
+ - [ ] Type checking passes (`npm run typecheck`)
72
+ - [ ] The app builds successfully (`npm run build`)
73
+
74
+ ### Pre-merge
75
+
76
+ - [ ] My changes generate no new warnings
77
+ - [ ] Any dependent changes have been merged and published
78
+ - [ ] I have updated the CHANGELOG.md (if applicable)
79
+
80
+ ## Breaking Changes
81
+
82
+ <!-- If this PR introduces breaking changes, describe them here and what users need to do -->
83
+
84
+ N/A
85
+
86
+ ## Additional Notes
87
+
88
+ <!-- Any additional information that reviewers should know -->
89
+
@@ -0,0 +1,70 @@
1
+ # =============================================================================
2
+ # Dependabot Configuration for markupr
3
+ # =============================================================================
4
+ # Low-noise defaults:
5
+ # - Monthly cadence
6
+ # - Tight PR caps
7
+ # - Aggressive grouping (minor/patch + majors grouped)
8
+ # =============================================================================
9
+
10
+ version: 2
11
+
12
+ updates:
13
+ - package-ecosystem: "npm"
14
+ directory: "/"
15
+ schedule:
16
+ interval: "monthly"
17
+ day: "monday"
18
+ time: "06:00"
19
+ timezone: "America/Chicago"
20
+ open-pull-requests-limit: 2
21
+ commit-message:
22
+ prefix: "deps"
23
+ include: "scope"
24
+ labels:
25
+ - "dependencies"
26
+ - "npm"
27
+ allow:
28
+ - dependency-type: "direct"
29
+ groups:
30
+ npm-minor-patch:
31
+ patterns:
32
+ - "*"
33
+ update-types:
34
+ - "minor"
35
+ - "patch"
36
+ npm-major:
37
+ patterns:
38
+ - "*"
39
+ update-types:
40
+ - "major"
41
+ ignore:
42
+ - dependency-name: "electron"
43
+ update-types: ["version-update:semver-major"]
44
+ - dependency-name: "react"
45
+ update-types: ["version-update:semver-major"]
46
+ - dependency-name: "react-dom"
47
+ update-types: ["version-update:semver-major"]
48
+
49
+ - package-ecosystem: "github-actions"
50
+ directory: "/"
51
+ schedule:
52
+ interval: "monthly"
53
+ day: "monday"
54
+ time: "06:00"
55
+ timezone: "America/Chicago"
56
+ open-pull-requests-limit: 1
57
+ commit-message:
58
+ prefix: "ci"
59
+ include: "scope"
60
+ labels:
61
+ - "dependencies"
62
+ - "github-actions"
63
+ groups:
64
+ github-actions-all:
65
+ patterns:
66
+ - "*"
67
+ update-types:
68
+ - "major"
69
+ - "minor"
70
+ - "patch"
@@ -0,0 +1,184 @@
1
+ # =============================================================================
2
+ # markupr CI Pipeline
3
+ # =============================================================================
4
+ # Runs on every push to main and pull request
5
+ # Matrix build for macOS and Windows with comprehensive validation
6
+ # =============================================================================
7
+
8
+ name: CI
9
+
10
+ on:
11
+ push:
12
+ branches: [main]
13
+ pull_request:
14
+ branches: [main]
15
+
16
+ # Cancel in-progress runs for the same branch
17
+ concurrency:
18
+ group: ci-${{ github.ref }}
19
+ cancel-in-progress: true
20
+
21
+ env:
22
+ NODE_VERSION: '20'
23
+
24
+ jobs:
25
+ # ===========================================================================
26
+ # Lint & Type Check (fast feedback)
27
+ # ===========================================================================
28
+ validate:
29
+ name: Lint & Type Check
30
+ runs-on: ubuntu-latest
31
+ steps:
32
+ - name: Checkout repository
33
+ uses: actions/checkout@v6
34
+
35
+ - name: Setup Node.js
36
+ uses: actions/setup-node@v6
37
+ with:
38
+ node-version: ${{ env.NODE_VERSION }}
39
+ cache: 'npm'
40
+
41
+ - name: Install dependencies
42
+ run: npm ci
43
+
44
+ - name: Run ESLint
45
+ run: npm run lint
46
+
47
+ - name: Run TypeScript type check
48
+ run: npm run typecheck
49
+
50
+ - name: Audit production dependencies
51
+ run: npm audit --omit=dev --audit-level=high
52
+
53
+ # ===========================================================================
54
+ # Test Suite
55
+ # ===========================================================================
56
+ test:
57
+ name: Test Suite
58
+ runs-on: ubuntu-latest
59
+ needs: validate
60
+ steps:
61
+ - name: Checkout repository
62
+ uses: actions/checkout@v6
63
+
64
+ - name: Setup Node.js
65
+ uses: actions/setup-node@v6
66
+ with:
67
+ node-version: ${{ env.NODE_VERSION }}
68
+ cache: 'npm'
69
+
70
+ - name: Install dependencies
71
+ run: npm ci
72
+
73
+ - name: Run tests with coverage
74
+ run: npm run test:ci
75
+
76
+ - name: Upload coverage reports
77
+ uses: codecov/codecov-action@v5
78
+ with:
79
+ token: ${{ secrets.CODECOV_TOKEN }}
80
+ files: ./coverage/lcov.info
81
+ fail_ci_if_error: false
82
+ verbose: true
83
+
84
+ # ===========================================================================
85
+ # Build Matrix (macOS & Windows)
86
+ # ===========================================================================
87
+ build:
88
+ name: Build (${{ matrix.os }})
89
+ runs-on: ${{ matrix.os }}
90
+ needs: validate
91
+ strategy:
92
+ fail-fast: false
93
+ matrix:
94
+ os: [macos-latest, windows-latest]
95
+ include:
96
+ - os: macos-latest
97
+ artifact-name: markupr-macos
98
+ build-path: release/*.dmg
99
+ - os: windows-latest
100
+ artifact-name: markupr-windows
101
+ build-path: release/*.exe
102
+
103
+ steps:
104
+ - name: Checkout repository
105
+ uses: actions/checkout@v6
106
+
107
+ - name: Setup Node.js
108
+ uses: actions/setup-node@v6
109
+ with:
110
+ node-version: ${{ env.NODE_VERSION }}
111
+ cache: 'npm'
112
+
113
+ # Cache node_modules for faster builds
114
+ - name: Cache node_modules
115
+ uses: actions/cache@v5
116
+ id: cache-node-modules
117
+ with:
118
+ path: node_modules
119
+ key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
120
+ restore-keys: |
121
+ ${{ runner.os }}-node-
122
+
123
+ - name: Install dependencies
124
+ if: steps.cache-node-modules.outputs.cache-hit != 'true'
125
+ run: npm ci
126
+
127
+ # Cache Electron binaries
128
+ - name: Cache Electron
129
+ uses: actions/cache@v5
130
+ with:
131
+ path: |
132
+ ~/Library/Caches/electron
133
+ ~/AppData/Local/electron/Cache
134
+ ~/.cache/electron
135
+ key: ${{ runner.os }}-electron-${{ hashFiles('package-lock.json') }}
136
+ restore-keys: |
137
+ ${{ runner.os }}-electron-
138
+
139
+ - name: Build application
140
+ run: npm run build
141
+
142
+ # Build unsigned packages for CI validation (--publish never to skip GH_TOKEN requirement)
143
+ - name: Package application (unsigned)
144
+ shell: bash
145
+ continue-on-error: ${{ matrix.os == 'windows-latest' }}
146
+ run: |
147
+ if [ "${{ matrix.os }}" = "macos-latest" ]; then
148
+ CSC_IDENTITY_AUTO_DISCOVERY=false npx electron-builder --mac --publish never --config electron-builder.yml
149
+ else
150
+ npx electron-builder --win --publish never --config electron-builder.yml
151
+ fi
152
+ env:
153
+ CSC_IDENTITY_AUTO_DISCOVERY: false
154
+
155
+ - name: Upload build artifacts
156
+ uses: actions/upload-artifact@v6
157
+ with:
158
+ name: ${{ matrix.artifact-name }}
159
+ path: |
160
+ release/*.dmg
161
+ release/*.zip
162
+ release/*.exe
163
+ release/*.msi
164
+ if-no-files-found: warn
165
+ retention-days: 7
166
+
167
+ # ===========================================================================
168
+ # Build Status Summary
169
+ # ===========================================================================
170
+ ci-success:
171
+ name: CI Success
172
+ runs-on: ubuntu-latest
173
+ needs: [validate, test, build]
174
+ if: always()
175
+ steps:
176
+ - name: Check all jobs passed
177
+ run: |
178
+ if [ "${{ needs.validate.result }}" != "success" ] || \
179
+ [ "${{ needs.test.result }}" != "success" ] || \
180
+ [ "${{ needs.build.result }}" != "success" ]; then
181
+ echo "One or more jobs failed"
182
+ exit 1
183
+ fi
184
+ echo "All CI jobs passed successfully!"
@@ -0,0 +1,134 @@
1
+ # GitHub Pages deployment workflow for markupr landing page
2
+ # Automatically deploys site/ to GitHub Pages on push to main
3
+
4
+ name: Deploy Landing Page
5
+
6
+ on:
7
+ push:
8
+ branches:
9
+ - main
10
+ paths:
11
+ - 'site/**'
12
+ - '.github/workflows/deploy-landing.yml'
13
+ workflow_dispatch:
14
+
15
+ # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
16
+ permissions:
17
+ contents: read
18
+ pages: write
19
+ id-token: write
20
+
21
+ # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
22
+ concurrency:
23
+ group: "pages"
24
+ cancel-in-progress: false
25
+
26
+ jobs:
27
+ build:
28
+ runs-on: ubuntu-latest
29
+ steps:
30
+ - name: Checkout
31
+ uses: actions/checkout@v6
32
+
33
+ - name: Setup Pages
34
+ uses: actions/configure-pages@v5
35
+
36
+ - name: Build static site
37
+ run: |
38
+ mkdir -p _site
39
+
40
+ # Copy current landing page source
41
+ cp -r site/* _site/
42
+
43
+ # Generate sitemap
44
+ cat > _site/sitemap.xml << 'EOF'
45
+ <?xml version="1.0" encoding="UTF-8"?>
46
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
47
+ <url>
48
+ <loc>https://markupr.com/</loc>
49
+ <lastmod>$(date +%Y-%m-%d)</lastmod>
50
+ <changefreq>weekly</changefreq>
51
+ <priority>1.0</priority>
52
+ </url>
53
+ </urlset>
54
+ EOF
55
+
56
+ # Generate robots.txt
57
+ cat > _site/robots.txt << 'EOF'
58
+ User-agent: *
59
+ Allow: /
60
+ Sitemap: https://markupr.com/sitemap.xml
61
+ EOF
62
+
63
+ # Generate 404 page
64
+ cat > _site/404.html << 'EOF'
65
+ <!DOCTYPE html>
66
+ <html lang="en">
67
+ <head>
68
+ <meta charset="UTF-8">
69
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
70
+ <title>404 - Page Not Found | markupr</title>
71
+ <style>
72
+ * { margin: 0; padding: 0; box-sizing: border-box; }
73
+ body {
74
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
75
+ background: #0F0F1A;
76
+ color: #E2E8F0;
77
+ min-height: 100vh;
78
+ display: flex;
79
+ align-items: center;
80
+ justify-content: center;
81
+ text-align: center;
82
+ padding: 2rem;
83
+ }
84
+ .container { max-width: 500px; }
85
+ h1 { font-size: 6rem; font-weight: 800; color: #6366F1; margin-bottom: 1rem; }
86
+ h2 { font-size: 1.5rem; margin-bottom: 1rem; }
87
+ p { color: #94A3B8; margin-bottom: 2rem; }
88
+ a {
89
+ display: inline-block;
90
+ padding: 1rem 2rem;
91
+ background: linear-gradient(135deg, #6366F1 0%, #8B5CF6 100%);
92
+ color: white;
93
+ text-decoration: none;
94
+ border-radius: 0.5rem;
95
+ font-weight: 600;
96
+ }
97
+ a:hover { transform: translateY(-2px); box-shadow: 0 4px 14px rgba(99, 102, 241, 0.4); }
98
+ </style>
99
+ </head>
100
+ <body>
101
+ <div class="container">
102
+ <h1>404</h1>
103
+ <h2>Page Not Found</h2>
104
+ <p>The page you're looking for doesn't exist or has been moved.</p>
105
+ <a href="/">Back to Home</a>
106
+ </div>
107
+ </body>
108
+ </html>
109
+ EOF
110
+
111
+ echo "Build completed successfully"
112
+ ls -la _site/
113
+
114
+ - name: Upload artifact
115
+ uses: actions/upload-pages-artifact@v4
116
+ with:
117
+ path: '_site'
118
+
119
+ deploy:
120
+ environment:
121
+ name: github-pages
122
+ url: ${{ steps.deployment.outputs.page_url }}
123
+ runs-on: ubuntu-latest
124
+ needs: build
125
+ steps:
126
+ - name: Deploy to GitHub Pages
127
+ id: deployment
128
+ uses: actions/deploy-pages@v4
129
+
130
+ - name: Output deployment URL
131
+ run: |
132
+ echo "## Deployment Successful! 🚀" >> $GITHUB_STEP_SUMMARY
133
+ echo "" >> $GITHUB_STEP_SUMMARY
134
+ echo "Landing page deployed to: ${{ steps.deployment.outputs.page_url }}" >> $GITHUB_STEP_SUMMARY