vccs
Vue 3용 차트 컴포넌트 모음, Recharts에서 포팅
Tripcord은 웹 앱에서 선택한 순간을 기록합니다
Tripcord records the moments you choose in your web app — in the browser and on your server — and joins them into the one timeline that led to an error, a signup or a checkout.
데이터TypeScript · HTMLGitHub @jonaszbigda온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Opt-in, developer-instrumented breadcrumb timeline. Mark the moments that matter in your app. When one happens, Tripcord sends you the path that led there.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Mark the moments that matter in your app. When one happens, Tripcord sends you the path that led there.
Tripcord is a self-hosted timeline tool for web apps. You decide which steps are worth recording — in the browser and on your server. The browser keeps the most recent ones and sends nothing; your backend can add its own at any time. Neither becomes a timeline until something you care about happens: a crash, a checkout, an abandoned form, a signup. Then Tripcord joins it all into the one session that led there, with browser and server steps side by side.
No noise, only signal: every event on a timeline is one you chose to record.
Why did this break? Uncaught errors are captured automatically. A stack trace tells you where the code failed. The timeline tells you what the user did to get there:
TypeError: Cannot read properties of undefined (reading 'price')
on /checkout · tagged checkout
−41.2s trace "Add to cart"
−18.7s custom checkout.step { step: "shipping" }
−6.3s trace "Apply coupon"
−1.1s custom coupon.applied { code: "SPRING", valid: false }
How did people get here? Call capture() at any moment that matters to you,
not just failures. The dashboard counts each moment over time, ranks them, filters
them by area of the app, and shows the path behind every one:
signup.completed { plan: "team" }
on /welcome · tagged onboarding
−95.0s trace "Pricing: Team plan"
−61.4s custom signup.step { step: "account" }
−22.8s custom signup.step { step: "invite_team", invited: 3 }
track("checkout.step", { step: "shipping" }), or add
data-trace="Apply coupon" to an element. Only what you mark is recorded:
no DOM snapshots, no keystrokes, no network logs. Your backend can record
steps too, with @tripcord/js/node or the REST API.sessionStorage (or only in memory, with persist: false) and sends nothing. Server breadcrumbs are staged on your
Tripcord server and stay invisible. Neither is a timeline yet.capture("signup.completed") — from the browser or the
server. Tripcord bakes the session: it merges the staged server events
with the browser's, deduped and in order, into one timeline.| Error tracker | Session replay | Product analytics | Tripcord | |
|---|---|---|---|---|
| What you get | A stack trace | A recording of everything | Aggregate counts and funnels | The path to each moment you mark |
| When data is sent | On errors | Continuously | On every event | Only when a marked moment happens |
| What's sent | The error | Everything on the page | Every tracked event | A short timeline you wrote |
| Keeping personal data out | Mostly easy | Masking rules and audits | Per-event review | You write every event, so you decide |
Tripcord sits between these tools. An error tracker tells you what failed, and analytics tells you how many. Tripcord shows the steps an individual user took to reach a moment, and how often that moment happens.
1. Run a server. Tripcord is self-hosted: one Docker image (the API plus the
dashboard) and Postgres. See Self-hosting. It takes a
Compose file, two settings and docker compose up -d.
2. Install the client and point it at your server, using an API key from the dashboard:
npm i @tripcord/js
import { init, track, capture, setTags } from "@tripcord/js";
init({
endpoint: "https://tripcord.example.com/v1/timeline",
apiKey: "tpk_…",
});
setTags(["onboarding"]); // which area of the app this is
track("signup.step", { step: "account" }); // a step worth remembering
capture("signup.completed", { plan: "team" }); // a moment worth a timeline
<button data-trace="Pricing: Team plan">Choose Team</button>
Uncaught errors are captured without any code. For React, wrap your tree in
<ErrorBoundary> from @tripcord/js/react. The
client README covers tags, manual captures and
controlling which page URLs are sent.
Nothing stored on the device (optional). By default the client keeps the
session id and recent events in sessionStorage, so a timeline survives page
loads. Pass persist: false and it stores nothing on the visitor's device: no
cookies, no sessionStorage, no localStorage. The timeline lives in memory
until the page unloads, which suits single-page apps and sites with client-side
navigation:
init({ endpoint: "…", apiKey: "tpk_…", persist: false });
3. Add server breadcrumbs (optional). A backend can record its own steps — an API call, a background job — into the same session:
import { createTracer } from "@tripcord/js/node";
const tracer = createTracer({
endpoint: "https://tripcord.example.com/v1/timeline",
apiKey: "tpk_…",
sessionId,
});
tracer.track("job.started", { jobId });
tracer.capture("job.failed", { reason });
Anything else — Python, Go, .NET — can POST to the same REST API; see the server README.
Tripcord is early, and the idea is still being tested on real apps. What exists today:
@tripcord/js: the browser client (a framework-agnostic core and a React
error boundary) and a Node client at @tripcord/js/node. Both stamp every
event with an id and a source, so browser and server breadcrumbs land in one
session. The browser client can run without storing anything on the device
(persist: false). TypeScript, ESM and CommonJS.Not yet: a hosted version, clients for platforms other than the browser and Node, alerts, grouping similar errors, and analytics across sessions, such as funnels or the most common paths to a moment.
| Path | What it is |
|---|---|
packages/js | @tripcord/js, the browser and Node clients, published to npm |
server | The ingest API and dashboard backend (Fastify, Postgres). Its README covers configuration and running from source. |
dashboard | The dashboard (React SPA), built into and served by the server |
deploy | The Compose file for running a released image |
docs | Self-hosting, releasing, and the design specs in docs/superpowers/specs |
An npm workspaces monorepo. Server tests need Docker (they start Postgres with testcontainers).
npm install
npm run build # every workspace
npm test # every workspace, plus the release scripts' tests
npm run lint
npm run typecheck
docker compose up -d --build # server + Postgres from source, on localhost:3000
CI runs all of this on every push. Releases are cut from git tags; see
docs/releasing.md.
MIT — see LICENSE.