Skip to content

shruggietech/go-schedule

Repository files navigation

go-schedule

CI Release License

A cross-platform (Linux · macOS · Windows) task scheduler written in Go — cron-level power without the cryptic syntax. CLI-first, with a Go-native Material Design desktop GUI built on top.

Status: Feature-complete (spec-driven via Spec Kit). The CLI, daemon, and Material Design desktop GUI are all implemented and tested: human-readable & one-off scheduling, per-task timezones with DST handling, nested groups, downtime catch-up, and a Fyne GUI (calendar, guided editor with live preview, real-time logs). See CHANGELOG.md. The GUI requires a C toolchain + OpenGL to build (CI/releases handle this); the daemon and CLI are cgo-free.

Why

cron is powerful but its */15 * * * * syntax is hard to read and easy to get wrong. go-schedule gives you the same scheduling power expressed in plain language — "every 15 minutes", "every weekday at 9:00 AM", "the 3rd Wednesday of each month", or a single one-off run — with a calendar/timeline GUI for managing it all.

Features

Implemented (✅) and planned:

  • Human-readable schedules — recurring and one-off, no cron strings.
  • Cron parity — anything cron can express, this can too (intervals, ordinal weekdays, etc.).
  • Per-task timezones with correct Daylight Saving Time handling; UTC backend.
  • Nested task groups (groups within groups) with cascading enable/disable.
  • Downtime catch-up — one catch-up run per task after missed runs, then resume.
  • Overlap control — queue-one-pending by default, configurable per task, with alerts.
  • Starts on boot — runs as a system-wide service (systemd / launchd / Windows Service); single-instance guarded.
  • Material Design desktop GUI — calendar/schedule views, guided task editor with live schedule preview, group tree, and a real-time logs view. Opening the GUI never leaves a visible console window (gosched gui). New to the task editor? See the GUI field reference.

Architecture

A single background daemon (goschedd) hosts the scheduling engine, persistence, and executor, and is registered as a system service. The CLI (gosched) and desktop GUI (gosched-gui) are thin clients that talk to the daemon over local IPC (Unix socket / Windows named pipe), so both operate on identical state and the engine keeps running regardless of which client is open.

See specs/001-task-scheduler/plan.md for the full design.

Project layout (target)

cmd/        goschedd (daemon) · gosched (CLI) · gosched-gui (Fyne GUI)
internal/   engine · schedule · task · store · executor · catchup · timezone · api · ipc · service · config · platform
gui/        Fyne views (schedule list + calendar, editor, logs, groups)
specs/      spec-driven development artifacts (spec, plan, tasks, contracts)

Install

Each release ships installers and archives per platform. Verify downloads against SHA256SUMS.txt.

Windows (recommended) — formal .msi installer

Download go-schedule_<ver>_windows_amd64.msi and run it. It installs to Program Files, registers the background scheduler as an auto-starting Windows service, and adds a Start-Menu shortcut — no extracting a zip or running an exe from Downloads. Launch go-schedule from the Start Menu; uninstall via Apps & features. Full steps: the Windows install guide.

macOS desktop — one self-contained download

go-schedule-desktop_<ver>_darwin_<arch> bundles the GUI + daemon + CLI together. The GUI ships as gosched-gui.app (the daemon and CLI live inside it) and auto-starts the background daemon the first time, so there's nothing to configure:

open gosched-gui.app

The auto-started daemon keeps running so your tasks fire even after you close the window. For a daemon that also starts on boot, install it as a system service (below).

Server / headless — daemon + CLI only

go-schedule_<ver>_<os>_<arch> contains just goschedd + gosched (Linux & macOS, amd64 + arm64). Register the service to start on boot:

sudo ./gosched service install   # admin/root required
sudo ./gosched service start
./gosched health                 # expect: daemon ok
./gosched task add hello --command /usr/bin/true --schedule "every weekday at 09:00"

Windows users: see the step-by-step Windows install guide.

Once the GUI is open, the GUI field reference explains what every field in the task editor accepts.

Development

Spec-driven via Spec Kit. The source of truth lives under specs/001-task-scheduler/:

Engineering standards are governed by the project constitution: gofmt/go vet/golangci-lint clean, go test -race, ≥80% coverage on core packages, and a documented dispatch-latency budget.

License

Licensed under the Apache License 2.0. © 2026 ShruggieTech.

About

Cross-platform task scheduler in Go — cron-level power without the cryptic syntax. CLI-first with a Material Design desktop GUI.

Resources

License

Stars

1 star

Watchers

0 watching

Forks

Packages

 
 
 

Contributors