🐞 Tickets – Schnittstelle fürs Browser-Plugin

Anleitung für die Entwicklung: So meldet das Plugin Fehler an https://tickets.schemo.one.

Kein Konto und kein Schlüssel nötig. Das Plugin schickt einfach eine JSON-Anfrage. Die Übersicht der Tickets (/) ist passwortgeschützt und nur für den Betreiber.

Endpunkt

POST https://tickets.schemo.one/api/report
Content-Type: application/json

CORS ist offen (Access-Control-Allow-Origin: *). Trotzdem am besten aus dem Background-/Service-Worker senden und "host_permissions": ["https://tickets.schemo.one/*"] im Manifest eintragen.

Felder

FeldPflichtTyp / GrenzeBedeutung
titlejaText, max. 200Kurzer Titel des Fehlers
descriptionjaText, max. 10 000Was ist passiert, was wurde erwartet, Schritte
reporterneinText, max. 120Name oder E-Mail der meldenden Person
pluginVersionneinText, max. 40z. B. chrome.runtime.getManifest().version
browserneinText, max. 300Standard: User-Agent der Anfrage
pageUrlneinText, max. 2000Seite, auf der der Fehler auftrat
screenshotneinData-URL PNG/JPEG/WebP, max. 4 MBz. B. aus chrome.tabs.captureVisibleTab (JPEG empfohlen)
extraneinbeliebiges JSON, max. 50 KBLogs, Einstellungen, Fehler-Stack …
website–immer weglassenSpamfalle: Ist es gefüllt, wird die Meldung still verworfen

Gesamtgröße der Anfrage: höchstens 6 MB.

Antworten

StatusInhaltBedeutung
201{"ok":true,"id":"…","number":12}Ticket angelegt – number kann man der Person anzeigen („Ticket #12“)
200{"ok":true,…,"duplicate":true}Gleiche Meldung kam in den letzten 10 Min. schon an – kein neues Ticket
400{"error":"…"}Pflichtfeld fehlt oder kein gültiges JSON
413{"error":"…"}Zu groß
429{"error":"…"} + Retry-AfterSpamschutz greift – später erneut versuchen

Die Fehlermeldungen in error sind deutsch und können direkt angezeigt werden.

Spamschutz und Limits

Empfehlung fürs Plugin: Senden-Knopf nach dem Klick sperren, bis die Antwort da ist.

Beispiel (Manifest V3, Service Worker)

// manifest.json: "permissions": ["activeTab"], "host_permissions": ["https://tickets.schemo.one/*"]

async function reportBug({ title, description, reporter, withScreenshot, extra }) {
  const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
  let screenshot;
  if (withScreenshot) {
    screenshot = await chrome.tabs.captureVisibleTab(undefined, { format: 'jpeg', quality: 70 });
  }
  const res = await fetch('https://tickets.schemo.one/api/report', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      title, description, reporter,
      pluginVersion: chrome.runtime.getManifest().version,
      browser: navigator.userAgent,
      pageUrl: tab?.url,
      screenshot,
      extra,
    }),
  });
  const data = await res.json();
  if (!res.ok) throw new Error(data.error || 'Meldung fehlgeschlagen');
  return data; // { ok, id, number, duplicate? }
}

Test mit curl

curl -X POST https://tickets.schemo.one/api/report \
  -H 'Content-Type: application/json' \
  -d '{"title":"Test","description":"Nur ein Test","pluginVersion":"0.0.1"}'

Datenschutz-Hinweis

Seiten-Adressen und Bildschirmfotos können interne Firmendaten enthalten. Die Daten liegen auf einem eigenen Server in Deutschland (Hetzner, Falkenstein). Im Plugin sollte die meldende Person sehen, was mitgeschickt wird, und das Bildschirmfoto abwählen können.