Skip to content

Latest commit

 

History

372 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MarkuprPlus

MarkuprPlus

You see it. You say it. Your AI fixes it.

A Windows and macOS desktop app, CLI, and MCP server for visual feedback.
Record and annotate from your desktop, process recordings from the terminal, or give your AI agent screen capture tools.

Download for Windows or macOS · Use the CLI · Connect an MCP client · GitHub Action

Watch the 33-second MarkuprPlus product tour

▶ Watch the 33-second product tour

Pick a window. Talk through what's wrong. Circle it while it happens.
Every circle becomes its own issue, with its own screenshot, ready to paste into your coding agent.

CI Nightly Deploy Action Coverage

Version 3.2.0 Desktop app for Windows and macOS MarkuprPlus CLI MCP server for AI agents Local Whisper transcription License

Quick Start · The Loop · Output · Screenshots · Providers · MCP · CLI


An app under review, unmarked    The same screen with a red freehand ellipse around the problem

Hold Ctrl on Windows or Cmd on macOS, circle the problem, keep talking. That stroke becomes MX-001.

The Problem

Your coding agent can't see your screen. So you stop working and start transcribing: describe the layout bug in prose, take a screenshot, crop it, drag it into the right place, explain which part matters. You speak at 150 words per minute and type at 60, and the context leaks out on the way.

The Solution

MarkuprPlus is a Windows and macOS desktop app, with a CLI, MCP server, and GitHub Action for automated workflows. The desktop app lives in the Windows system tray or macOS menu bar. It records the exact window you point at, listens while you narrate, and lets you draw on the live screen without blocking your clicks. When you stop, it transcribes on-device, aligns your words to each mark, and writes a report your agent can act on — one finding per circle, each with its own annotated frame.

Use MarkuprPlus as What you can do Get started
Windows desktop app Record your screen and voice, draw live annotations, and review reports from the system tray. Download for Windows
macOS desktop app Capture and annotate from the menu bar on Apple Silicon or Intel Macs. Download for macOS
CLI Analyze existing recordings, watch folders, and generate reports in scripts. CLI commands
MCP server Let an AI coding agent capture screenshots, record sessions, and receive structured reports. Connect your agent
GitHub Action Process recordings in your GitHub Actions workflows. Action setup
Windows: Ctrl+Shift+F → talk → Ctrl-drag → Ctrl+Shift+F → paste into your agent
macOS:   Cmd+Shift+F  → talk → Cmd-drag  → Cmd+Shift+F  → paste into your agent

The Loop

1. Press the capture shortcut and pick your target

Use Ctrl+Shift+F on Windows or Cmd+Shift+F on macOS.

The MarkuprPlus popover in its Ready To Capture state

The picker opens above every window. Whatever is under your cursor lights up — click it and the recorder locks onto that window alone, and stays locked through moves, resizes, and app switches. Region and full-display modes are one click away when a finding needs a wider frame.

If the window's identity or native geometry ever becomes ambiguous mid-session, capture stops rather than widening to whatever is behind it. You never ship a frame you didn't mean to share.

The capture controls live in one portrait popover, accessible from the Windows system tray or macOS menu bar.


2. Talk while you work

Keep clicking through your app as usual. MarkuprPlus records the window and your microphone together, then transcribes with Whisper on-device after you stop.

The picker, the drawing canvas, and the recording HUD are all excluded from screen capture at the OS level — nothing MarkuprPlus draws ends up in your video. Only your app does, plus the strokes you meant to leave.

3. Hold Ctrl (Windows) or Cmd (macOS) and draw

A red hand-drawn ellipse around the tab bar of the app under review

Hold the modifier key and drag to paint straight onto the live screen — freehand, circle, or highlight, in a colour you choose. Let go of the key and your next normal click both reaches the app underneath and saves that mark, clearing the canvas for the next one.

Three circles means three issues, not one screenshot with three scribbles on it. Each finding carries its own PNG, timestamp, tool, and colour.


4. Press the capture shortcut again to stop

Use Ctrl+Shift+F on Windows or Cmd+Shift+F on macOS.

The popover showing Report Ready with the markdown path copied to the clipboard

Whisper runs, your narration is aligned to each mark, and the report is written to disk. The markdown path lands on your clipboard the moment it's ready — paste it straight into Claude Code, Codex, Cursor, or anything else that reads a file.

Everything for the session goes in one folder: the report, the screenshots, the session video, the narration audio, and the metadata.


Quick Start

Windows and macOS desktop app (recommended)

Download from markuprplus.com or the releases page. Choose the Windows installer (.exe) or the macOS disk image (.dmg) for Apple Silicon or Intel.

