Getting started
Getting started
Section titled “Getting started”Sentori is an error-tracking + APM platform. There’s a 5-minute quickstart for each supported stack — pick yours:
| Stack | Quickstart |
|---|---|
| React (Vite / CRA / any bundler) | getting-started/react |
| React Native (bare or Expo) | getting-started/react-native |
| Next.js (App Router or Pages) | getting-started/nextjs |
| Node.js / Bun (Express, Hono, Fastify, scripts) | getting-started/node |
All four assume you already have:
- a token (
st_pk_...) - an ingest URL
For SaaS: sign up at https://sentori.golia.jp and copy from project settings. For self-hosted: see Self-hosting.
Don’t have a backend yet?
- Self-hosting — one
docker compose upon your own VM - The SaaS at https://sentori.golia.jp is the same binary + same schema, just multi-tenant
Working without an SDK
Section titled “Working without an SDK”If you’re prototyping or writing your own client, you can POST directly to the ingest endpoint:
curl -X POST "$SENTORI_INGEST_URL/v1/events" \ -H "Authorization: Bearer $SENTORI_TOKEN" \ -H "Sentori-Sdk: curl/0.0.0" \ -H "Content-Type: application/json" \ -d '{ "id": "01000000-0000-7000-8000-000000000001", "timestamp": "'"$(date -u +%FT%T.000Z)"'", "kind": "error", "platform": "javascript", "release": "myapp@0.1.0+1", "environment": "dev", "device": {"os": "other", "osVersion": "0"}, "app": {"version": "0.1.0"}, "error": { "type": "TypeError", "message": "hello sentori", "stack": [{"file": "shell.ts", "line": 1, "inApp": true}] } }'See the Protocol reference for the full schema.
After you have events flowing
Section titled “After you have events flowing”- Notify Sentori of deploys — one curl in CI keeps the release timeline accurate
- Triage from CI with sentori-cli —
issue list / resolve / silence - Make errors readable: upload source maps —
see
src/Foo.tsx:42instead ofindex.bundle:1:288432
Deploy pings
Section titled “Deploy pings”Add one line to your CI right after the build is uploaded:
curl -fsS -X POST "$SENTORI_INGEST_URL/v1/deploys" \ -H "Authorization: Bearer $SENTORI_TOKEN" \ -H "Content-Type: application/json" \ -d "{\"release\":\"myapp@$VERSION+$BUILD\",\"environment\":\"prod\"}"Idempotent — re-running the same release just refreshes
deployAt, so flaky-CI retry is safe.
Triage from CI
Section titled “Triage from CI”# Latest 20 active issues — one line per issue.npx @goliapkg/sentori-cli issue list \ --project "$PROJECT_ID" --status active --limit 20
# Mark resolved, tagging the fix release. The dashboard's regression# detector flips it back to `regressed` if a matching event lands later.npx @goliapkg/sentori-cli issue resolve <issue-uuid> \ --project "$PROJECT_ID" \ --in-release "myapp@1.2.4+457"
# Silence a known-noisy issue.npx @goliapkg/sentori-cli issue silence <issue-uuid> \ --project "$PROJECT_ID"The admin token (SENTORI_ADMIN_TOKEN, sk_ prefix) is in project
settings → tokens.
Source maps
Section titled “Source maps”So a stack trace points at src/Foo.tsx:42, not index.bundle:1:288432.
After a release build, upload the source map tagged to the release —
byte-for-byte the same string you pass to init({ release }):
npx @goliapkg/sentori-cli@latest upload sourcemap \ --release "myapp@$VERSION+$BUILD" --token "$SENTORI_TOKEN" \ dist/assets/ # a build dir, or specific .map / .js filesThe server symbolicates matching events at ingest and groups the issue on the original-source frame. React Native (Hermes) needs the Metro and Hermes maps composed first — see Source map upload for the per-platform steps and CI recipes (GitHub Actions / GitLab / Vercel / EAS).
v2.3 features (added 2026-05)
Section titled “v2.3 features (added 2026-05)”All optional. Existing v1.x code keeps working. Pick what’s useful.
Cross-project user lookup
Section titled “Cross-project user lookup”If your users are in multiple projects within one org, Sentori can join their events across projects — without ever storing raw email / phone / OAuth sub:
sentori.setUser({ id: 'usr_internal_123', name: 'Lihao', linkBy: { // SDK hashes client-side email: 'lihao@example.com', googleSub: '108293…', },})In the dashboard, the Users page lets an operator paste a real email, browser-side hashes it, and the URL/query only ever carries the hash. See Privacy & identity.
Silent SDK + structured ready signal
Section titled “Silent SDK + structured ready signal”Sentori is silent on the host’s console by default. To know
when it’s live, wire onReady:
sentori.init({ token, release, onReady: (info) => { // info.sdkVersion / info.coldStartMs / info.native.bound console.log('sentori live', info) },})For host-side log routing (Datadog / OpenTelemetry / etc.):
import { setLogTransport } from '@goliapkg/sentori-react-native'
setLogTransport((level, tag, args) => { myLogger.log({ source: `sentori/${tag}`, level, args })})Manual instrumentation
Section titled “Manual instrumentation”captureMessage, startTrace, startSpan / withScopedSpan,
startMoment, recordMetric, track, addBreadcrumb. See
the recipes directory:
- manual-issue.md —
captureMessage - manual-trace.md — top-level traces
- manual-span.md — child spans
- manual-moment.md — funnels
- manual-breadcrumb.md — context trail
- track-and-metrics.md — analytics + numeric
Sentry-compatible API
Section titled “Sentry-compatible API”If your codebase or LLM uses @sentry/react-native:
import * as Sentry from '@goliapkg/sentori-react-native/compat'
Sentry.init({ dsn: 'https://st_pk_…@ingest.sentori.golia.jp/proj' })Sentry.captureException(err)Sentry.setUser({ id, email })// email → linkBy.email (hashed); ip_address dropped + hintSee Sentry compat.
Reference
Section titled “Reference”- Protocol — wire format, if you’re writing your own SDK or just curious
- Self-hosting — production deploy, SMTP, backups, behind a reverse proxy
- Migrating to v2.3 — what changed between v1.x and v2.x SDKs (everything is additive — no required code changes)
- Privacy & identity — what Sentori sees / doesn’t see / can’t recover. Audit-safe by construction.
- Sentry compat — drop-in
Sentry.*API surface mapping into Sentori-native - SDK — React / SDK — React Native