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.
- package/.claude/commands/review-feedback.md +47 -0
- package/.eslintrc.json +35 -0
- package/.github/CODEOWNERS +16 -0
- package/.github/FUNDING.yml +1 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +56 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +54 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +89 -0
- package/.github/dependabot.yml +70 -0
- package/.github/workflows/ci.yml +184 -0
- package/.github/workflows/deploy-landing.yml +134 -0
- package/.github/workflows/nightly.yml +288 -0
- package/.github/workflows/release.yml +318 -0
- package/CHANGELOG.md +127 -0
- package/CLAUDE.md +137 -0
- package/CODE_OF_CONDUCT.md +9 -0
- package/CONTRIBUTING.md +390 -0
- package/LICENSE +21 -0
- package/PRODUCT_VISION.md +277 -0
- package/README.md +517 -0
- package/SECURITY.md +51 -0
- package/SIGNING_INSTRUCTIONS.md +284 -0
- package/assets/DMG_BACKGROUND_INSTRUCTIONS.md +130 -0
- package/assets/svg-source/dmg-background.svg +70 -0
- package/assets/svg-source/icon.svg +20 -0
- package/assets/svg-source/tray-icon-processing.svg +7 -0
- package/assets/svg-source/tray-icon-recording.svg +7 -0
- package/assets/svg-source/tray-icon.svg +6 -0
- package/assets/tray-complete.png +0 -0
- package/assets/tray-complete@2x.png +0 -0
- package/assets/tray-completeTemplate.png +0 -0
- package/assets/tray-completeTemplate@2x.png +0 -0
- package/assets/tray-error.png +0 -0
- package/assets/tray-error@2x.png +0 -0
- package/assets/tray-errorTemplate.png +0 -0
- package/assets/tray-errorTemplate@2x.png +0 -0
- package/assets/tray-icon-processing.png +0 -0
- package/assets/tray-icon-processing@2x.png +0 -0
- package/assets/tray-icon-processingTemplate.png +0 -0
- package/assets/tray-icon-processingTemplate@2x.png +0 -0
- package/assets/tray-icon-recording.png +0 -0
- package/assets/tray-icon-recording@2x.png +0 -0
- package/assets/tray-icon-recordingTemplate.png +0 -0
- package/assets/tray-icon-recordingTemplate@2x.png +0 -0
- package/assets/tray-icon.png +0 -0
- package/assets/tray-icon@2x.png +0 -0
- package/assets/tray-iconTemplate.png +0 -0
- package/assets/tray-iconTemplate@2x.png +0 -0
- package/assets/tray-idle.png +0 -0
- package/assets/tray-idle@2x.png +0 -0
- package/assets/tray-idleTemplate.png +0 -0
- package/assets/tray-idleTemplate@2x.png +0 -0
- package/assets/tray-processing-0.png +0 -0
- package/assets/tray-processing-0@2x.png +0 -0
- package/assets/tray-processing-0Template.png +0 -0
- package/assets/tray-processing-0Template@2x.png +0 -0
- package/assets/tray-processing-1.png +0 -0
- package/assets/tray-processing-1@2x.png +0 -0
- package/assets/tray-processing-1Template.png +0 -0
- package/assets/tray-processing-1Template@2x.png +0 -0
- package/assets/tray-processing-2.png +0 -0
- package/assets/tray-processing-2@2x.png +0 -0
- package/assets/tray-processing-2Template.png +0 -0
- package/assets/tray-processing-2Template@2x.png +0 -0
- package/assets/tray-processing-3.png +0 -0
- package/assets/tray-processing-3@2x.png +0 -0
- package/assets/tray-processing-3Template.png +0 -0
- package/assets/tray-processing-3Template@2x.png +0 -0
- package/assets/tray-processing.png +0 -0
- package/assets/tray-processing@2x.png +0 -0
- package/assets/tray-processingTemplate.png +0 -0
- package/assets/tray-processingTemplate@2x.png +0 -0
- package/assets/tray-recording.png +0 -0
- package/assets/tray-recording@2x.png +0 -0
- package/assets/tray-recordingTemplate.png +0 -0
- package/assets/tray-recordingTemplate@2x.png +0 -0
- package/build/DMG_BACKGROUND_SPEC.md +50 -0
- package/build/dmg-background.png +0 -0
- package/build/dmg-background@2x.png +0 -0
- package/build/entitlements.mac.inherit.plist +27 -0
- package/build/entitlements.mac.plist +41 -0
- package/build/favicon-16.png +0 -0
- package/build/favicon-180.png +0 -0
- package/build/favicon-192.png +0 -0
- package/build/favicon-32.png +0 -0
- package/build/favicon-48.png +0 -0
- package/build/favicon-512.png +0 -0
- package/build/favicon-64.png +0 -0
- package/build/icon-128.png +0 -0
- package/build/icon-16.png +0 -0
- package/build/icon-24.png +0 -0
- package/build/icon-256.png +0 -0
- package/build/icon-32.png +0 -0
- package/build/icon-48.png +0 -0
- package/build/icon-64.png +0 -0
- package/build/icon.icns +0 -0
- package/build/icon.ico +0 -0
- package/build/icon.iconset/icon_128x128.png +0 -0
- package/build/icon.iconset/icon_128x128@2x.png +0 -0
- package/build/icon.iconset/icon_16x16.png +0 -0
- package/build/icon.iconset/icon_16x16@2x.png +0 -0
- package/build/icon.iconset/icon_256x256.png +0 -0
- package/build/icon.iconset/icon_256x256@2x.png +0 -0
- package/build/icon.iconset/icon_32x32.png +0 -0
- package/build/icon.iconset/icon_32x32@2x.png +0 -0
- package/build/icon.iconset/icon_512x512.png +0 -0
- package/build/icon.iconset/icon_512x512@2x.png +0 -0
- package/build/icon.png +0 -0
- package/build/installer-header.bmp +0 -0
- package/build/installer-header.png +0 -0
- package/build/installer-sidebar.bmp +0 -0
- package/build/installer-sidebar.png +0 -0
- package/build/installer.nsh +45 -0
- package/build/overlay-processing.png +0 -0
- package/build/overlay-recording.png +0 -0
- package/build/toolbar-record.png +0 -0
- package/build/toolbar-screenshot.png +0 -0
- package/build/toolbar-settings.png +0 -0
- package/build/toolbar-stop.png +0 -0
- package/dist/main/index.mjs +12612 -0
- package/dist/preload/index.mjs +907 -0
- package/dist/renderer/assets/index-CCmUjl9K.js +19495 -0
- package/dist/renderer/assets/index-CUqz_Gs6.css +2270 -0
- package/dist/renderer/index.html +27 -0
- package/docs/AI_AGENT_QUICKSTART.md +42 -0
- package/docs/AI_PIPELINE_DESIGN.md +595 -0
- package/docs/API.md +514 -0
- package/docs/ARCHITECTURE.md +460 -0
- package/docs/CONFIGURATION.md +336 -0
- package/docs/DEVELOPMENT.md +508 -0
- package/docs/EXPORT_FORMATS.md +451 -0
- package/docs/GETTING_STARTED.md +236 -0
- package/docs/KEYBOARD_SHORTCUTS.md +334 -0
- package/docs/TROUBLESHOOTING.md +418 -0
- package/docs/landing/index.html +672 -0
- package/docs/landing/script.js +342 -0
- package/docs/landing/styles.css +1543 -0
- package/electron-builder.yml +140 -0
- package/electron.vite.config.ts +63 -0
- package/package.json +108 -0
- package/railway.json +12 -0
- package/scripts/build.mjs +51 -0
- package/scripts/generate-icons.mjs +314 -0
- package/scripts/generate-installer-images.cjs +253 -0
- package/scripts/generate-tray-icons.mjs +258 -0
- package/scripts/notarize.cjs +180 -0
- package/scripts/one-click-clean-test.sh +147 -0
- package/scripts/postinstall.mjs +36 -0
- package/scripts/setup-markupr.sh +55 -0
- package/setup +17 -0
- package/site/index.html +1835 -0
- package/site/package.json +11 -0
- package/site/railway.json +12 -0
- package/site/server.js +31 -0
- package/src/main/AutoUpdater.ts +392 -0
- package/src/main/CrashRecovery.ts +655 -0
- package/src/main/ErrorHandler.ts +703 -0
- package/src/main/HotkeyManager.ts +399 -0
- package/src/main/MenuManager.ts +529 -0
- package/src/main/PermissionManager.ts +420 -0
- package/src/main/SessionController.ts +1465 -0
- package/src/main/TrayManager.ts +540 -0
- package/src/main/ai/AIPipelineManager.ts +199 -0
- package/src/main/ai/ClaudeAnalyzer.ts +339 -0
- package/src/main/ai/ImageOptimizer.ts +176 -0
- package/src/main/ai/StructuredMarkdownBuilder.ts +379 -0
- package/src/main/ai/index.ts +16 -0
- package/src/main/ai/types.ts +258 -0
- package/src/main/analysis/ClarificationGenerator.ts +385 -0
- package/src/main/analysis/FeedbackAnalyzer.ts +531 -0
- package/src/main/analysis/index.ts +19 -0
- package/src/main/audio/AudioCapture.ts +978 -0
- package/src/main/audio/audioUtils.ts +100 -0
- package/src/main/audio/index.ts +20 -0
- package/src/main/capture/index.ts +1 -0
- package/src/main/index.ts +1693 -0
- package/src/main/ipc/captureHandlers.ts +272 -0
- package/src/main/ipc/index.ts +45 -0
- package/src/main/ipc/outputHandlers.ts +302 -0
- package/src/main/ipc/sessionHandlers.ts +56 -0
- package/src/main/ipc/settingsHandlers.ts +471 -0
- package/src/main/ipc/types.ts +56 -0
- package/src/main/ipc/windowHandlers.ts +277 -0
- package/src/main/output/ClipboardService.ts +369 -0
- package/src/main/output/ExportService.ts +539 -0
- package/src/main/output/FileManager.ts +416 -0
- package/src/main/output/MarkdownGenerator.ts +791 -0
- package/src/main/output/MarkdownPatcher.ts +299 -0
- package/src/main/output/index.ts +186 -0
- package/src/main/output/sessionAdapter.ts +207 -0
- package/src/main/output/templates/html-template.ts +553 -0
- package/src/main/pipeline/FrameExtractor.ts +330 -0
- package/src/main/pipeline/PostProcessor.ts +399 -0
- package/src/main/pipeline/TranscriptAnalyzer.ts +226 -0
- package/src/main/pipeline/index.ts +36 -0
- package/src/main/platform/WindowsTaskbar.ts +600 -0
- package/src/main/platform/index.ts +16 -0
- package/src/main/settings/SettingsManager.ts +730 -0
- package/src/main/settings/index.ts +19 -0
- package/src/main/transcription/ModelDownloadManager.ts +494 -0
- package/src/main/transcription/TierManager.ts +219 -0
- package/src/main/transcription/TranscriptionRecoveryService.ts +340 -0
- package/src/main/transcription/WhisperService.ts +748 -0
- package/src/main/transcription/index.ts +56 -0
- package/src/main/transcription/types.ts +135 -0
- package/src/main/windows/PopoverManager.ts +284 -0
- package/src/main/windows/TaskbarIntegration.ts +452 -0
- package/src/main/windows/index.ts +23 -0
- package/src/preload/index.ts +1047 -0
- package/src/renderer/App.tsx +515 -0
- package/src/renderer/AppWrapper.tsx +28 -0
- package/src/renderer/assets/logo-dark.svg +7 -0
- package/src/renderer/assets/logo.svg +7 -0
- package/src/renderer/audio/AudioCaptureRenderer.ts +454 -0
- package/src/renderer/capture/ScreenRecordingRenderer.ts +492 -0
- package/src/renderer/components/AnnotationOverlay.tsx +836 -0
- package/src/renderer/components/AudioWaveform.tsx +811 -0
- package/src/renderer/components/ClarificationQuestions.tsx +656 -0
- package/src/renderer/components/CountdownTimer.tsx +495 -0
- package/src/renderer/components/CrashRecoveryDialog.tsx +632 -0
- package/src/renderer/components/DonateButton.tsx +127 -0
- package/src/renderer/components/ErrorBoundary.tsx +308 -0
- package/src/renderer/components/ExportDialog.tsx +872 -0
- package/src/renderer/components/HotkeyHint.tsx +261 -0
- package/src/renderer/components/KeyboardShortcuts.tsx +787 -0
- package/src/renderer/components/ModelDownloadDialog.tsx +844 -0
- package/src/renderer/components/Onboarding.tsx +1830 -0
- package/src/renderer/components/ProcessingOverlay.tsx +157 -0
- package/src/renderer/components/RecordingOverlay.tsx +423 -0
- package/src/renderer/components/SessionHistory.tsx +1746 -0
- package/src/renderer/components/SessionReview.tsx +1321 -0
- package/src/renderer/components/SettingsPanel.tsx +217 -0
- package/src/renderer/components/Skeleton.tsx +347 -0
- package/src/renderer/components/StatusIndicator.tsx +86 -0
- package/src/renderer/components/ThemeProvider.tsx +429 -0
- package/src/renderer/components/Tooltip.tsx +370 -0
- package/src/renderer/components/TranscriptionPreview.tsx +183 -0
- package/src/renderer/components/TranscriptionTierSelector.tsx +640 -0
- package/src/renderer/components/UpdateNotification.tsx +377 -0
- package/src/renderer/components/WindowSelector.tsx +947 -0
- package/src/renderer/components/index.ts +99 -0
- package/src/renderer/components/primitives/ApiKeyInput.tsx +98 -0
- package/src/renderer/components/primitives/ColorPicker.tsx +65 -0
- package/src/renderer/components/primitives/DangerButton.tsx +45 -0
- package/src/renderer/components/primitives/DirectoryPicker.tsx +41 -0
- package/src/renderer/components/primitives/Dropdown.tsx +34 -0
- package/src/renderer/components/primitives/KeyRecorder.tsx +117 -0
- package/src/renderer/components/primitives/SettingsSection.tsx +32 -0
- package/src/renderer/components/primitives/Slider.tsx +43 -0
- package/src/renderer/components/primitives/Toggle.tsx +36 -0
- package/src/renderer/components/primitives/index.ts +10 -0
- package/src/renderer/components/settings/AdvancedTab.tsx +174 -0
- package/src/renderer/components/settings/AppearanceTab.tsx +77 -0
- package/src/renderer/components/settings/GeneralTab.tsx +40 -0
- package/src/renderer/components/settings/HotkeysTab.tsx +79 -0
- package/src/renderer/components/settings/RecordingTab.tsx +84 -0
- package/src/renderer/components/settings/index.ts +9 -0
- package/src/renderer/components/settings/settingsStyles.ts +673 -0
- package/src/renderer/components/settings/tabConfig.tsx +85 -0
- package/src/renderer/components/settings/useSettingsPanel.ts +447 -0
- package/src/renderer/contexts/ProcessingContext.tsx +227 -0
- package/src/renderer/contexts/RecordingContext.tsx +683 -0
- package/src/renderer/contexts/UIContext.tsx +326 -0
- package/src/renderer/contexts/index.ts +24 -0
- package/src/renderer/donateMessages.ts +69 -0
- package/src/renderer/hooks/index.ts +75 -0
- package/src/renderer/hooks/useAnimation.tsx +544 -0
- package/src/renderer/hooks/useTheme.ts +313 -0
- package/src/renderer/index.html +26 -0
- package/src/renderer/main.tsx +52 -0
- package/src/renderer/styles/animations.css +1093 -0
- package/src/renderer/styles/app-shell.css +662 -0
- package/src/renderer/styles/globals.css +515 -0
- package/src/renderer/styles/theme.ts +578 -0
- package/src/renderer/types/electron.d.ts +385 -0
- package/src/shared/hotkeys.ts +283 -0
- package/src/shared/types.ts +809 -0
- package/tests/clipboard.test.ts +228 -0
- package/tests/e2e/criticalPaths.test.ts +594 -0
- package/tests/feedbackAnalyzer.test.ts +303 -0
- package/tests/integration/sessionFlow.test.ts +583 -0
- package/tests/markdownGenerator.test.ts +418 -0
- package/tests/output.test.ts +96 -0
- package/tests/setup.ts +486 -0
- package/tests/unit/appIntegration.test.ts +676 -0
- package/tests/unit/appViewState.test.ts +281 -0
- package/tests/unit/audioIpcChannels.test.ts +17 -0
- package/tests/unit/exportService.test.ts +492 -0
- package/tests/unit/hotkeys.test.ts +92 -0
- package/tests/unit/navigationPreload.test.ts +94 -0
- package/tests/unit/onboardingFlow.test.ts +345 -0
- package/tests/unit/permissionManager.test.ts +175 -0
- package/tests/unit/permissionManagerExpanded.test.ts +296 -0
- package/tests/unit/screenRecordingRenderer.test.ts +368 -0
- package/tests/unit/sessionController.test.ts +515 -0
- package/tests/unit/tierManager.test.ts +61 -0
- package/tests/unit/tierManagerExpanded.test.ts +142 -0
- package/tests/unit/transcriptAnalyzer.test.ts +64 -0
- package/tsconfig.json +25 -0
- package/vitest.config.ts +46 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
# markupr Product Vision
|
|
2
|
+
|
|
3
|
+
**Version 1.2** | February 2026
|
|
4
|
+
**Author**: Eddie San Juan
|
|
5
|
+
**License**: MIT (Open Source)
|
|
6
|
+
**Status**: Public Release
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## The Problem Nobody Talks About
|
|
11
|
+
|
|
12
|
+
Developers using AI coding assistants have a broken feedback loop.
|
|
13
|
+
|
|
14
|
+
You spend 30 minutes working with Claude Code or Cursor to build a feature. You deploy. You test. You find problems. Now you need to communicate what you found -- but your AI session context is gone. Re-explaining everything takes as long as the original work.
|
|
15
|
+
|
|
16
|
+
The existing tools don't solve this:
|
|
17
|
+
|
|
18
|
+
- **Loom** caps at 5 minutes and produces video files AI tools can't read.
|
|
19
|
+
- **Jam.dev** is browser-only and assumes something is broken. Development feedback isn't just bugs -- it's reasoning, preferences, and context.
|
|
20
|
+
- **Screen Studio** produces beautiful recordings with zero structured output.
|
|
21
|
+
- **Screenshots + typing** interrupts your thought process. By the time you switch apps and type, you've lost the nuance.
|
|
22
|
+
|
|
23
|
+
Bug reporting tools assume something is *broken*. Development feedback captures *reasoning*. No existing tool bridges this gap.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## What markupr Does
|
|
28
|
+
|
|
29
|
+
markupr is a menu bar app that intelligently captures your development feedback. Press a hotkey, talk through what you see, and markupr records your screen while transcribing your voice in real time. When you stop, an intelligent post-processing pipeline correlates your transcript timestamps with the screen recording to extract the right frames at the right moments -- then stitches everything into a structured, AI-ready markdown document.
|
|
30
|
+
|
|
31
|
+
One hotkey to start. One hotkey to stop. A markdown file with your words, contextually-placed screenshots, and intelligent structure -- ready to hand to your AI coding agent, paste into a GitHub issue, or drop in a Slack thread. The output isn't a transcript with screenshots attached. It's a document that understands the relationship between what you said and what was on screen.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## The User Journey
|
|
36
|
+
|
|
37
|
+
### Starting a Session
|
|
38
|
+
|
|
39
|
+
You're testing a feature you just deployed. Something feels off about the layout. A button is in the wrong place. The loading state is confusing.
|
|
40
|
+
|
|
41
|
+
You press `Cmd+Shift+F`.
|
|
42
|
+
|
|
43
|
+
The menu bar icon shifts from a gray outline to a pulsing red dot. Recording has started. No window pops up. No app switcher. No interruption. You stay exactly where you are.
|
|
44
|
+
|
|
45
|
+
### During a Session
|
|
46
|
+
|
|
47
|
+
You talk naturally:
|
|
48
|
+
|
|
49
|
+
*"This button is way too small on mobile. And it's competing with the header -- look, they're practically overlapping."*
|
|
50
|
+
|
|
51
|
+
You pause for a beat. markupr detects the silence -- about 1.2 seconds of quiet -- and captures a screenshot of exactly what you're looking at.
|
|
52
|
+
|
|
53
|
+
You scroll down.
|
|
54
|
+
|
|
55
|
+
*"The loading spinner here feels sluggish. It shows up but then the content pops in with no transition. Feels janky."*
|
|
56
|
+
|
|
57
|
+
Another natural pause. Another screenshot.
|
|
58
|
+
|
|
59
|
+
You click through to a different page.
|
|
60
|
+
|
|
61
|
+
*"Actually, I love how this card animation works. We should use this pattern on the dashboard too."*
|
|
62
|
+
|
|
63
|
+
Screenshot.
|
|
64
|
+
|
|
65
|
+
You don't switch apps. You don't break your train of thought. You don't reach for your phone to take a photo of your screen. You just talk and navigate like you normally would.
|
|
66
|
+
|
|
67
|
+
If you need a screenshot at a specific moment -- mid-sentence, before you pause -- hit `Cmd+Shift+S` for a manual capture.
|
|
68
|
+
|
|
69
|
+
### Ending a Session
|
|
70
|
+
|
|
71
|
+
Press `Cmd+Shift+F` again. The menu bar icon spins briefly while the session processes. A few seconds later, a notification tells you the session is complete.
|
|
72
|
+
|
|
73
|
+
### What You Get
|
|
74
|
+
|
|
75
|
+
Everything is saved to an organized folder on your machine:
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
~/markupr/sessions/2026-02-05_14-23-41/
|
|
79
|
+
feedback.md
|
|
80
|
+
screenshots/
|
|
81
|
+
fb-001.png
|
|
82
|
+
fb-002.png
|
|
83
|
+
fb-003.png
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The markdown file is the core output. The post-processing pipeline:
|
|
87
|
+
|
|
88
|
+
1. Analyzes your transcript timestamps against the screen recording
|
|
89
|
+
2. Extracts the most relevant frames at the exact moments you described each issue
|
|
90
|
+
3. Places screenshots inline with the corresponding narration
|
|
91
|
+
4. Structures the document with clear sections, timestamps, and context
|
|
92
|
+
5. Produces a summary with item counts and session duration
|
|
93
|
+
|
|
94
|
+
The result is a document purpose-built for AI consumption -- your coding agent can read it and immediately understand every issue, see exactly what you saw, and act on it.
|
|
95
|
+
|
|
96
|
+
On the premium tier, Claude AI reads your transcript alongside your screenshots and produces an even more intelligent document -- grouping related feedback, identifying patterns across items, surfacing what matters most, and writing actionable summaries.
|
|
97
|
+
|
|
98
|
+
### The Clipboard Bridge
|
|
99
|
+
|
|
100
|
+
When the session ends, the **file path** to your markdown document is copied to your clipboard. Not the content. The path.
|
|
101
|
+
|
|
102
|
+
This is deliberate:
|
|
103
|
+
|
|
104
|
+
- If your clipboard gets overwritten, your feedback isn't gone. The file lives on disk permanently.
|
|
105
|
+
- AI coding tools like Claude Code can read a file path and process the full document, including the screenshots.
|
|
106
|
+
- You paste the path into your AI tool, your IDE, a Slack message, an issue tracker -- wherever it needs to go.
|
|
107
|
+
- The file is yours. Local. Private. No cloud dependency.
|
|
108
|
+
|
|
109
|
+
The path is the bridge between "I captured feedback" and "something acts on it."
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Who This Is For
|
|
114
|
+
|
|
115
|
+
**Primary users**: Individual developers and small teams (2-10 people) who use AI coding assistants daily. They deploy frequently, prefer keyboard-driven workflows, and care more about structured output than polished video.
|
|
116
|
+
|
|
117
|
+
**Secondary users**: Senior developers and tech leads who review AI-assisted work, need visibility into development decisions, and want to build team knowledge bases over time.
|
|
118
|
+
|
|
119
|
+
The common thread: these are people who think faster than they type, test their own code regularly, and want their feedback to be immediately actionable by both humans and AI tools.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## How Pricing Works
|
|
124
|
+
|
|
125
|
+
### Free Tier (Open Source, MIT License)
|
|
126
|
+
|
|
127
|
+
markupr is free and fully functional with no feature gates:
|
|
128
|
+
|
|
129
|
+
- **Local Whisper transcription** runs entirely on your machine. No API key. No internet required after the initial model download (~500MB).
|
|
130
|
+
- **BYOK (Bring Your Own Key)** for AI analysis. Plug in any API key you want -- Anthropic, OpenAI, whatever you prefer.
|
|
131
|
+
- **All features unlocked.** Screenshots, transcription, markdown output, crash recovery, silence detection, manual capture -- everything works.
|
|
132
|
+
- **Offline capable.** Once the Whisper model is downloaded, markupr works without a network connection.
|
|
133
|
+
|
|
134
|
+
A donate button rotates through messages like "Buy Eddie a Taco" and "Fund Eddie's Caffeine Addiction" -- a single link to Ko-fi. It never blocks your workflow. It never nags. It's there if you feel like it.
|
|
135
|
+
|
|
136
|
+
### Premium Tier (~$12/month)
|
|
137
|
+
|
|
138
|
+
Everything in Free, plus:
|
|
139
|
+
|
|
140
|
+
- **Built-in Claude AI analysis.** No API key setup. No configuration. Press stop, and Anthropic's Claude reads your transcript alongside your screenshots to produce an intelligent, contextualized feedback document.
|
|
141
|
+
- **Smart summaries.** Claude identifies patterns across your feedback items, groups related observations, flags the most critical issues, and writes concise action items.
|
|
142
|
+
- **Zero setup.** Eddie's API key is proxied through a Cloudflare Worker. You sign up, you pay, it works.
|
|
143
|
+
- **Stripe billing.** Standard monthly subscription. Cancel anytime.
|
|
144
|
+
|
|
145
|
+
The premium value is Claude's intelligence applied to your feedback -- not better transcription. Transcription is always local Whisper, always free. The AI analysis layer is what you pay for.
|
|
146
|
+
|
|
147
|
+
This is not an OpenAI integration. The analysis is powered by Anthropic's Claude because it produces better structured reasoning about visual and textual content.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Design Principles
|
|
152
|
+
|
|
153
|
+
**Zero-config first run.** markupr works the moment you open it. No API keys. No account creation. No onboarding wizard with seven steps. You click the menu bar icon, press the hotkey, and start talking.
|
|
154
|
+
|
|
155
|
+
**Menu bar native.** No dock icon. No window chrome. markupr lives in your menu bar like a system utility. It's there when you need it and invisible when you don't. Inspired by how the Claude Status app behaves -- minimal, professional, out of the way.
|
|
156
|
+
|
|
157
|
+
**Never lose work.** Session state is written to disk every 5 seconds. If the app crashes, your data is recovered on restart. If your clipboard gets overwritten, the file is still on disk. If processing hangs, a watchdog timer forces recovery within 10 seconds. You will never lose a feedback session.
|
|
158
|
+
|
|
159
|
+
**AI is the luxury, not the baseline.** The free tier is a complete, production-quality tool. AI analysis makes the output smarter and more structured, but markupr is useful without it. This is not a demo that upsells you.
|
|
160
|
+
|
|
161
|
+
**Open source first.** MIT license. Fork it, improve it, ship it. Contributions welcome. The codebase is designed to be readable and well-documented. Community-driven development, not SaaS-driven.
|
|
162
|
+
|
|
163
|
+
**Ship fast, polish later.** The core loop -- record, capture, generate, copy -- matters more than animation polish or pixel-perfect design. Functionality first. Always.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## How It Works Under the Hood
|
|
168
|
+
|
|
169
|
+
markupr is an Electron app with a React frontend. The recording session is governed by a 7-state finite state machine:
|
|
170
|
+
|
|
171
|
+
**idle** -- ready to record
|
|
172
|
+
**starting** -- initializing microphone and transcription (5-second timeout)
|
|
173
|
+
**recording** -- capturing audio and screenshots (30-minute max)
|
|
174
|
+
**stopping** -- finalizing audio capture (3-second timeout)
|
|
175
|
+
**processing** -- generating the output document (10-second timeout)
|
|
176
|
+
**complete** -- session saved, path copied (auto-returns to idle after 30 seconds)
|
|
177
|
+
**error** -- something went wrong (auto-recovers to idle after 5 seconds)
|
|
178
|
+
|
|
179
|
+
Every state has a maximum duration. A watchdog timer monitors state age in the background and forces recovery if anything gets stuck. There is no state the app can enter and not exit. This is the "bulletproof" guarantee.
|
|
180
|
+
|
|
181
|
+
### Three-Tier Transcription
|
|
182
|
+
|
|
183
|
+
Transcription degrades gracefully:
|
|
184
|
+
|
|
185
|
+
1. **OpenAI** (optional, best quality) -- cloud-based, 95%+ accuracy, ~300ms latency. Requires an API key and internet.
|
|
186
|
+
2. **Local Whisper** (default) -- runs on your machine, 90%+ accuracy, 1-2 second latency. No API key. No internet.
|
|
187
|
+
3. **macOS Dictation** (emergency fallback) -- real-time, ~85% accuracy. Uses the system's built-in speech recognition.
|
|
188
|
+
|
|
189
|
+
If OpenAI fails mid-session, markupr falls back to Whisper. If Whisper isn't available, it falls back to macOS Dictation. If nothing works, it continues capturing screenshots on a timer and saves whatever audio it has.
|
|
190
|
+
|
|
191
|
+
### Intelligent Screen Recording & Frame Extraction
|
|
192
|
+
|
|
193
|
+
During a session, markupr continuously records your screen (up to 4K@30fps, VP9/VP8 encoded). Simultaneously, silence detection monitors audio input using RMS amplitude analysis -- when you pause for ~1.2 seconds, the system notes a capture point. You can also trigger a manual capture at any time with `Cmd+Shift+S`.
|
|
194
|
+
|
|
195
|
+
The real intelligence happens in post-processing. When you end a session, the pipeline:
|
|
196
|
+
|
|
197
|
+
1. Walks through the transcript with timestamps
|
|
198
|
+
2. Correlates each narration segment with the screen recording timeline
|
|
199
|
+
3. Extracts frames at the exact moments that correspond to what you were describing
|
|
200
|
+
4. Stitches the frames and transcript into a structured markdown document
|
|
201
|
+
|
|
202
|
+
This means the output isn't just "screenshots taken during pauses" -- it's contextually-aware frame extraction that ensures every image in the document shows exactly what you were talking about.
|
|
203
|
+
|
|
204
|
+
### Crash Recovery
|
|
205
|
+
|
|
206
|
+
Session state persists to disk every 5 seconds. If the app is force-quit or crashes during a recording:
|
|
207
|
+
|
|
208
|
+
1. On next launch, markupr detects the incomplete session.
|
|
209
|
+
2. It presents a recovery dialog with the partial data.
|
|
210
|
+
3. You can resume or discard the session.
|
|
211
|
+
|
|
212
|
+
This means even a power failure mid-session doesn't lose your work.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## What Makes markupr Different
|
|
217
|
+
|
|
218
|
+
| | markupr | Loom | Jam.dev | Screenshots + Notes |
|
|
219
|
+
|---|---|---|---|---|
|
|
220
|
+
| Voice + Screen Recording | Yes | Video only | Browser only | Manual |
|
|
221
|
+
| AI-Ready Output | Structured markdown | No | Partial | No |
|
|
222
|
+
| Intelligent Frame Extraction | Timestamp-correlated | No | Auto (browser) | No |
|
|
223
|
+
| Works Offline | Yes (local Whisper) | No | No | Yes |
|
|
224
|
+
| Works with Any App | Yes (desktop-wide) | Yes | No (browser) | Yes |
|
|
225
|
+
| Free | Fully functional | Limited | Limited | Yes |
|
|
226
|
+
| Open Source | MIT | No | No | N/A |
|
|
227
|
+
| Output format | Markdown + images | MP4 | Web report | Scattered files |
|
|
228
|
+
|
|
229
|
+
The core differentiator: markupr's intelligent pipeline understands the relationship between what you said and what was on screen, then produces a structured document optimized for AI consumption. Video files can't do that -- AI tools can't read them. Browser-only tools miss everything outside the browser. Manual note-taking breaks your flow. markupr captures everything, then intelligently assembles the output.
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Roadmap
|
|
234
|
+
|
|
235
|
+
### Shipped (v1.0 - v1.2)
|
|
236
|
+
|
|
237
|
+
- Bulletproof state machine with watchdog timer
|
|
238
|
+
- Menu bar native interface (no dock icon)
|
|
239
|
+
- Three-tier transcription (OpenAI, Whisper, macOS Dictation)
|
|
240
|
+
- Silence-triggered screenshot capture
|
|
241
|
+
- Crash recovery with 5-second auto-save
|
|
242
|
+
- Multiple export formats (Markdown, PDF, HTML, JSON)
|
|
243
|
+
- Session history browser
|
|
244
|
+
- Annotation tools (arrows, circles, rectangles, freehand, text)
|
|
245
|
+
- Audio waveform visualization
|
|
246
|
+
- Auto-updater
|
|
247
|
+
- Cross-platform support (macOS primary, Windows secondary)
|
|
248
|
+
- Donate button with rotating messages
|
|
249
|
+
|
|
250
|
+
### Next
|
|
251
|
+
|
|
252
|
+
- Premium tier with Claude AI analysis (Stripe billing, Cloudflare Worker proxy)
|
|
253
|
+
- Improved AI-powered document structuring and pattern detection
|
|
254
|
+
- Team sharing via file system or git integration
|
|
255
|
+
- Custom vocabulary for technical domain terms
|
|
256
|
+
- Session tagging and search across history
|
|
257
|
+
- Integration hooks for issue trackers (GitHub Issues, Linear)
|
|
258
|
+
|
|
259
|
+
### Future
|
|
260
|
+
|
|
261
|
+
- Linux support (full parity)
|
|
262
|
+
- Browser extension companion for web-specific capture
|
|
263
|
+
- Multi-language transcription
|
|
264
|
+
- Voice commands during recording ("mark this as critical", "new section")
|
|
265
|
+
- API for automation and CI/CD integration
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## The Vision in One Sentence
|
|
270
|
+
|
|
271
|
+
markupr turns the way you naturally think about software -- talking through what you see -- into intelligently structured documents where every screenshot is placed exactly where it belongs, ready for humans and AI tools to act on immediately.
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
*Built by Eddie San Juan. Open source. MIT licensed.*
|
|
276
|
+
*[github.com/eddiesanjuan/markupr](https://github.com/eddiesanjuan/markupr)*
|
|
277
|
+
*[ko-fi.com/eddiesanjuan](https://ko-fi.com/eddiesanjuan)*
|