Lets users log tasks the Linux agent can't discover on its own (e.g.
Docker-based backup jobs) directly in the UI. Tasks now carry an
origin ('agent' | 'manual') so the agent's report-sync logic only
ever creates/updates/stale-marks agent-sourced rows, leaving manual
entries untouched; the API rejects edits/deletes of agent-sourced
tasks to keep that boundary enforced server-side too.
Schedule Task Manager
Tracks scheduled tasks (cron jobs, systemd timers) across your homelab servers, grouped by server and schedule type. Servers push their task list to this app via a small agent script; sign-in is delegated to Authentik (OIDC).
v1 scope: Linux servers only (cron + systemd timers). Windows Task Scheduler
support is a documented future addition — see agent/windows/README.md.
Architecture
server/— Express + TypeScript API, SQLite (via libSQL) storage, Authentik OIDC login.web/— React + Vite single-page app, served as static files by the Express server.agent/linux/—report-tasks.sh(collects cron + systemd timer data) andinstall.sh(installs it as a systemd timer on a target server).
Data model, API contract, and sync behavior are documented in code:
server/src/db/schema.ts,
server/src/routes/agentReport.ts,
server/src/services/taskSync.ts.
1. Set up an Authentik application
In Authentik:
- Create an OAuth2/OpenID Provider:
- Redirect URI:
<APP_BASE_URL>/auth/callback(e.g.https://schedule.example.lan/auth/callback) - Scopes:
openid,email,profile
- Redirect URI:
- Create an Application using that provider, and assign the users/groups who should be allowed to sign in — Authentik controls who can authenticate; the app itself has no separate user list.
- Copy the provider's issuer URL, client ID, and client secret into
.env(see.env.example).
2. Run with Docker (recommended)
cp .env.example .env
# edit .env: APP_BASE_URL, SESSION_SECRET, AUTHENTIK_*
docker compose up -d --build
The app listens on HOST_PORT (default 3000). SQLite data and session
files persist in ./data on the host.
3. Local development
Requires Node.js 20+.
npm install
cp .env.example .env # fill in AUTHENTIK_* to test real login, or leave
# blank to run everything except /auth/login locally
npm run dev:server # http://localhost:3000 (API)
npm run dev:web # http://localhost:5173 (Vite dev server, proxies /api and /auth to :3000)
Visit http://localhost:5173 during development. Database migrations run
automatically on server start.
4. Add a server and install the agent
-
Sign in, go to Servers, and add a server. The generated API token is shown once — copy it.
-
On the target Linux server (as root):
curl -fsSL https://schedule.example.lan/agent/linux/install.sh | \ API_URL=https://schedule.example.lan API_TOKEN=stm_xxx bashThis installs
report-tasks.shto/usr/local/bin, writes the API credentials to/etc/schedule-task-manager-agent.env, and installs aschedule-task-manager-agent.timersystemd timer that reports every 15 minutes (override withINTERVAL_MINUTES=5before thebashabove).Requires
curl,jq, andsystemdon the target server. -
Tasks appear on the Dashboard, grouped by server and then by schedule type, within one reporting interval.
Tasks that stop appearing in a server's report are marked stale rather than deleted (so a temporary agent failure doesn't wipe history) and are hidden by default — toggle "Show stale/missing tasks" to see them.
Environment variables
See .env.example for the full list with descriptions.