
Andrew Ng has announced OpenWorker, an open-source desktop agent that produces finished work rather than conversation. OpenWorker asks the user for an outcome, not a prompt: a polished document, a Slack reply containing the actual numbers, an updated calendar, a triaged inbox. It then breaks that outcome into steps, works across local files and connected apps, and checks in before anything consequential.
The architecture is four layers, and all of them run on your machine
The repository contains 119 Python files (~32,400 lines) under coworker/, 149 TypeScript/TSX files under surfaces/gui/, and 78 backend test modules.
The stack breaks down as follows:
- Desktop shell — a Tauri 2 native window wrapping a React 18 UI. The bundle identifier is
com.openworker.desktop, and the shell supervises the Python server itself. - Local agent server — Python 3.10+ on FastAPI and uvicorn, binding to
127.0.0.1:8765by default. The example config caps a turn at 12 model↔tool iterations. - Capability and connector layer — vetted local tools (files, git, ripgrep-backed search, shell, todo) plus hosted integrations plus MCP.
- Model router — one interface over native, OpenAI-compatible, reseller and local providers.
The engine is built on aisuite, Andrew Ng’s provider-agnostic LLM library.
‘+l.d+’
- ‘+l.u.map(function(u){return ‘
- ‘+u+’
‘}).join(”)+’
‘;
d.addEventListener(‘click’,function(){var was=d.classList.contains(‘on’);lay.querySelectorAll(‘.layer’).forEach(function(x){x.classList.remove(‘on’)});if(!was)d.classList.add(‘on’);sz();});
lay.appendChild(d);});
function facet(items,idx,chipEl,rowEl,render){
var cats=[];items.forEach(function(it){if(cats.indexOf(it[idx])<0)cats.push(it[idx])});
var sel=”All”;
function chips(){chipEl.innerHTML=”;[‘All’].concat(cats).forEach(function(c){
var n=c===’All’?items.length:items.filter(function(i){return i[idx]===c}).length;
var b=document.createElement(‘button’);b.className=”chip”+(c===sel?’ on’:”);
b.innerHTML=c+’‘+n+’‘;
b.addEventListener(‘click’,function(){sel=c;chips();rows();sz();});chipEl.appendChild(b);});}
function rows(){rowEl.innerHTML=”;items.filter(function(i){return sel===’All’||i[idx]===sel}).forEach(function(i){
var d=document.createElement(‘div’);d.className=”row”;d.innerHTML=render(i);rowEl.appendChild(d);});}
chips();rows();}
facet(MODELS,0,document.getElementById(‘mchips’),document.getElementById(‘mrows’),function(m){
return ‘‘+(m[3]?’Vision + PDF’:’Tools only’)+’‘;});
facet(CONN,0,document.getElementById(‘cchips’),document.getElementById(‘crows’),function(c){
return ‘
‘+c[1]+’
‘+c[0]+’‘;});
var mxb=document.getElementById(‘mxb’);
MX.forEach(function(r){var tr=document.createElement(‘tr’);
tr.innerHTML=’
'+r[0]+'‘+r.slice(1).map(function(c){return ‘
‘}).join(”);
mxb.appendChild(tr);});
function sz(){try{parent.postMessage({owEmbed:’ow1′,height:R.offsetHeight+40},’*’)}catch(e){}}
if(window.ResizeObserver)new ResizeObserver(sz).observe(R);
window.addEventListener(‘load’,sz);setTimeout(sz,120);sz();
})();







