Scheduled-job products built on serverless functions have a habit of missing a beat: cold starts push the actual run a few seconds late, or a job that runs long gets killed before it finishes. DenkOps ships two native ways to schedule work instead, both running on a real always-on slot with standard 5-field cron, default UTC, so the run actually fires on time.
Schedule from inside your Bun app with the DenkOps SDK. Restart-safe, state lives on /persist. Best when the job is code in your app.
import { denkops } from "@denkopsai/sdk";
denkops.cron("0 2 * * *", async () => {
await runNightlyReport();
}, { name: "nightly", timezone: "UTC" });Any runtime, Bun or Python. Declare the schedule in denkops.json and DenkOps calls the path for you, visible from the dashboard and MCP.
{
"cron": [{
"schedule": "0 2 * * *",
"path": "/jobs/nightly",
"method": "POST",
"timezone": "UTC",
"name": "nightly"
}]
}Both paths run on the same always-on slot: log what a run did to /persist so a restart doesn't lose the history, and add only the destinations the job calls out to, an email API, a Slack webhook, a database, to the egress allowlist. Managed jobs also show up in the dashboard's Scheduled jobs panel and can be re-run on demand with the MCP run_cron tool.
Both are native. denkops.cron is an in-process helper in the DenkOps SDK: call it with a 5-field schedule and a handler inside your Bun app, and it runs there, restart-safe, with state kept on /persist. Managed declarative cron works for any runtime, Bun or Python: list a schedule in denkops.json and DenkOps calls your app's path on time, visible and manually triggerable from the dashboard's Scheduled jobs panel or the MCP list_crons and run_cron tools. Use denkops.cron when the job is code in your app, use managed cron for Python, cross-runtime jobs, or when you want platform visibility and a manual re-run button.
denkops.cron takes an overlap option to skip or queue a run that's still going, and a catchUp option to control whether a missed run replays after a restart, both backed by state on the durable /persist disk. There's no per-invocation timeout on either path, a long run is between your code and the slot's CPU and RAM, not a platform limit.
← API hosting · Express cron job guide · FastAPI cron job guide