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.

01 / SDKS

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.

Capture from
  • JavaScript
  • TypeScript
  • Web
  • Node.js
  • React Native
  • HTTP API
  • Feedback form
Keep using
  • Segment
  • Swift
  • Sentry
  • Python
Coming
  • 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

Example
# 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 ios

JavaScript and TypeScript

npm install @hitslop/slurp-sdk

Example
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 exiting

React Native and Expo

npm install @hitslop/slurp-react-native @react-native-async-storage/async-storage

Example
// 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

Example
// 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

Example
# 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

Example
// 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

Example
// 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

Example
# 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

Example
slurp project webhook prj_… github
slurp project webhook prj_… revenuecat
slurp project webhook prj_… stripe --secret whsec_…
slurp project webhook prj_… generic

Every option, mapping and limit ↗

02 / FEEDBACK WIDGET

Let 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.

  1. Install

    The same package as the JavaScript SDK.

    Terminal
    npm install @hitslop/slurp-sdk
  2. Mount it

    Use the ingest URL and publishable key from slurp init. The key only adds events, so it is safe in a page.

    Your page's script
    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 });
  3. Read it

    Each submission is a feedback event. Ask your agent, or query it after slurp sync.

    Terminal
    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

askEmail: true
Ask for an optional email address, for people who want a reply.
data: () => ({ plan })
Attach anything useful, read when the form is sent: the current screen, the plan, the release.
theme, accent, position
auto follows the visitor's dark mode (or force light or dark); your brand colour; bottom-left or bottom-right.
label, title, placeholder, ratings
Your words on the button and the form, or no rating row.
button: false
Open it from your own button or menu with the open() that mountFeedback returns.
poweredBy: false
Hides the small "Powered by Slurp" link under the form (on by default).

Full reference: the SDK readme.

03 / WORKS TODAY

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.

JavaScript / TypeScript

Browser and Node event capture with a durable queue.

npm install @hitslop/slurp-sdkSetup guide ↗
Works today
Feedback widget

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 ↗
Works today
React Native / Expo

Events survive the app being killed and are sent when it goes to the background.

npm install @hitslop/slurp-react-nativeSetup guide ↗
Preview
Segment

Keep your Segment SDK and change its host to your Worker.

writeKey: slurp_pk_… · host: your WorkerSetup guide ↗
Works today
Swift (via Segment)

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 ↗
Works today
Sentry

Keep your Sentry SDK and change the DSN. Errors are stored whole and read with SQL.

dsn: https://slurp_pk_…@your-worker/1Setup guide ↗
Works today
Python

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 ↗
Works today
MCP

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 ↗
Works today
Slack

Post a report image and a summary to a channel with slurp notify slack, for scheduled reports.

slurp notify slack --file report.pngSetup guide ↗
Preview
Discord

The same with a Discord webhook, image included.

slurp notify discord --file report.pngSetup guide ↗
Preview
GitHub

Releases, deployments and workflow runs arrive as events, with a releases view in SQL.

slurp project webhook PROJECT githubSetup guide ↗
Preview
RevenueCat

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 ↗
Preview
Stripe

Payments and subscriptions arrive as events.

slurp project webhook PROJECT stripe --secret whsec_…Setup guide ↗
Preview
Webhooks

Any tool that can POST: the payload is stored whole as an event, named by you, optionally signed.

slurp project webhook PROJECT genericSetup guide ↗
Preview
HTTP API

POST one JSON object, or NDJSON lines, to /v1/events with a publishable key. Only event is required.

Setup guide ↗
Works today
Claude Code

Run the Slurp CLI and query your local DuckDB data.

Setup guide ↗
Works today
Codex

Run the Slurp CLI and query your local DuckDB data.

Setup guide ↗
Works today
Cursor

Run the Slurp CLI and query your local DuckDB data.

Setup guide ↗
Works today
04 / EXPLORING

More of your stack, together.

Ideas we are exploring. Not available yet.

More ways to capture

Rust

A dedicated capture SDK.

Exploring
Python (first-party SDK)

A native Python SDK. Today the Segment and Sentry Python SDKs already work by changing the host or the DSN.

Exploring
Kotlin (Android)

A native Android SDK. Segment and Sentry Android SDKs may already work by changing the URL, but are untested.

Exploring
File uploads

Bring CSV, Parquet, JSONL, and logs.

Exploring

Product analytics inputs

Mixpanel

Bring existing product events into Slurp.

Exploring
Amplitude

Bring existing product events into Slurp.

Exploring
RudderStack

Bring existing product events into Slurp.

Exploring

Errors and support inputs

Sentry symbolication

Readable stack traces from your own source maps and debug files.

Exploring
Bugsnag

Errors and stability.

Exploring
Customer chat

Support conversations and transcripts.

Exploring
Feedback in mobile apps

The same form for Swift and React Native. The web widget works today.

Exploring

Business and code inputs

Linear

Issues and cycles. Its webhooks can use the generic receiver today, but are untested.

Exploring

Pipeline inputs

Kafka

Receive events from your pipelines.

Exploring

Outputs and agent destinations

Webhooks

Deliver events to your own endpoint.

Exploring
Linear

Create an issue from a finding.

Exploring
GitHub

Open an issue or pull request.

Exploring
Muse

Route relevant events to an agent.

Exploring
Grok

Route relevant events to an agent.

Exploring
OpenAI

Route relevant events to an agent.

Exploring
dots

Route relevant events to an agent.

Exploring
Custom agents

Route relevant events to an agent.

Exploring
05 / JEV · EXPLORING

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 ↗