Ask every event a question.

A developer-first library to have Jev integrated into your users' inbox, calendar, Slack channels and more!

Ready-made integrations for the apps your users already use.

  • Gmail
  • Outlook
  • Google Calendar
  • Slack
  • Microsoft Teams
  • Discord
  • Linear
  • GitHub
  • Notion
  • Google Drive
  • Twitch
  • YouTube

How it works

One calendar invite, step by step.

Say you're building Acme, an assistant that looks after people's calendars. You want it to accept the meetings that matter and tell the person why. Here's the whole monitor, and what happens when one invite arrives.

01 · Connect

Your user connects Google once

Dana, one of Acme's users, signs in with Google through your own OAuth app, and the tokens stay in your database. From then on, the integration picks up every new or changed invite and remembers where it left off, so nothing is missed or handled twice.

source: google.calendar.invites(),
  • dana@acme.com connected with your OAuth app
  • Watching for new and changed invites
  • Picks up where it left off after a restart

02 · Context

The invite comes with context

An invite on its own doesn't say much. The integration works out who organized it, how soon it starts and whether it clashes with anything else. Your profile function adds what Acme knows about Dana, such as their job.

profile: (connection) => profileOf(connection.userId),
New inviteto dana@acme.com

Q4 planning

Thu, Oct 2 · 10:00 to 11:00

SCSarah Chen· CEO4 guests
organizer Sarah Chen, CEOstarts in 26 hconflicts nonejob Staff engineer, Payments
  • Worked out by the integration
  • From your profile function

03 · Ask

You ask one question

Write the question the way you'd ask a colleague, and name the answers you care about. Each answer becomes an event you can listen for, like importance:critical, and TypeScript checks the names.

importance: choice("How important is this meeting to this person?", {  critical: "They should be there",  useful: "Worth going if they're free",  skip: null,}),
How important is this meeting to this person?
criticalusefulskip

04 · Judge

Jev answers in about 200 ms

Jev is TypeSafe's model for questions like this one. It gives each answer a probability between 0 and 1, and for this invite it says 0.91 for critical. A call costs a fraction of a cent, so you can afford to ask about every invite.

critical: "They should be there",useful: "Worth going if they're free",skip: null,
critical0.91
useful0.07
skip0.02

212 msexample numbers

05 · Decide

Your thresholds decide what happens

You choose the cut-offs. At 0.85 or higher, Acme acts on its own. Between 0.6 and 0.85, it asks Dana first. Below 0.6, nothing happens.

invites.on("importance:critical", { min: 0.85, review: 0.6 },  google.calendar.respond("accepted"));invites.on("importance:critical", { min: 0.85 },  (e) => notify(e.connection, e.item));invites.on("review", (e) => askUser(e.connection, e));
ignorereview 0.6act 0.85

critical 0.91 → act

06 · Act

Acme accepts the invite and tells Dana

0.91 clears 0.85, so the native action accepts the invite and your own notify function tells Dana why. New monitors run in dry-run mode, where native actions only report what they would do, until you turn it off.

invites.on("importance:critical", { min: 0.85, review: 0.6 },  google.calendar.respond("accepted"));invites.on("importance:critical", { min: 0.85 },  (e) => notify(e.connection, e.item));
  • nativecalendar.respond("accepted")
  • your codenotify(e.connection, e.item)
AAcmenow

Sarah Chen (CEO) invited you to Q4 planning.

Looks critical, so it's on your calendar.

Why Jev

Fast and cheap enough to ask about everything.

Sending every email to a large chat model is slow and expensive, and you get back text you still have to parse. Jev is made for short questions like the one above. It answers in milliseconds and gives you a probability you can set a threshold on.

~200 ms

to answer a question

TypeSafe lists 150 to 300 ms

$0.042

per million input tokens

Output tokens are free

0 to 1

a probability for each answer

You decide where the cut-offs go

Speed and price are TypeSafe's published figures. The scores in the walkthrough above are made up for the example.

Integrations

Twelve integrations.
No API docs to read.

Each integration already deals with the platform's API, so you don't have to learn how to fetch new items, refresh tokens or stay under rate limits. It also comes with the actions you'd want, like accepting an invite or moving an email to Junk. Sign-in goes through your own OAuth app, and the tokens stay in your database.

Gmail

Watches new mail, threads and labels

Actions:

  • label
  • archive
  • star
  • draft reply

Outlook

Watches new mail and folders

Actions:

  • move
  • flag
  • categorize

Google Calendar

Watches invites, changes and upcoming events

Actions:

  • accept
  • decline
  • maybe

Slack

Watches messages, threads and reactions

Actions:

  • reply
  • react
  • post

Microsoft Teams

Watches chats and channels

Actions:

  • reply
  • react

Discord

Watches server messages

Actions:

  • delete
  • timeout
  • react

Linear

Watches issues and comments

Actions:

  • create
  • label
  • assign

GitHub

Watches issues, pull requests and reviews

Actions:

  • label
  • comment
  • close

Notion

Watches pages and databases

Actions:

  • add row
  • comment

Google Drive

Watches files and sharing changes

Actions:

  • restrict
  • move
  • label

Twitch

Watches live chat

Actions:

  • timeout
  • ban
  • delete

YouTube

Watches live chat and comments

Actions:

  • hold
  • delete
  • reply

Using something else? Send items in with webhook() or from(asyncIterable).

Custom sources

Ask your first question
in five minutes.

It's an open-source TypeScript library under the MIT license. Monitors start in dry-run, so you can point one at a real account without it changing anything.

Coming later · Jev Events Cloud

Want us to run your monitors?

We'd run the webhook routes, scheduled jobs and workers for you, and keep a log of every action. You'd still write the monitors. It's in design now, so tell us what you'd use it for.