Thursday, October 22, 2026
banner
Top Selling Multipurpose WP Theme

Vercel has launched durable-harness, an open-source package deal that retains coding agent classes alive via crashes and timeouts. Vercel durable-harness wraps present harnesses, together with Pi, OpenCode, Claude Code and Codex, without changing them. Every session lives in a sturdy log. A lifeless operate now not means misplaced work. For groups shifting brokers off laptops and into the cloud, that closes an actual hole.

TL;DR

  • Measurement: npm package deal, model 0.0.x, Apache-2.0. Adapters cowl 5 harnesses: Pi, OpenCode, fx, Claude Code, Codex.
  • Runs on: Vercel Capabilities plus Vercel Queues, Node.js 22+ with Postgres, or laptop computer information. Claude Code and Codex want a Vercel Sandbox.
  • Efficiency: No latency or throughput benchmarks revealed. All restoration claims are self-reported by Vercel.
  • Greatest: Completed mannequin and power calls are learn again from the log, by no means re-run or billed twice.
  • Worst: Experimental 0.0.x API. Claude Code and Codex run solely in a Vercel Sandbox, even self-hosted.

What’s durable-harness?

durable-harness is a set of adapters from Vercel that retailer a harness session in a Workflow SDK World. A World bundles storage, a queue and a stream behind one interface. The package deal makes use of the identical equipment that powers Vercel’s Workflow SDK.

Why do coding brokers lose work within the cloud?

Harnesses like Pi and Claude Code had been designed as long-lived native processes. They hold the session in reminiscence. Domestically, the workspace and historical past sit on the identical disk, so resuming takes 1 immediate. Within the cloud, a VM with persistent storage doesn’t observe which calls accomplished. Vercel crew notes a failed flip or community error then means misplaced work.

How does durable-harness work?

It writes every step of a flip to a sturdy log. Earlier than a mannequin or software name runs, it information an intent. When the decision finishes, it information the result. Every flip is backed by a message on Vercel Queues. If the operate dies, the queue palms the flip to a brand new operate. That operate reads the log and continues.

After a crash, the log reveals what completed, what was operating and what by no means began:

  • Accomplished calls are learn from the log, so completed mannequin tokens aren’t billed once more.
  • replay: 'secure' instruments, corresponding to lookups, can run once more.
  • replay: 'by no means' instruments, corresponding to refunds, by no means run twice. The mannequin is advised the decision could have occurred.

Harness session information are mirrored into the log as effectively. That covers Claude Code’s transcript, Codex’s rollout and OpenCode’s occasion retailer.

The place do information and shell instructions run?

Mannequin-chosen instructions by no means run on the operate’s personal disk. The tools docs record 3 workspace choices:

  • digital() retains information within the session log, with a bash-compatible shell and no community. It holds about 500 information.
  • digital({ sturdy: false }) retains scratch information in reminiscence and clears them each flip.
  • sandbox() offers every session a Vercel Sandbox, with /workspace on a Drive.

Typed JSON paperwork, corresponding to a to-do record, additionally reside within the log. Every holds at most 64 KB.

