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

Migration guide

Move every EasyCron job onto a runner you own

EasyCron is a hosted HTTP timer. This walkthrough moves those jobs onto NexusCron, a self-hosted runner you deploy with Docker Compose, then cancel the subscription.

Self-hosted cron runner used after leaving EasyCron

If you already have a VPS or a home lab, the only thing EasyCron is doing is firing URLs you already own. Migration is inventory, compose up, recreate, then pause. The apps behind those URLs stay put.

For the product comparison, see the EasyCron alternative page. This page is the cutover.

EasyCron vs self-hosted runner

ConcernEasyCronNexusCron
Job storeVendor account, CSV/API export if enabledSQLite file on your disk, backed up with the rest of the box
HTTP pingGET/POST from EasyCron IPs with optional headersGET/POST from your runner. Same URL, headers, and timeout
Cron expression5-field crontab plus EasyCron extrasStandard 5-field crontab. Map extras to delay/retry fields
SecretsStored in EasyCronEnv file next to Compose. Never leaves the host
Failure handlingEmail/webhook from the vendorLocal history plus your own alert job
Cost after year oneStill monthlyZero. License is one payment

1. Export the job list

From EasyCron, download CSV or pull the API. Keep name, cron, URL, HTTP method, timezone, and any auth headers. Map those four fields one-to-one.

# EasyCron CSV columns typically: name, cron, url, method, timezone
python3 - <<'PY'
import csv, json, sys
rows = list(csv.DictReader(open("easycron-export.csv")))
jobs = [{
  "name": r["name"],
  "cron": r["cron"],
  "url": r["url"],
  "method": r.get("method") or "GET",
} for r in rows]
json.dump(jobs, sys.stdout, indent=2)
PY

2. Docker Compose on the box that already stays up

Put the runner next to the app it pings when you can. Persist /data so history survives restarts. Match TZ to EasyCron.

services:
  nexuscron:
    image: nexuscron:latest
    restart: unless-stopped
    ports:
      - "127.0.0.1:8787:8787"
    environment:
      TZ: Europe/Madrid
      NEXUSCRON_DATA: /data
      NEXUS_TELEMETRY: "off"
    volumes:
      - ./data:/data
      - ./nexuscron.env:/run/secrets/env:ro

Then docker compose up -d. Open port 8787 only on localhost or your private network.

3. Recreate each HTTP job

Same URL, same cron string, headers from your env file. Do not paste tokens into the CSV.

curl -sS -X POST http://127.0.0.1:8787/api/jobs \
  -H "content-type: application/json" \
  -d '{
    "name": "invoice-reminders",
    "cron": "0 8 * * 1-5",
    "method": "POST",
    "url": "https://billing.internal/jobs/remind",
    "headers": { "Authorization": "Bearer $JOB_TOKEN" },
    "timeout_ms": 15000
  }'

4. Cut over without a missed ping

  1. Watch one full interval in NexusCron run history.
  2. Pause the matching EasyCron job, do not delete it yet.
  3. Leave EasyCron paused for a week of clean local history.
  4. Cancel the EasyCron plan after that week.

Full Platform Bundle

Own the runner and the rest of the stack

$249.99lifetime, Webhook Router, NexusCron, NexusPipeline, NexusAdmin

  • Self-hosted cron runner (NexusCron)
  • Webhook Router for inbound events
  • NexusPipeline and NexusAdmin
  • Docker Compose on machines you already pay for
Buy the Full Platform Bundle

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

Questions people ask before they switch

Do I have to change the URLs my apps already expose?

No. Recreate each EasyCron job with the same HTTPS endpoint. The app that receives the ping does not need a new route.

How do I avoid double-firing during cutover?

Pause EasyCron jobs after the first successful NexusCron run for that schedule, not before. Overlap of one interval is safer than a missed ping.

What about EasyCron’s time zone field?

Set TZ in docker-compose.yml (for example Europe/Madrid) so expressions mean the same hour they meant in EasyCron.

Can I keep EasyCron as a watchdog for a week?

Yes. Point a low-frequency EasyCron job at a health URL on NexusCron, then cancel EasyCron when the runner has a clean week of history.

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 cron jobs off cloud providers to self-hosted

Technical guide for migrating cron jobs off cloud providers to self-hosted NexusCron. Architecture, Docker Compose, job mapping, and cutover without missed pings.

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.