// the find
flohoss/gocron
A task scheduler built with Go and Vue.js that allows users to specify recurring jobs via a simple YAML configuration file. The scheduler reads job definitions, executes commands at specified times using cron expressions, and passes in environment variables for each job.
gocron is a self-hosted cron scheduler with a Vue.js web UI, where jobs are defined in a YAML file rather than through the UI itself. It targets homelabbers and small ops setups that want visibility into scheduled tasks — particularly backups — without the overhead of something like Ofelia or Kubernetes CronJobs.
The config-as-code approach is the right call: jobs live in YAML, the UI is read-only observability rather than a mutation surface, which means your job definitions stay in version control. The `GC_` environment variable override convention is well-thought-out for Docker Compose deployments where you want to inject secrets without touching the config file. Using sqlc for the SQLite query layer is a good choice — typed queries without an ORM. The built-in software installation in the container (restic, rclone, borgbackup, etc.) means the backup use case actually works out of the box rather than requiring you to build a custom image.
No authentication on the web UI at all — if you expose port 8156, anyone on the network can see your jobs and their output, which often contains paths, hostnames, and exit codes that tell an attacker something. The software-in-config installation model is fragile: pinning `borgbackup` to `1.2.0` via apt in a config file means your container image is effectively pulling packages at runtime, which breaks reproducibility and creates a class of 'works on my machine' failures. Job output is stored in SQLite, which is fine until your backup jobs are verbose and you've accumulated months of log rows with no apparent TTL or pruning mechanism in the README. The project has 548 stars but only 18 forks, which is a reasonable signal that people are using it but not extending or fixing it — issues and PRs may sit.