<iframe id="mtp-dh-frame" title="Vercel durable-harness interactive explainer" type="width:100%;top:600px;border:0;show:block;background:clear;" scrolling="no" loading="lazy" srcdoc="<!doctype html>
<html lang="en"><head><meta charset="utf-8"><meta identify="viewport" content material="width=device-width,initial-scale=1">
<title>durable-harness explainer</title>
<type>
html,physique{margin:0!essential;padding:0!essential;background:clear!essential;}
#mtp-dh{–bg:#000;–card:#0a0a0a;–line:#262626;–mute:#a1a1a1;–txt:#ededed;–blue:#0070f3;–ok:#50e3c2;–warn:#f5a623;–err:#ee0000;–mtp:#76B900;
max-width:880px;margin:0 auto;background:var(–bg)!essential;colour:var(–txt)!essential;border:1px stable var(–line)!essential;border-radius:14px;
font-family:Inter,-apple-system,"Segoe UI",Roboto,sans-serif;font-size:15px;line-height:1.5;overflow:hidden;box-sizing:border-box}
#mtp-dh *{box-sizing:border-box}
#mtp-dh hr,#mtp-dh p:empty,#mtp-dh del,#mtp-dh s{show:none!essential}
#mtp-dh .hd{padding:20px 24px 14px;border-bottom:1px stable var(–line)!essential;background:radial-gradient(600px 160px at 0% 0%,rgba(0,112,243,.18),clear)!essential}
#mtp-dh .tag{show:inline-flex;hole:6px;align-items:middle;font-size:12px;colour:var(–mute)!essential;letter-spacing:.04em;text-transform:uppercase}
#mtp-dh .tri{width:8px;top:8px;border-radius:50%;background:#0070f3!essential;box-shadow:0 0 8px #0070f3}
#mtp-dh h3{margin:6px 0 4px!essential;font-size:22px!essential;colour:#fff!essential;font-weight:700;letter-spacing:-.02em}
#mtp-dh .sub{colour:var(–mute)!essential;font-size:14px;margin:0}
#mtp-dh .tabs{show:flex;hole:4px;padding:10px 16px 0;border-bottom:1px stable var(–line)!essential;overflow-x:auto}
#mtp-dh .tab{background:clear!essential;colour:var(–mute)!essential;border:0!essential;border-bottom:2px stable clear!essential;padding:9px 12px;font:600 13px Inter,sans-serif;cursor:pointer;white-space:nowrap}
#mtp-dh .tab.on{colour:#fff!essential;border-bottom-color:#fff!essential}
#mtp-dh .pane{show:none;padding:20px 24px 22px;animation:dhfade .35s ease}
#mtp-dh .pane.on{show:block}
@keyframes dhfade{from{opacity:0;remodel:translateY(6px)}to{opacity:1;remodel:none}}
#mtp-dh .cols{show:grid;grid-template-columns:1fr 1fr;hole:14px}
#mtp-dh .field{background:var(–card)!essential;border:1px stable var(–line)!essential;border-radius:10px;padding:14px}
#mtp-dh .field h4{margin:0 0 10px!essential;font-size:13px!essential;colour:#fff!essential;show:flex;justify-content:space-between;align-items:middle}
#mtp-dh .tablet{font-size:11px;padding:2px 8px;border-radius:99px;border:1px stable var(–line)!essential;colour:var(–mute)!essential;font-weight:600}
#mtp-dh ol.steps{list-style:none;margin:0;padding:0}
#mtp-dh ol.steps li{show:flex;hole:8px;align-items:middle;padding:6px 8px;border-radius:6px;font-size:13px;colour:var(–mute)!essential;transition:all .3s}
#mtp-dh ol.steps li .ok{font:600 11px ui-monospace,Menlo,monospace;width:46px;colour:#888!essential}
#mtp-dh ol.steps li.run{background:rgba(0,112,243,.15)!essential;colour:#fff!essential}
#mtp-dh ol.steps li.executed{colour:#fff!essential}
#mtp-dh ol.steps li.executed::after{content material:"2713";margin-left:auto;colour:var(–ok)!essential}
#mtp-dh ol.steps li.rerun::after{content material:"ran twice";margin-left:auto;colour:var(–err)!essential;font-size:11px;font-weight:600}
#mtp-dh ol.steps li.fromlog::after{content material:"from log";margin-left:auto;colour:var(–ok)!essential;font-size:11px;font-weight:600}
#mtp-dh ol.steps li.lifeless{background:rgba(238,0,0,.12)!essential;colour:#ff6b6b!essential}
#mtp-dh .stat{show:flex;justify-content:space-between;font-size:12px;colour:var(–mute)!essential;margin-top:10px;border-top:1px dashed var(–line)!essential;padding-top:8px}
#mtp-dh .stat b{colour:#fff!essential}
#mtp-dh .btns{show:flex;hole:8px;flex-wrap:wrap;margin:14px 0 4px}
#mtp-dh button.b{background:#fff!essential;colour:#000!essential;border:0!essential;border-radius:8px;padding:8px 14px;font:600 13px Inter,sans-serif;cursor:pointer}
#mtp-dh button.b.ghost{background:clear!essential;colour:#fff!essential;border:1px stable var(–line)!essential}
#mtp-dh button.b.crimson{background:var(–err)!essential;colour:#fff!essential}
#mtp-dh button.b:disabled{opacity:.4;cursor:not-allowed}
#mtp-dh .be aware{font-size:12.5px;colour:var(–mute)!essential;margin-top:10px}
#mtp-dh .log{font:12px/1.6 ui-monospace,Menlo,monospace;background:#050505!essential;border:1px stable var(–line)!essential;border-radius:8px;padding:10px;top:150px;overflow:hidden;margin-top:12px}
#mtp-dh .log div{animation:dhfade .3s ease;colour:#bbb!essential}
#mtp-dh .log .i{colour:var(–warn)!essential}#mtp-dh .log .o{colour:var(–ok)!essential}#mtp-dh .log .x{colour:#ff6b6b!essential}
#mtp-dh .guidelines{show:grid;grid-template-columns:1fr 1fr;hole:14px}
#mtp-dh .software{cursor:pointer;transition:border-color .2s}
#mtp-dh .software:hover,#mtp-dh .software.sel{border-color:#fff!essential}
#mtp-dh code,#mtp-dh pre{font-family:ui-monospace,Menlo,monospace!essential;background:#111!essential;colour:#ededed!essential;border:1px stable var(–line)!essential;border-radius:5px;padding:1px 5px;font-size:12px}
#mtp-dh pre{padding:10px 12px;white-space:pre-wrap;margin:10px 0 0;line-height:1.55}
#mtp-dh .verdict{margin-top:14px;padding:12px;border-radius:8px;border:1px stable var(–line)!essential;background:var(–card)!essential;font-size:13.5px;min-height:60px}
#mtp-dh .ws{show:grid;grid-template-columns:repeat(3,1fr);hole:12px}
#mtp-dh .ws .field{cursor:pointer}
#mtp-dh .ws .field.sel{border-color:var(–blue)!essential;box-shadow:0 0 0 1px var(–blue)}
#mtp-dh .meter{top:8px;background:#1a1a1a!essential;border-radius:99px;overflow:hidden;margin:6px 0 2px}
#mtp-dh .meter i{show:block;top:100%;width:0;background:var(–blue)!essential;transition:width .9s cubic-bezier(.2,.8,.2,1)}
#mtp-dh .ml{font-size:11px;colour:var(–mute)!essential;show:flex;justify-content:space-between}
#mtp-dh desk{width:100%;border-collapse:collapse;font-size:12.5px}
#mtp-dh th,#mtp-dh td{border-bottom:1px stable var(–line)!essential;padding:8px 6px;text-align:left;vertical-align:high;colour:var(–txt)!essential;background:clear!essential}
#mtp-dh th{colour:var(–mute)!essential;font-weight:600}
#mtp-dh td.y{colour:var(–ok)!essential}#mtp-dh td.n{colour:#888!essential}
#mtp-dh .worlds{show:flex;hole:10px;flex-wrap:wrap}
#mtp-dh .world{flex:1;min-width:150px;cursor:pointer}
#mtp-dh .world.sel{border-color:#fff!essential}
#mtp-dh .ft{show:flex;justify-content:space-between;align-items:middle;padding:10px 24px;border-top:1px stable var(–line)!essential;font-size:11.5px;colour:#777!essential}
#mtp-dh .ft b{colour:var(–mtp)!essential;font-weight:700}
#mtp-dh a{colour:#fff!essential;text-decoration:underline}
@media (max-width:640px){
#mtp-dh .cols,#mtp-dh .guidelines,#mtp-dh .ws{grid-template-columns:1fr}
#mtp-dh .hd,#mtp-dh .pane{padding-left:16px;padding-right:16px}
#mtp-dh h3{font-size:19px!essential}
#mtp-dh .ft{flex-direction:column;hole:4px;align-items:flex-start;padding:10px 16px}
#mtp-dh desk{font-size:11.5px}
}
</type></head><physique>
<div id="mtp-dh">
<div class="hd">
<div class="tag"><span class="tri"></span> Vercel · durable-harness · v0.0.x</div>
<h3>How durable-harness retains agent turns alive</h3>
<p class="sub">Each mannequin and power name goes right into a sturdy log. A crashed flip resumes on a brand new operate.</p>
</div>
<div class="tabs" function="tablist">
<button class="tab on" data-t="p1">Crash demo</button>
<button class="tab" data-t="p2">Replay guidelines</button>
<button class="tab" data-t="p3">Workspaces</button>
<button class="tab" data-t="p4">The place it runs</button>
<button class="tab" data-t="p5">Harnesses</button>
</div>

