Tutorial · getting started · GhostGet 0.19.0
Install GhostGet and read your first page
Give your agent local tools to read pages, save media, and use connected accounts. Start with one public-page read. No GhostGet account, API key, provider connection, or Markdown vault is needed.
This guide describes GhostGet v0.19.0.
What you need
A macOS or Linux computer, a terminal, and Bun 1.3.14. Check it with bun --version. GhostGet is free and MIT licensed. You can use it directly or with an agent that can run commands, such as Codex, Claude Code, or Cursor, after you check the agent’s network settings.
What GhostGet supports
- Platforms. macOS and Linux with Bun 1.3.14. Windows is not supported. Agent Skill installs also need
npxorbunx. - Sites. Any public page through
ghostget read, and named actions in 19 services: Beeper, Bluesky, ClasificadosOnline, Facebook, Facebook Groups, Facebook Marketplace, GitHub, Gmail, Hacker News, Instagram, iMessage, LinkedIn, Reddit, Substack, Threads, TikTok, Twitch, WhatsApp, and YouTube. The provider directory lists each action and what it needs; most need a connected account. - Local apps. Beeper actions need Beeper Desktop signed in on the same machine. iMessage, Apple Photos, and WhatsApp export run on macOS only; WhatsApp export needs an Apple silicon Mac and an already linked device.
- Agents. Codex, Claude Code, Cursor, and any agent that can run a terminal command or import the TypeScript SDK. GhostGet publishes no hosted API or MCP server; platforms that expose tools through MCP wrap the same commands.
1. Install GhostGet
- macOS
- Linux
- Windows via WSL2
macOS
bun add --global https://github.com/hraness/ghostget/releases/download/v0.19.0/hraness-ghostget-0.19.0.tgzLinux
bun add --global https://github.com/hraness/ghostget/releases/download/v0.19.0/hraness-ghostget-0.19.0.tgzWindows
bun add --global https://github.com/hraness/ghostget/releases/download/v0.19.0/hraness-ghostget-0.19.0.tgzThis installs the CLI from the exact published GitHub release. If your shell cannot find ghostget, open a new terminal or run export PATH="$(bun pm bin -g):$PATH".
Upgrading from Wrench? Follow the GhostGet migration guide to keep existing local state and recovery records in place.
2. Read a public page
ghostget read https://example.comSuccess prints Example Domain, source metadata, and the page as Markdown. read does not save the page. Replace the URL with a page you want your agent to use.
A plain public-page read needs no connected account, media downloader, transcription model, or control owner. Pages that require JavaScript or sign-in can need additional setup. GhostGet does not bypass login, payment, access controls, or DRM.
Use GhostGet with your agent
Add the optional Agent Skill to teach a compatible agent the commands and supported workflows:
npx skills add hraness/ghostget#v0.19.0With Bun, use bunx skills add hraness/ghostget#v0.19.0. Start a new agent session, then ask: “Use GhostGet to read https://example.com and summarize it.” The skill supplies instructions; the CLI you installed supplies the executable.
Run GhostGet from Codex, Claude Code, or Cursor
Your agent runs GhostGet as a terminal command, so the agent’s sandbox and command permissions decide whether a read reaches the web. Every page read needs network access. The Beeper actions also connect to Beeper Desktop at 127.0.0.1 on your computer.
Codex
Codex runs commands in a sandbox, and its default workspace-write mode has no network access. A read there fails with an error that includes http: could not resolve example.com. To turn on network access for one session, start Codex with this option:
codex -c 'sandbox_workspace_write.network_access=true'To keep it on, add a permission profile to ~/.codex/config.toml. Permission profiles are a beta Codex feature.
default_permissions = "ghostget"
[permissions.ghostget]
extends = ":workspace"
[permissions.ghostget.network]
enabled = trueLeave Codex’s network proxy, features.network_proxy, turned off. GhostGet looks up and checks each site’s address itself and doesn’t use proxy settings, so behind the proxy its reads fail with the same could not resolve error. Without the proxy, commands under this profile can also reach 127.0.0.1, where Beeper Desktop listens.
Codex reads either a permission profile or the older sandbox_mode and [sandbox_workspace_write] settings, not both. If network_access = true in config.toml changes nothing, look for a default_permissions line and turn on network access in that profile instead.
To leave network access off for other commands, let only ghostget read run outside the sandbox without asking. Add this rule to ~/.codex/rules/default.rules, then restart Codex; rules are an experimental Codex feature:
prefix_rule(pattern = ["ghostget", "read"], decision = "allow")Check how Codex applies the rule with codex execpolicy check --pretty --rules ~/.codex/rules/default.rules -- ghostget read https://example.com. Codex’s approvals and security guide, permission profiles reference, and rules guide cover these settings.
Status on October 4, 2026: with Codex CLI 0.160.0, the sandbox and network settings above were tried by running ghostget read https://example.com --mode http and a request to 127.0.0.1 under codex sandbox, and the rule was checked with codex execpolicy check. GhostGet was not run from a Codex agent session.
Claude Code
In Manual mode, Claude Code asks before it runs a shell command outside its built-in read-only set. Choose “Yes, and don’t ask again” to save the rule for the repository, or allow GhostGet reads for every project in ~/.claude/settings.json:
{
"permissions": {
"allow": ["Bash(ghostget read *)"]
}
}Claude Code’s sandbox is off by default; /sandbox or the sandbox.enabled setting turns it on. With it on, commands reach the network only through Claude Code’s proxy, which GhostGet doesn’t use, so its reads can’t reach the web. List GhostGet in excludedCommands so it runs outside the sandbox, where the permission prompts above still apply:
{
"sandbox": {
"excludedCommands": ["ghostget *"]
}
}See Claude Code’s permissions and sandboxing guides for the rule syntax.
Status on October 4, 2026: these settings follow Anthropic’s permissions and sandboxing guides. GhostGet was not run inside Claude Code with them.
Cursor
Cursor’s Run Mode, in Settings › Agents › Approvals & Execution, decides which agent commands run without asking and which run in Cursor’s sandbox. A sandboxed command reaches only the domains your network mode and sandbox.json allow, and the sandbox blocks private addresses such as 127.0.0.1 by default. In Auto-review mode, commands on your allowlist run outside the sandbox without asking, so add ghostget to it. Cursor’s Run Modes guide and sandbox.json reference cover the allowlist and network settings.
Status on October 4, 2026: these settings follow Cursor’s Run Modes guide and sandbox.json reference. GhostGet was not run inside Cursor with them.
Keep the CLI up to date
Supported global Bun and npm installs on macOS and Linux check for a stable release before ordinary commands, at most once a day. Install the GitHub CLI and authenticate it with gh auth login --hostname github.com so GhostGet can download verified release archives. For an older CLI without update, repeat the global CLI install command in this guide once. Run ghostget update to update immediately or ghostget update check --json to inspect the latest release.
Use ghostget update disable to turn automatic updates off, ghostget update enable to turn them on, and ghostget update status to inspect the setting. Exact version pins require enable before following new releases. Set HRANESS_NO_UPDATE=1 for a command that must use the installed version.
CI, nested clients, help, and gateway-only mode skip automatic checks. Manage source checkouts and project dependencies with their package manager. Refresh Agent Skill copies separately through the skill installer. Updating the CLI preserves your connected accounts and saved content.
Save and search pages
Choose a new directory for a local Markdown vault, then save your first page there:
ghostget init ./ghostget-notes
ghostget https://example.com --output ./ghostget-notes/articles
ghostget search "Example Domain" --root ./ghostget-notes --mode exactYour saved page and capture metadata stay in that directory. Exact search needs no embedding model. The Markdown vault stores documents; it is separate from account credentials. The capture and archives guide covers saving pages and downloading one accessible media item.
Connect one service
When you need a signed-in action, install this release’s bundled provider definitions and check the service you want:
ghostget adapter sync-bundled --json
ghostget capabilities
ghostget statuscapabilities lists installed adapters. Add an adapter ID, such as ghostget capabilities gmail, to see its operations and required inputs. Add --json when your agent needs the complete contracts.
On macOS, ghostget tui and ghostget connections can connect LinkedIn and Reddit browser sessions. Other providers and Linux account setup use the CLI instructions in the provider directory, including the focused guides for Beeper, WhatsApp, and Gmail. Some providers need their own local tool or OAuth client. Installing GhostGet does not connect any account automatically.
ghostget status shows accounts, pending approvals and saved outputs; add --json for your agent. See the control guide for the control owner, approvals, and credential import.
For keyboard controls, run ghostget tui. Press Tab to change sections, Enter to open actions, and ? for help. No Rust compiler or separate TUI install is needed.
Understand capability status
ghostget capabilities --json lists the actions installed on this machine. An action marked observed has a reviewed definition, but it still needs a connected account and the right local setup before it can run. An action marked capture-required can’t run until its definition is reviewed. The messaging.automation.* entries are permissions for the owner messaging host; you can’t run them with invoke or confirm.
If a workflow is unavailable
ghostget doctor
ghostget plugin doctor --jsonDoctor reports capture, media, provider setup, and durable recovery. It can also finish safe recovery of interrupted work. Install only the dependencies needed by your chosen workflow. Missing media tools or unconnected providers do not prevent a plain public-page read, and the overall provider-readiness result can be false on a fresh installation.
For an account error, check that the intended account is connected and the requested action is listed. For a capture error, try a public page first. If a read works in your terminal but fails with could not resolve when your agent runs it, give the agent’s sandbox network access. Keep indeterminate writes for reconciliation; do not repeat a send because its response was lost.
Watch one complete read
This historical 12-second demo typesets the output from a successful Wrench 0.13.5 run on August 25, 2026, before the project became GhostGet. The current command is ghostget read. It fetches the public page, prints Markdown, and does not add the result to a vault. The silent recording and transcript retain the original command.
Reuse the animated GIF or PNG preview. Both show the same successful public-page read.
Read the demo transcript
$ wrench read https://example.com
Capturing https://example.com/ (auto, auto) ...
---
title: "Example Domain"
source: "https://example.com/"
clipped: "2026-08-25"
platform: "generic"
capture_status: "complete"
capture_method: "http"
capture_scope: "page"
---
# Example Domain
This domain is for use in documentation examples without needing permission. Avoid use in operations.
[Learn more](https://iana.org/domains/example)Use GhostGet from TypeScript
Applications can pin the same release and import its side-effect-free package entrypoints:
bun add https://github.com/hraness/ghostget/releases/download/v0.19.0/hraness-ghostget-0.19.0.tgzimport {
isProviderPluginId,
type ProviderPluginDefinitionV1,
} from "@hraness/ghostget"
if (!isProviderPluginId(candidate.id)) {
throw new Error("invalid plugin ID")
}
const plugin = candidate satisfies ProviderPluginDefinitionV1The package has eleven public TypeScript entrypoints: @hraness/ghostget for plugin types and validators, @hraness/ghostget/client for saved reads and live calls, @hraness/ghostget/beeper for contact interactions without message bodies, @hraness/ghostget/apple-photos for local Photos contact evidence, @hraness/ghostget/whatsapp for the private export to TextButler, @hraness/ghostget/omni for normalized cross-provider reads, @hraness/ghostget/messaging for agentic route discovery and resolution, @hraness/ghostget/messaging-automation for the trusted owner host and its protocol types, @hraness/ghostget/contracts for checking a read-only collection plan against the installed actions before any provider is contacted, @hraness/ghostget/media-acquisition for temporary media acquisition and cleanup, and @hraness/ghostget/pdf-acquisition for signed-in PDF capture with optional typed native process supervision. Importing any of them starts nothing and makes no network request in Node or Bun; constructing an automation host requires Bun and explicit provider setup, and both acquisition helpers require Bun. Use ghostget messaging automation serve --stdio for built-in account and managed-permission enforcement. See the owner messaging guide before granting authority.
GhostGet developer resources
These are the current public GhostGet developer resources for the CLI, TypeScript SDK, Agent Skill, and provider plugin workflow. GhostGet does not publish a hosted API, OpenAPI description, OAuth developer portal, webhook catalog, or MCP server.
- Install the
@hraness/ghostgetCLI and TypeScript SDK from GitHub Releases - Install the GhostGet Agent Skill from skills.sh with
npx skills add hraness/ghostget#v0.19.0 - Capture URLs and create verified media archives
- Watch and download the first-capture demo
- Provider support reference
- Security model
- Author and verify provider plugins
- Source, issues, and release tags
- Plugin protocol guide for v0.19.0
- Agent site guide (llms.txt)