Follow an error into the logs, the request and the code that explain it. Then watch
your endpoints and cron jobs so the next one doesn’t happen quietly. One Go binary and
Postgres, on your box or on a dedicated instance we run in the EU.
Errors, grouped. With the trail that led there.
Captured errors are grouped by fingerprint so your team can work through recurring
problems together. Open an occurrence to inspect the context your SDK supplied.
Each issue carries the full stack trace, a breadcrumb timeline of what led to the
crash (HTTP requests, DB queries, log lines, user actions), the environment it
occurred in, and the stored event payload.
Errors group by fingerprint: the SDK’s, the exception’s, or a hash of the message.
Stack traces carry the source file, line number and local variables.
Breadcrumbs show the HTTP calls, queries, cache hits and log lines before the crash.
Source maps upload per release and resolve on your JS frames when you open them.
A resolved issue that shows up again gets marked regressed.
Full list (9 more)
Assignments and comments: assign to a team member, leave notes on the issue
Status transitions: open, resolved, ignored, regressed
Bulk operations: resolve, ignore, assign or re-open many issues at once
Merge and unmerge: combine related issues, split them back if needed
Search and filter by title, status, level, tags, and the shared project, environment, user and time
Refresh controls: pause automatic updates while you investigate, refresh to get back to the latest
Data export of up to 10,000 issues as JSON or CSV
Dark mode: every screen has a dark theme. One click to toggle, remembered across sessions
Works on a phone: triage an error at 2am without pinching to zoom
Start with a customer’s error and follow what happened.
Someone reports a failed checkout. Select their identity on the error event,
narrow the time range, and carry that context into logs and performance.
You can follow their captured activity without rebuilding each search.
One investigation context: project, environment, user, and time follow you between telemetry views
Individual activity: selecting a user shows their traces and browser page loads
Shareable links: send a rolling window or fixed interval to a teammate with access
Read the logs around the failure, then follow the trace.
Search structured log messages within your investigation, expand a row for its
attributes, and open a matching stored transaction when trace context is available.
Focused searches: combine message text and severity with project, environment, user, and time
Structured context: inspect the full attributes, release, trace ID, and span ID
Volume alerts: prefill a rule from projects, environment, level, and message search
Alerts evaluate their own rolling window and minimum severity. Your selected user
and fixed investigation interval stay with the investigation.
Transactions, span waterfalls, and where your time went.
Every traced request becomes a transaction with a full span waterfall: database
queries, HTTP calls to external services, template renders, queue dispatches.
See exactly where your 800ms went.
Span waterfalls with database, HTTP, template, task and custom spans.
The critical path turns amber and everything else dims, so the bottleneck stands out.
The same query repeated in one request (an N+1) opens an issue by itself.
Web Vitals for browser page loads: LCP, INP, CLS, FCP and TTFB, with P75 and pass rate per page.
A flame graph under the waterfall when the transaction carried a profile. More below.
Full list (5 more)
Endpoint metrics for latency and throughput, switching to individual traces when you select a user
Queries, caches and jobs scoped to the selected user through their transactions
Apdex score per endpoint and as a weighted average on the dashboard (T=500ms, coloured green, yellow or red)
Error linkage from a transaction straight to the error that caused it
Custom spans through the standard Sentry tracing API in any SDK
Spans stop where your tracing stops. Profiles don’t.
Spans only show you what you instrumented. When a span is slow for no obvious
reason, the answer is usually in code nobody wrapped in a tracer. Turn on your
SDK's profiler and Tindra folds the samples into a flame graph, rendered right
under the waterfall on the same page.
A sampled PHP transaction, down to its database, cache, and template calls.
Self time and total time per frame, so you can tell a slow function from a slow call path.
Click a frame to zoom in. The breadcrumb or Esc walks you back out.
Profiles never count against your monthly event quota.
One checkbox per project stops accepting profiles from a noisy service. No SDK redeploy.
Full list (6 more)
Both wire formats: transaction-based profiles and continuous profiling chunks. Tindra slices the right window out of a continuous session automatically
Search frames to dim everything that does not match, keeping hits in the context of their stack
Honest milliseconds: the sample interval is measured from the samples themselves, not assumed from the SDK's nominal rate
App and library frames colored differently, idle samples reported separately instead of faked into the tree
Folded server side: the browser gets a tree of a few hundred nodes, not megabytes of raw samples
Frame metadata scrubbed through your project's PII patterns before it is stored. Absolute paths included
Profiles are much bigger than events, so they get their own short retention window
and an instance-wide storage budget instead of following your event retention.
Set it once and forget it: oldest profiles roll off, nothing else is touched.
Know when jobs miss and services go down.
Tindra monitors two things: scheduled jobs that should run on a cron schedule,
and HTTP/HTTPS endpoints that should always be up. Both feed into the same alert
rules and notification channels.
Cron monitors
Cron expression schedules with human-readable summaries and next expected run time
Configurable grace period before a late job is marked as missed
Get notified when something breaks. Not on every event.
Tindra sends alerts on conditions that matter: a new issue, a regression, an error
rate spike, or a cron job that stopped running. Not a flood of identical
notifications for each occurrence.
A log alert’s scope, threshold, and recorded delivery result. This demo rule is paused.
New issue alerts the first time a fingerprint shows up.
Regression alerts when a resolved or ignored issue comes back.
Rate alerts when the error count crosses a threshold in a rolling window.
Log volume alerts, including Alert on this straight from the log viewer.
Delivery to email, Slack, Discord, Microsoft Teams or a webhook.
Full list (9 more)
Global rules for issues and monitors, with project selection when you need a narrower scope
Email via any supported provider (SMTP, Postmark, Brevo, and more)
Slack, Discord, and Microsoft Teams: paste your incoming webhook URL and alerts post directly to any channel
Webhook with a structured JSON payload posted to your configured HTTP(S) endpoint
Cron missed and cron error conditions for scheduled job alerts
Uptime down and uptime recovered conditions for HTTP monitor alerts
Per-rule cooldown to avoid repeat notifications during an ongoing incident
Delivery history: every alert firing is logged with status, trigger, and item count
Automatic webhook retry: failed deliveries retry at 2 minutes and 10 minutes before giving up
Also in the binary.
No add-ons, no separate services. Every instance ships with all of this.
Dashboard
The first screen you see. Every project feeds one live view: latency, throughput and Apdex, a 7-day traffic heatmap, the five hottest issues and the five slowest endpoints.
Shared filters: focus transaction metrics by project, environment, user and time
Recent releases: the latest deployments
Alert activity: the last rules to fire, so you can see what has been noisy
Current state: issues, alerts, releases and monitors keep their own scope, and the heatmap always shows seven days
Releases
Releases come from your SDK’s release tag. No setup, no API call. Filter issues and transactions to one deploy, and anything resolved in v1.4.2 that shows up in v1.4.3 gets marked regressed.
Auto-created from SDK release tags: no API call needed to register a release
Per-release issue view showing every error that appeared in that deploy
Per-release transaction view with performance stats filtered to that release
Source map uploads scoped per release so the right map is applied to the right version
Regression linking connects a regressed issue back to the release where it reappeared
Setup and SDKs
Keep your Sentry SDK and point it at your project’s Tindra DSN. The setup page tells you when a tagged test event is actually stored, then checks transactions, profiles and source maps on their own.
Guided connection checks with a project DSN, tagged test, and storage confirmation
Source-map verification showing the release, matching bundle URL, and resolved original location. Upload and verify source maps
Optional tracing and profiling where supported by your SDK
Passthrough DSN for best-effort comparison with another service during migration
Missing data: guidance when optional transactions or profiles have not arrived
PHP / Laravel
sentry/sentry-laravel
Go
getsentry/sentry-go
JavaScript
@sentry/browser · node
Python
sentry-sdk
Rust
sentry · sentry-anyhow
Ruby
sentry-ruby · sentry-rails
Java / Kotlin
sentry-java
.NET / C#
Sentry.Extensions.Logging
iOS / Android
sentry-cocoa · sentry-android
# BeforeSENTRY_DSN=https://key@sentry.io/123
# After: point at TindraSENTRY_DSN=https://your-key@acme.tindra.sh/your-project-id
# Optional: keep forwarding to old endpoint during migrationPASSTHROUGH_DSN=https://key@sentry.io/123
MCP server
A built-in MCP server on POST /mcp. Ask Claude, Cursor or Windsurf about open issues, slow endpoints, cron health and recent logs from the tool you’re already in. Tokens are per project and read-only unless you enable writes.
Single sign-on with GitHub, Google, Microsoft, Auth0, Zitadel or any OIDC provider (managed: Studio and Scale). TOTP MFA is on by default, permissions are split by area, and an audit log records who did what.
Native GitHub, Google, Microsoft, Auth0, Zitadel, and any OIDC-compliant provider. New users join by invitation with a verified provider email; administrators can explicitly link existing accounts when needed
TOTP MFA enforced by default
Users enroll a local authenticator before accessing the app and verify it after password or SSO login. No third-party service needed. Enrollment can be made optional
Fine-grained permissions
Separate controls for managing projects, issues, alerts, and users
API tokens
Per-project bearer tokens, read-only by default. Enable write access for supported project mutations via the MCP server or API; instance administration still requires user permissions
Audit log
Structured log of every auth, user, project, token, alert, and issue action with actor IP and timestamp
Rate limiting
Per-IP on login, per-project on event ingest
Session security
HttpOnly session cookies, secure cookies for HTTPS deployments, and revocation of old sessions when passwords change
Privacy and PII
Field-path and pattern rules per project scrub errors, transactions, logs and profiles before they’re stored. Keep the context you need, drop what you don’t want to hold.
Exact field paths for request headers, structured data, and user identity fields
Built-in patterns for email and IPv4 addresses, enabled per project
Signal-specific coverage including log bodies and attributes, span data, and profile frame metadata
Explicit configuration through each project’s Data privacy settings
New ingestion only: rules apply to new data. Forwarded passthrough content and source text added during enrichment behave separately
One binary and a Postgres. Or we run it for you.
The entire Tindra server is a single statically-compiled Go binary. Connect it to
a Postgres database and you have the full stack. No sidecar processes, no object
storage, no message broker.