macOS install note: Direct downloads from GitHub Releases are signed, notarized, and stapled. If Gatekeeper rejects an artifact, use MarkuprPlus support so the release can be investigated.

  1. Press Cmd+Shift+F (macOS) or Ctrl+Shift+F (Windows) and click the window you want.
  2. Narrate what you see. Hold Cmd / Ctrl and drag to mark the live screen.
  3. Release the key, then click normally — that saves the mark and clears the canvas. Repeat for every finding.
  4. Press the hotkey again to stop. The report path is on your clipboard.

MCP server (for AI coding agents)

npx --yes --package markuprplus markuprplus-mcp

CLI (for recordings you already have)

npx markuprplus analyze ./recording.mov

Compatibility: the public package and commands are markuprplus and markuprplus-mcp. Existing .markuprx project files, storage paths, and app identifiers remain unchanged so upgrades keep their settings and sessions.

Optional companion for Mac App Store CLI integrations

The sandboxed Mac App Store app can use AI command-line tools already installed and signed in on your Mac through the optional MarkuprPlus CLI Bridge. Local Rules, Ollama, LM Studio, and Anthropic API do not require this companion.

Install and pair it from a Terminal:

npm install -g markuprplus
markuprplus bridge install     # installs and starts a per-user LaunchAgent
markuprplus bridge token       # paste this value in Settings → Advanced
markuprplus bridge status

The public npm package contains the same versioned CLI and MCP entry points used by the source release.

The service listens only on 127.0.0.1:49647, requires its random pairing token for every provider request, and accepts a fixed structured-report protocol rather than shell text. The App Store app does not run shell commands or launch external tools; the separately installed companion invokes only the provider selected in Settings.

Lifecycle and recovery commands:

markuprplus bridge start
markuprplus bridge stop
markuprplus bridge status
markuprplus bridge token
markuprplus bridge rotate-token
markuprplus bridge uninstall

Rotating the token requires pairing again. Uninstall removes the exact LaunchAgent and bridge configuration owned by MarkuprPlus; it does not uninstall your AI CLIs.

What Lands in Your Folder

One session, one directory:

originplayer-test-iphone-20260818-104731/
├── feedback-report.md          # the file you paste
├── feedback-summary.md         # counts and duration
├── metadata.json               # per-issue capture context
├── processing-trace.json       # which provider ran, how long, why it fell back
├── screenshots/
│   ├── marked-issue-001.png    # one frame per mark, your stroke composited in
│   ├── marked-issue-002.png
│   └── marked-issue-003.png
├── session-recording.webm      # the window, with annotations
└── session-audio.webm          # your narration

A real, unedited finding from that session:

### MX-001

- **Timestamp:** 00:08
- **Tools:** freehand
- **Colors:** #ff3b30

#### User Comment

> So there's a search menu and over here by default, if there's been
> previous searches, it should list out all the searches that have
> happened in the past.

#### Marked Evidence

![Marked issue MX-001](./screenshots/marked-issue-001.png)

Each finding carries more than pixels:

What travels with the issue Example
Its own annotated PNG screenshots/marked-issue-001.png
The narration at that moment transcript-segment-0001 … 0002
How you marked it freehand · #ff3b30
Where it came from window:5976:0 · OriginPlayer Test iPhone · darwin
Cursor, active app, and focus hints captured at the instant you drew
Trigger metadata annotation, manual, pause, or voice-command

Marked issues are numbered MX-001…; items that come from narration alone are FB-001….

Every Surface

Provider list with live reachability status
Report providers
Fifteen ways to turn a session into a report, each showing whether it's reachable right now — CLI version and path, local port, missing key.
Review editor with editable category and severity chips
Review editor
Reorder findings, retitle them, change category and severity, and drop the ones that were just thinking out loud.
Live markdown preview inside the review editor
Live markdown preview
See the exact file your agent will read before you save it. Copy it, open the folder, or export.
Recent captures list with item and shot counts
Recent captures
Every session stays on disk with its item and shot counts. Copy any report path back without hunting through Finder.
Hotkey settings and quick reference
Hotkeys
Record, screenshot, and pause are global and rebindable, with the quick reference kept in the panel.
Accent colour picker with live preview
Appearance
Ten accent colours plus a custom picker, previewed live. Light and dark follow the system.
Recording behaviour and audio input settings
Recording & audio
Countdown before recording, audio waveform feedback, and microphone selection.
Local transcription and credential settings
Transcription & keys
Whisper runs locally first. OpenAI only receives audio if local recovery fails and you saved a key.
Menu bar context menu
Menu bar
Start a recording, jump to settings, or quit — without opening the popover at all.

Local Transcription

On desktop startup, MarkuprPlus downloads the multilingual Whisper tiny model (~75 MB) in the background if no local model is installed. Existing models are reused. Download progress and retryable errors appear under Settings > Advanced > Local Transcription. Interrupted downloads resume on the next startup; offline or failed downloads do not block opening the app. Once downloaded, local transcription works without an internet connection.

