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,508 @@
1
+ # Development Guide
2
+
3
+ This guide covers everything you need to know to develop markupr.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Prerequisites](#prerequisites)
8
+ - [Development Setup](#development-setup)
9
+ - [Project Structure](#project-structure)
10
+ - [Build System](#build-system)
11
+ - [Testing](#testing)
12
+ - [Debug Mode](#debug-mode)
13
+ - [Code Style](#code-style)
14
+ - [Making Changes](#making-changes)
15
+
16
+ ## Prerequisites
17
+
18
+ ### Required Software
19
+
20
+ - **Node.js**: 18.x or later
21
+ - **npm**: 9.x or later (comes with Node.js)
22
+ - **Git**: For version control
23
+
24
+ ### Recommended
25
+
26
+ - **VS Code**: With recommended extensions
27
+ - **macOS**: For testing macOS-specific features
28
+ - **Windows (VM or machine)**: For testing Windows builds
29
+
30
+ ### VS Code Extensions
31
+
32
+ Create `.vscode/extensions.json`:
33
+
34
+ ```json
35
+ {
36
+ "recommendations": [
37
+ "dbaeumer.vscode-eslint",
38
+ "esbenp.prettier-vscode",
39
+ "bradlc.vscode-tailwindcss",
40
+ "ms-vscode.vscode-typescript-next"
41
+ ]
42
+ }
43
+ ```
44
+
45
+ ## Development Setup
46
+
47
+ ### 1. Clone the Repository
48
+
49
+ ```bash
50
+ git clone https://github.com/eddiesanjuan/markupr.git
51
+ cd markupr
52
+ ```
53
+
54
+ ### 2. Install Dependencies
55
+
56
+ ```bash
57
+ # npm
58
+ npm install
59
+
60
+ # bun
61
+ bun install
62
+ ```
63
+
64
+ This installs:
65
+ - Electron and electron-vite
66
+ - React and React DOM
67
+ - TypeScript
68
+ - OpenAI SDK
69
+ - All other dependencies
70
+
71
+ ### 3. Configure Environment
72
+
73
+ Create a `.env.local` file (optional, for development):
74
+
75
+ ```bash
76
+ # Development API key (optional)
77
+ DEEPGRAM_API_KEY=your_dev_api_key
78
+
79
+ # Enable additional logging
80
+ DEBUG=markupr:*
81
+ ```
82
+
83
+ ### 4. Start Development Server
84
+
85
+ ```bash
86
+ # npm
87
+ npm run dev
88
+
89
+ # bun
90
+ bun run dev
91
+ ```
92
+
93
+ This starts:
94
+ - Vite dev server for the renderer (hot reload)
95
+ - Electron in development mode
96
+ - DevTools automatically opens
97
+
98
+ ### 5. Verify Setup
99
+
100
+ 1. The markupr window should open
101
+ 2. Tray icon should appear
102
+ 3. Press `Cmd+Shift+F` (or `Ctrl+Shift+F`)
103
+ 4. If you see the window selector, setup is complete!
104
+
105
+ ## Project Structure
106
+
107
+ ```
108
+ markupr/
109
+ ├── src/
110
+ │ ├── main/ # Electron main process
111
+ │ │ ├── index.ts # Entry point, orchestration
112
+ │ │ ├── SessionController.ts # Session state machine
113
+ │ │ ├── HotkeyManager.ts # Global hotkey registration
114
+ │ │ ├── TrayManager.ts # System tray management
115
+ │ │ ├── MenuManager.ts # Native menu bar
116
+ │ │ ├── AutoUpdater.ts # Auto-update functionality
117
+ │ │ ├── CrashRecovery.ts # Session recovery
118
+ │ │ ├── ErrorHandler.ts # Error handling
119
+ │ │ ├── capture/ # Screen capture
120
+ │ │ │ ├── ScreenCapture.ts
121
+ │ │ │ └── IntelligentCapture.ts
122
+ │ │ ├── audio/ # Audio capture
123
+ │ │ │ └── AudioCapture.ts
124
+ │ │ ├── transcription/ # OpenAI integration
125
+ │ │ │ └── TranscriptionService.ts
126
+ │ │ ├── output/ # Document generation
127
+ │ │ │ ├── MarkdownGenerator.ts
128
+ │ │ │ ├── ExportService.ts
129
+ │ │ │ ├── FileManager.ts
130
+ │ │ │ └── ClipboardService.ts
131
+ │ │ ├── analysis/ # AI categorization
132
+ │ │ │ ├── FeedbackAnalyzer.ts
133
+ │ │ │ └── ClarificationGenerator.ts
134
+ │ │ └── settings/ # Settings management
135
+ │ │ └── SettingsManager.ts
136
+ │ │
137
+ │ ├── renderer/ # React UI
138
+ │ │ ├── main.tsx # React entry point
139
+ │ │ ├── App.tsx # Main component
140
+ │ │ ├── components/ # UI components
141
+ │ │ │ ├── RecordingOverlay.tsx
142
+ │ │ │ ├── SettingsPanel.tsx
143
+ │ │ │ ├── SessionReview.tsx
144
+ │ │ │ ├── WindowSelector.tsx
145
+ │ │ │ ├── KeyboardShortcuts.tsx
146
+ │ │ │ ├── ExportDialog.tsx
147
+ │ │ │ └── ...
148
+ │ │ ├── hooks/ # React hooks
149
+ │ │ │ ├── useAnimation.tsx
150
+ │ │ │ └── useTheme.ts
151
+ │ │ ├── styles/ # CSS and themes
152
+ │ │ │ ├── globals.css
153
+ │ │ │ ├── animations.css
154
+ │ │ │ └── theme.ts
155
+ │ │ └── audio/ # Renderer audio capture
156
+ │ │ └── AudioCaptureRenderer.ts
157
+ │ │
158
+ │ ├── preload/ # Context bridge
159
+ │ │ └── index.ts # Exposes API to renderer
160
+ │ │
161
+ │ └── shared/ # Shared types
162
+ │ └── types.ts # All TypeScript interfaces
163
+
164
+ ├── tests/ # Test files
165
+ │ └── output.test.ts
166
+
167
+ ├── docs/ # Documentation
168
+
169
+ ├── electron-builder.yml # Build configuration
170
+ ├── tsconfig.json # TypeScript config
171
+ ├── vite.config.ts # Vite configuration
172
+ ├── tailwind.config.js # Tailwind CSS config
173
+ └── package.json
174
+ ```
175
+
176
+ ### Key Files
177
+
178
+ | File | Purpose |
179
+ |------|---------|
180
+ | `src/main/index.ts` | Main process entry, orchestrates all services |
181
+ | `src/preload/index.ts` | Context bridge, defines renderer API |
182
+ | `src/shared/types.ts` | All TypeScript types and IPC channels |
183
+ | `src/renderer/App.tsx` | Main React component |
184
+
185
+ ## Build System
186
+
187
+ markupr uses [electron-vite](https://electron-vite.org/) for building.
188
+
189
+ ### Configuration Files
190
+
191
+ - `electron.vite.config.ts`: Build configuration for main, preload, renderer
192
+ - `electron-builder.yml`: Packaging configuration
193
+
194
+ ### Build Commands
195
+
196
+ ```bash
197
+ # Development build
198
+ npm run build
199
+
200
+ # Production build
201
+ npm run build -- --mode production
202
+
203
+ # Package for current platform
204
+ npm run package
205
+
206
+ # Package for specific platforms
207
+ npm run package:mac
208
+ npm run package:win
209
+ npm run package:linux
210
+
211
+ # Package macOS without code signing (development)
212
+ npm run package:mac:unsigned
213
+
214
+ # Build and release
215
+ npm run release
216
+ ```
217
+
218
+ ### Build Output
219
+
220
+ ```
221
+ dist/
222
+ ├── main/ # Compiled main process
223
+ ├── preload/ # Compiled preload script
224
+ └── renderer/ # Compiled React app
225
+
226
+ release/ # Packaged applications
227
+ ├── markupr-0.4.0.dmg
228
+ ├── markupr-0.4.0-arm64.dmg
229
+ ├── markupr Setup 0.4.0.exe
230
+ └── markupr_0.4.0_amd64.deb
231
+ ```
232
+
233
+ ## Testing
234
+
235
+ markupr uses [Vitest](https://vitest.dev/) for testing.
236
+
237
+ ### Running Tests
238
+
239
+ ```bash
240
+ # Run all tests
241
+ npm test
242
+
243
+ # Run tests in watch mode
244
+ npm run test:watch
245
+
246
+ # Run tests with UI
247
+ npm run test:ui
248
+
249
+ # Run tests with coverage
250
+ npm run test:coverage
251
+
252
+ # Run specific test file
253
+ npm test -- tests/output.test.ts
254
+ ```
255
+
256
+ ### Test Structure
257
+
258
+ ```
259
+ tests/
260
+ ├── unit/ # Unit tests for individual modules
261
+ ├── integration/ # Integration tests
262
+ └── e2e/ # End-to-end tests
263
+ ```
264
+
265
+ ### Writing Tests
266
+
267
+ ```typescript
268
+ // tests/output.test.ts
269
+ import { describe, it, expect } from 'vitest';
270
+
271
+ describe('OutputManager', () => {
272
+ it('should generate markdown from a session', () => {
273
+ const session = createMockSession();
274
+ const output = outputManager.generateMarkdown(session);
275
+
276
+ expect(output.markdown).toContain('# Feedback Session');
277
+ expect(output.screenshots).toHaveLength(1);
278
+ });
279
+ });
280
+ ```
281
+
282
+ ### Mocking Electron APIs
283
+
284
+ Since many features rely on Electron APIs, use mocks:
285
+
286
+ ```typescript
287
+ import { vi } from 'vitest';
288
+
289
+ // Mock clipboard
290
+ vi.mock('electron', () => ({
291
+ clipboard: {
292
+ writeText: vi.fn(),
293
+ },
294
+ }));
295
+ ```
296
+
297
+ ## Debug Mode
298
+
299
+ ### Enabling Debug Mode
300
+
301
+ 1. Open Settings (`Cmd+,` or `Ctrl+,`)
302
+ 2. Go to Advanced > Debug Mode
303
+ 3. Enable the toggle
304
+
305
+ Or set in environment:
306
+
307
+ ```bash
308
+ DEBUG=markupr:* npm run dev
309
+ ```
310
+
311
+ ### DevTools
312
+
313
+ In development mode, DevTools opens automatically. In production:
314
+
315
+ 1. Open from View menu (if enabled)
316
+ 2. Or use `Cmd+Option+I` (macOS) / `Ctrl+Shift+I` (Windows)
317
+
318
+ ### Logging
319
+
320
+ Main process logs appear in the terminal:
321
+
322
+ ```
323
+ [Main] App ready, starting initialization...
324
+ [Main] Settings loaded
325
+ [Main] Session controller initialized
326
+ [Main] Transcription service configured
327
+ [Main] markupr initialization complete
328
+ ```
329
+
330
+ Renderer logs appear in DevTools console.
331
+
332
+ ### Debug Environment Variables
333
+
334
+ ```bash
335
+ # Enable all debug output
336
+ DEBUG=markupr:*
337
+
338
+ # Enable specific modules
339
+ DEBUG=markupr:transcription,markupr:capture
340
+
341
+ # Verbose Electron logs
342
+ ELECTRON_ENABLE_LOGGING=1
343
+ ```
344
+
345
+ ## Code Style
346
+
347
+ ### TypeScript
348
+
349
+ - Use explicit types for function parameters and returns
350
+ - Prefer interfaces over types for objects
351
+ - Use `const assertions` for literal types
352
+
353
+ ```typescript
354
+ // Good
355
+ function createSession(sourceId: string): Session {
356
+ return { id: generateId(), sourceId };
357
+ }
358
+
359
+ // Avoid
360
+ function createSession(sourceId) {
361
+ return { id: generateId(), sourceId };
362
+ }
363
+ ```
364
+
365
+ ### React
366
+
367
+ - Use functional components with hooks
368
+ - Prefer named exports
369
+ - Keep components focused and small
370
+
371
+ ```tsx
372
+ // Good
373
+ export function SessionStatus({ state }: SessionStatusProps) {
374
+ return <div className="status">{state}</div>;
375
+ }
376
+
377
+ // Avoid
378
+ export default class SessionStatus extends Component {
379
+ render() {
380
+ return <div className="status">{this.props.state}</div>;
381
+ }
382
+ }
383
+ ```
384
+
385
+ ### CSS
386
+
387
+ - Use Tailwind CSS utilities
388
+ - Avoid custom CSS when Tailwind suffices
389
+ - Use CSS variables for theming
390
+
391
+ ```tsx
392
+ // Good
393
+ <div className="bg-gray-900 text-white p-4 rounded-lg">
394
+
395
+ // Avoid
396
+ <div style={{ backgroundColor: '#111827', color: 'white', padding: 16 }}>
397
+ ```
398
+
399
+ ### Linting
400
+
401
+ ```bash
402
+ # Check for issues
403
+ npm run lint
404
+
405
+ # Auto-fix issues
406
+ npm run lint:fix
407
+
408
+ # Type checking
409
+ npm run typecheck
410
+ ```
411
+
412
+ ### ESLint Configuration
413
+
414
+ The project uses:
415
+ - `@typescript-eslint/eslint-plugin`
416
+ - `eslint-plugin-react`
417
+ - `eslint-plugin-react-hooks`
418
+
419
+ ## Making Changes
420
+
421
+ ### 1. Create a Branch
422
+
423
+ ```bash
424
+ git checkout -b feature/my-feature
425
+ ```
426
+
427
+ ### 2. Make Changes
428
+
429
+ Follow the code style guidelines.
430
+
431
+ ### 3. Test Locally
432
+
433
+ ```bash
434
+ npm test
435
+ npm run lint
436
+ npm run typecheck
437
+ ```
438
+
439
+ ### 4. Test the Build
440
+
441
+ ```bash
442
+ npm run build
443
+ npm run package
444
+ ```
445
+
446
+ ### 5. Commit
447
+
448
+ Follow conventional commits:
449
+
450
+ ```bash
451
+ git commit -m "feat: add new export format"
452
+ git commit -m "fix: resolve screenshot timing issue"
453
+ git commit -m "docs: update API documentation"
454
+ ```
455
+
456
+ ### 6. Push and Create PR
457
+
458
+ ```bash
459
+ git push origin feature/my-feature
460
+ ```
461
+
462
+ Then create a Pull Request on GitHub.
463
+
464
+ ### Common Changes
465
+
466
+ #### Adding a New Setting
467
+
468
+ 1. Add to `AppSettings` in `src/shared/types.ts`
469
+ 2. Add default in `DEFAULT_SETTINGS`
470
+ 3. Add UI in `src/renderer/components/SettingsPanel.tsx`
471
+ 4. Handle in `SettingsManager` if special logic needed
472
+
473
+ #### Adding a New IPC Channel
474
+
475
+ 1. Add channel name to `IPC_CHANNELS` in `src/shared/types.ts`
476
+ 2. Add handler in `src/main/index.ts`
477
+ 3. Add API method in `src/preload/index.ts`
478
+ 4. Add types for payloads
479
+
480
+ #### Adding a New Component
481
+
482
+ 1. Create file in `src/renderer/components/`
483
+ 2. Export from `src/renderer/components/index.ts`
484
+ 3. Import where needed
485
+ 4. Add any new hooks to `src/renderer/hooks/`
486
+
487
+ ### Troubleshooting Development
488
+
489
+ **Hot reload not working**:
490
+ - Check if Vite server is running
491
+ - Clear `.vite` cache folder
492
+ - Restart `npm run dev`
493
+
494
+ **TypeScript errors**:
495
+ - Run `npm run typecheck`
496
+ - Ensure types are exported from shared
497
+ - Check for circular dependencies
498
+
499
+ **Electron errors**:
500
+ - Check main process terminal output
501
+ - Look for native module issues
502
+ - Rebuild native modules: `npm run postinstall`
503
+
504
+ **Native modules failing**:
505
+ ```bash
506
+ # Rebuild for Electron
507
+ npx electron-rebuild
508
+ ```