🐞 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
| Feld | Pflicht | Typ / Grenze | Bedeutung |
|---|---|---|---|
title | ja | Text, max. 200 | Kurzer Titel des Fehlers |
description | ja | Text, max. 10 000 | Was ist passiert, was wurde erwartet, Schritte |
reporter | nein | Text, max. 120 | Name oder E-Mail der meldenden Person |
pluginVersion | nein | Text, max. 40 | z. B. chrome.runtime.getManifest().version |
browser | nein | Text, max. 300 | Standard: User-Agent der Anfrage |
pageUrl | nein | Text, max. 2000 | Seite, auf der der Fehler auftrat |
screenshot | nein | Data-URL PNG/JPEG/WebP, max. 4 MB | z. B. aus chrome.tabs.captureVisibleTab (JPEG empfohlen) |
extra | nein | beliebiges JSON, max. 50 KB | Logs, Einstellungen, Fehler-Stack … |
website | – | immer weglassen | Spamfalle: Ist es gefüllt, wird die Meldung still verworfen |
Gesamtgröße der Anfrage: höchstens 6 MB.
Antworten
| Status | Inhalt | Bedeutung |
|---|---|---|
| 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-After | Spamschutz greift – später erneut versuchen |
Die Fehlermeldungen in error sind deutsch und können direkt angezeigt werden.
Spamschutz und Limits
- Je IP-Adresse höchstens 5 Meldungen pro Minute und 60 pro Stunde (großzügig, weil in der Firma viele dieselbe öffentliche IP teilen).
- Insgesamt höchstens 500 Meldungen pro Tag.
- Gleiche Meldung (Titel + Beschreibung) innerhalb von 10 Minuten wird nicht doppelt angelegt.
- Bildschirmfotos werden nicht mehr gespeichert, wenn zusammen mehr als 1 GB belegt ist (das Ticket selbst schon).
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.