Interface Language

The desktop interface defaults to English, including when upgrading from an installation that previously displayed Traditional Chinese automatically. Choose Settings > General > Language > Interface language to opt into Traditional Chinese or switch back to English. The preference is saved and applies immediately across open windows without restarting or interrupting a recording. Resetting General settings restores English.

Interface language is separate from transcription language. Feedback text, recordings, and generated reports are not translated by this setting.

To add another interface language, register its identifier and display name in src/shared/uiLanguage.ts and its translation catalog in src/renderer/i18n/catalogs.ts. English labels are the source and fallback for missing translations; mark user-content regions with translate="no".

Report Providers

Pick the model that turns a capture into a structured report. MarkuprPlus checks each one before you record and shows you what it actually found.

In the Mac App Store app, CLI providers use the optional local companion described above. Direct desktop builds invoke the same adapters inside the app. Both paths preserve Local Rules as the failure-safe report.

Provider Kind What it uses
Codex CLI CLI Your installed CLI or the Codex Mac app's bundled CLI and existing ChatGPT login, in a read-only ephemeral session
Claude Code CLI CLI The Claude Code CLI you're already signed in to
GitHub Copilot CLI CLI Copilot CLI 1.0.83+ with your existing GitHub login, in an isolated tool-free session
OpenCode CLI Your configured OpenCode provider, with a per-run agent that denies every tool action
Cursor Agent CLI CLI Cursor Agent in non-interactive, read-only Ask mode
Qwen Code CLI Qwen Code in safe, non-interactive plan mode with mutation tools excluded
Goose CLI Your configured Goose provider in tool-free chat mode, without profiles or session persistence
Amp CLI Your Amp login with an isolated default-deny tool policy
Kiro CLI CLI Kiro headless mode with only read and grep trusted
Aider CLI Your configured Aider model in dry-run, no-git mode
Ollama Local A model served on 127.0.0.1:11434 — nothing leaves the machine
LM Studio Local An LM Studio server on 127.0.0.1:1234
Anthropic API Cloud Your own key, stored in the system keychain and used for nothing else
Local rules Zero setup Deterministic report from transcript and marks alone, no credentials

Failure is safe by design. If the provider you picked errors out, the deterministic Local rules report is written anyway, and the popover names the provider and the reason. Your recording, audio, and marks were already on disk before analysis started. An explicit CLI choice never silently becomes an Anthropic call.

Codex CLI, GitHub Copilot CLI, and OpenCode can receive captured screenshots. Transcript-only CLI adapters reject screenshot-only sessions instead of inventing visual findings.

To use GitHub Copilot CLI, install or update copilot, run copilot login in Terminal, then select GitHub Copilot CLI in Report Settings and refresh providers. Leave the model blank to use your Copilot default, or enter a Copilot model ID. Discovery verifies the installed version; authentication is verified when a report runs. The optional CLI Bridge provides the same integration for the Mac App Store app.

Copilot receives the transcript over stdin and screenshots as attachments. Each report uses a temporary Copilot configuration that reuses only your login identity (credentials remain in the OS credential store) and default model, not your plugins, hooks, MCP servers, or saved permissions. All model tools and custom instructions are disabled. Temporary context is removed after success or failure. Environment-token authentication is also supported; plaintext credential fallbacks are not copied into the temporary configuration.

processing-trace.json records exactly what happened:

{
  "requestedProvider": "codex-cli",
  "actualProvider": "rules",
  "aiFallbackReason": "Codex analysis exited with status 1.",
  "aiEnhanced": false,
  "totalMs": 4220
}

Why MarkuprPlus

Evidence, not footage. A screen recording leaves your agent a video it can't watch and you a file you have to narrate twice. This gives you separate findings, one annotated frame each, the words you said at that timestamp, and the window and cursor context.

Local-first. Whisper runs on your device and Local rules needs no credentials. Cloud transcription and cloud models only run when you explicitly pick them. No account, no telemetry, no analytics.

It doesn't film itself. The picker, the drawing canvas, and the recording HUD are content-protected at the OS level. Your marks reach the report; the app's own chrome never reaches the video.

Fits your workflow. Windows and macOS desktop apps for daily capture, a CLI for scripts and CI, an MCP server for agents, and a GitHub Action for pull requests.

Open source. MIT licensed. Read it, fork it, ship it.

MCP Server

Give your agent eyes and ears. It can capture screenshots, record your screen with voice, and receive structured reports mid-conversation.

Connect GitHub Copilot CLI, the Claude Mac app, or Codex with the setup command:

npm install -g markuprplus
markuprplus integrate copilot
markuprplus integrate claude-desktop
markuprplus integrate codex

