Skip to content

Commit 3e279ee

Browse files
authored
Merge pull request #28 from eddiesanjuan/launch/v2.4.0-ready
Launch: prepare markupr v2.4.0 for public release
2 parents aff7f9f + 43e1641 commit 3e279ee

File tree

4 files changed

+334
-8
lines changed

4 files changed

+334
-8
lines changed

README.md

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
<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>
1414
<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>
1515
<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>
16+
<a href="https://www.npmjs.com/package/markupr"><img src="https://img.shields.io/npm/v/markupr?style=flat-square" alt="npm version"></a>
1617
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square" alt="License"></a>
1718
<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>
1819
</p>
@@ -68,6 +69,11 @@ Download from [markupr.com](https://markupr.com) or the [releases page](https://
6869

6970
If markupr saves you hours, consider [supporting development on Ko-fi](https://ko-fi.com/eddiesanjuan).
7071

72+
## See It In Action
73+
74+
<!-- TODO: Replace with actual demo recording -->
75+
> **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.
76+
7177
## Why markupr?
7278

7379
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.
@@ -313,10 +319,13 @@ The output Markdown follows the llms.txt convention -- structured, parseable, an
313319

314320
## MCP Server (for AI Coding Agents)
315321

316-
markupr includes an MCP (Model Context Protocol) server that gives AI coding agents direct access to screen capture and voice recording. Claude Code, Cursor, and Windsurf can call markupr tools during a conversation -- capturing screenshots, recording your screen with voice narration, and receiving structured Markdown reports back.
322+
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."
323+
324+
### Setup
317325

318-
Add to your IDE config and your agent gets 6 tools: `capture_screenshot`, `capture_with_voice`, `analyze_video`, `analyze_screenshot`, `start_recording`, and `stop_recording`.
326+
Add to your IDE config and your agent gets 6 tools:
319327

328+
**Claude Code** (`~/.claude/settings.json`):
320329
```json
321330
{
322331
"mcpServers": {
@@ -328,7 +337,47 @@ Add to your IDE config and your agent gets 6 tools: `capture_screenshot`, `captu
328337
}
329338
```
330339

331-
See **[README-MCP.md](README-MCP.md)** for full setup instructions, tool documentation, and troubleshooting.
340+
**Cursor / Windsurf** (MCP settings):
341+
```json
342+
{
343+
"mcpServers": {
344+
"markupr": {
345+
"command": "npx",
346+
"args": ["-y", "markupr-mcp"]
347+
}
348+
}
349+
}
350+
```
351+
352+
### Available Tools
353+
354+
| Tool | What it does |
355+
|------|-------------|
356+
| `capture_screenshot` | Grab the current screen. Your agent sees what you see. |
357+
| `capture_with_voice` | Record screen + microphone for a set duration. Returns a full structured report. |
358+
| `analyze_video` | Process any `.mov` or `.mp4` into Markdown with extracted frames. |
359+
| `analyze_screenshot` | Feed a screenshot through the AI analysis pipeline. |
360+
| `start_recording` | Begin an interactive recording session. |
361+
| `stop_recording` | End the session. Full pipeline runs, report returned. |
362+
363+
### Example: Agent Captures and Fixes a Bug
364+
365+
In Claude Code, after adding the MCP config, your agent can do this:
366+
367+
```
368+
You: "The sidebar is overlapping the main content on mobile. Can you see it?"
369+
370+
Claude: [calls capture_screenshot]
371+
"I can see the issue -- the sidebar has position: fixed but no
372+
z-index, and it's 280px wide with no responsive breakpoint.
373+
Let me fix the CSS..."
374+
375+
[fixes the code]
376+
```
377+
378+
No copy-pasting screenshots. No describing the bug in text. The agent looks at your screen and acts.
379+
380+
See **[README-MCP.md](README-MCP.md)** for full setup instructions, all tool parameters, and troubleshooting.
332381

333382
## Usage
334383

scripts/generate-og-image.mjs

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
import sharp from 'sharp';
2+
import { join, dirname } from 'path';
3+
import { fileURLToPath } from 'url';
4+
5+
const __dirname = dirname(fileURLToPath(import.meta.url));
6+
const outputPath = join(__dirname, '..', 'site', 'og-image.png');
7+
8+
const width = 1200;
9+
const height = 630;
10+
11+
// Colors from the site's design system
12+
const bgColor = '#0A0A0B';
13+
const textPrimary = '#F5F5F5';
14+
const accent = '#F59E0B';
15+
const textSecondary = '#A0A0A0';
16+
const textTertiary = '#666666';
17+
18+
const svg = `
19+
<svg width="${width}" height="${height}" xmlns="http://www.w3.org/2000/svg">
20+
<defs>
21+
<style>
22+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;700;900&amp;display=swap');
23+
</style>
24+
</defs>
25+
26+
<!-- Background -->
27+
<rect width="${width}" height="${height}" fill="${bgColor}"/>
28+
29+
<!-- Subtle grid pattern -->
30+
<pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
31+
<rect width="40" height="40" fill="none"/>
32+
<rect width="1" height="1" x="0" y="0" fill="rgba(255,255,255,0.03)"/>
33+
</pattern>
34+
<rect width="${width}" height="${height}" fill="url(#grid)"/>
35+
36+
<!-- Top accent line -->
37+
<rect x="0" y="0" width="${width}" height="4" fill="${accent}"/>
38+
39+
<!-- Bottom accent line -->
40+
<rect x="0" y="${height - 4}" width="${width}" height="4" fill="${accent}"/>
41+
42+
<!-- Wordmark: "markup" in white + "R" in amber -->
43+
<text x="600" y="240" text-anchor="middle" font-family="-apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial, sans-serif" font-size="96" font-weight="900" letter-spacing="-4">
44+
<tspan fill="${textPrimary}">markup</tspan><tspan fill="${accent}">R</tspan>
45+
</text>
46+
47+
<!-- Tagline -->
48+
<text x="600" y="320" text-anchor="middle" font-family="-apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial, sans-serif" font-size="32" font-weight="700" fill="${textPrimary}" letter-spacing="-1">
49+
You see it. You say it. Your AI fixes it.
50+
</text>
51+
52+
<!-- Subtitle -->
53+
<text x="600" y="380" text-anchor="middle" font-family="-apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial, sans-serif" font-size="22" font-weight="400" fill="${textSecondary}">
54+
AI-ready developer feedback capture -- open source
55+
</text>
56+
57+
<!-- Decorative neo-brutalist border elements -->
58+
<!-- Left bracket -->
59+
<rect x="80" y="180" width="4" height="220" fill="${accent}" opacity="0.6"/>
60+
<rect x="80" y="180" width="24" height="4" fill="${accent}" opacity="0.6"/>
61+
<rect x="80" y="396" width="24" height="4" fill="${accent}" opacity="0.6"/>
62+
63+
<!-- Right bracket -->
64+
<rect x="${width - 84}" y="180" width="4" height="220" fill="${accent}" opacity="0.6"/>
65+
<rect x="${width - 104}" y="180" width="24" height="4" fill="${accent}" opacity="0.6"/>
66+
<rect x="${width - 104}" y="396" width="24" height="4" fill="${accent}" opacity="0.6"/>
67+
68+
<!-- Bottom info bar -->
69+
<rect x="0" y="${height - 80}" width="${width}" height="76" fill="rgba(255,255,255,0.03)"/>
70+
<line x1="0" y1="${height - 80}" x2="${width}" y2="${height - 80}" stroke="rgba(255,255,255,0.08)" stroke-width="1"/>
71+
72+
<!-- GitHub icon hint -->
73+
<text x="200" y="${height - 34}" text-anchor="middle" font-family="-apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial, sans-serif" font-size="16" font-weight="600" fill="${textTertiary}">
74+
github.com/eddiesanjuan/markupr
75+
</text>
76+
77+
<!-- Version badge -->
78+
<rect x="880" y="${height - 60}" width="80" height="28" rx="4" fill="rgba(245,158,11,0.15)" stroke="${accent}" stroke-width="2"/>
79+
<text x="920" y="${height - 40}" text-anchor="middle" font-family="-apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial, sans-serif" font-size="14" font-weight="700" fill="${accent}">
80+
v2.4.0
81+
</text>
82+
83+
<!-- MIT badge -->
84+
<rect x="980" y="${height - 60}" width="60" height="28" rx="4" fill="rgba(255,255,255,0.05)" stroke="rgba(255,255,255,0.16)" stroke-width="2"/>
85+
<text x="1010" y="${height - 40}" text-anchor="middle" font-family="-apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial, sans-serif" font-size="14" font-weight="600" fill="${textTertiary}">
86+
MIT
87+
</text>
88+
</svg>`;
89+
90+
async function generate() {
91+
try {
92+
await sharp(Buffer.from(svg))
93+
.png()
94+
.toFile(outputPath);
95+
96+
const metadata = await sharp(outputPath).metadata();
97+
console.log(`OG image generated: ${outputPath}`);
98+
console.log(`Dimensions: ${metadata.width}x${metadata.height}`);
99+
console.log(`Format: ${metadata.format}`);
100+
console.log(`Size: ${(metadata.size || 0) / 1024} KB`);
101+
} catch (err) {
102+
console.error('Failed to generate OG image:', err);
103+
process.exit(1);
104+
}
105+
}
106+
107+
generate();

0 commit comments

Comments
 (0)