Hey HN!
Today we are launching Jiter, a service that lets you schedule callbacks and receive webhook events when you are ready for them. We got really annoyed by having to manage cron jobs in our application when the vast majority of the functionality that we needed was to be reminded that an event was supposed to happen in the future. Jiter makes this simple since all you need to provide is an ISO timestamp, a stringified payload, and your endpoint destination - we'll handle all of the queuing and do our best to send you that event at your desired time.
Please let us know if you have any questions or feedback! We will have an SDK up soon!
From the homepage and the examples after signing up, I don't get if you are able to create one event which would be recurring and trigger a webhook every week/month/year etc. or is that not possible yet?
In addition to what Jose posted above, we also want to encourage users to use the existing functionality as a trigger for setting up recurring handlers.
For example, if you receive an event to your webhook and you want that webhook to fire again at the same time tomorrow, make a new call to Jiter and create a new event when you receive the first event and you can chain them together. Hopefully by end of day today we'll be able to include the original scheduledTime in the webhook body so you can use that as the base for the new event (e.g., createNewEvent(body.scheduledTime + twentyFourHours)
And as Jose said, we definitely plan to make recurring events possible in the immediate future too!
> For example, if you receive an event to your webhook and you want that webhook to fire again at the same time tomorrow, make a new call to Jiter and create a new event when you receive the first event and you can chain them together.
Hmm, that feels like a brittle solution. As soon as one webhook delivery fails, or the webhook receiver has a temporary problem and throws an error, the chain of callbacks is cut. And so the user has to monitor that. It also gets messy if the user needs a more complex schedule than "every x <time units>".
Agreed on it being brittle. However, that's hopefully where retries come into play. And if the original request is handled but an error is thrown before the new event could be created, I'd hope there would be some form of logging in place to report that and hopefully it'd be a simple API call to restore the flow. But I definitely agree that it's messy...
All that being said, we definitely want to support true cron expressions at some point in the near future, I was mostly just throwing that out there as an option that would work today.
It looks interesting but even after signing up I cannot find any documentation aside from the basic code snippets. An example of what I would like to know is: what if things go wrong, will there be retries?
If an error occurs on our end while processing it, we will keep retrying for a while. If an event fails to POST to your endpoint it'll have a failedAt time for when it failed. We are adding customizable retries soon, as well as docs and an SDK, thanks for your concern we know that's a big feature :)
Please do not interpret this comment as negative in any way - I am sincerely trying to understand what this does.
Instead of setting up cronjobs on a machine I own, this allows me to set up a cronjob on jiter servers to make a callback to my server?
Who is your target user? I am happy to run cronjobs or systemd timers on servers that I or my team control. And for execution in environments like GitHub Actions or AWS Lambda, they all have functionality to trigger execution with a timer.
This introduces added complexity of maintaining a webhook receiver and having to deal with the rather complex failure modes of webhooks.
FWIW my engineering org built a service that pretty much does what Jiter offers because we need to do things like schedule messages to be sent in the future.
> And for execution in environments like GitHub Actions or AWS Lambda, they all have functionality to trigger execution with a timer.
We use it for triggering things dynamically within services. For example, when someone books a flight we need to send a follow-up email X amount of time later. Building a scheduler into the service that handles booking the flight might make sense, but what happens when we need to do the same thing for someone booking a hotel or car rental? Instead we just have a service that stores all of the messages it needs to send in the future and has a tight reconciliation loop to send out those webhooks.
> This introduces added complexity of maintaining a webhook receiver and having to deal with the rather complex failure modes of webhooks.
If you only need to do it once, sure. If you standardize the behavior/API then it reduces complexity a ton.
Awesome feedback and thanks for taking the time to challenge us! Sorry in advance for the wall of text, but you asked some great questions.
It sounds like you’re probably a bit outside our target market because you sound comfortable building a scalable solution of your own. However, our target user is either unwilling to build their own or they don’t have the skillset to efficiently build and maintain a separate cron app/server.
As for other execution environments, those definitely have options for scheduling things and setting up recurring events, but you have limited flexibility and things like Type Safety can be quite the burden because they're disparate from your core app. (And while I totally agree GitHub Actions is an option, that doesn't sound fun at all haha). However, what they don't have is flexibility around the "when"...
For example, let's say you want to check to see if a user has performed XYZ action within their first 72 hours after signup. You could setup a cron job to fire once daily to simply poll ALL new users, lock those rows, and join with other tables to see if they're relevant for a follow-up email OR you could setup a Jiter event to target that specific user at exactly 72 hours after their signup. The result is distributed, small queries delivered just in time. The payload contains exactly the information you need to handle that one action and you spread your DB queries out over time to minimize larger impact to a decent chunk of your table.
I agree about the complexity of maintaining the webhook, but hopefully that logic is super focused and ideally you'd use different routes/handlers for different events so each is small and maintainable.
Great feedback all around and I'm curious to see if you have a follow up on any of that!
TL;DR - We're not for everyone, but we think we offer a convenient solution for those looking for flexibility and for those without the skillset to roll their own.
Actually, I hadn't considered that signup use case at all. Good point. It could be a useful way of offloading heavy data processing to Jiter.
It would be useful to see on your website what the webhook request from Jiter.dev would look like. How does the receiver know that the webhook came from Jiter with no tampering by a middleman? Is there a signature that the user could verify? (Slack does this well on their webhooks.)
Congratulations on the launch, and I wish you the best!
So are you suggesting that we update docs to encourage users to do that? We use signing secrets to sign the payload so users know the request from us is authentic, but other than that I can't think of how we'd control what users send us aside from just rejecting anything that "looks" like an object ;)
I do like the idea of including a little chunk in our SDK (Coming soon!) to allow them to easily encrypt/decrypt their payload, but that'd be entirely on them to follow that practice.
Oh for sure, I just haven't thought of a way to enforce that the payload be encrypted because there are so many different methods to do that and most of them still result in a string...
Do you have any advice or suggestions for how to enforce that?
I'll definitely add some docs to encourage it though; thanks for the suggestion!
to my understanding, it's for those who can imagine (and predict time) how to write simple additional httprequest to external URI and create simple `route` in their NodeJS app [for getting callbacks], but who's not confident on wtf is `man systemd.timer` (smells like all dead sysadmins' zombie magic) which `service unit` it should trigger and what actually to run under that service unit. How to deploy all that after all.
Indie/solo devs, if that express state of things better, who are assured their product will be never run in internal/isolated networking, for example or never need to stop some specific cron but not all of them during migration, blah blah blah.
Love the irony that while the product is trying to "Make cron jobs a thing of the past", it probably runs with one polling the scheduled messages every second to send them JIT
Congratulations on the launch, it's something I've been meaning to build for a while, and was actually chatting with @onassar about it (also on this thread) when he built his. It's very much useful, don't let people discourage you just because it's not useful for them. :P
Btw, if you are ever tired with managing your own webhook infra, we[1] do webhook sending as a service, and we have also open-sourced the core tech[2] in case you find it useful.
We just made some changes to our DNS which SHOULD have fixed the original issue. Can you try again?
Worst case scenario (if you're still willing to give us a shot), join our Discord and we can work with you to figure out what's going on: https://discord.gg/NPC6GBDBXp
Mm, so definitely temporary storage and I’m sure some steps were taken to encrypt that temp storage? What is the impact of scope for those secrets ya know? Seems like a honeypot for good stuff lurking in their cloud account.. not going to knock the idea though, pretty clever
Regarding the backend we're essentially adding events into a queue and polling the queue for messages that are ready. Since this is an MVP we don't have any scaling or delivery guarantees but from our testing all of our events were delivered within 2 seconds of the desired time. We have many retries if something fails on our end while attempting to send the event to you, but if your server returns an error to us we will mark it as failed with a timestamp.
We are literally adding retries & some more customizability options right now, as well as better docs for usage and other endpoints!
Similar, but think more for "one off" events for now, we plan to add more "cron" like functionality in the future.
Instead of having EventBridge trigger a lambda to poll your DB every hour for users that signed up 24 hours ago to send them a welcome email, when that user is created you can send us that event with that users info and the emailTemplateId so you can be reminded of it in 24 hours. Once you receive the event from us, you'd send the email like normal on your app server. You don't have to manage the polling infrastructure.
It is a sign of the times devs would consider writing code that depends on random websites in order to get cron-type callbacks instead of using the timer of the actual local system.
46 comments
[ 2.4 ms ] story [ 91.2 ms ] threadPlease let us know if you have any questions or feedback! We will have an SDK up soon!
For example, if you receive an event to your webhook and you want that webhook to fire again at the same time tomorrow, make a new call to Jiter and create a new event when you receive the first event and you can chain them together. Hopefully by end of day today we'll be able to include the original scheduledTime in the webhook body so you can use that as the base for the new event (e.g., createNewEvent(body.scheduledTime + twentyFourHours)
And as Jose said, we definitely plan to make recurring events possible in the immediate future too!
Thanks for the feedback/interest!!!
Hmm, that feels like a brittle solution. As soon as one webhook delivery fails, or the webhook receiver has a temporary problem and throws an error, the chain of callbacks is cut. And so the user has to monitor that. It also gets messy if the user needs a more complex schedule than "every x <time units>".
All that being said, we definitely want to support true cron expressions at some point in the near future, I was mostly just throwing that out there as an option that would work today.
If you're interested in using it, join our Discord and we'll do everything we can to make the platform work for your use case!
https://discord.gg/NPC6GBDBXp
So rad! I built an experiment a while back to do exactly this (https://onassar.github.io/experiments/boomerang-webhooks)
It's awesome to see this productized. I had the same annoyance: setting up and managing cron jobs.
Good luck with the launch :)
Some other similar tech for those interested in tools like this:
Zeplo https://www.zeplo.io/
Boomerang https://onassar.github.io/experiments/boomerang-webhooks
Instead of setting up cronjobs on a machine I own, this allows me to set up a cronjob on jiter servers to make a callback to my server?
Who is your target user? I am happy to run cronjobs or systemd timers on servers that I or my team control. And for execution in environments like GitHub Actions or AWS Lambda, they all have functionality to trigger execution with a timer.
This introduces added complexity of maintaining a webhook receiver and having to deal with the rather complex failure modes of webhooks.
> And for execution in environments like GitHub Actions or AWS Lambda, they all have functionality to trigger execution with a timer.
We use it for triggering things dynamically within services. For example, when someone books a flight we need to send a follow-up email X amount of time later. Building a scheduler into the service that handles booking the flight might make sense, but what happens when we need to do the same thing for someone booking a hotel or car rental? Instead we just have a service that stores all of the messages it needs to send in the future and has a tight reconciliation loop to send out those webhooks.
> This introduces added complexity of maintaining a webhook receiver and having to deal with the rather complex failure modes of webhooks.
If you only need to do it once, sure. If you standardize the behavior/API then it reduces complexity a ton.
Awesome feedback and thanks for taking the time to challenge us! Sorry in advance for the wall of text, but you asked some great questions.
It sounds like you’re probably a bit outside our target market because you sound comfortable building a scalable solution of your own. However, our target user is either unwilling to build their own or they don’t have the skillset to efficiently build and maintain a separate cron app/server.
As for other execution environments, those definitely have options for scheduling things and setting up recurring events, but you have limited flexibility and things like Type Safety can be quite the burden because they're disparate from your core app. (And while I totally agree GitHub Actions is an option, that doesn't sound fun at all haha). However, what they don't have is flexibility around the "when"...
For example, let's say you want to check to see if a user has performed XYZ action within their first 72 hours after signup. You could setup a cron job to fire once daily to simply poll ALL new users, lock those rows, and join with other tables to see if they're relevant for a follow-up email OR you could setup a Jiter event to target that specific user at exactly 72 hours after their signup. The result is distributed, small queries delivered just in time. The payload contains exactly the information you need to handle that one action and you spread your DB queries out over time to minimize larger impact to a decent chunk of your table.
I agree about the complexity of maintaining the webhook, but hopefully that logic is super focused and ideally you'd use different routes/handlers for different events so each is small and maintainable.
Great feedback all around and I'm curious to see if you have a follow up on any of that!
TL;DR - We're not for everyone, but we think we offer a convenient solution for those looking for flexibility and for those without the skillset to roll their own.
It would be useful to see on your website what the webhook request from Jiter.dev would look like. How does the receiver know that the webhook came from Jiter with no tampering by a middleman? Is there a signature that the user could verify? (Slack does this well on their webhooks.)
Congratulations on the launch, and I wish you the best!
And another great question! We use signing secrets to create a signature so you can validate that the request from us is authentic.
And thanks! This is just the beginning for us, so hopefully you give us a chance and sign up so we can notify you as we release new features!
When it comes back in, they can decrypt and authenticate it. You could hide all this in your api client.
Then you don’t end up with a big centralized database full of the PII of millions of your customers’ customers.
I do like the idea of including a little chunk in our SDK (Coming soon!) to allow them to easily encrypt/decrypt their payload, but that'd be entirely on them to follow that practice.
Do you have any advice or suggestions for how to enforce that?
I'll definitely add some docs to encourage it though; thanks for the suggestion!
You can provide some functions for the webhooks so targeted to authenticate and decrypt the stuff posted to them.
Indie/solo devs, if that express state of things better, who are assured their product will be never run in internal/isolated networking, for example or never need to stop some specific cron but not all of them during migration, blah blah blah.
Hopefully you won't ever have to write them again because we're falling on the sword for you.
Btw, if you are ever tired with managing your own webhook infra, we[1] do webhook sending as a service, and we have also open-sourced the core tech[2] in case you find it useful.
[1] https://www.svix.com
[2] https://github.com/svix/svix-webhooks
We'll be right back... We're hard at work making some great changes.
Thanks for the heads up, we'll get that fixed up asap!
Is that the expected URL?
Worst case scenario (if you're still willing to give us a shot), join our Discord and we can work with you to figure out what's going on: https://discord.gg/NPC6GBDBXp
* Is the future webhook calling cancel-able?
* If I send multiple event with the same payload and same triggering time, will jiter coalesce them into one webhook calling?
* if my service is temporarily offline, will jiter retry the webhook?
* Not yet, but soon! We're planning to add functionality to allow you to specify whether
* Soon, yes. We're planning on adding functionality for retries soon!
Care to share some of the technical details?
How far does it scale, what are the delivery guarantees, recovery strategy for missed webhooks, time accuracy?
Regarding the backend we're essentially adding events into a queue and polling the queue for messages that are ready. Since this is an MVP we don't have any scaling or delivery guarantees but from our testing all of our events were delivered within 2 seconds of the desired time. We have many retries if something fails on our end while attempting to send the event to you, but if your server returns an error to us we will mark it as failed with a timestamp.
We are literally adding retries & some more customizability options right now, as well as better docs for usage and other endpoints!
Instead of having EventBridge trigger a lambda to poll your DB every hour for users that signed up 24 hours ago to send them a welcome email, when that user is created you can send us that event with that users info and the emailTemplateId so you can be reminded of it in 24 hours. Once you receive the event from us, you'd send the email like normal on your app server. You don't have to manage the polling infrastructure.