sync-scheduler
Sync Scheduler
Cron scheduling with durable dispatch. Server version does distributed leader election across pods, browser version runs single-tab. Dispatch goes through the job system.
Dependencies: requires sync-job handles for execution. Uses sync-mutex internally for leader election. Read those skills for deeper semantics if needed.
Setup Pattern
// 1. Define jobs first
const cleanupJob = job({ id: "cleanup", schema, process: handler });
// 2. Create scheduler
const sched = scheduler({ id: "platform", onMetric: console.log });
// 3. Start on every pod
sched.start();
// 4. Register schedules (idempotent — safe to call on every startup)
More from valentinkolb/sync
sync-job
Use this skill when implementing durable background jobs with @valentinkolb/sync job: defining typed process handlers with ctx.step/ctx.heartbeat/ctx.signal, submit/join/cancel flows, idempotent submission via key, retries with exponential backoff, lease timeouts, and per-job event streams for audit. Also use when choosing between job (durable execution with state) vs queue (simple work distribution). Also works in the browser via `@valentinkolb/sync/browser` with in-memory state — same API, no Redis needed.
9sync-retry
Use this skill when handling transient transport failures with @valentinkolb/sync retry utility: wrapping Redis/network calls with exponential backoff, configuring per-call retry overrides, using AbortSignal for cooperative cancellation, and classifying errors with retryIf. Also use when writing stream reader loops that must survive brief outages. Works identically in the browser via `@valentinkolb/sync/browser` — no Redis dependency, uses setTimeout-based sleep.
9sync-ephemeral
Use this skill when implementing short-lived typed state with @valentinkolb/sync ephemeral: TTL-based key/value with upsert/touch/remove, snapshot-plus-cursor reconciliation for cache hydration, streaming upsert/touch/delete/expire events, capacity/payload limits, and presence-style use cases where entries should naturally expire. Also works in the browser via `@valentinkolb/sync/browser` with in-memory state — same API, no Redis needed.
9sync-topic
Use this skill when implementing event streams with @valentinkolb/sync topic: publishing typed events with idempotency, consumer-group processing with commit for at-least-once delivery, live replay from any cursor, retention tuning, and multi-tenant stream isolation. Also use when choosing between topic (pub/sub events) vs queue (work distribution). Also works in the browser via `@valentinkolb/sync/browser` as an in-memory event bus — same API, no Redis needed.
9sync-mutex
Use this skill when working with @valentinkolb/sync distributed locks: exclusive critical sections across pods with withLock/withLockOrThrow, manual acquire/release, lease extension for long work, retry tuning, owner-safe release via Lua, and LockError handling. Also works in the browser via `@valentinkolb/sync/browser` with an in-memory store for single-tab lock coordination.
9sync-ratelimit
Use this skill when working with @valentinkolb/sync rate limiting in Bun/TypeScript: creating per-identifier sliding-window limiters, choosing check() vs checkOrThrow(), handling RateLimitError with resetIn/Retry-After headers, tuning window size, and reasoning about Redis key layout. Also works in the browser via `@valentinkolb/sync/browser` with an in-memory store — same API, no Redis needed.
9