Skip to content

Ein Tag, ein SDK, ein Projekt.

Vier Dinge zu verkabeln, keines davon länger als ein paar Zeilen. Alles meldet in dasselbe Projekt und landet auf demselben Dashboard.

Quellen

ein Projekt
web
downloads
app
errors
logs
feedback

Einrichtung

Vier Zeilen Verkabelung, dann meldet es.

Es gibt keine Pipeline aufzusetzen und kein Warehouse anzubinden. Tag und SDK sprechen mit einem Endpunkt, und der Endpunkt schreibt in eine Datenbank.

  1. 01 web

    Tag auf der Website einbinden

    Ein Script-Tag auf der Marketing-Seite. Reines TypeScript, unter 3 KB gzip, keine Abhängigkeiten und kein zweiter Request. Vor der Einwilligung schreibt und sendet es nichts.

    <script defer
      src="https://…/t.js"
      data-key="fr_web_…"></script>
  2. 02 app

    SDK in der App initialisieren

    Ein Aufruf beim Start. Ab da trägt derselbe Client Produkt-Events, Exceptions, Logs und Feedback, also gibt es eine Sache zu konfigurieren statt vier.

    firstrun.init({
      key: "fr_app_…",
      release: "2.7.0",
    })
  3. 03 app

    Senden, was du zählen willst

    Ein typisierter Umschlag mit deinem eigenen Namen und deinen Properties. Exceptions und Log-Zeilen nehmen denselben Weg, deshalb übersteht ein Event, das auf einem Laptop ohne Netz in der Queue lag, den Neustart und kommt später an.

    firstrun.track("project.created", {
      template: "blank",
    })
  4. 04 app

    Feedback-Widget einsetzen

    Ein Reporter, der das laufende Release, die Plattform und die letzte Exception vor dem Öffnen anhängt. Was ankommt, ist ein Ticket und nicht der Anfang eines Gesprächs darüber, auf welchem Build jemand ist.

    firstrun.feedback.open()

Aufzeichnung

Wie aus etwas Geschehenem eine Zeile wird.

Die Regeln unten halten Tests fest und nicht die Gewohnheit. Nur deshalb lohnt es sich, sie auf einer Marketing-Seite abzudrucken.

  • Die Zeit des Clients ist die echte Zeit

    Der Laptop ist offline, das System beendet den Prozess, die Queue liefert drei Tage später nach. Das Event landet trotzdem an dem Tag, an dem es passiert ist. Nichts wird nach Eingangszeit einsortiert.

  • Ein Umschlag für alles

    Ein Produkt-Event, eine Exception und eine Log-Zeile haben dieselbe Form mit einem anderen Typ. Deshalb konfiguriert ein SDK-Aufruf alle drei, und deshalb ist es der Retry-Queue egal, was gerade durchläuft.

  • Das Release reist mit dem Event

    Jeder Datensatz trägt die Version, aus der er kam. Verbreitung, Retention und Crash-Rate werden dadurch über dasselbe Feld geschnitten, statt nachträglich aus Zeitstempeln rekonstruiert zu werden.

  • Die Aufnahme scheitert laut

    Ein aufgebrauchter Plan oder ein falscher Key stoppt die Aufnahme und sagt das auch. Es wird nicht still gesampelt, und nichts bereits Angekommenes wird gelöscht.

Datenschutz

Absichtlich klein genug, um es zu halten.

Je weniger ein Tag erheben muss, desto weniger Versprechen gibt es zu halten. Dieses erhebt so wenig, dass Selbst-Hosten den Rest davon erledigt.

  • Nichts vor der Einwilligung

    Das Web-Tag belegt keinen Speicher und sendet keinen Request, bevor eingewilligt wurde. Ablehnen tut schlicht nichts, statt in einen abgespeckten Modus mit Cookie zu führen.

  • IPs werden mit deinem eigenen Salt gehasht

    Eine rohe Adresse wird nie geschrieben. Selbst gehostet liegt das Salt in deiner Umgebung und verlässt sie nie, die Hashes sind für uns also nicht umkehrbar, weil wir es nicht haben.

  • Kein Fingerprinting

    Kein Geräte-Fingerprint, keine seitenübergreifende Kennung, kein Session-Replay. Eine Besucher-ID ist ein First-Party-Wert, der auf deine eigene Domain begrenzt ist, und sonst nichts.

  • Keine Dritten, nirgends

    Kein CDN, kein Font-Host, kein Tag-Manager. Die Seite, die du gerade liest, holt ihre Schrift aus genau demselben Grund vom eigenen Origin.


Lies den Teil, der es tut.