Atlas / Skills / amontlabs / lcu

lcuBLOCK

skills/amontlabs/lcu

Codex computer use, decoupled from the app, for usage inside any harness.

Verdict
BLOCK
Grade
F
Trust score
50 /100
Version
—
Hosts
6 documented
License
MIT
Stars
1,020
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

LCU

Codex computer use, decoupled from the Codex app.

https://github.com/user-attachments/assets/bd9d0809-8a6c-4931-a51c-b98daf05cb5f

LCU exposes Codex's original computer-use runtime to your harness without requiring Codex authentication. The official ChatGPT desktop app must still be installed locally: it supplies the runtime and instructions, while LCU handles setup and harness integration.

Quick start

Copy this into your agent:

Install and configure LCU for this harness using the latest release.
Follow https://raw.githubusercontent.com/amontlabs/lcu/main/docs/INSTALLATION.md
Check my OS, architecture, and prerequisites, then guide me through any required permissions.

In Claude Code on an Apple Silicon Mac, two commands do the same through its plugin manager; see Claude Code plugin:

claude plugin marketplace add amontlabs/lcu
claude plugin install lcu@lcu

Features

  • Desktop apps: read windows, click, type, and take screenshots.
  • Chrome, when enabled: read and control tabs through the official extension, with site approval.
  • In your harness: adapters are available for Pi, Codex CLI, and Claude Code, with experimental Oh My Pi and Hermes integrations. See setup and verification limits.

Approve apps from Claude, natively

The first time an agent controls an app (Zed, Notes, Safari), the computer-use runtime asks you to allow it. The Claude app's Code tab used to fail that request with "Computer Use was not approved". lcu setup --agent claude-code now installs a small Claude Code mod, lcu-approve, that shows the question as a native Computer use approval pane in the Claude app, and in the terminal.

Read from source at commit c2e0c1228aadOBSERVED · 2026-10-12
02

Install

Commands as the repository documents them. They are shown, not run.

claude plugin install lcu@lcu
npm install -g @openai/codex@latest
git clone https://github.com/amontlabs/lcu.git
claude plugin install lcu@lcu
03

Host compatibility

What the documentation claims. We have not run a compatibility test.

HostStatusNotes
claude-codementioned
claude-desktopmentioned
codexmentioned
copilotmentioned
cursormentioned
windsurfmentioned
04

Trust audit

BLOCKgrade F · trust 50/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (9 observation(s))
Network
declared (8 observation(s))
Shell
declared (1 observation(s))
Dependencies
pinned
Secrets in source
none-found

Findings (25)

HIGHPrivilege escalation / persistence · priv.escalate · CWE-269, CWE-250
lcu/setup.mjs:987
process.setgid(account.gid);
Why it matters. asks for elevated privileges
HIGHPrivilege escalation / persistence · priv.escalate · CWE-269, CWE-250
lcu/setup.mjs:988
process.setuid(account.uid);
Why it matters. asks for elevated privileges
HIGHPrivilege escalation / persistence · priv.escalate · CWE-269, CWE-250
lcu/update_apply.mjs:269
deps.report('lcu update: running as root without SUDO_USER; run it as the desktop account through sudo or as that account.\n');
Why it matters. asks for elevated privileges
HIGHPrivilege escalation / persistence · priv.escalate · CWE-269, CWE-250
lcu/update_apply.mjs:275
`  sudo ${[...command, '--user', userInfo().username].map(quote).join(' ')}\nThen delete ${temporary}.\n`);
Why it matters. asks for elevated privileges
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
lcu/cross_turn.mjs:42
parsed = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(data).replace(/^/, ''));
MEDIUMInventory / provenance · skill.no_skill_md · CWE-1104
Why it matters. no SKILL.md at the audited path
Fix. a skill without its instruction file cannot be reviewed as one
LOWInventory / provenance · inv.hidden_file · CWE-1104
site/.vercelignore
.vercelignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.suspicious_name · CWE-1104
docs/verification/full-payload-development-2026-09-22.json
full-payload-development-2026-09-22.json
Why it matters. member named after an attack tool
Fix. remove or justify
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tests/node/windows_host.test.mjs:237
assert.throws(() => analyze(NODE, { op: 'host', source: 'function (' }), /does not parse/);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tests/x11_fixture.py:12
display = function('XOpenDisplay', [c.c_char_p], pointer)(None)
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tests/x11_fixture.py:14
screen = function('XDefaultScreen', [pointer], integer)(display)
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tests/x11_fixture.py:15
root = function('XRootWindow', [pointer, integer], ulong)(display, screen)
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tests/x11_fixture.py:16
window = function('XCreateSimpleWindow', [pointer, ulong, integer, integer, c.c_uint, c.c_uint, c.c_uint, ulong, ulong], ulong)(display, root, 600, 400, 240, 160, 1, 0, 0xeeeeee)
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWFilesystem / path · fs.system_paths · CWE-22, CWE-59
tests/node/update_apply.test.mjs:114
'absolute link': [[`${top}/link`, { symlink: '/etc/passwd' }]],
LOWFilesystem / path · fs.system_paths · CWE-22, CWE-59
tests/pending_registration.py:51
shutil.copy('/usr/local/bin/pi', home / '.local/bin/pi')
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
adapters/pi/index.ts:12
import { cacheDirectory, checkOnce, readRecord, writeRecord } from '../../lcu/check_record.mjs';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
adapters/pi/index.ts:13
import { tryAcquire } from '../../lcu/lock.mjs';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
adapters/pi/index.ts:35
const runtime = fileURLToPath(new URL('../../bin/lcu', import.meta.url));
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
adapters/pi/index.ts:38
const session = fileURLToPath(new URL('../../bin/lcu-session', import.meta.url));
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
adapters/test/linux-sky-service.test.mjs:12
import * as wrapper from '../../lcu/linux_sky_service.mjs';
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
adapters/test/client.test.mjs:204
[[], 'cancel'], [['http://127.0.0.1:8080'], 'accept'],
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
adapters/test/client.test.mjs:221
assert.equal(seen[0]._meta.origin, 'http://127.0.0.1:8080');
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
adapters/test/client.test.mjs:223
assert.throws(() => createCuaClient({ command, allowedOrigins: ['http://127.0.0.1:8080/'] }), /exact HTTP/);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
adapters/test/hermes-mcp-fixture.mjs:40
tool_name: 'access_browser_origin', origin: 'http://127.0.0.1:8080', persist: 'always' } : native ? {
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
adapters/test/mcp-fixture.mjs:146
? 'http://127.0.0.1.attacker.invalid:8080' : 'http://127.0.0.1:8080';

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha c2e0c1228aadfull audit observations/trust-audit/skill/amontlabs__lcu.json · Report an issue / request a re-scan
05

Audit history

Every audit this skill has had.

DateSourceVerdictGradeScoreChange
2026-10-12c2e0c1228aadBLOCKF50first audit
06

Questions

What does the lcu skill do?

Codex computer use, decoupled from the app, for usage inside any harness.

Is lcu safe to install?

No — not without reading the findings first. The audit graded it F (50/100) and found 4 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What can lcu access on my machine?

The audit observed that it reaches the network, runs shell commands and reads or writes files. Each of those is consistent with what it says it does. Secrets in the source: none found.

Which assistants does lcu work with?

Its documentation mentions claude-code, claude-desktop, codex, copilot, cursor and windsurf. That is what the text claims, not a compatibility test we ran.

How current is this page?

The grade is for one exact copy of the source (c2e0c1228aad), read on 2026-10-12. The repository is watched, and a new audit runs when it changes — this is the first audit.

Advertisement