
Research
/Security News
Mini Shai-Hulud Campaign Hits Red Hat Cloud Services npm Packages
A mini Shai-Hulud campaign compromised Red Hat Cloud Services npm packages to steal developer and CI/CD secrets during installation.
@jackwener/opencli
Advanced tools
Convert any website into a CLI & run Browser Use on your logged-in Chrome. Turn websites, browser sessions, Electron apps, and local tools into deterministic interfaces for humans and AI agents. Or run Browser Use against any page — navigate, fill forms, click, extract, automate.
OpenCLI gives you one surface for three different kinds of automation:
opencli-browser skill in your AI agent (Claude Code, Cursor, etc.), and it can navigate, click, type/fill, extract, and inspect any page through your logged-in browser via opencli browser primitives.opencli browser + the opencli-adapter-author skill, which guides from first recon through field decoding, code, and opencli browser verify.It also works as a CLI hub for local tools such as gh, docker, longbridge, tg, discord, wx, ntn (Notion), and other binaries you register yourself, plus desktop app adapters for Electron apps like Cursor, Codex, Antigravity, and ChatGPT.
OpenCLI requires Node.js >= 21.
node --version
npm install -g @jackwener/opencli
OpenCLI connects to Chrome/Chromium through a lightweight Browser Bridge extension plus a small local daemon. The daemon auto-starts when needed.
Option A — Chrome Web Store (recommended): Install OpenCLI from the Chrome Web Store.
Option B — Manual install:
opencli-extension-v{version}.zip from the GitHub Releases page.chrome://extensions, and enable Developer mode.opencli doctor
Each Chrome profile runs its own OpenCLI extension instance. If you use multiple Chrome profiles, list the connected profiles and assign local aliases:
opencli profile list
opencli profile rename <contextId> work
opencli profile use work
opencli --profile work browser state
With only one connected profile, OpenCLI uses it automatically. With multiple connected profiles and no default, OpenCLI asks you to choose instead of guessing.
opencli list
opencli hackernews top --limit 5
opencli bilibili hot --limit 5
Use OpenCLI directly when you want a reliable command instead of a live browser session:
opencli list shows every registered command.opencli <site> <command> runs a built-in or generated adapter.opencli external register mycli exposes a local CLI through the same discovery surface.opencli doctor helps diagnose browser connectivity.If you want to add your own commands, start with the Extending OpenCLI guide. README keeps this short; the guide covers the directory layout, source-control model, and install commands.
| Need | Recommended path |
|---|---|
| Keep personal website commands in your own Git repo | opencli plugin create + opencli plugin install file://... |
| Quickly draft a private local adapter | opencli browser init <site>/<command> in ~/.opencli/clis/ |
| Modify an official adapter locally | opencli adapter eject <site> + opencli adapter reset <site> |
| Publish or install third-party commands | opencli plugin install github:user/repo |
| Wrap an existing local binary | opencli external register <name> |
OpenCLI's browser commands are designed to be used by AI Agents — not run manually. Install skills into your AI agent (Claude Code, Cursor, etc.), and the agent operates websites on your behalf using your logged-in Chrome session.
npx skills add jackwener/opencli
Or install only what you need:
npx skills add jackwener/opencli --skill opencli-adapter-author
npx skills add jackwener/opencli --skill opencli-autofix
npx skills add jackwener/opencli --skill opencli-browser
npx skills add jackwener/opencli --skill opencli-usage
| Skill | When to use | Example prompt to your AI agent |
|---|---|---|
| opencli-adapter-author | Write a reusable adapter for a new site or add a command to an existing site | "Write an adapter for douyin trending" / "Make a command that grabs the top posts from this page" |
| opencli-autofix | Repair a broken adapter when a built-in command fails | "opencli zhihu hot is returning empty — fix it" |
| opencli-browser | Drive a real Chrome page ad-hoc — navigate, fill forms, click, extract | "Help me check my Xiaohongshu notifications" / "Help me fill out this form" / "Use browser commands to scrape this page" |
| opencli-usage | Quick reference for all OpenCLI commands and sites | "What commands does OpenCLI have for Twitter?" |
Once opencli-browser is installed, your AI agent can:
The agent handles all the opencli browser commands internally — you just describe what you want done in natural language.
Skill references:
skills/opencli-browser/SKILL.md — drive Chrome ad-hoc (navigate, fill forms, click, extract)skills/opencli-adapter-author/SKILL.md — write a new adapter end-to-endskills/opencli-autofix/SKILL.md — repair broken adaptersskills/opencli-usage/SKILL.md — command and site referenceAvailable browser commands include open, state, click, type, fill, select, keys, wait, get, find, extract, frames, screenshot, scroll, back, eval, network, tab list, tab new, tab select, tab close, init, verify, and close.
opencli browser commands require a <session> positional immediately after browser. opencli browser work open <url> and opencli browser work tab new [url] both return a target ID. Use opencli browser work tab list to inspect target IDs, then pass --tab <targetId> to route a command to a specific tab. tab new creates a new tab without changing the default browser target; only tab select <targetId> promotes that tab to the default target for later untargeted commands in the same session.
When the site you need is not yet covered, use the opencli-adapter-author skill end-to-end:
PUBLIC / COOKIE / INTERCEPT / UI / LOCAL.opencli browser recon analyze <url> → opencli browser recon init <site>/<name> → write adapter → opencli browser recon verify <site>/<name>.~/.opencli/sites/<site>/ so the next adapter for the same site starts from context.Important: Browser-backed commands reuse your Chrome/Chromium login session. If you get empty data or permission-like failures, first confirm the site is already open and authenticated in Chrome/Chromium.
| Variable | Default | Description |
|---|---|---|
OPENCLI_DAEMON_PORT | 19825 | HTTP port for the daemon-extension bridge |
OPENCLI_PROFILE | — | Browser Bridge profile alias/contextId to use when multiple Chrome profiles are connected |
OPENCLI_WINDOW | command default | Set to foreground or background to override Browser Bridge window placement. Browser-backed commands also accept --window <foreground|background>. |
OPENCLI_BROWSER_CONNECT_TIMEOUT | 30 | Seconds to wait for browser connection |
OPENCLI_BROWSER_COMMAND_TIMEOUT | 60 | Seconds to wait for a single browser command |
OPENCLI_CDP_ENDPOINT | — | Chrome DevTools Protocol endpoint for remote browser or Electron apps |
OPENCLI_CDP_TARGET | — | Filter CDP targets by URL substring (e.g. detail.1688.com) |
OPENCLI_VERBOSE | false | Enable verbose logging (-v flag also works) |
DEBUG_SNAPSHOT | — | Set to 1 for DOM snapshot debug output |
opencli browser * requires an explicit <session> positional, uses a foreground browser window by default, and keeps that session's tab lease until opencli browser <session> close or idle cleanup. Browser-backed adapters use a background adapter window and release one-shot tab leases by default. Interactive adapters can declare siteSession: 'persistent' to keep a stable site tab for continuity; pass --site-session ephemeral for a one-shot tab.
Install from source:
git clone git@github.com:jackwener/opencli.git
cd opencli
npm install
npm run build
npm link
To load the source Browser Bridge extension:
chrome://extensions and enable Developer mode.extension/ directory.| Site | Commands |
|---|---|
| xiaohongshu | search note comments feed user download publish notifications creator-notes creator-notes-summary creator-note-detail creator-profile creator-stats |
| bilibili | hot search history feed ranking download comments dynamic favorite following me subtitle summary video user-videos |
| zhihu | hot search question download follow like favorite comment answer |
| hackernews | top new best ask show jobs search user |
connect inbox safe-send search sent-invitations thread-snapshot timeline salesnav-search salesnav-inbox salesnav-message salesnav-thread | |
hot frontpage popular search subreddit read user user-posts user-comments upvote upvoted save saved comment subscribe | |
trending search timeline tweets lists list-tweets list-add list-remove bookmarks post download profile article like likes notifications reply reply-dm thread follow unfollow followers following block unblock bookmark unbookmark delete hide-reply accept | |
| claude | ask send new status read history detail |
| gemini | new ask image deep-research deep-research-result |
| notebooklm | status list open current get history summary note-list notes-get source-list source-get source-fulltext source-guide |
| amazon | bestsellers search product offer discussion movers-shakers new-releases rankings |
Curated highlights — → see all 100+ supported sites & commands (douyin / weibo / spotify / 1688 / quark / nowcoder / google-scholar / hupu / xianyu / weread / weread-official / xiaoyuzhou / and more).
Unified passthrough for your existing command-line tools. Run opencli <tool> ... for any of:
gh · docker · vercel · wrangler · ntn · obsidian · longbridge · lark-cli · dws · wecom-cli · tg · discord · wx
Register your own with opencli external register <name>; list everything with opencli external list.
Desktop app adapters (Electron, via CDP): Cursor / Codex / Antigravity / ChatGPT App / ChatWise / Discord / Doubao — see docs/adapters/desktop/.
OpenCLI supports downloading images, videos, and articles from supported platforms.
| Platform | Content Types | Notes |
|---|---|---|
| xiaohongshu | Images, Videos | Downloads all media from a note |
| rednote | Images, Videos | Downloads all media from a signed rednote note URL |
| bilibili | Videos | Requires yt-dlp installed |
| Images, Videos | From user media tab or single tweet | |
| douban | Images | Poster / still image lists |
| pixiv | Images | Original-quality illustrations, multi-page |
| 1688 | Images, Videos | Downloads page-visible product media from item pages |
| xiaoyuzhou | Audio, Transcript | Downloads episode audio and transcript JSON/text with local credentials |
| zhihu | Articles (Markdown) | Exports with optional image download |
| weixin | Articles (Markdown) | WeChat Official Account articles |
For video downloads, install yt-dlp first: brew install yt-dlp
opencli xiaohongshu download "https://www.xiaohongshu.com/search_result/<id>?xsec_token=..." --output ./xhs
opencli xiaohongshu download "https://xhslink.com/..." --output ./xhs
opencli rednote download "https://www.rednote.com/search_result/<id>?xsec_token=..." --output ./rednote
opencli bilibili download BV1xxx --output ./bilibili
opencli twitter download elonmusk --limit 20 --output ./twitter
opencli 1688 download 841141931191 --output ./1688-downloads
opencli xiaoyuzhou download 69b3b675772ac2295bfc01d0 --output ./xiaoyuzhou
opencli xiaoyuzhou transcript 69dd0c98e2c8be31551f6a33 --output ./xiaoyuzhou-transcripts
opencli xiaoyuzhou download and transcript require local Xiaoyuzhou credentials in ~/.opencli/xiaoyuzhou.json.
All built-in commands support --format / -f with table (default), json, yaml, md, and csv.
opencli bilibili hot -f json # Pipe to jq or LLMs
opencli bilibili hot -f csv # Spreadsheet-friendly
opencli bilibili hot -v # Verbose: show pipeline debug steps
opencli follows Unix sysexits.h conventions so it integrates naturally with shell pipelines and CI scripts:
| Code | Meaning | When |
|---|---|---|
0 | Success | Command completed normally |
1 | Generic error | Unexpected / unclassified failure |
2 | Usage error | Bad arguments or unknown command |
66 | Empty result | No data returned (EX_NOINPUT) |
69 | Service unavailable | Browser Bridge not connected (EX_UNAVAILABLE) |
75 | Temporary failure | Command timed out — retry (EX_TEMPFAIL) |
77 | Auth required | Not logged in to target site (EX_NOPERM) |
78 | Config error | Missing credentials or bad config (EX_CONFIG) |
130 | Interrupted | Ctrl-C / SIGINT |
opencli spotify status || echo "exit $?" # 69 if browser not running
opencli gh issue list 2>/dev/null
[ $? -eq 77 ] && opencli gh auth login # auto-auth if not logged in
Extend OpenCLI with community-contributed adapters:
opencli plugin install github:user/opencli-plugin-my-tool
opencli plugin list
opencli plugin update --all
opencli plugin uninstall my-tool
| Plugin | Type | Description |
|---|---|---|
| opencli-plugin-github-trending | JS | GitHub Trending repositories |
| opencli-plugin-hot-digest | JS | Multi-platform trending aggregator |
| opencli-plugin-juejin | JS | 稀土掘金 (Juejin) hot articles |
| opencli-plugin-vk | JS | VK (VKontakte) wall, feed, and search |
See Plugins Guide for creating your own plugin.
See TESTING.md for how to run and write tests.
chrome://extensions.fetch / startup crash on old Node — OpenCLI requires Node.js >= 21. Run node --version, upgrade Node if needed, then retry.curl localhost:19825/status · View logs: curl localhost:19825/logsFAQs
Make any website or Electron App your CLI. AI-powered.
The npm package @jackwener/opencli receives a total of 8,902 weekly downloads. As such, @jackwener/opencli popularity was classified as popular.
We found that @jackwener/opencli demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
A mini Shai-Hulud campaign compromised Red Hat Cloud Services npm packages to steal developer and CI/CD secrets during installation.

Research
/Security News
The North Korean malware loader hides in a Packagist-listed package and its GitHub branch to fetch and execute remote code in a likely Contagious Interview-style lure.

Security News
The Rust project is moving toward formal rules on LLM use in contributions after months of internal debate over maintainer burden, code quality, and contributor experience.