Backups, reports, imports — the cron jobs on your servers, with a history of every run and an email when one fails. The agent that runs them sends back the exit code and the output, and only ever connects out over HTTPS, so your firewall stays exactly as closed as it was.
One static binary, two service accounts and a systemd unit — and it links nothing out of the host, so which distribution it lands on is not a question. Nothing is started yet: there is nothing to connect to until the next step, and an agent that starts without an identity has nothing to do but fail.
One binary on the machine that does the work, one place to schedule it from, and an email when something breaks. Nothing below needs a port opened.
The agent only ever connects out, over HTTPS, so there is no port to open and no firewall rule to change. What it receives is signed: nobody but Runjet can hand your server a command to run.
Every plan starts with 30 days on Pro — the full product, whichever card you pick. No card, no setup fee, no minimum term.
Up to three agents, and every job you care to put on them.
Billed monthly
3 agents, unlimited jobs
Fifteen agents, and three months of logs behind every run.
Billed monthly
15 agents, unlimited jobs
Fifty agents, a year of logs, and your questions answered first.
Billed monthly
50 agents, unlimited jobs
Scroll the table sideways to reach the plans that do not fit.
| Solo | Pro | Business | |
|---|---|---|---|
| Limits | |||
| Agents | 3 | 15 | 50 |
| Scheduled jobs | Unlimited | Unlimited | Unlimited |
| Team members | 1 | 5 | Unlimited |
| The limit counts agents, not hardware. One machine running two agents — a host and a container, say — uses two of them, and one agent looking after a machine uses one. A seat is taken when you invite somebody rather than when they accept, and blocking an account does not hand it back — removing the account does. | |||
| Every run | |||
| Output and outcome | Included | Included | Included |
| Output size per run | 1M characters | 10M characters | 50M characters |
| Log text kept | 14 days | 90 days | A year |
| Every run is kept for as long as the workspace exists, on every plan — its status, timings and outcome. What a plan buys time for is the output text: past the size above it is cut, past the window above it is cleared, and either way the log says so where the text was. Neither is a failure, and neither stops a run. | |||
| Support | |||
| Support | Email, answered first | ||
Crontab is fine on one machine you look at every day. It keeps no history, so a job that failed last Tuesday left nothing behind to look at, and a machine that was down at 03:00 simply skips the run with nothing anywhere to say it was missed.
Those watch cron from the outside: you add a ping to the end of your script and they tell you when it stops arriving. Runjet is what runs the script, so the output and the reason it stopped are already here, and there is no ping to forget on the job you add next week. They send a message when a job stops reporting; Runjet sends one when it breaks and one when it recovers, and nothing for the ninety-eight failures in between.
No. Every connection is made by the agent, outward, over HTTPS. Nothing is listening on your side, there is no port to forward, and the service has no route in even if it wanted one.
Anything you would put in crontab: a shell one-liner, a script, a docker exec. The agent runs it under an account of its own, runjet-job unless you name another, so a job cannot read the agent’s key or your secrets file, and hands back the exit code and the output — it does not need your work wrapped in anything of ours.
The command, the schedule, the exit code and whatever each run printed — the same things the interface shows you. Of each agent I also see the name you gave it, its version, operating system and architecture, the account it runs jobs under, and the address it connects from. The agent sends results, not files: nothing else on the machine leaves it.
It does not start a second one. A job runs once per machine at a time, so a tick that comes due while the previous run is still going on that agent is dropped rather than queued — an hourly job that takes ninety minutes runs every two hours and never piles up behind itself. What that costs you is a line in the history: a dropped tick leaves no row, so the list shows the runs that happened rather than the times the machine was still busy. Pressing the play button in the same situation is the case where you are told, because there is somebody there to tell: the answer names the machine and what is already in flight on it.
A smaller plan holds less, so buying one asks what to turn off. If the workspace has more agents or more people in it than the plan allows, the purchase does not go through until you have chosen which of them stop — and stop is what they do: they are switched off, not deleted, and they stay off until you are on a plan with room again, where you turn back on whatever you want. Jobs whose last agent goes are named before you confirm, because a job with nowhere to run stops quietly. Log text is the exception in your favour: a shorter window never reaches backwards, so everything written under the longer one stays readable and the new window applies from that day on. Run history is not a plan axis at all — every run is kept on every plan.
Reminders are scheduled for the last days of the trial, and no card was taken to start, so nothing is charged when the date passes. Then the scheduler stops: nothing runs, but everything stays readable for another 30 days and export still works — subscribe inside that window and your jobs, history and agents are exactly as you left them, with scheduling starting again from that moment rather than firing everything it missed. After it the workspace comes down, and for 30 days more it can still be brought back if you ask, before it is deleted for good. A subscription that ends later puts you on the same ladder from its own last day, and either way emails are scheduled on the way down, each counting the days that are left. Treat them as a courtesy rather than a clock, because an email can arrive late, and export before the 30 days are out: once the workspace comes down there is nothing left to export.
Thirty days, no card — long enough to take the cron entry that worries you most and run it on a machine that still has nothing listening on it.
github.com/mr-jablon/runjet-agent
Read it, or build it yourself — one static binary, ~6 MB, nothing beneath it
Linux
linux
macOS
darwin
Windows
windows
BSD
freebsd
The distribution is not one of the variables: nothing in the binary links out of the host, so there is no glibc to match and no package to hold back.
Step 1 of 5. Nothing to do. The agent holds one GET open and waits.
ping received 03:00
the script reached its last line
upload: - to s3://acme-backups/dump
output, duration and outcome, per run
0 9 * * *
Whichever shape you pick, the hours it lands on are on the screen before you save it.
sending incremental file list