Run the command for each client you use, then restart that client. Claude setup covers both Chat and Code. Codex shares its configuration with its CLI. Add --dry-run to preview; existing settings and other servers are preserved, and changed files are backed up. An existing conflicting markuprplus entry requires --force. See client setup and capabilities for details.

For manual setup, Claude Code (~/.claude.json or project .mcp.json), Cursor, and Windsurf take the same shape:

{
  "mcpServers": {
    "MarkuprPlus": {
      "command": "npx",
      "args": ["--yes", "--package", "markuprplus", "markuprplus-mcp"]
    }
  }
}

Tools

Tool Description
capture_screenshot Grab the current screen with cursor, active app/window, and focus hints attached.
capture_with_voice Record screen and mic for a set duration, and return a structured report.
describe_screen Describe what's currently on screen.
start_recording Begin an interactive recording session.
stop_recording End the session and run the full pipeline.
analyze_video Process an existing .mov / .mp4 into Markdown with extracted frames.
analyze_screenshot Run a single screenshot through the analysis pipeline.
push_to_github Create GitHub issues from a report.
push_to_linear Create Linear issues from a report.
You: "The sidebar is overlapping the main content on mobile. Can you see it?"

Agent: [calls capture_screenshot]
       "I can see it — the sidebar is position: fixed with no z-index,
        280px wide with no responsive breakpoint. Fixing the CSS..."

Full MCP documentation: README-MCP.md.

CLI

npx markuprplus analyze ./recording.mov
Command What it does
markuprplus analyze <video> Turn an existing recording into a structured report
markuprplus watch [dir] Process new recordings from a folder as they land
markuprplus doctor Check your environment for dependencies and configuration
markuprplus init Scaffold configuration
markuprplus push github <report> Create GitHub issues from a report
markuprplus push linear <report> Create Linear issues from a report
markuprplus analyze ./recording.mov --output ./reports
markuprplus analyze ./recording.mov --template github-issue
markuprplus analyze ./recording.mov --no-frames        # transcript only
markuprplus watch ~/Desktop --output ./reports
markuprplus push github ./report.md --repo myorg/myapp --dry-run

Output templates: markdown (default) · json · github-issue · linear · jira The desktop app also exports html and pdf.

Requirements: Node.js 20.9+ and ffmpeg on your PATH (brew install ffmpeg / apt install ffmpeg / choco install ffmpeg).

MarkuprPlus desktop-to-report workflow demo

Integrations

GitHub Action

Analyze recordings in CI and post structured feedback on the pull request that needs it:

- uses: eddiesanjuan/markuprx-action@v1
  with:
    video-path: ./recordings/
    github-token: ${{ secrets.GITHUB_TOKEN }}
    create-issues: 'true'

See markuprx-action/README.md for every input.

Issue trackers

Push each finding straight into GitHub Issues or Linear — screenshot, narration, timestamp, and capture context already formatted — from the app, the CLI, or your agent over MCP.

Keyboard Shortcuts

Action macOS Windows
Start / stop recording Cmd+Shift+F Ctrl+Shift+F
Mark the live screen hold Cmd and drag hold Ctrl and drag
Manual screenshot Cmd+Shift+S Ctrl+Shift+S
Pause / resume Cmd+Shift+P Ctrl+Shift+P
Settings Cmd+, Ctrl+,

Recording, screenshot, and pause are global and rebindable in Settings → Hotkeys. Full reference: docs/KEYBOARD_SHORTCUTS.md.

How It Works

                    +-----------+
  Screen + Voice -> | Whisper   | -> Timestamped transcript
                    +-----------+
                         |
                    +-----------+
                    | Aligner   | -> Marks matched to the words around them
                    +-----------+
                         |
                    +-----------+
                    | Provider  | -> Structure and severity (or local rules)
                    +-----------+
                         |
                    +-----------+
                    | Generator | -> Markdown, HTML, JSON, PDF, or tracker-ready
                    +-----------+

The pipeline degrades gracefully at every step. No ffmpeg? Transcript-only output. No Whisper model? Timer-based screenshots. No provider? Local rules. A failure anywhere still leaves you a report and the raw session on disk.

For architecture details, see CLAUDE.md.

Development

npm install
npm run dev
Command Description
npm run dev Development mode with hot reload
npm run build Build everything (desktop + CLI + MCP)
npm test Run all tests
npm run lint Lint
npm run typecheck Type check

Contributing

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/your-feature
  3. Run tests: npm test && npm run lint && npm run typecheck
  4. Open a Pull Request

See CONTRIBUTING.md for full guidelines.

License

MIT — see LICENSE.


www.markuprplus.com

About

Record your screen, narrate the bug, and hand your AI coding agent structured Markdown - one annotated screenshot per mark. Desktop app, CLI, and MCP server for Claude Code, Cursor, Codex, and Windsurf. On-device Whisper transcription, local-first, MIT.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

78 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages