Use code for 20% launch discount. Lifetime licenses include complete source code.Copy code

Developer guide

Move AWS EventBridge, Cloud Scheduler, and EasyCron onto a runner you own

Cloud cron is a timer in someone else’s account. Self-hosting puts the schedule next to the process it wakes, on disk you already back up.

NexusCron used after migrating jobs off cloud providers

AWS EventBridge Scheduler, Google Cloud Scheduler, and EasyCron all store the expression, the target URL, and often a bearer token outside your VPC. You pay per invocation or per job cap. Latency includes a hop from their region to yours. When the rule is deleted in the console, the history goes with it.

NexusCron inverts that. The scheduler is a Docker service on the same machine (or the same private network) as the job. SQLite holds definitions and run rows. HTTP fires locally. One payment for NexusCron.

Why self-hosting wins on architecture

  • Same-host fire

    No public ingress required for internal jobs. The ping never leaves the box.

  • Disk is the source of truth

    Jobs and logs are files you rsync. Cloud consoles are not a backup.

  • No invocation tax

    Five-minute health checks do not belong on a metered EventBridge rule.

Docker Compose

Deploy next to the app the jobs call. Secrets stay in cron.env.

services:
  nexuscron:
    image: nexuscron:latest
    restart: unless-stopped
    ports:
      - "127.0.0.1:8787:8787"
    environment:
      TZ: UTC
      NEXUSCRON_DATA: /data
      NEXUS_TELEMETRY: "off"
      CRON_ADMIN_TOKEN: ${CRON_ADMIN_TOKEN}
    volumes:
      - ./data:/data
      - ./jobs.json:/app/jobs.json:ro
      - ./cron.env:/run/secrets/env:ro

Map cloud rules to jobs.json

Keep the same cadence. Point HTTP at loopback when the worker is local.

{
  "jobs": [
    {
      "id": "was-eventbridge-invoice-sweep",
      "cron": "0 */6 * * *",
      "timezone": "UTC",
      "http": {
        "url": "http://127.0.0.1:8080/jobs/invoice-sweep",
        "method": "POST",
        "headers": { "Authorization": "Bearer ${INTERNAL_JOB_TOKEN}" }
      },
      "retry": { "max": 3, "backoff_ms": 5000 }
    },
    {
      "id": "was-cloud-scheduler-health",
      "cron": "*/5 * * * *",
      "http": {
        "url": "https://app.yourdomain.com/internal/health",
        "method": "GET"
      }
    }
  ]
}

Cutover

  1. Export every cloud timer (expression, URL, headers, timezone).
  2. Compose up NexusCron. Hit /health.
  3. Load jobs.json. Run one job immediately.
  4. Dual-run one interval if the endpoint is idempotent.
  5. Disable the EventBridge rule, Cloud Scheduler job, or EasyCron entry.
# Inventory EventBridge / Cloud Scheduler / EasyCron, then:
curl -sS http://127.0.0.1:8787/health
curl -sS -X POST http://127.0.0.1:8787/api/jobs/was-cloud-scheduler-health/run \
  -H "Authorization: Bearer $CRON_ADMIN_TOKEN"
# Dual-run one interval, then disable the cloud rule.

Product page: NexusCron Self-Hosted Task Scheduler. Related: self-hosted cron setup.

NexusCron

Own the scheduler

$94.99one-time

  • Source license for NexusCron
  • Docker Compose and jobs.json examples
  • HTTP jobs, retries, SQLite history
  • No monthly EventBridge or EasyCron bill
Buy NexusCron

Checkout stays on Whop. You get the source after payment.

Questions people ask before they switch

What counts as a cloud cron provider here?

AWS EventBridge Scheduler, Google Cloud Scheduler, Azure Logic Apps recurrences, EasyCron, cron-job.org, and GitHub Actions cron. If the timer lives in someone else’s account, it belongs on this list.

Do I need a public URL for every job after the move?

No. Jobs that only wake an app on the same host can use http://billing.internal or 127.0.0.1. That is the main architectural win versus a SaaS ping from the public internet.

How do I keep EventBridge rate expressions?

Map rate(5 minutes) to */5 * * * * and rate(1 day) to a daily cron with TZ set. One-shot EventBridge schedules become delayed jobs, not cron rows.

What if a job needs secrets from the cloud provider?

Copy them into cron.env on the host. Do not paste IAM keys into jobs.json. Pair EnvSync if you already distribute .env files across boxes.

Keep reading

Guide

Self-hosted cron alternative

Stop paying a monthly bill to fire HTTP on a timer. NexusCron is a self-hosted cron alternative you deploy with Docker on machines you already own.

Guide

EasyCron and cron-job.org alternative

Compare EasyCron, cron-job.org, and other hosted cron products with NexusCron. Same job, no subscription, logs and secrets stay on your disk.

Guide

Migrate off EasyCron to a self-hosted runner

Step-by-step migration from EasyCron to a self-hosted cron runner. Export jobs, map cron expressions, Docker Compose, HTTP pings, and cutover without downtime.

Guide

Replace cloud cron services with self-hosted NexusCron

Architecture, Docker Compose, production env vars, and cutover for replacing hosted cron with NexusCron on a VPS you already run. One lifetime payment.

Guide

Migrate EasyCron jobs to self-hosted NexusCron

Architecture, Docker Compose, and cost math for replacing $20–$50/month hosted cron with NexusCron on a VPS you already run. One lifetime payment.

Guide

Self-hosted webhook router

A self-hosted webhook router that receives, transforms, and forwards events on your infrastructure. One payment. No Zapier tax for simple routing.

Guide

Replace cloud webhook services with self-hosted Webhook Router

Architecture, Docker Compose, and config mapping to replace Hookdeck, Svix, Zapier, and Make with NexusCore Webhook Router on your VPS. One lifetime payment.

Guide

Replace cloud webhook queues with local SQLite routing

Technical architecture for replacing cloud webhook queues with local SQLite routing. Production Docker Compose, under 50MB RAM, WAL mode, retries, and dead-letter replay.

Guide

Self-hosted pipeline setup

NexusPipeline is a FastAPI Docker execution engine. Clone it, compose up, and keep job state on disk you control. One payment. No worker SaaS.

Guide

Self-hosted admin dashboard setup

NexusAdmin is the self-hosted dashboard that sits next to NexusPipeline. One payment, Docker Compose, no SaaS admin tenant.

Guide

Self-hosted log stream setup

LogStream is a single-binary Node.js collector. HTTP and UDP ingest, SQLite, live dashboard, webhook alerts. One payment. No observability SaaS.

Guide

Self-hosted env sync setup

EnvSync Agent syncs .env values across VPS hosts, laptops, and microservices. Encrypted key-value store. One payment. No secrets tenant.

Guide

Self-hosted API proxy setup

API Proxy Service sits between your code and upstream APIs. Retries, rate limits, fallbacks, circuit breakers. One payment. No gateway SaaS.