Private beta

Don't rewrite your jobs. Govern them.

Temporal and Inngest want your business-critical work rebuilt on their framework. Weev puts a control plane in front of the jobs you already run — same code, explicit dependencies, every run accounted for.

$ npx weev init_
// the jobs already exist.
// wrap them, don't port them.
weev.job({
name: "reconBatch",
batch: "nightlySettlement",
predecessors: ["ledgerClose"] },
async (ctx) => legacy.reconcile(ctx));
 
weev.job({
name: "feeAccrual",
batch: "nightlySettlement",
predecessors: ["fxRates"] },
async (ctx) => legacy.accrue(ctx));
 
weev.job({
name: "settle",
batch: "nightlySettlement",
predecessors:
["reconBatch", "feeAccrual"] },
async (ctx) => legacy.settle(ctx));
● validatedsettle · 2 upstream deps · next run 02:00 EST
// WHAT'S AT STAKE

One night of jobs nobody wants to migrate.

live · payments-platform
00:0002:0004:0006:00
ledger_close41s
fx_rates12s
recon_batch2m04
fee_accrual58s
nightly_settlement00:47
regulatory_exportgated
retention_sweep04:00
completedrunninggated on dependencies or scheduled

A rewrite is not a migration path.

Durable-execution frameworks assume you can rebuild the job. For settlement runs, billing batches and regulatory exports you can't — so they stay on cron and stay invisible.

- crontab + runbook
0 2 * * * run_settlement.sh
# after ledger_close
# (usually done ~1:40?)
# retry: runbook §4
# ping #payments if it fails
+ weev.job
after: [reconBatch, feeAccrual]
schedule: 02:00 America/New_York
batch: nightlySettlement
✓ validated before release

Same script, same infrastructure. What changed is that the reason it runs is written down, checked, and visible to everyone who depends on it.

// WHO IT'S FOR

Teams whose worst outage would be a job that quietly didn't run.

— Settlement, billing and ledger work on a fixed clock— Regulatory exports with a hard deadline and an auditor— Pipelines glued together with cron, retries and Slack alerts
// ADOPTION

Adopt it on a Tuesday. One job.

Nothing is rebuilt and nothing is cut over. Cron keeps firing until Weev owns the run — then you delete the line. The next job inherits the graph.

How it works

Three steps. No migration.

01 DECLARE

Where the job lives

Annotate jobs in your own code. Dependencies and batches become versioned, reviewable config.

02 GOVERN

Validated before release

The control plane checks the graph — cycles, missing edges, orphaned jobs. Invalid orchestration fails review, not production.

03 OBSERVE

Why it ran, not just that

Every run traces back to a definition and a trigger. State, logs and timing in one place, live.

graph · payments-platformlive
ledger_closedone 41sfx_ratesdone 12srecon_batchdone 2m04fee_accrualdone 58snightly_settlementrunning · 00:47
run 8f21c · 02:00 EST
02:00:01 deps satisfied (2/2)
02:00:01 heartbeat · payments-01
02:00:47 settling 41,208 rows

Start with one job. Zero rewrites.

No credit card. No new runtime. Start with the job you check every morning.