Simple and open event logs for your next project.

Upstream is a simple logging platform for developers. View your events in a beautifully designed dashboard with powerful searching capabilities.

👋
!
11:36 pmhello, world!
Endpoint/api/webhooks/stripe
Status200 OK
Stripe has detected a potential fraud on your account.
{
  "id": "pi_3O1234567890abcdef",
  "object": "payment_intent",
  "amount": 4999,
  "currency": "usd",
  "status": "requires_action",
  "fraud_details": {
    "stripe_report": "fraudulent",
    "user_report": null
  }
}
A new user has signed up for your service.
User ID1234567890abcdef
Emailuser@example.com
IP Address192.168.1.1
User AgentChrome/58.0.3029.110 Safari/537.3
🆕
11:36 pmuser: account created
📧
11:36 pmuser: email sent
11:36 pmuser: email verified

3 events. 0 secs.

{
  "id": "1234567890abcdef",
  "object": "user",
  "email": "user@example.com"
}

look. managing your SaSS events in a project is not easy. every project needs an logs viewer, searching APIs, ingestion endpoints, SDKs, and analytics. there are a lot of moving parts.

we've all been there before, its a pain to set up and maintain. this is why developers pay for logging platforms.

however, most platforms like datadog, seq, signoz, and many others aren't designed for your critical product events, which need to be viewed at a glance.

thats why i built this solution.

heres what it looks like.

import { Upstream } from "@uplabs/sdk"

const up = new Upstream({
  apiKey: "YOUR_API_KEY",
})

up.events.log({
    title: "hello, world!",
    icon: "👋",
})

8 lines of code, and you can easily start logging critical events to our dashboard. heres what the event looks like.

👋
11:36 pmhello, world!

or, are you selfhosting? no problem, just add the host variable to your initialisation function:

const up = new Upstream({
  apiKey: "YOUR_API_KEY",
  host: "https://your.upstream-instance.com"
})

need to add more details to the event? no problem. here is the code to add fields, and a description.

up.events.log({
    title: "hello, world!",
    icon: "👋",
    description: "this is a more detailed event",
    fields: [
        {
            title: "this is a field",
            value: "you can add some info here",
        },
        {
            title: "this is another field",
            value: "you can add some more info here",
        },
    ],
})

now, the event is a dropdown!

this is a more detailed event
this is a fieldyou can add some info here
this is another fieldyou can add some more info here

what if you need to trigger workflows or have actions for your events? no problem. Upstream has those features too. Simply add a category to the event and setup webhooks in the dashboard.

oh, and theres event actions too.

or, do you need to add stack traces to events? do you need push notifications to send important events direct to your phone? Upstream can do that too.

await ups.events.ingest({
  title: "This triggered a push notification!",
  pushNotify: true,
  contextId: "contextId-example-notifications",
  contextStart: true
})

await ups.events.ingest({
  title: "This triggered a notification inside the event!",
  contextId: "contextId-example-notifications",
  pushNotify: true,
  data: {
    "test": "This is a test with contextId and data.",
    "contextId": "contextId-example-notifications",
    "contextStart": true
  },
  actions: [
    {
      title: "View",
      url: "https://upstream.dev",
      variant: "primary"
    },
    {
      title: "Dismiss",
      url: "https://upstream.dev",
      variant: "secondary"
    }
  ]
})

now you have a stack trace inside of an event with push notifications to your devices!

🚨
!
11:36 pmThis triggered a notification inside the event!
{
  "test": "This is a test with contextId and data.",
  "contextId": "contextId-example-notifications",
  "contextStart": true
}

1 event. 0 secs.

and here is a full example with all event fields into 1 log entry.

A user completed checkout for a subscription upgrade. This event chains the whole purchase flow as nested context events and triggers a push notification.
Customerlinus@upstream.dev
PlanPro (monthly)
Amount$19.00
Invoice IDin_1QyXfK2eZvKYlo2C
Payment Statussucceeded
IP Address203.0.113.24
🛒
11:36 pmcheckout session created
💳
11:36 pmpayment intent succeeded
Statussucceeded
Amount$19.00
🔗
11:36 pmwebhook delivered

checkout.session.completed delivered to /api/webhooks/stripe

Endpoint/api/webhooks/stripe
Status200 OK
{
  "id": "wh_3O1234567890",
  "type": "checkout.session.completed",
  "livemode": false
}
🔐
11:36 pmwebhook: signature verified

Signature verified before dispatch.

Attempt1 of 3

1 event. 0 secs.

🔑
!
11:36 pmlicense key provisioned

New license issued to customer. Push notification sent.

LicenseUP-XXXX-XXXX-XXXX
Seats5

4 events. 0 secs.

{
  "id": "evt_1QyXfK2eZvKYlo2C",
  "object": "checkout.session.completed",
  "amount_total": 1900,
  "currency": "usd",
  "payment_status": "paid",
  "customer_email": "linus@upstream.dev",
  "metadata": {
    "plan": "pro",
    "interval": "monthly",
    "coupon": "LAUNCH50"
  },
  "fraud_details": null
}

we are just scratching the surface. Upstream also has features like query APIs, a mobile app with pager and push notification features, and much more.

i also built this to be completely open source, so you can go self-host it if you want.

if you want to see more, check out the playground for more information. documentation is coming soon once i finish writing it.

in case you still have questions:

thats it. go try it out!