markupr 2.5.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,439 +1,110 @@
1
- > **This project has moved.** FeedbackFlow has been rebranded and evolved into **[markupr](https://github.com/eddiesanjuan/markupr)** -- with cross-platform support, a CLI, an MCP server for AI coding agents, and an intelligent post-processing pipeline. All future development happens at [github.com/eddiesanjuan/markupr](https://github.com/eddiesanjuan/markupr).
2
- >
3
- > **Install:** `npm install -g markupr` | **Download:** [markupr.com](https://markupr.com) | **Releases:** [github.com/eddiesanjuan/markupr/releases](https://github.com/eddiesanjuan/markupr/releases)
4
-
5
- ---
6
-
7
1
  <p align="center">
8
- <img src="src/renderer/assets/logo.svg" alt="markupr Logo" width="120" height="120">
2
+ <img src="src/renderer/assets/logo.svg" alt="markupr" width="80" height="80">
9
3
  </p>
10
4
 
11
5
  <h1 align="center">markupr</h1>
12
6
 
13
7
  <p align="center">
14
- <strong>Turn voice narration into AI-ready Markdown with intelligent screenshots</strong>
8
+ <strong>Record your screen. Say what's wrong. Your AI agent fixes it.</strong>
15
9
  </p>
16
10
 
17
11
  <p align="center">
18
- <a href="https://github.com/eddiesanjuan/markupr/actions/workflows/ci.yml"><img src="https://github.com/eddiesanjuan/markupr/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
19
- <a href="https://github.com/eddiesanjuan/markupr/actions/workflows/release.yml"><img src="https://github.com/eddiesanjuan/markupr/actions/workflows/release.yml/badge.svg" alt="Release"></a>
20
- <a href="https://github.com/eddiesanjuan/markupr/releases"><img src="https://img.shields.io/github/v/release/eddiesanjuan/markupr?style=flat-square" alt="Latest Release"></a>
21
- <a href="https://github.com/eddiesanjuan/markupr/releases"><img src="https://img.shields.io/github/downloads/eddiesanjuan/markupr/total?style=flat-square" alt="Downloads"></a>
22
12
  <a href="https://www.npmjs.com/package/markupr"><img src="https://img.shields.io/npm/v/markupr?style=flat-square" alt="npm version"></a>
13
+ <a href="https://www.npmjs.com/package/markupr"><img src="https://img.shields.io/npm/dm/markupr?style=flat-square" alt="npm downloads"></a>
14
+ <a href="https://github.com/eddiesanjuan/markupr/actions/workflows/ci.yml"><img src="https://github.com/eddiesanjuan/markupr/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
23
15
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square" alt="License"></a>
24
- <a href="https://ko-fi.com/eddiesanjuan"><img src="https://img.shields.io/badge/Support-Ko--fi-FF5E5B?style=flat-square&logo=ko-fi" alt="Ko-fi"></a>
16
+ <a href="https://github.com/eddiesanjuan/markupr/stargazers"><img src="https://img.shields.io/github/stars/eddiesanjuan/markupr?style=flat-square" alt="GitHub stars"></a>
25
17
  </p>
26
18
 
27
19
  <p align="center">
28
- <a href="#quick-start">Quick Start</a> |
29
- <a href="#why-markupr">Why markupr?</a> |
30
- <a href="#features">Features</a> |
31
- <a href="#how-it-works">How It Works</a> |
32
- <a href="#example-output">Examples</a> |
33
- <a href="#installation">Installation</a> |
34
- <a href="#cli-usage">CLI Usage</a> |
35
- <a href="#mcp-server-for-ai-coding-agents">MCP Server</a> |
36
- <a href="#usage">Usage</a> |
37
- <a href="#keyboard-shortcuts">Shortcuts</a> |
38
- <a href="#export-formats">Export</a> |
39
- <a href="#development">Development</a> |
40
- <a href="#contributing">Contributing</a> |
41
- <a href="CHANGELOG.md">Changelog</a>
20
+ <a href="#quick-start">Quick Start</a> &middot;
21
+ <a href="#why-markupr">Why markupr</a> &middot;
22
+ <a href="#mcp-server">MCP Server</a> &middot;
23
+ <a href="#cli">CLI</a> &middot;
24
+ <a href="#integrations">Integrations</a> &middot;
25
+ <a href="#contributing">Contributing</a>
42
26
  </p>
43
27
 
44
28
  ---
45
29
 
46
- markupr is a menu bar app that intelligently captures developer feedback. Press a hotkey, talk through what you see, and markupr records your screen while transcribing your voice. 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.
47
-
48
- 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.
49
-
50
- ## Quick Start
30
+ <!-- hero-screenshot: Replace with an actual screenshot or GIF of markupr in action -->
51
31
 
52
- ### CLI (for developers and AI agents)
53
- ```bash
54
- npx markupr analyze ./recording.mov
55
- ```
56
-
57
- Or install globally:
58
- ```bash
59
- npm install -g markupr
60
- # or
61
- bun install -g markupr
62
- ```
63
-
64
- ### Desktop App
65
- Download from [markupr.com](https://markupr.com) or the [releases page](https://github.com/eddiesanjuan/markupr/releases) -- available for macOS, Windows, and Linux.
66
-
67
- **First-time setup:**
68
- 1. Install the application (DMG for macOS, installer for Windows)
69
- 2. Grant required permissions (Microphone, Screen Recording)
70
- 3. Press `Cmd+Shift+F` (macOS) or `Ctrl+Shift+F` (Windows) to start recording
71
- 4. Narrate your feedback while markupr captures screenshots at pause points
72
- 5. Press the hotkey again to stop -- post-processing runs automatically
73
- 6. Paste the file path from your clipboard into your AI coding agent
74
-
75
- **No API key required!** markupr uses local Whisper transcription by default.
76
-
77
- If markupr saves you hours, consider [supporting development on Ko-fi](https://ko-fi.com/eddiesanjuan).
78
-
79
- ## See It In Action
80
-
81
- <!-- TODO: Replace with actual demo recording -->
82
- > **Demo video coming soon** -- Record your screen, talk through what you see, get structured Markdown with screenshots your AI coding agent can act on. One hotkey in, one hotkey out.
83
-
84
- ## Why markupr?
85
-
86
- AI coding agents are transforming development, but they're only as good as the context you give them. Typing out bug reports with manual screenshots is slow and lossy -- you lose the flow of what you saw and the nuance of what you meant.
87
-
88
- markupr bridges this gap. Record your screen, narrate what you see, and markupr produces a structured Markdown document that AI agents can consume directly. The output isn't a raw transcript with random screenshots -- it's an intelligently structured document where every screenshot is placed at the exact moment you were describing it, every issue is categorized, and the format is optimized for LLM consumption.
89
-
90
- **The workflow:**
91
- 1. You see a bug. Press `Cmd+Shift+F`.
92
- 2. Talk through what you see: "This button is hidden on mobile, and the spacing is off here..."
93
- 3. Press the hotkey again to stop.
94
- 4. Paste the file path into Claude Code, Cursor, or any AI agent.
95
- 5. The agent reads your structured feedback -- with screenshots -- and fixes the issues.
96
-
97
- **What makes it different:**
98
- - **Timestamp-correlated frames** -- screenshots are extracted from the exact video frame matching your narration, not taken at arbitrary intervals
99
- - **Local-first** -- Whisper runs on your machine, your data stays on your machine
100
- - **AI-native output** -- Markdown structured for LLM consumption, not human-only reading
101
- - **Zero-friction capture** -- one global hotkey from any app, no context switching
102
-
103
- ## Features
104
-
105
- ### Voice-Driven Capture
106
- - **Local Whisper transcription** runs entirely on your machine -- no API key, no internet required
107
- - **Optional OpenAI cloud transcription** for higher accuracy (BYOK)
108
- - **Intelligent screenshot timing** captures automatically during voice pauses
109
- - **Audio waveform visualization** for real-time feedback
110
-
111
- ### Intelligent Post-Processing Pipeline
112
- - **Timestamp-correlated frame extraction** -- every screenshot corresponds to what you were describing
113
- - **Key-moment detection** analyzes your transcript to find the most important moments
114
- - **Video frame extraction** via ffmpeg pulls precise frames from the screen recording
115
- - **Structured Markdown output** optimized for LLM consumption (llms.txt inspired)
116
-
117
- ### Smart Screenshots
118
- - **Voice Activity Detection (VAD)** triggers captures at natural pause points
119
- - **Manual screenshot hotkey** (`Cmd+Shift+S`) for precise control
120
- - **Multi-monitor support** with display selection
121
- - **Window-specific capture** for focused feedback
122
-
123
- ### AI-Ready Output
124
- - **Markdown format** with contextually-placed screenshots and structured feedback items
125
- - **Multiple export formats**: Markdown, PDF, HTML, JSON
126
- - **Clipboard bridge** -- file path is copied to clipboard so AI tools can read the full document
127
-
128
- ### Bulletproof Reliability
129
- - **7-state finite state machine** with watchdog timer -- no state the app can enter and not exit
130
- - **Crash recovery** with 5-second auto-save -- never lose a feedback session
131
- - **Graceful degradation** -- if transcription fails, frame extraction continues; if ffmpeg is missing, transcript-only output is generated
132
- - **Auto-updater** for seamless updates
133
-
134
- ### Professional Experience
135
- - **Native macOS menu bar** integration (no dock icon)
136
- - **Windows system tray** support
137
- - **Global hotkeys** that work from any application
138
- - **Annotation tools** (arrow, circle, rectangle, freehand, text)
139
- - **Session history browser** with search and export
140
- - **Dark/light/system theme** support
141
- - **Onboarding experience** for first-run setup
142
-
143
- ## How It Works
32
+ ## The Problem
144
33
 
145
- ### The Post-Processing Pipeline
34
+ AI coding agents can't see your screen. When you find a bug, you context-switch into writing mode -- describing the layout issue in text, manually screenshotting, cropping, and dragging images into the right spot. You speak at 150 words per minute but type at 60. The context is lost in translation.
146
35
 
147
- When you press stop, markupr's intelligent pipeline takes over:
36
+ ## The Solution
148
37
 
149
- 1. **Transcribe** -- Your audio is transcribed using local Whisper (or OpenAI API if configured)
150
- 2. **Analyze** -- The transcript is analyzed to identify key moments, topic changes, and important observations
151
- 3. **Extract** -- Video frames are extracted at the exact timestamps corresponding to each key moment
152
- 4. **Generate** -- Everything is stitched into a structured Markdown document with screenshots placed exactly where they belong
38
+ markupr records your screen while you narrate what's wrong. When you stop, it runs an intelligent pipeline that correlates your transcript timestamps with the video to extract the right frames at the right moments -- then stitches everything into structured Markdown your AI agent can act on immediately.
153
39
 
154
- The result 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.
40
+ - **Record** -- press a hotkey, talk through what you see
41
+ - **Process** -- Whisper transcribes, ffmpeg extracts frames at the exact moments you described
42
+ - **Output** -- structured Markdown with screenshots placed exactly where they belong
155
43
 
156
- ### The Clipboard Bridge
157
-
158
- When a session completes, the **file path** to your Markdown document is copied to clipboard. Not the content -- the path. This is deliberate:
159
-
160
- - If your clipboard gets overwritten, the file lives on disk permanently
161
- - AI tools like Claude Code can read the file path and process the full document including screenshots
162
- - The file is yours -- local, private, no cloud dependency
163
-
164
- ### Session State Machine
165
-
166
- The recording session is governed by a 7-state FSM with timeouts:
167
-
168
- ```
169
- idle ─→ starting (5s timeout) ─→ recording (30min max) ─→ stopping (3s timeout)
170
-
171
-
172
- processing (10s timeout) ─→ complete (30s auto-idle)
173
-
174
-
175
- error (5s auto-recover)
176
44
  ```
177
-
178
- Every state has a maximum duration. A watchdog timer monitors state age and forces recovery if anything gets stuck.
179
-
180
- ## Example Output
181
-
182
- See what markupr produces:
183
-
184
- - [Desktop app feedback session](examples/feedback-session-example.md) -- a developer reviewing a dashboard, finding mobile and UX issues
185
- - [MCP server capture session](examples/mcp-session-example.md) -- an AI coding agent recording a CSS bug via `capture_with_voice`
186
- - [CLI analysis output](examples/cli-output-example.md) -- `npx markupr analyze` processing a security code review
187
-
188
- ## Installation
189
-
190
- ### macOS
191
-
192
- Download the `.dmg` file from the [releases page](https://github.com/eddiesanjuan/markupr/releases).
193
-
194
- 1. Open the DMG file
195
- 2. Drag markupr to your Applications folder
196
- 3. Launch markupr from Applications
197
- 4. Grant required permissions (Microphone, Screen Recording)
198
-
199
- ### Windows
200
-
201
- Download the `.exe` installer from the [releases page](https://github.com/eddiesanjuan/markupr/releases).
202
-
203
- 1. Run the installer
204
- 2. Follow the installation wizard
205
- 3. Launch markupr from the Start menu
206
-
207
- ### Linux
208
-
209
- Download the `.AppImage` or `.deb` file from the [releases page](https://github.com/eddiesanjuan/markupr/releases).
210
-
211
- ```bash
212
- # AppImage
213
- chmod +x markupr-*.AppImage
214
- ./markupr-*.AppImage
215
-
216
- # Debian/Ubuntu
217
- sudo dpkg -i markupr_*.deb
45
+ Cmd+Shift+F --> talk --> Cmd+Shift+F --> Cmd+V into your agent
218
46
  ```
219
47
 
220
- ## Configuration
221
-
222
- ### Transcription
223
-
224
- markupr works out of the box with **local Whisper** transcription -- no API key needed. On first run, you'll be prompted to download a Whisper model (~75MB for tiny, ~500MB for base).
225
-
226
- For cloud post-session transcription with higher accuracy, add your OpenAI API key:
227
-
228
- 1. Sign up at [platform.openai.com/api-keys](https://platform.openai.com/api-keys)
229
- 2. Create an API key with "Usage" permissions
230
- 3. Open Settings > Advanced > Transcription Service
231
- 4. Enter your OpenAI API key
232
-
233
- OpenAI usage is billed to your own API account.
234
-
235
- ### AI-Enhanced Analysis (Optional)
236
-
237
- Add your Anthropic API key for Claude-powered document analysis:
238
-
239
- 1. Get an API key at [console.anthropic.com](https://console.anthropic.com/)
240
- 2. Open Settings > Advanced > AI Analysis
241
- 3. Enter your Anthropic API key
242
-
243
- Claude analyzes your transcript alongside screenshots to produce an intelligent document -- grouping related feedback, identifying patterns, and writing actionable summaries.
244
-
245
- ### Settings Overview
246
-
247
- | Category | Setting | Description |
248
- |----------|---------|-------------|
249
- | **General** | Output Directory | Where sessions are saved |
250
- | | Launch at Login | Start markupr on system boot |
251
- | **Recording** | Countdown | 0, 3, or 5 second countdown before recording |
252
- | | Transcription Preview | Show live transcription overlay |
253
- | | Audio Waveform | Visual audio level feedback |
254
- | **Capture** | Pause Threshold | Voice pause duration before screenshot (500-3000ms) |
255
- | | Min Time Between | Minimum gap between screenshots |
256
- | **Appearance** | Theme | Dark, Light, or System |
257
- | | Accent Color | Customize UI accent color |
258
- | **Hotkeys** | Toggle Recording | Default: `Cmd/Ctrl+Shift+F` |
259
- | | Manual Screenshot | Default: `Cmd/Ctrl+Shift+S` |
260
-
261
- ## CLI Usage
262
-
263
- markupr can run as a standalone CLI tool -- no Electron or desktop app required. This is ideal for:
264
- - CI/CD pipelines processing screen recordings
265
- - AI coding agents that need to analyze recordings programmatically
266
- - Developers who prefer the command line
48
+ ## Quick Start
267
49
 
268
- ### Installation
50
+ ### CLI (zero install)
269
51
 
270
52
  ```bash
271
- # Run without installing
272
53
  npx markupr analyze ./recording.mov
273
-
274
- # Install globally via npm
275
- npm install -g markupr
276
-
277
- # Install globally via bun
278
- bun install -g markupr
279
54
  ```
280
55
 
281
- ### Commands
282
-
283
- #### `markupr analyze <video-file>`
284
-
285
- Process a screen recording into a structured Markdown document with extracted frames and transcript.
286
-
287
- **Options:**
288
- | Flag | Description | Default |
289
- |------|-------------|---------|
290
- | `--audio <file>` | Separate audio file (if not embedded in video) | Auto-extracted from video |
291
- | `--output <dir>` | Output directory | `./markupr-output` |
292
- | `--whisper-model <path>` | Path to local Whisper model file | Auto-detected in `~/.markupr/whisper-models/` |
293
- | `--no-frames` | Skip frame extraction | `false` |
294
- | `--template <name>` | Output template (`markdown`, `json`, `github-issue`, `linear`, `jira`, `html`) | `markdown` |
295
- | `--verbose` | Show detailed progress output | `false` |
296
-
297
- **Examples:**
56
+ ### MCP Server (for AI coding agents)
298
57
 
299
58
  ```bash
300
- # Basic usage - analyze a screen recording
301
- markupr analyze ./bug-demo.mov
302
-
303
- # Use a specific output directory
304
- markupr analyze ./recording.mov --output ./reports
305
-
306
- # Separate audio and video files
307
- markupr analyze ./screen.mov --audio ./voiceover.wav
308
-
309
- # Skip frame extraction (transcript only)
310
- markupr analyze ./recording.mov --no-frames
59
+ npx markupr-mcp
311
60
  ```
312
61
 
313
- #### `markupr watch [directory]`
314
-
315
- Watch a directory for new screen recordings and auto-process them as they appear. Ideal for continuous feedback workflows.
316
-
317
- ```bash
318
- # Watch the current directory
319
- markupr watch
320
-
321
- # Watch a specific directory with custom output
322
- markupr watch ./recordings --output ./reports
323
-
324
- # Watch with verbose logging
325
- markupr watch ~/Desktop --verbose
326
- ```
327
-
328
- #### `markupr push github <report>`
329
-
330
- Create GitHub issues from a markupr feedback report. Each feedback item (FB-001, FB-002, etc.) becomes a separate issue with labels and structured markdown.
331
-
332
- ```bash
333
- # Create issues from a report (uses gh CLI auth or GITHUB_TOKEN)
334
- markupr push github ./markupr-output/report.md --repo myorg/myapp
335
-
336
- # Preview what would be created
337
- markupr push github ./report.md --repo myorg/myapp --dry-run
338
-
339
- # Push specific items only
340
- markupr push github ./report.md --repo myorg/myapp --items FB-001 FB-003
341
- ```
342
-
343
- Authentication resolves in order: `--token` flag, `GITHUB_TOKEN` env var, `gh auth token` CLI.
344
-
345
- #### `markupr push linear <report>`
346
-
347
- Create Linear issues from a markupr feedback report.
348
-
349
- ```bash
350
- # Create issues in a Linear team
351
- markupr push linear ./report.md --team ENG
352
-
353
- # Assign to a project with dry run
354
- markupr push linear ./report.md --team DES --project "Q1 Polish" --dry-run
355
- ```
356
-
357
- Set `LINEAR_API_KEY` env var or pass `--token`.
358
-
359
- ### Output Templates
360
-
361
- markupr supports multiple output templates for the `analyze` command:
62
+ ### Desktop App
362
63
 
363
- | Template | Description |
364
- |----------|-------------|
365
- | `markdown` | Default structured Markdown (llms.txt-inspired) |
366
- | `json` | Machine-readable JSON for integrations |
367
- | `github-issue` | GitHub-flavored Markdown optimized for issues |
368
- | `linear` | Linear-optimized issue format |
369
- | `jira` | Jira-compatible markup |
370
- | `html` | Self-contained HTML document |
64
+ Download from [markupr.com](https://markupr.com) or [GitHub Releases](https://github.com/eddiesanjuan/markupr/releases). Available for macOS and Windows.
371
65
 
372
- ```bash
373
- # Generate JSON output for automation
374
- markupr analyze ./recording.mov --template json
66
+ No API keys required. Local Whisper transcription works out of the box.
375
67
 
376
- # Generate GitHub-ready issue format
377
- markupr analyze ./recording.mov --template github-issue
378
- ```
68
+ ## Why markupr?
379
69
 
380
- ### GitHub Action
70
+ **Local-first.** Whisper runs on your device. Your recordings, transcripts, and screenshots never leave your machine. No cloud dependency, no account required.
381
71
 
382
- Run markupr in CI to get visual feedback on pull requests. Add the action to your workflow:
72
+ **AI-native output.** The Markdown output is structured for LLM consumption -- headings, categories, severity levels, and inline screenshots. Not a raw transcript with random images. Every screenshot shows exactly what you were describing when you said it.
383
73
 
384
- ```yaml
385
- - uses: eddiesanjuan/markupr-action@v1
386
- with:
387
- video-path: ./test-recording.mov
388
- output-dir: ./markupr-output
389
- ```
74
+ **Works everywhere.** Desktop app for daily use. CLI for scripts and CI/CD. MCP server for agent integration. GitHub Action for PR feedback. Same pipeline, four interfaces.
390
75
 
391
- See [markupr-action/README.md](markupr-action/README.md) for full configuration options.
76
+ **Open source.** MIT licensed. No telemetry, no tracking, no analytics. Read the source, fork it, ship it.
392
77
 
393
- ### Requirements
78
+ ## What the Output Looks Like
394
79
 
395
- - **Node.js** 18+
396
- - **ffmpeg** must be installed and on your PATH (for frame extraction and audio processing)
397
- - macOS: `brew install ffmpeg`
398
- - Ubuntu/Debian: `sudo apt install ffmpeg`
399
- - Windows: `choco install ffmpeg` or download from ffmpeg.org
80
+ ```markdown
81
+ # Feedback Session -- Feb 5, 2026
400
82
 
401
- ### For AI Agents
83
+ ## FB-001: Button sizing issue
84
+ The submit button is way too small on mobile. I'm trying to tap it
85
+ and keep hitting the cancel link underneath. Needs more vertical
86
+ padding, maybe 12px minimum tap target.
402
87
 
403
- markupr is designed to be used by AI coding agents. An agent can:
88
+ ![Screenshot at 0:34](screenshots/fb-001.png)
404
89
 
405
- ```bash
406
- # Install and process a recording in one command
407
- npx markupr analyze ./recording.mov --output ./feedback
90
+ ## FB-002: Loading state feels janky
91
+ After the spinner disappears, the content pops in with no transition.
92
+ There's a visible layout shift -- the sidebar jumps left by about
93
+ 20 pixels.
408
94
 
409
- # The output is a structured Markdown file with embedded screenshots
410
- # Perfect for feeding into Claude, GPT, or any LLM
411
- cat ./feedback/markupr-report.md
95
+ ![Screenshot at 1:12](screenshots/fb-002.png)
412
96
  ```
413
97
 
414
- The output Markdown follows the llms.txt convention -- structured, parseable, and optimized for AI consumption.
98
+ Each screenshot is extracted from the exact video frame matching your narration timestamp. See full examples in [`examples/`](examples/).
415
99
 
416
- ## MCP Server (for AI Coding Agents)
100
+ ## MCP Server
417
101
 
418
- markupr includes an MCP server that gives AI coding agents direct access to screen capture and voice recording. Your agent can see your screen, hear your narration, and receive structured reports -- all mid-conversation. This is the bridge between "I can see the bug" and "my agent can fix it."
102
+ Give your AI coding agent eyes and ears. Add markupr as an MCP server and it can capture screenshots, record your screen with voice, and receive structured reports -- all mid-conversation.
419
103
 
420
104
  ### Setup
421
105
 
422
- Add to your IDE config and your agent gets 6 tools:
423
-
424
106
  **Claude Code** (`~/.claude/settings.json`):
425
- ```json
426
- {
427
- "mcpServers": {
428
- "markupr": {
429
- "command": "npx",
430
- "args": ["-y", "markupr-mcp"]
431
- }
432
- }
433
- }
434
- ```
435
107
 
436
- **Cursor / Windsurf** (MCP settings):
437
108
  ```json
438
109
  {
439
110
  "mcpServers": {
@@ -445,350 +116,163 @@ Add to your IDE config and your agent gets 6 tools:
445
116
  }
446
117
  ```
447
118
 
448
- ### Available Tools
119
+ **Cursor / Windsurf** -- same config in your MCP settings.
120
+
121
+ ### Tools
449
122
 
450
- | Tool | What it does |
123
+ | Tool | Description |
451
124
  |------|-------------|
452
125
  | `capture_screenshot` | Grab the current screen. Your agent sees what you see. |
453
- | `capture_with_voice` | Record screen + microphone for a set duration. Returns a full structured report. |
126
+ | `capture_with_voice` | Record screen + mic for a set duration. Returns a structured report. |
454
127
  | `analyze_video` | Process any `.mov` or `.mp4` into Markdown with extracted frames. |
455
- | `analyze_screenshot` | Feed a screenshot through the AI analysis pipeline. |
128
+ | `analyze_screenshot` | Run a screenshot through the AI analysis pipeline. |
456
129
  | `start_recording` | Begin an interactive recording session. |
457
- | `stop_recording` | End the session. Full pipeline runs, report returned. |
458
-
459
- ### Example: Agent Captures and Fixes a Bug
130
+ | `stop_recording` | End the session and run the full pipeline. |
460
131
 
461
- In Claude Code, after adding the MCP config, your agent can do this:
132
+ ### Example
462
133
 
463
134
  ```
464
135
  You: "The sidebar is overlapping the main content on mobile. Can you see it?"
465
136
 
466
- Claude: [calls capture_screenshot]
467
- "I can see the issue -- the sidebar has position: fixed but no
468
- z-index, and it's 280px wide with no responsive breakpoint.
469
- Let me fix the CSS..."
137
+ Agent: [calls capture_screenshot]
138
+ "I can see the issue -- the sidebar has position: fixed but no z-index,
139
+ and it's 280px wide with no responsive breakpoint. Let me fix the CSS..."
470
140
 
471
- [fixes the code]
141
+ [fixes the code]
472
142
  ```
473
143
 
474
144
  No copy-pasting screenshots. No describing the bug in text. The agent looks at your screen and acts.
475
145
 
476
- See **[README-MCP.md](README-MCP.md)** for full setup instructions, all tool parameters, and troubleshooting.
477
-
478
- ## Usage
479
-
480
- ### Basic Workflow
481
-
482
- 1. **Start Recording**: Press `Cmd+Shift+F` (macOS) or `Ctrl+Shift+F` (Windows)
483
- 2. **Select Source**: Choose which screen or window to capture
484
- 3. **Narrate**: Speak naturally about what you see
485
- 4. **Screenshots**: Captured automatically during pauses (or press `Cmd+Shift+S` manually)
486
- 5. **Stop Recording**: Press the hotkey again
487
- 6. **Post-Processing**: Pipeline automatically transcribes, analyzes, extracts frames, and generates output
488
- 7. **Use Output**: File path is on your clipboard -- paste into your AI tool
146
+ Full MCP documentation: [README-MCP.md](README-MCP.md)
489
147
 
490
- ### Recording Tips
148
+ ## CLI
491
149
 
492
- - **Speak naturally** -- markupr detects pauses to time screenshots
493
- - **Pause briefly** when you want a screenshot captured
494
- - **Use manual capture** (`Cmd+Shift+S`) for precise timing
495
- - **Review before export** to remove unwanted items
496
-
497
- ### Using with AI Coding Agents
150
+ ### Installation
498
151
 
499
- After a session completes, the file path is on your clipboard. Paste it into:
152
+ ```bash
153
+ # Run without installing
154
+ npx markupr analyze ./recording.mov
500
155
 
501
- - **Claude Code**: `Read the feedback session at [paste path]`
502
- - **Cursor/Windsurf**: Reference the file path in your prompt
503
- - **GitHub Issues**: Copy the Markdown content directly
156
+ # Or install globally
157
+ npm install -g markupr
158
+ ```
504
159
 
505
- ### AI Agent Setup
160
+ ### Commands
506
161
 
507
- For coding agents, use the one-liner from repo root:
162
+ **`markupr analyze <video>`** -- Process a screen recording into structured Markdown.
508
163
 
509
164
  ```bash
510
- npm run setup:markupr
165
+ markupr analyze ./bug-demo.mov
166
+ markupr analyze ./recording.mov --output ./reports
167
+ markupr analyze ./recording.mov --template github-issue
168
+ markupr analyze ./recording.mov --no-frames # transcript only
511
169
  ```
512
170
 
513
- Detailed agent setup notes are in [`docs/AI_AGENT_QUICKSTART.md`](docs/AI_AGENT_QUICKSTART.md).
514
-
515
- ### Session Output
516
-
517
- Sessions are saved to an organized folder:
171
+ **`markupr watch [directory]`** -- Watch for new recordings and auto-process them.
518
172
 
173
+ ```bash
174
+ markupr watch ~/Desktop --output ./reports
519
175
  ```
520
- ~/markupr/sessions/2026-02-05_14-23-41/
521
- feedback-report.md # Structured Markdown with inline screenshots
522
- metadata.json # Session metadata (source, duration, environment)
523
- screenshots/
524
- fb-001.png # Extracted frames from key moments
525
- fb-002.png
526
- fb-003.png
527
- session-recording.webm # Full screen recording (optional)
528
- ```
529
-
530
- ## Keyboard Shortcuts
531
-
532
- ### Recording
533
-
534
- | Action | macOS | Windows/Linux |
535
- |--------|-------|---------------|
536
- | Start/Stop Recording | `Cmd+Shift+F` | `Ctrl+Shift+F` |
537
- | Manual Screenshot | `Cmd+Shift+S` | `Ctrl+Shift+S` |
538
- | Pause/Resume | `Cmd+Shift+P` | `Ctrl+Shift+P` |
539
-
540
- ### Navigation
541
-
542
- | Action | macOS | Windows/Linux |
543
- |--------|-------|---------------|
544
- | Open Settings | `Cmd+,` | `Ctrl+,` |
545
- | Session History | `Cmd+H` | `Ctrl+H` |
546
- | Keyboard Shortcuts | `Cmd+/` | `Ctrl+/` |
547
- | Close Dialog | `Escape` | `Escape` |
548
176
 
549
- ### Editing
177
+ **`markupr push github <report>`** -- Create GitHub issues from a feedback report.
550
178
 
551
- | Action | macOS | Windows/Linux |
552
- |--------|-------|---------------|
553
- | Delete Selected | `Backspace` | `Delete` |
554
- | Edit Item | `Enter` | `Enter` |
555
- | Move Up | `Cmd+Up` | `Ctrl+Up` |
556
- | Move Down | `Cmd+Down` | `Ctrl+Down` |
557
- | Undo | `Cmd+Z` | `Ctrl+Z` |
558
- | Redo | `Cmd+Shift+Z` | `Ctrl+Shift+Z` |
559
- | Select All | `Cmd+A` | `Ctrl+A` |
560
-
561
- ### Annotation Tools
562
-
563
- | Tool | Shortcut |
564
- |------|----------|
565
- | Arrow | `1` |
566
- | Circle | `2` |
567
- | Rectangle | `3` |
568
- | Freehand | `4` |
569
- | Text | `5` |
570
- | Clear Annotations | `Cmd/Ctrl+Backspace` |
179
+ ```bash
180
+ markupr push github ./report.md --repo myorg/myapp
181
+ markupr push github ./report.md --repo myorg/myapp --dry-run
182
+ ```
571
183
 
572
- ## Export Formats
184
+ **`markupr push linear <report>`** -- Create Linear issues from a feedback report.
573
185
 
574
- ### Markdown (.md)
186
+ ```bash
187
+ markupr push linear ./report.md --team ENG
188
+ ```
575
189
 
576
- AI-optimized format inspired by [llms.txt](https://llms.txt). Includes:
190
+ ### Output Templates
577
191
 
578
- - Structured headings with timestamps
579
- - Feedback items with categories and severity
580
- - Inline screenshot references
581
- - Summary table with session metadata
192
+ `markdown` (default) | `json` | `github-issue` | `linear` | `jira` | `html`
582
193
 
583
- ```markdown
584
- # Feedback Report: My App
194
+ ### Requirements
585
195
 
586
- ## Summary
587
- - **Duration**: 2m 34s
588
- - **Items**: 5 feedback points
589
- - **Screenshots**: 3 captured
196
+ - Node.js 18+
197
+ - [ffmpeg](https://ffmpeg.org/) on your PATH (`brew install ffmpeg` / `apt install ffmpeg` / `choco install ffmpeg`)
590
198
 
591
- ## Feedback Items
199
+ ## Integrations
592
200
 
593
- ### FB-001: Login button not visible
594
- **Timestamp**: 00:15 | **Type**: Bug
201
+ ### GitHub Action
595
202
 
596
- > The login button is hidden behind the header on mobile viewport...
203
+ Run markupr in CI to get visual feedback on pull requests:
597
204
 
598
- ![Screenshot](./screenshots/fb-001.png)
205
+ ```yaml
206
+ - uses: eddiesanjuan/markupr-action@v1
207
+ with:
208
+ video-path: ./recordings/
209
+ github-token: ${{ secrets.GITHUB_TOKEN }}
599
210
  ```
600
211
 
601
- ### PDF (.pdf)
602
-
603
- Professional document with embedded screenshots, print-ready layout, and theme support.
604
-
605
- ### HTML (.html)
606
-
607
- Self-contained web page with embedded images, dark/light theme toggle, and mobile responsive design.
212
+ ### Desktop App Workflow
608
213
 
609
- ### JSON (.json)
214
+ 1. Press `Cmd+Shift+F` (macOS) or `Ctrl+Shift+F` (Windows)
215
+ 2. Narrate what you see -- screenshots capture automatically during pauses
216
+ 3. Press the hotkey again to stop
217
+ 4. Paste the file path from your clipboard into Claude Code, Cursor, or any AI agent
610
218
 
611
- Machine-readable format for integrations and automation.
612
-
613
- ## Architecture
219
+ ## How It Works
614
220
 
615
221
  ```
616
- markupr/
617
- ├── src/
618
- │ ├── main/ # Electron main process
619
- │ │ ├── index.ts # Entry point, orchestration
620
- │ │ ├── SessionController # 7-state FSM with watchdog
621
- │ │ ├── CrashRecovery # Auto-save and crash detection
622
- │ │ ├── ai/ # Claude AI analysis pipeline
623
- │ │ ├── audio/ # Audio capture and VAD
624
- │ │ ├── capture/ # Screen capture services
625
- │ │ ├── output/ # Document generation (MD, PDF, HTML, JSON)
626
- │ │ ├── pipeline/ # Post-processing (transcribe → analyze → extract → generate)
627
- │ │ ├── settings/ # Settings with secure API key storage
628
- │ │ ├── transcription/ # Whisper + tier management
629
- │ │ └── windows/ # Window management (popover, taskbar)
630
- │ ├── renderer/ # React UI
631
- │ │ ├── App.tsx # Main component
632
- │ │ ├── components/ # UI components (30+)
633
- │ │ ├── audio/ # Renderer-side audio bridge
634
- │ │ ├── capture/ # Renderer-side screen recording
635
- │ │ └── hooks/ # React hooks (theme, animation)
636
- │ ├── preload/ # Electron preload (secure IPC bridge)
637
- │ └── shared/ # Shared types and constants
638
- ├── tests/ # Test suite
639
- ├── docs/ # Documentation
640
- ├── site/ # Landing page
641
- └── package.json
222
+ +-----------+
223
+ Screen + Voice -> | Whisper | -> Timestamped transcript
224
+ +-----------+
225
+ |
226
+ +-----------+
227
+ | Analyzer | -> Key moments identified
228
+ +-----------+
229
+ |
230
+ +-----------+
231
+ | ffmpeg | -> Frames extracted at exact timestamps
232
+ +-----------+
233
+ |
234
+ +-----------+
235
+ | Generator | -> Structured Markdown with inline screenshots
236
+ +-----------+
642
237
  ```
643
238
 
644
- ## Development
239
+ The pipeline degrades gracefully. No ffmpeg? Transcript-only output. No Whisper model? Timer-based screenshots. No API keys? Everything runs locally.
645
240
 
646
- ### Prerequisites
241
+ For architecture details, see [CLAUDE.md](CLAUDE.md).
647
242
 
648
- - Node.js 18+
649
- - npm 9+
650
- - macOS, Windows, or Linux
651
-
652
- ### Setup
243
+ ## Development
653
244
 
654
245
  ```bash
655
- # Clone the repository
656
246
  git clone https://github.com/eddiesanjuan/markupr.git
657
247
  cd markupr
658
- ```
659
-
660
- Use either npm or bun:
661
-
662
- ```bash
663
- # npm
664
248
  npm install
665
-
666
- # Start development mode
667
249
  npm run dev
668
250
  ```
669
251
 
670
- ```bash
671
- # bun
672
- bun install
673
-
674
- # Start development mode
675
- bun run dev
676
- ```
677
-
678
- ### Scripts
679
-
680
- | Script | Description |
681
- |--------|-------------|
682
- | `npm run dev` | Start in development mode with hot reload |
683
- | `npm run build` | Build for production |
684
- | `npm run build:desktop` | Build desktop app only |
685
- | `npm run package` | Package for current platform |
686
- | `npm run package:mac` | Package for macOS |
687
- | `npm run package:win` | Package for Windows |
688
- | `npm run package:linux` | Package for Linux |
252
+ | Command | Description |
253
+ |---------|-------------|
254
+ | `npm run dev` | Development mode with hot reload |
255
+ | `npm run build` | Build everything (desktop + CLI + MCP) |
689
256
  | `npm test` | Run all tests |
690
- | `npm run test:unit` | Run unit tests only |
691
- | `npm run test:watch` | Run tests in watch mode |
692
- | `npm run lint` | Lint code |
693
- | `npm run lint:fix` | Auto-fix lint issues |
694
- | `npm run typecheck` | TypeScript type checking |
695
-
696
- You can run the same scripts with bun (`bun run dev`, `bun run test`, etc.).
697
-
698
- ### Running Tests
699
-
700
- ```bash
701
- # Run all tests
702
- npm test
703
-
704
- # Run with coverage
705
- npm run test:coverage
706
-
707
- # Run specific test file
708
- npx vitest tests/unit/postProcessor.test.ts
709
- ```
257
+ | `npm run lint` | Lint |
258
+ | `npm run typecheck` | Type check |
710
259
 
711
260
  ## Contributing
712
261
 
713
- We welcome contributions! markupr is MIT licensed and community-driven.
714
-
715
- ### Quick Start for Contributors
716
-
717
262
  1. Fork the repository
718
- 2. Create a feature branch: `git checkout -b feature/amazing-feature`
719
- 3. Make your changes
720
- 4. Run tests: `npm test`
721
- 5. Run lint: `npm run lint`
722
- 6. Commit: `git commit -m 'Add amazing feature'`
723
- 7. Push: `git push origin feature/amazing-feature`
724
- 8. Open a Pull Request
725
-
726
- ### Guidelines
727
-
728
- - **Tests required** for new functionality
729
- - **Lint clean** -- run `npm run lint` before submitting
730
- - **TypeScript strict** -- run `npm run typecheck`
731
- - **Small PRs preferred** -- focused changes are easier to review
732
- - **Follow existing patterns** -- check CLAUDE.md for architecture details
263
+ 2. Create a feature branch: `git checkout -b feature/your-feature`
264
+ 3. Run tests: `npm test && npm run lint && npm run typecheck`
265
+ 4. Open a Pull Request
733
266
 
734
267
  See [CONTRIBUTING.md](CONTRIBUTING.md) for full guidelines.
735
268
 
736
- ## Troubleshooting
737
-
738
- ### Common Issues
739
-
740
- **Microphone not detected**
741
- - Check System Preferences > Security & Privacy > Microphone
742
- - Grant markupr microphone access
743
-
744
- **Screen recording permission denied**
745
- - macOS: System Preferences > Security & Privacy > Screen Recording
746
- - Restart markupr after granting permission
747
-
748
- **Whisper model download failing**
749
- - Check your internet connection
750
- - Try a smaller model first (tiny: ~75MB)
751
- - Downloads support resume if interrupted
752
-
753
- **OpenAI API connection failed**
754
- - Verify your API key is correct
755
- - Check your internet connection
756
- - Ensure your OpenAI project has billing enabled
757
-
758
- **Hotkeys not working**
759
- - Check for conflicts with other applications
760
- - Try customizing hotkeys in Settings > Hotkeys
761
-
762
- **ffmpeg not found for frame extraction**
763
- - Install ffmpeg: `brew install ffmpeg` (macOS) or download from [ffmpeg.org](https://ffmpeg.org/)
764
- - markupr gracefully degrades to transcript-only output without ffmpeg
765
-
766
- See [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) for more solutions.
767
-
768
- ## Support markupr
769
-
770
- If markupr is useful in your workflow and you want to keep it improving quickly:
771
-
772
- - [Support on Ko-fi](https://ko-fi.com/eddiesanjuan)
773
- - Share the project with a teammate who writes bug reports
774
- - Open issues with reproducible feedback sessions so fixes land faster
775
-
776
269
  ## License
777
270
 
778
- MIT License - see [LICENSE](LICENSE) for details.
779
-
780
- ## Acknowledgments
781
-
782
- - [Whisper](https://github.com/openai/whisper) for local speech recognition
783
- - [Anthropic Claude](https://anthropic.com) for AI-enhanced document analysis
784
- - [OpenAI](https://platform.openai.com) for cloud transcription
785
- - [Electron](https://electronjs.org) for cross-platform desktop framework
786
- - [React](https://reactjs.org) for the UI framework
787
- - [Vite](https://vitejs.dev) for blazing fast builds
271
+ MIT -- see [LICENSE](LICENSE).
788
272
 
789
273
  ---
790
274
 
791
275
  <p align="center">
792
- Built by <a href="https://github.com/eddiesanjuan">Eddie San Juan</a>. Open source. MIT licensed.<br>
793
- <a href="https://ko-fi.com/eddiesanjuan">Support markupr on Ko-fi</a>
276
+ Built by <a href="https://github.com/eddiesanjuan">Eddie San Juan</a><br>
277
+ <a href="https://markupr.com">markupr.com</a>
794
278
  </p>