A $0 stack HTTP cron job manager — create, schedule, and monitor jobs from the browser.
Live app: https://crondom.temidayo.xyz/
This is the web UI. Users sign in, manage cron jobs, and view execution history. The browser talks to Turso directly.
Jobs are executed by a separate always-on process:
| Repo | Role | Deploy |
|---|---|---|
| crondom (this repo) | Dashboard UI | GitHub Pages |
| crondom-engine | Runs due jobs every 60s | GCP e2-micro (free tier) |
Browser (this app) ──► Turso (cron_jobs, execution_logs)
▲
│
crondom-engine (VM)
every 60s
fetch due URLs
Both apps share the same Turso database. The UI writes jobs; the engine executes them and writes logs.
- UI: React 18 + React Router + Vite
- Auth: Clerk
- Database: Turso (
@libsql/client/web) - Hosting: GitHub Pages (custom domain)
Create an application at clerk.com and copy the Publishable Key (pk_live_… or pk_test_…).
cp .env.example .env| Variable | Description |
|---|---|
VITE_TURSO_DATABASE_URL |
Turso libsql URL |
VITE_TURSO_AUTH_TOKEN |
Turso auth token (read/write) |
VITE_CLERK_PUBLISHABLE_KEY |
Clerk publishable key |
Use the same Turso URL and token in crondom-engine.
npm install
npm run devThe engine is not required for browsing the UI, but jobs will not fire until the engine is running against the same database.
Tables live in Turso (cron_jobs, execution_logs). Initialize once via the engine:
# in the crondom-engine repo
npm run db:initOr apply db/schema.sql from this repo with the Turso CLI.
Add repository secrets under Settings → Secrets and variables → Actions:
| Secret | Value |
|---|---|
VITE_TURSO_DATABASE_URL |
Turso URL |
VITE_TURSO_AUTH_TOKEN |
Turso token |
VITE_CLERK_PUBLISHABLE_KEY |
Clerk key |
Push to main — the deploy workflow builds and publishes to gh-pages.
- Live app: crondom.temidayo.xyz
- Engine: github.com/temidayoxyz/crondom-engine