Tripcord

Browser and server events in one timeline

No noise, pure signal.

You choose what goes on the timeline — a click, a signup step, an API call — in the browser and on your server. When something breaks, or a moment you care about happens, Tripcord sends the steps that led there.

Why did this break? How did people get here? One timeline answers both.

  1. track("cart.viewed", { items: 3 }) 0.0s

    Browser Your code marks a step

  2. "Checkout button" 4.2s

    Browser A click on data-trace="Checkout button"

  3. tracer.track("payment.attempt") 9.8s

    Server Your backend adds its own step

  4. TypeError: Cannot read properties of undefined (reading 'zip') 11.3s

    The error trips the cord, and Tripcord sends these four steps

A checkout that broke, as Tripcord records it: browser and server steps side by side, then the error.

What you get

A small client, a server you own, and a dashboard built around one question: what led here?

Browser and server, one timeline

Frontend steps and backend breadcrumbs merge into one session, each tagged with its source.

Errors capture themselves

Uncaught errors and unhandled rejections are captured on their own, with the path that led to them.

Tags say where

Label the area of your app a moment came from, then filter sessions by it in the dashboard.

Ranked reasons

The dashboard counts each moment over time and ranks the ones that come up most.

Self-hosted

One Docker image and Postgres. Your data stays on your server, kept for the retention you configure.

You choose every event

No DOM snapshots, no keystrokes, no network logs. Only the moments your app marks are recorded.

How it works

  1. 1

    Install the client

    npm i @tripcord/js

  2. 2

    Point it at your project

    Call init() with the endpoint and the project's API key.

  3. 3

    Mark the moments that matter

    track() adds a step to the timeline. capture() sends the timeline on purpose, for a signup or a checkout. Errors and unhandled rejections are captured on their own.

  4. 4

    Add server breadcrumbs (optional)

    Record a step from your backend with @tripcord/js/node or the REST API. Browser and server events land in the same session.

import { init, track, capture } from "@tripcord/js";

init({
  endpoint: "https://app.tripcord.dev/v1/timeline",
  apiKey: "tpk_…",
});

track("checkout.step", { step: "shipping" });
capture("checkout.completed");

See what led there

Sessions over time, the reasons that come up most, filters by tag, and one merged timeline per session — every browser and server step, side by side.

The Tripcord dashboard: timeline volume over the last 7 days by reason type, the top reasons, and the sessions behind them

Safe to run in production

Your app comes first
The client never throws and never retries. If Tripcord is down, your users don't notice.
URLs are trimmed
By default, page URLs keep only the origin and path. Query strings and fragments, where tokens hide, are dropped.
You choose what's recorded
Apart from errors, nothing goes on the timeline unless your code puts it there.
Kept for 30 days
Timelines older than that are deleted automatically, and the window is yours to configure.
Nothing stored on the device, if you want
Pass persist: false and the client keeps the timeline in memory only: no cookies, no sessionStorage, no localStorage.

Open source, and easy to leave

Tripcord is MIT licensed. Run the same image on your own server, or use the hosted beta. Either way, you can export any project as NDJSON or delete it whenever you like.