<div class="pane on" id="p1">
<div class="cols">
<div class="field"><h4>With out sturdiness <span class="tablet">state in reminiscence</span></h4>
<ol class="steps" id="sA"></ol>
<div class="stat"><span>Steps run twice <b id="aRe">0</b></span><span>Mannequin calls <b id="aMc">0</b></span></div>
</div>
<div class="field"><h4>With durable-harness <span class="tablet">state in log</span></h4>
<ol class="steps" id="sB"></ol>
<div class="stat"><span>Steps run twice <b id="bRe">0</b></span><span>Mannequin calls <b id="bMc">0</b></span></div>
</div>
</div>
<div class="btns">
<button class="b" id="go"> Run flip</button>
<button class="b crimson" id="kill" disabled>Kill operate</button>
<button class="b ghost" id="rst">Reset</button>
</div>
<div class="log" id="lg"><div>Press Run flip, then kill the operate whereas CI is operating.</div></div>
<p class="be aware">State of affairs from Vercel’s submit: an agent provides a pricing web page, opens a PR, and waits for CI. Illustrative simulation, not a benchmark.</p>
</div>

<div class="pane" id="p2">
<p class="sub" type="margin-bottom:12px">Click on a software, then crash it mid-call.</p>
<div class="guidelines">
<div class="field software sel" data-r="secure"><h4><code>get_order</code><span class="tablet">replay: ‘secure'</span></h4><span class="be aware">A lookup. Secure to repeat after a crash.</span></div>
<div class="field software" data-r="by no means"><h4><code>refund_order</code><span class="tablet">replay: ‘by no means'</span></h4><span class="be aware">A refund. Mustn’t ever run twice.</span></div>
</div>
<div class="btns"><button class="b crimson" id="crash">Crash mid-call</button></div>
<div class="verdict" id="vd">Decide a software and press Crash mid-call.</div>
<pre id="code">{ identify: ‘get_order’, replay: ‘secure’, … }</pre>
</div>

