DBDelve
Dive deep into your data. A fast, native, multi-engine database client written in Rust. Free and open source, no telemetry.
Give Claude Code, Codex or Cursor a browser on your Mac that stays signed in, so it runs your socials, news and work accounts. Free and open source.
Developer toolsTypeScript · JavaScriptGitHub @openwork-africaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
A Firefox that stays signed in, in a small Linux VM on your Mac, that you and your agents can drive.
Loading the full README.
Read the full README ↗A Firefox that stays signed in, in a small Linux VM on your Mac, that you and your agents can drive. worklyn.com/computer
screenshot, click, type, key, tabs and more, from the command line or TypeScript.Each computer is its own lightweight VM (Apple's container), not a process
sharing your Mac.
You need a Mac with Apple silicon (an M1 or later: → About This Mac shows "Chip: Apple M…") on macOS 26 or later.
Install Apple's container. On its releases page, download
container-<version>-installer-signed.pkg and open it.
Open Terminal (⌘Space, type Terminal) and paste:
curl -fsSL https://github.com/openwork-africa/computer/releases/latest/download/install.sh | sh
It installs the computer command. If it says the folder is not on your PATH, paste the line it prints, too.
Run the same install line again any time to update.
computer serve
The ⓘ button lists your computers and recordings. A computer uses up to 2 GB of memory while it runs and none while saved.
Paste this to your agent (Claude Code, Codex, Cursor or any agent that can run commands and view images):
Add the Computer skill: download
https://raw.githubusercontent.com/openwork-africa/computer/main/skills/computer/SKILL.md
and save it as ~/.claude/skills/computer/SKILL.md (or wherever your skills or rules live). Then read it, and use
my Computer whenever I ask you to do something on a website as me.
The skill teaches the loop: look, act, look again.
computer list # each line: <id> <state> <label>; one must be "running"
computer screenshot /tmp/screen.png # look: a 1024x640 PNG; its pixels are click coordinates
computer click 512 300 # act
computer type "hello" # into whatever is focused (click the field first)
computer key enter # also: escape, tab, ctrl+l, pagedown, ctrl+shift+t…
computer open https://example.com # go to an address (--new-tab for a new tab)
computer tabs # open tabs; * marks the one in front
computer tab mail # bring a tab forward by part of its title or address
computer title # the page's title, as text (also: computer url)
computer logs # the sites' console errors, when a page misbehaves
computer upload ~/Pictures/beach.jpg # into the computer's ~/Uploads, for a site's upload button
computer help # every command
The skill also says when to stop and ask: before passwords, payments, sending, or deleting. It also covers following a task someone recorded.
The same in TypeScript (src/sdk.ts) is below.
import { Computer } from "./src/sdk.ts"; // from a clone of this repo, run with Bun
const pc = await Computer.connect(); // the running one, or Computer.connect("computer-1234abcd")
await pc.open("https://example.com");
await pc.leftClick(512, 300);
await pc.write("hello");
await pc.press("enter");
await Bun.write("screen.png", await pc.screenshot());
await pc.switchTab("mail");
const file = await pc.upload("~/Pictures/beach.jpg"); // "/home/user/Uploads/beach.jpg", for the upload dialog
await pc.save(); // shut down, keeping sign-ins and tabs
| Computers | Computer.create(label?), Computer.connect(id?), Computer.list(), save(), resume(), kill() |
| Screen | screenshot(), getScreenSize(), getCursorPosition(), getWindowTitle() |
| Mouse | leftClick(x, y), doubleClick, rightClick, middleClick, moveMouse, drag(from, to), scroll(dir, n) |
| Keyboard | write(text), press("ctrl+l"), press(["ctrl", "shift", "t"]) |
| Browser | open(url, { newTab }), getUrl(), tabs(), switchTab(n | text), newTab, nextTab, prevTab, closeTab |
| Clipboard | getClipboard(), setClipboard(text), copy() |
| Files | upload(path | bytes, name?): into the shared uploads folder; returns the path inside the computer |
| Recording | record.start(), record.note(text), record.finish(name), record.status(), record.discard() |
Press Record in the page and do the task. Type a note whenever the reason matters ("only jobs from this week").
Then name it and press Finish. The recording is saved in ~/.openwork-computer/recordings/<name>/:
This is the beginning of the README. Read the rest at the original. Read the full README ↗