Ctrl K
ComunidadGuías…

site/comparison-matrix.mjs

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
// 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]),
  ),
};