TangentLens

Home / Developers

Nine SDKs that actually agree with each other.

A property you send from Swift means exactly what it means from Python, because every SDK implements one written protocol and the same conformance fixtures run against all of them. "It should behave the same" is a test here, not an assumption.

Install

Pick a language.

Offline queueing, batching and retries are built in. A dropped network becomes a delay, not a hole in your data.

index.html

      
    

How it works

Five hops, and none of them lose your data.

Worth knowing before you commit a product's telemetry: this is the whole path an event takes, and what happens at each step when something fails.

01 · SDKQueue on the deviceBatched, retried, and held through an offline period rather than dropped.
02 · CollectAuthenticate & acceptThe key is checked and the event validated against your schema, then accepted or explained.
03 · QueueDurable logEvents land in a replayable log first. If storage goes down, nothing is lost — it waits.
04 · StoreColumnar warehouseWritten in batches, deduplicated on arrival, partitioned by time, isolated by workspace.
05 · QueryRead-only accessReads run as a constrained account with hard limits, scoped to one workspace and project.
  • →Failures are visible, not silent. An event that genuinely cannot be processed is kept and surfaced with the reason, so "the numbers look low" has an answer.
  • →Recovery does not depend on backups. Because the log is replayable, most storage incidents are resolved by re-reading it — losing nothing at all.

Questions engineers ask first

What does the SDK cost me in bundle size and latency?

The browser SDK is small and loads deferred; tracking calls are queued and flushed in batches on an idle callback, so they never block interaction. Flag evaluation is local — a flag check does not make a network request.

What happens if your ingest endpoint is down?

The SDK keeps events in a local queue and retries with backoff. Nothing is discarded because a request failed. On the server side, events land in a replayable log before they reach the warehouse, so an outage downstream of the queue is caught up rather than lost.

Can I send events without an SDK?

Yes. The HTTP ingest API is the same contract every SDK speaks, documented field by field and published as an OpenAPI specification. Anything that can POST JSON can be a client.

How do you stop one bad deploy flooding my data?

Keys are rate limited per workspace, events are validated against your schema on arrival, and rejections are surfaced with reasons rather than silently dropped — so a malformed release is visible within minutes instead of appearing as a mysterious gap.

Is the SDK naming consistent?

Not yet, and it is visible above: the JavaScript packages are published under @tangent/* while Python, Java, Go and Swift still carry selica-* names from an earlier iteration. Unifying them is on the list.

First event in about five minutes.