site/comparison-matrix.mjs
Rama main · réplica de lectura del repositorio original.
// Canonical dated evidence. No verdict is inferred from a missing keyword.
import feedbacks from "./comparison-evidence/feedbacks.mjs";
import audit0 from "./comparison-evidence/bugpin.mjs";
import audit1 from "./comparison-evidence/fasterfixes.mjs";
import audit2 from "./comparison-evidence/siteping.mjs";
import audit3 from "./comparison-evidence/openreplay.mjs";
import audit4 from "./comparison-evidence/bugherd.mjs";
import audit5 from "./comparison-evidence/marker-io.mjs";
import audit6 from "./comparison-evidence/markup-io.mjs";
import audit7 from "./comparison-evidence/markup-hero.mjs";
import audit8 from "./comparison-evidence/redpen-ai.mjs";
import audit9 from "./comparison-evidence/pastel.mjs";
import audit10 from "./comparison-evidence/ruttl.mjs";
import audit11 from "./comparison-evidence/superflow.mjs";
import audit12 from "./comparison-evidence/usersnap.mjs";
import audit13 from "./comparison-evidence/userback.mjs";
import audit14 from "./comparison-evidence/atarim.mjs";
export const matrixReviewed = "30 September 2026";
export const matrixGroups = [
{
id: "highlights",
title: "Distinctive Feedbacks workflows",
description:
"Compare the complete product, portable evidence and team-aware agent handoff. A distinctive combination does not mean every capability is exclusive.",
features: [
["apacheLicense", "Apache-2.0 licensed complete product"],
["allFeaturesFree", "All product features without a license fee"],
["threadBundle", "Portable complete thread archive"],
["expertise", "Owner-approved weighted reviewer guidance in MCP"],
["projectContext", "Versioned project guidance for agents"],
["multiApps", "Multiple GitHub Apps on one server"],
["agentQueue", "Assigned and prioritized task queue through MCP"],
["sessionOnly", "Session capture without recording video"],
["screenshotDiagnostics", "DOM, console and network bundle with screenshots"],
["textSuggestions", "Selected text and replacement suggestions"],
["timeline", "Shared playback and diagnostic timeline"],
["frameAnnotations", "Timestamped frame annotations"],
],
},
{
id: "capture",
title: "Capture and page review",
description:
"Keep the page, the selected element and its original evidence together.",
features: [
["extension", "Browser extension capture"],
["screenshots", "Screenshot capture"],
["fullPage", "Full-page capture"],
["pins", "Element or page pins"],
["originals", "Original screenshot per review point"],
["drafts", "Local multi-point review-and-send queue"],
["resolved", "Resolve individual points"],
["reviewDefaults", "Saved review and recording controls"],
],
},
{
id: "annotation",
title: "Annotation and image exports",
description:
"Compare specific editing tools and output formats, not just an annotation checkbox.",
features: [
["drawing", "Draw, shapes and text"],
["highlighter", "Highlighter"],
["steps", "Numbered steps"],
["blur", "Blur tool"],
["redact", "Mask private pixels"],
["stickers", "Stamps or stickers"],
["localImages", "Insert, move and resize local images"],
["cropExport", "Crop screenshot exports"],
["rasterExport", "PNG, JPEG and WebP export"],
["pdfExport", "Multi-page PDF export"],
["clipboard", "Copy annotated image"],
],
},
{
id: "recording",
title: "Recording and diagnostics",
description:
"Recording a new clip and replaying a past session are different capabilities.",
features: [
["video", "Record feedback video"],
["tabAudio", "Capture tab audio"],
["microphone", "Microphone narration"],
["pauseVideo", "Pause and resume recording"],
["trimVideo", "Trim video visually"],
["cropVideo", "Crop video frame"],
["replay", "Session replay"],
["diagnostics", "Console or network context"],
],
},
{
id: "collaboration",
title: "Team discussion and agent handoff",
description: "Check how reviewers, developers and authorized agents share the work.",
features: [
["discussion", "Team comments and replies"],
["mcp", "Feedback via MCP"],
["agentContext", "Visual or page context for agents"],
["github", "GitHub Issues handoff"],
["multiRepo", "Multiple GitHub repositories per project"],
["nativeClients", "Native mobile feedback SDKs"],
],
},
{
id: "hosting",
title: "Source and self-hosting",
description: "Availability in a hosted plan does not establish self-hosting support.",
features: [
["source", "Public server source"],
["selfHost", "Whole service self-hosted"],
["independent", "No required external account"],
["storage", "S3 in no-fee self-hosting"],
],
},
];
export const matrixFeatures = matrixGroups.flatMap((group) => group.features);
export const feedbacksAudit = feedbacks;
export const vendorAudits = {
bugpin: audit0,
fasterfixes: audit1,
siteping: audit2,
openreplay: audit3,
bugherd: audit4,
"marker-io": audit5,
"markup-io": audit6,
"markup-hero": audit7,
"redpen-ai": audit8,
pastel: audit9,
ruttl: audit10,
superflow: audit11,
usersnap: audit12,
userback: audit13,
atarim: audit14,
};
export const matrixRows = {
feedbacks: feedbacks.cells,
...Object.fromEntries(
Object.entries(vendorAudits).map(([slug, audit]) => [slug, audit.cells]),
),
};