Connections
Your app. Your tools.
Your agent.
Bring events home and work with them locally. Here’s what works today, and where we could take it next.
Install an SDK, or keep the one you have.
Every path lands in the same archive and the same DuckDB table. slurp init creates your project and its first publishable key and prints that key with your ingest URL; the examples below show where each one goes.
JavaScript
TypeScript
- Web
Node.js
React Native
- HTTP API
- Feedback form
Segment
Swift
Sentry
Python
Rust
Kotlin
React Native is in preview.
Logos belong to their owners and show compatibility only.
Where the endpoint and key come from
Both come from slurp init; there is nothing to sign up for
# slurp init creates your project and its first publishable key, and prints the ingest URL and that key.
# Print them again, and make one key per source (web, ios, github): the source is stamped on every event as `sender`.
# Rotating a key means creating another for the same source and revoking the old one.
slurp project setup prj_…
slurp project key list prj_… --scope publishable
slurp project key create prj_… --scope publishable --source iosJavaScript and TypeScript
npm install @hitslop/slurp-sdk
import { init, track, flush } from '@hitslop/slurp-sdk';
init({
endpoint: 'https://slurp.YOUR-SUBDOMAIN.workers.dev/v1/events',
key: 'slurp_pk_…',
});
track('signed_up', { plan: 'pro' });
await flush(); // Node: flush before exitingReact Native and Expo
npm install @hitslop/slurp-react-native @react-native-async-storage/async-storage
// npm install @hitslop/slurp-react-native @react-native-async-storage/async-storage
import { init, track, identify, screen } from '@hitslop/slurp-react-native';
init({
endpoint: 'https://slurp.YOUR-SUBDOMAIN.workers.dev/v1/events',
key: 'slurp_pk_…',
});
screen('Home');
track('purchase_completed', { total: 49 });Swift (iOS, macOS)
Segment’s analytics-swift: set both apiHost and cdnHost to your Worker
// Swift (iOS, macOS): Segment's analytics-swift, pointed at your Worker.
// Xcode: File > Add Package Dependencies... https://github.com/segmentio/analytics-swift
// Set BOTH hosts: without cdnHost the SDK fetches its settings from Segment's CDN and can send events there.
import Segment
let configuration = Configuration(writeKey: "slurp_pk_…")
.apiHost("slurp.YOUR-SUBDOMAIN.workers.dev/v1")
.cdnHost("slurp.YOUR-SUBDOMAIN.workers.dev/v1")
let analytics = Analytics(configuration: configuration)
analytics.screen(title: "Home")
analytics.track(name: "purchase_completed", properties: ["total": 49])HTTP, any language
POST one JSON object with only an event name
# Any language. One JSON object is a valid body and only "event" is required.
curl -X POST 'https://slurp.YOUR-SUBDOMAIN.workers.dev/v1/events?key=slurp_pk_…' --data-binary '{"event":"signed_up"}'
# Add an "id" so a retry is safe: the same id from the same source is stored once. Several records: one JSON object per line.
curl -X POST 'https://slurp.YOUR-SUBDOMAIN.workers.dev/v1/events?key=slurp_pk_…' --data-binary $'{"id":"evt_1","event":"signed_up","user_id":"user_42","data":{"plan":"pro"}}\n{"id":"evt_2","event":"project_created","user_id":"user_42"}\n'
# The key can also go in an "Authorization: Bearer slurp_pk_…" header.Segment SDKs
Keep your SDK; your publishable key is the write key
// Already use Segment? Keep the SDK. Your publishable key is the write key.
// Node (@segment/analytics-node)
const analytics = new Analytics({ writeKey: 'slurp_pk_…', host: 'https://slurp.YOUR-SUBDOMAIN.workers.dev', path: '/v1/batch' });
// Browser (@segment/analytics-next)
const [analytics] = await AnalyticsBrowser.load({ writeKey: 'slurp_pk_…', cdnURL: 'https://slurp.YOUR-SUBDOMAIN.workers.dev' });
// Swift (analytics-swift)
let config = Configuration(writeKey: "slurp_pk_…").apiHost("slurp.YOUR-SUBDOMAIN.workers.dev/v1").cdnHost("slurp.YOUR-SUBDOMAIN.workers.dev/v1")Sentry SDKs
Keep your SDK; change the DSN
// Already use Sentry? Keep the SDK and change the DSN.
// The public key in the DSN is your publishable key as is.
Sentry.init({ dsn: 'https://slurp_pk_…@slurp.YOUR-SUBDOMAIN.workers.dev/1' });Python
pip install segment-analytics-python or sentry-sdk; no Slurp package
# Python: keep the Segment or Sentry SDK you use. There is no Slurp package for Python.
# segment-analytics-python (pip install segment-analytics-python)
import segment.analytics as analytics
analytics.write_key = 'slurp_pk_…'
analytics.host = 'https://slurp.YOUR-SUBDOMAIN.workers.dev' # the SDK adds /v1/batch
analytics.track('user_42', 'signed_up', {'plan': 'pro'})
analytics.flush() # in scripts, before the process exits
# sentry-sdk (pip install sentry-sdk)
import sentry_sdk
sentry_sdk.init(dsn='https://slurp_pk_…@slurp.YOUR-SUBDOMAIN.workers.dev/1')Webhooks
Each command prints a URL and a secret to paste into the provider
slurp project webhook prj_… github
slurp project webhook prj_… revenuecat
slurp project webhook prj_… stripe --secret whsec_…
slurp project webhook prj_… genericLet your users talk to you, from your own site.
The Feedback button on this page is this widget. Add it to any web page in a few lines: a small form (message, optional rating and email) that lands next to your other events, so your agent reads what people say beside what they did.
Install
The same package as the JavaScript SDK.
npm install @hitslop/slurp-sdkMount it
Use the ingest URL and publishable key from
slurp init. The key only adds events, so it is safe in a page.import { init } from '@hitslop/slurp-sdk'; import { mountFeedback } from '@hitslop/slurp-sdk/feedback'; init({ endpoint: 'https://slurp.YOUR-SUBDOMAIN.workers.dev/v1/events', key: 'slurp_pk_…' }); mountFeedback({ askEmail: true });Read it
Each submission is a
feedbackevent. Ask your agent, or query it afterslurp sync.slurp sync slurp sql "SELECT timestamp, data->>'message' AS message, data->>'rating' AS rating FROM events WHERE event = 'feedback' ORDER BY timestamp DESC"
Make it yours
Full reference: the SDK readme.
Start with your app and your agent.
Capture with an SDK, your existing Segment or Sentry SDK, or the HTTP API. New events are published as archives about every 10 minutes; sync them with the CLI, then let your agent query the local data. Agent entries describe CLI workflows.
Browser and Node event capture with a durable queue.
npm install @hitslop/slurp-sdkSetup guide ↗A drop-in "Feedback" button for web pages: a small form with a message, an optional rating and email. Each submission is a feedback event next to what the person did.
import { mountFeedback } from '@hitslop/slurp-sdk/feedback'Setup guide ↗Events survive the app being killed and are sent when it goes to the background.
npm install @hitslop/slurp-react-nativeSetup guide ↗Keep your Segment SDK and change its host to your Worker.
writeKey: slurp_pk_… · host: your WorkerSetup guide ↗iOS, macOS, tvOS and watchOS with Segment's analytics-swift, pointed at your Worker. Set both apiHost and cdnHost.
.apiHost("your-worker/v1").cdnHost("your-worker/v1")Setup guide ↗Keep your Sentry SDK and change the DSN. Errors are stored whole and read with SQL.
dsn: https://slurp_pk_…@your-worker/1Setup guide ↗Keep the Segment or Sentry Python SDK and change the host or the DSN. No extra package.
analytics.host = "https://your-worker" · sentry_sdk.init(dsn="https://slurp_pk_…@your-worker/1")Setup guide ↗Let Claude Code, Cursor, Codex, Claude Desktop or Windsurf read your events: describe the schema, run read-only SQL in a sandbox, sync and build reports.
claude mcp add slurp -- slurp mcpSetup guide ↗Post a report image and a summary to a channel with slurp notify slack, for scheduled reports.
slurp notify slack --file report.pngSetup guide ↗The same with a Discord webhook, image included.
slurp notify discord --file report.pngSetup guide ↗Releases, deployments and workflow runs arrive as events, with a releases view in SQL.
slurp project webhook PROJECT githubSetup guide ↗App Store and Google Play purchases, renewals, cancellations and refunds arrive as events, with a revenue view in SQL.
slurp project webhook PROJECT revenuecatSetup guide ↗Payments and subscriptions arrive as events.
slurp project webhook PROJECT stripe --secret whsec_…Setup guide ↗Any tool that can POST: the payload is stored whole as an event, named by you, optionally signed.
slurp project webhook PROJECT genericSetup guide ↗POST one JSON object, or NDJSON lines, to /v1/events with a publishable key. Only event is required.
Setup guide ↗Run the Slurp CLI and query your local DuckDB data.
Setup guide ↗Run the Slurp CLI and query your local DuckDB data.
Setup guide ↗Run the Slurp CLI and query your local DuckDB data.
Setup guide ↗More of your stack, together.
Ideas we are exploring. Not available yet.
More ways to capture
A dedicated capture SDK.
A native Python SDK. Today the Segment and Sentry Python SDKs already work by changing the host or the DSN.
A native Android SDK. Segment and Sentry Android SDKs may already work by changing the URL, but are untested.
Bring CSV, Parquet, JSONL, and logs.
Product analytics inputs
Bring existing product events into Slurp.
Bring existing product events into Slurp.
Bring existing product events into Slurp.
Errors and support inputs
Readable stack traces from your own source maps and debug files.
Errors and stability.
Support conversations and transcripts.
The same form for Swift and React Native. The web widget works today.
Business and code inputs
Issues and cycles. Its webhooks can use the generic receiver today, but are untested.
Pipeline inputs
Receive events from your pipelines.
Outputs and agent destinations
Deliver events to your own endpoint.
Create an issue from a finding.
Open an issue or pull request.
Route relevant events to an agent.
Route relevant events to an agent.
Route relevant events to an agent.
Route relevant events to an agent.
Route relevant events to an agent.
Something that notices.
Jev is an idea for classifying incoming events and routing useful signals to an agent. This workflow is illustrative; processing and alert delivery are not available.
Events arrive
From your app and future connections.
Jev classifies
Identify a possible signal and its confidence.
Alerts go out
Hand the evidence to an agent or endpoint.
Illustrative signals: a spike in export failures, a new error pattern, stalled onboarding, or possible churn.
Get started with what works today ↗