<div class="pane" id="p3">
<div class="ws">
<div class="field sel" data-w="0"><h4><code>digital()</code></h4><span class="be aware">Recordsdata within the session log. Bash-compatible shell, no community.</span></div>
<div class="field" data-w="1"><h4><code>digital({sturdy:false})</code></h4><span class="be aware">In-memory scratch. Cleared each flip.</span></div>
<div class="field" data-w="2"><h4><code>sandbox()</code></h4><span class="be aware">Per-session Vercel Sandbox, <code>/workspace</code> on a Drive.</span></div>
</div>
<div class="field" type="margin-top:14px" id="wsd"></div>
</div>

<div class="pane" id="p4">
<div class="worlds">
<div class="field world sel" data-g="0"><h4>Vercel</h4><span class="be aware">Vercel World + Agent Runs traces</span></div>
<div class="field world" data-g="1"><h4>Laptop computer</h4><span class="be aware">Native information, zero config</span></div>
<div class="field world" data-g="2"><h4>Self-host</h4><span class="be aware">Postgres World, Node.js 22+</span></div>
</div>
<pre id="wc"></pre>
<p class="be aware" id="wn"></p>
</div>

<div class="pane" id="p5">
<desk>
<tr><th>Harness</th><th>Package deal</th><th>Runs in</th><th>Standing</th></tr>
<tr><td>Pi</td><td><code>durable-harness/pi-durable</code></td><td>Your operate + digital workspace or Sandbox</td><td class="y">Supported</td></tr>
<tr><td>OpenCode</td><td><code>durable-harness/opencode</code></td><td>Your operate + digital workspace or Sandbox</td><td class="y">Supported</td></tr>
<tr><td>fx</td><td><code>libfx</code></td><td>Sturdy by itself</td><td class="y">Supported</td></tr>
<tr><td>Claude Code</td><td><code>durable-harness/claude-code</code></td><td>Vercel Sandbox solely</td><td class="n">Experimental</td></tr>
<tr><td>Codex</td><td><code>durable-harness/codex</code></td><td>Vercel Sandbox solely</td><td class="n">Experimental</td></tr>
</desk>
<p class="be aware">Claude Code and Codex are single-user CLIs that hold state on disk, so every session will get its personal Sandbox.</p>
</div>

