- Fastify API: demos/steps CRUD, content-addressed assets, scoped API keys (read/author/publish/admin, draft-only default per D4) - Player: image + sandboxed DOM steps, hotspots, tooltips, keyboard nav, privacy-first beacons (no IP storage, viewer tokens only — R7) - Editor: React SPA — demo list, drag-to-draw hotspots, annotations, publish - MCP server: Streamable HTTP, scope-filtered tools, untrusted-data wrapping on viewer-supplied content (R8); platform never calls a model - Capture extension (MV3): screenshot-flow recording, hotspots pre-placed from real clicks - Docker: single app image + postgres, Traefik-ready (expose only) E2E verified: capture->author->publish->play->beacon->lead->analytics + full MCP tool surface with scope filtering.
21 lines
1,002 B
HTML
21 lines
1,002 B
HTML
<!doctype html>
|
|
<html>
|
|
<head><meta charset="utf-8">
|
|
<style>
|
|
body { font: 13px system-ui, sans-serif; width: 280px; padding: 14px; color: #0f172a; }
|
|
input { width: 100%; margin: 4px 0 8px; padding: 6px 8px; border: 1px solid #e2e8f0; border-radius: 6px; box-sizing: border-box; }
|
|
button { width: 100%; margin-top: 6px; padding: 8px; border: 1px solid #e2e8f0; border-radius: 6px; background: #fff; cursor: pointer; }
|
|
button.primary { background: #2563eb; color: #fff; border-color: #2563eb; }
|
|
#status { color: #64748b; margin: 8px 0; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<label>Platform URL <input id="base" placeholder="https://demo.example.com"></label>
|
|
<label>API key <input id="key" type="password" placeholder="dp_..."></label>
|
|
<div id="status">Not recording.</div>
|
|
<button id="start" class="primary">Start recording this tab</button>
|
|
<button id="finish" hidden>Finish & upload</button>
|
|
<button id="discard" hidden>Discard</button>
|
|
<script src="popup.js"></script>
|
|
</body>
|
|
</html>
|