Get started
YOUR SCHEDULED WORK HAS A HOME.OPEN SOURCE · SELF-HOSTED

Know what ran.
And what didn’t.

Run and monitor scheduled work across your machines. Backups, imports, the scripts you depend on—with a record of what actually happened.

One container. Your infrastructure. Completely yours.

THE OVERNIGHT REPORT06:00 AM
Immich backed up.nas01 · command job
4m 00s
Postgres dump received.Reported by your script
2m 00s
Photo sync needs a look.Connection reset by peer
Exit 1
2 finished 1 to look into

You don’t have to piece the night together.

EXAMPLE ACTIVITY
Full size
The actual Oh My Job Jobs page with command and monitored jobs, schedules, machines, and outcomes.

Commands you run. Work you watch. The same Jobs list, with the last result and what’s due next.

Actual app · Demo data
ONE CONTAINER.
ONE PERSISTENT DIRECTORY.
Linux agentsamd64 & arm64Outbound connectionsNo listening agent portsMIT licensedThe whole product is yours
A HOME FOR BOTH KINDS OF WORK

Meet your work
where it already lives.

Move a command into Oh My Job, or leave it where it is and have it report back. Both give you a schedule to expect and a history to inspect.

COMMAND JOB

“Run this on my NAS.”

Choose a machine, enter your command, and set a schedule. The agent executes it locally and brings back the output.

COMMAND/opt/scripts/backup-immich.sh
MACHINEnas01
SCHEDULEEvery day at 02:00 UTC
Server← requests workAgent on nas01← reports output + exit code
Schedule your first command
MONITORED JOB

“Tell me if it doesn’t run.”

Keep your cron job, systemd timer, or CI schedule. Add a ping URL so Oh My Job knows whether it finished.

your-existing-script.sh
./backup.sh
curl -fsS -m 10 --retry 5 -o /dev/null "https://jobs.example/ping/TOKEN/$?"
Report the command’s exit code, success or failure.
03:00 Expected03:30 Grace ends
No report received → Missed
Monitor work without an agent
FOLLOW THE RESULT

A failed run.
A useful explanation.

Go from a result to the evidence. Every run keeps its own command, timing, exit status, and output—even after you change the job.

01

Find the exception.

The overview surfaces failed runs and machines that need attention.

02

Read what happened.

Search, copy, or download the run’s output. Inspect its event timeline.

03

Make the next run count.

Fix the cause, then use Run again. The previous attempt stays in the history.

Understand run states
Real failed run in Oh My Job: Sync photos to S3, with output showing connection reset by peer and exit status 1.

The time is explicit.

Choose a schedule and timezone. Preview the next occurrences before saving. Use the form or a five-field cron expression.

Schedules

Offline has a policy.

Choose whether to skip missed work or run it late within a grace period. A machine going quiet leaves a visible result.

Missed and lost runs

The machine stays yours.

Agents connect outbound and execute as their local service user. Your server, your commands, your operating-system permissions.

The security model
SMALL BY DESIGN

A small home
for important work.

A Laravel server. A Go agent. SQLite for the data. Start with a single container and the machines you already own.

Open the installation guide

No separate database server or message broker.

compose.yml
services:
  ohmyjob:
    image: ghcr.io/ohmyjob/server:latest
    restart: unless-stopped
    ports:
      - '8080:8080'
    volumes:
      - ./data:/data
    environment:
      APP_URL: https://jobs.home.example
$ docker compose up -d

Use your reachable server URL. HTTPS requires a reverse proxy.

GOOD TO KNOW

Before you
give it a job.

Can I keep my existing cron jobs?

Yes. Create a monitored job and add its ping URL to your script. Your existing scheduler keeps running the work. Oh My Job records reports and notices when a scheduled report is missing. Read the monitoring guide.

Does every machine need an agent?

Only machines where Oh My Job executes commands need an agent. Monitored jobs report over HTTP and don't require an enrolled machine.

Is this a workflow engine?

Oh My Job is focused on scheduled commands and their outcomes. It doesn't model multi-step pipelines, job dependencies, or DAGs. It fits personal servers and small fleets where knowing what ran matters.

What is included in the open-source version?

The complete self-hosted product is MIT licensed. There are no software licensing caps on machines, jobs, or history. Available capacity depends on your server resources and configuration. Read about sizing.

Will it send me alerts?

The current implementation shows failures and missed work in the interface. Email and webhook notifications are planned; they aren't part of the version demonstrated here.

YOUR MACHINES. YOUR SCHEDULE. YOUR CALL.

Give your scheduled work
somewhere to report.

Get started Explore the source