<div class="ft"><span>Supply: vercel.com/weblog/making-every-harness-durable · Vercel docs · Oct 2026</span><b>© Marktechpost</b></div>
</div>
<script>
(operate(){
var R=doc.getElementById(‘mtp-dh’);
operate $(s){return R.querySelector(s)}operate $$(s){return R.querySelectorAll(s)}
operate rz(){attempt{father or mother.postMessage({mtpEmbedHeight:R.offsetHeight+40,id:’mtp-dh’},’*’)}catch(e){}}
$$(‘.tab’).forEach(operate
var S=[[‘model’,’Plan the change’,1],[‘read’,’app/page.tsx’,0],[‘write’,’app/pricing/page.tsx’,0],[‘run’,’gh pr create’,0],[‘wait’,’CI checks on the PR’,0],[‘model’,’Reply with the result’,1]];
operate draw(id){var o=$(id);o.innerHTML=”;S.forEach(operate(s){var li=doc.createElement(‘li’);li.innerHTML='<span class="ok">’+s[0]+'</span>’+s[1];o.appendChild(li)})}
var i=0,tm=null,killed=false,ma=0,mb=0;
operate log(t,c)”;d.textContent=t;l.appendChild(d);whereas(l.youngsters.size>6)l.removeChild(l.firstChild)
operate reset(){clearTimeout(tm);i=0;killed=false;ma=mb=0;draw(‘#sA’);draw(‘#sB’);$(‘#aRe’).textContent=0;$(‘#bRe’).textContent=0;$(‘#aMc’).textContent=0;$(‘#bMc’).textContent=0;$(‘#go’).disabled=false;$(‘#kill’).disabled=true;$(‘#lg’).innerHTML='<div>Press Run flip, then kill the operate whereas CI is operating.</div>’}
operate li(id,n){return $(id).youngsters[n]}
operate step(){if(i>=S.size){$(‘#kill’).disabled=true;log(‘flip full’,’o’);return}
[‘#sA’,’#sB’].forEach(operate(id){var e=li(id,i);e.className=”run”});
log(‘intent ‘+S[i][0]+’ ‘+S[i][1],’i’);
tm=setTimeout(operate(){[‘#sA’,’#sB’].forEach(operate(id){li(id,i).className=”executed”});if(S[i][2]){ma++;mb++;$(‘#aMc’).textContent=ma;$(‘#bMc’).textContent=mb}log(‘consequence ‘+S[i][0]+’ okay’,’o’);i++;step()},i===4?1800:700)}
$(‘#go’).onclick=operate(){reset();$(‘#go’).disabled=true;$(‘#kill’).disabled=false;$(‘#lg’).innerHTML=”;step()};
$(‘#rst’).onclick=reset;
$(‘#kill’).onclick=operate(){if(i>=S.size)return;clearTimeout(tm);killed=true;$(‘#kill’).disabled=true;var ok=i;
li(‘#sA’,ok).className=”lifeless”;li(‘#sB’,ok).className=”lifeless”;log(‘operate 1 died at step ‘+(ok+1),’x’);
setTimeout(operate(){log(‘with out sturdiness: handbook restart, flip begins over’,’x’);
draw(‘#sA’);var re=0,j=0;(operate a(){if(j>=S.size){$(‘#aRe’).textContent=re;return}var e=li(‘#sA’,j);e.className=”run”;setTimeout(operate(){e.className=j<ok?’rerun’:’executed’;if(j<ok){re++;$(‘#aRe’).textContent=re}if(S[j][2]){ma++;$(‘#aMc’).textContent=ma}j++;a()},260)})();
log(‘with durable-harness: queue palms flip to operate 2′,’o’);
for(var q=0;q<ok;q++)li(‘#sB’,q).className=”fromlog”;
i=ok;(operate b(){if(i>=S.size){log(‘flip full, 0 steps repeated’,’o’);return}var e=li(‘#sB’,i);e.className=”run”;setTimeout(operate(){e.className=”executed”;if(S[i][2]){mb++;$(‘#bMc’).textContent=mb}i++;b()},450)})();
},600)};
reset();
var rule=”secure”;
$$(‘.software’).forEach(operate
$(‘#crash’).onclick=operate(){var v=$(‘#vd’);v.type.opacity=0;setTimeout(operate(){v.innerHTML=rule===’secure’?'<b type="colour:#50e3c2">Resumed:</b> the interrupted lookup can run once more. Pi reruns it; Claude Code, Codex and OpenCode inform the mannequin it’s secure to repeat.’:'<b type="colour:#f5a623">By no means re-run:</b> the mannequin is advised the refund could or could not have occurred, so it might probably test first. Each harness waits for the log to report a ‘by no means’ name earlier than it begins.’;v.type.transition=’opacity .3s’;v.type.opacity=1;rz()},150)};
var W=[{t:’Short tasks and small workspaces’,f:[‘Files kept’,’In the session log’],m:[[‘Workspace size’,’about 500 files’,55]],x:’A crash mid-call leaves nothing behind, and the decision runs once more. Value: operate CPU plus log occasions and storage.’},
{t:’Scratch work inside a flip’,f:[‘Files kept’,’Cleared every turn’],m:[[‘Persistence’,’none across turns’,8]],x:’Nothing goes to the log. The mannequin is advised information are cleared. Value: operate CPU solely.’},
{t:’Actual tasks and long-running work’,f:[‘Files kept’,’On a Drive that outlives every Sandbox’],m:[[‘Isolation’,’1 Sandbox per session’,100]],x:’A command a crash interrupts could have partly run, and the mannequin is advised. Value: Sandbox and Drive utilization, plus a begin on first use.’}];
var cur=0;operate ws(n){cur=n;var w=W[n];$(‘#wsd’).innerHTML='<h4>Greatest for: ‘+w.t+'</h4><div class="be aware">’+w.f[0]+’: <b type="colour:#fff">’+w.f[1]+'</b></div>’+w.m.map(operate(m){return ‘<div class="meter"><i></i></div><div class="ml"><span>’+m[0]+'</span><span>’+m[1]+'</span></div>’}).be part of(”)+'<p class="be aware">’+w.x+’ Typed JSON paperwork reside within the log too, as much as 64 KB every.</p>’;setTimeout(operate(){$$(‘#wsd .meter i’).forEach(operate(e){e.type.width=w.m[0][2]+’%’});rz()},40)}
$$(‘.ws .field’).forEach(operate(b){b.onclick=operate(){$$(‘.ws .field’).forEach(operate(x){x.classList.take away(‘sel’)});b.classList.add(‘sel’);ws(+b.dataset.w)}});ws(0);
var G=[["// On Vercel: @workflow/world-vercel is picked automaticallynimport { claudeCode } from ‘durable-harness/claude-code’nexport const agent = claudeCode({ model: ‘anthropic/claude-sonnet-5.5′ })",’Sessions show up in Agent Runs with each model and tool call. Resumed turns appear in the same trace.’],
["# Local dev: @workflow/world-local, no configurationn# sessions live in .workflow-data by defaultnnpm install durable-harness",’The local World suits development and a single server with a persistent disk.’],
["# Self-host: 2 variables move every agent to PostgresnWORKFLOW_TARGET_WORLD="@workflow/world-postgres"nWORKFLOW_POSTGRES_URL="postgres://user:password@host:5432/database"",’Needs @workflow/world-postgres 5.0.4+ and Node.js 22+. It is a reference implementation: no route auth, no encryption, not tuned for scale.’]];
operate wd(n){$(‘#wc’).textContent=G[n][0];$(‘#wn’).textContent=G[n][1];rz()}
$$(‘.world’).forEach(operate(b){b.onclick=operate(){$$(‘.world’).forEach(operate(x){x.classList.take away(‘sel’)});b.classList.add(‘sel’);wd(+b.dataset.g)}});wd(0);
window.addEventListener(‘load’,rz);window.addEventListener(‘resize’,rz);setTimeout(rz,300);
})();
</script>
</physique></html>
“>

window.addEventListener(‘message’,operate(e){if(e.knowledge&&e.knowledge.id===’mtp-dh’&&e.knowledge.mtpEmbedHeight){var f=doc.getElementById(‘mtp-dh-frame’);if(f){f.type.top=e.knowledge.mtpEmbedHeight+’px’;}}});

The place are you able to run durable-harness?

The agent code stays the identical throughout Worlds:

  • Vercel: the Vercel World, with each session traced in Agent Runs.
  • Native: information in your machine, with no configuration.
  • Self-hosted: the Postgres World, model 5.0.4 or later, on Node.js 22+. Vercel’s weblog additionally lists MongoDB, Redis and Turso.

2 atmosphere variables, WORKFLOW_TARGET_WORLD and WORKFLOW_POSTGRES_URL, transfer an agent to Postgres.

How does durable-harness evaluate?

Characteristic durable-harness Temporal + OpenAI Agents SDK Inngest AgentKit Cloudflare Agents SDK
What it’s Sturdiness adapters for present coding harnesses Sturdy execution wrapper for OpenAI Brokers SDK TypeScript multi-agent framework Stateful brokers on Sturdy Objects
Wraps Claude Code / Codex Sure, experimental, Sandbox-only Not disclosed Not disclosed Not disclosed
Sturdiness backend Workflow SDK World (Vercel, native, Postgres) Temporal server or Temporal Cloud Inngest orchestration engine Sturdy Objects, Cloudflare Workflows
Language TypeScript Python TypeScript TypeScript
License Apache-2.0 MIT (server) Apache-2.0 MIT
Standing 0.0.x, experimental GA since Mar 23, 2026 Not disclosed Not disclosed

Key Takeaways

  • durable-harness logs each mannequin and power name, then resumes crashed activates a brand new operate.
  • Completed calls are by no means repeated, so tokens aren’t billed twice.
  • Pi and OpenCode run in your operate; Claude Code and Codex want a Vercel Sandbox.
  • Self-hosting works with 2 env vars and a Postgres World.
  • It’s 0.0.x and experimental, with no revealed benchmarks.


Take a look at the GitHub repo, docs and Vercel’s announcement. All credit score goes to the researcher of this mission. Additionally, be happy to observe us on Twitter and don’t neglect to affix our 150k+ML SubReddit and Subscribe to our Newsletter. Wait! are you on telegram? now you can join us on telegram as well.

The submit Vercel Open-Sources durable-harness for Crash-Proof Coding Brokers appeared first on MarkTechPost.

banner
Top Selling Multipurpose WP Theme

Converter

Top Selling Multipurpose WP Theme

Newsletter

Subscribe my Newsletter for new blog posts, tips & new photos. Let's stay updated!

banner
Top Selling Multipurpose WP Theme

Leave a Comment

banner
Top Selling Multipurpose WP Theme

Latest

Best selling

22000,00 $
16000,00 $
6500,00 $

Top rated

6500,00 $
22000,00 $
900000,00 $

Products

Knowledge Unleashed
Knowledge Unleashed

Welcome to Ivugangingo!

At Ivugangingo, we're passionate about delivering insightful content that empowers and informs our readers across a spectrum of crucial topics. Whether you're delving into the world of insurance, navigating the complexities of cryptocurrency, or seeking wellness tips in health and fitness, we've got you covered.