Install

Install Agent Sean

Three ways in. All of them provision on first run, never on npm install — there is no postinstall script, because npm 12+ disables those by default and a background job that touches your machine at install time is exactly the surprise this product refuses to be. Below: what each path writes, where it puts it, and how to take it all back out.

Node ≥ 22.19.0 sean doctor fails the check below this; older Node can't run the daemon.
Disk ~200 MB The package, plus Chromium only if a crawl needs to render JS.
Network Outbound only The daemon binds 127.0.0.1:7777. Nothing listens on a public interface.
Account None sean audit runs the full 425-check audit with no login and no keys.

Run it once with npx

The fastest way to try it. npx fetches the package into a temp directory, runs it, and leaves nothing installed.

$ npx agentsean

This drops you into the interactive onboard: it asks what site to work on, where it lives (WordPress, Shopify, a Git repo, Cloudflare, or other), and whether to connect Search Console. It provisions the files below and starts the daemon.

npx agentsean does not put a sean command on your PATH. npx resolves the package into a one-off temp folder and runs it there, so the next terminal that types sean doctor gets command not found. That's expected — it's how npx works, not a broken install. Sean detects it was launched through npx and prints commands as npx agentsean … back to you. For a permanent sean, install it globally.

Install the sean command globally

A global install gives you the short sean binary everywhere and is the right choice once you've decided to keep it.

$ npm i -g agentsean

Then the whole surface is available as sean <command>:

$ sean onboard

Still no postinstall. The package ships two bin names — sean and agentsean — and both provision on first run, never during npm i.

The curl installer

For a box where you'd rather not reach for npm. The script checks your Node version, installs the package, and runs onboard.

$ curl -fsSL https://raw.githubusercontent.com/seziro-team/agentsean/main/install/install.sh | sh

Piping a script to sh deserves a read first — the source is install/install.sh in the repo. It installs the same npm package the two commands above do; there is no separate binary.

Docker Compose

Runs the daemon in a container with its state on a named volume. The one thing you must supply is the auth token — the container exits rather than start without it, because an unauthenticated daemon that holds your CMS keys is the incident this whole product is built to avoid.

$ SEAN_AUTH_TOKEN="$(openssl rand -base64 32)" docker compose up

Your first run

However you installed, the first minutes look the same. Onboard runs automatically the first time; here is what it does, and how to drive it by hand.

  1. 1 Check the machine is ready

    $ sean doctor

    doctor is read-only and prints a check per line: your Node version, whether ~/.sean is writable and locked to mode 700, whether port 7777 is free, whether an auth token exists yet, whether the database and a Google grant are present, and whether Playwright is installed. Anything marked FAIL blocks a clean start; ! is a warning you can proceed past.

  2. 2 Connect a site

    Onboard asks for the URL and the platform. To connect Search Console — optional, but it's what turns crawl findings into ranked opportunities — Sean opens the local dashboard and walks you through Google's consent screen. The hosted OAuth broker never talks to your machine; the grant is stored locally.

    $ sean connect google

    No Google account? Skip it. sean audit https://your-site.com crawls and runs all 425 checks with zero credentials.

  3. 3 Let the first crawl run

    Sean crawls the site, runs the checks, and scores it. A small site (dozens of pages) finishes in seconds; the demo run on the home page shows 80 pages · 6s. Pages that need JavaScript to render trigger a one-time Chromium download the first time — after that it's cached.

  4. 4 The observe window

    New sites start in a 7-day observe-only period. Sean watches and proposes but writes nothing until it ends — the action validator vetoes every write with OBSERVE_PERIOD in the meantime. When you're ready to stop everything regardless, sean freeze halts all writes across every site and survives a restart.

What Agent Sean writes, and where

Everything the daemon owns lives under one directory: ~/.sean on macOS and Linux, or wherever SEAN_HOME points. It is created with permissions 700 (owner-only) and nothing is written outside it unless you explicitly install a service.

PathWhat it isWhen it appears
~/.sean/The home directory. Mode 700.First run of any command
~/.sean/sean.dbSQLite: crawl results, findings, the change ledger with before-snapshots.First crawl
~/.sean/daemon.pidThe running daemon's PID and port.On start
~/.sean/daemon.logDaemon stdout and stderr.On start
~/.sean/HALTThe freeze flag. Present means all writes are stopped.On sean freeze

The auth token is not in this directory as plaintext. It's stored through the OS credential store — Keychain on macOS, the Secret Service on Linux — with an encrypted-file fallback. doctor reports its length, never its value.

Run it as a service

To survive a reboot, install Sean as a user service. This is the one action that writes a file outside ~/.sean, so it is never a side effect of onboard or npm — it prints exactly what it will write and refuses to proceed without your confirmation (--yes, or typing yes at the prompt).

$ sean service install

Prefer to see the plan first without writing anything:

$ sean service status

What it writes depends on your OS. In every case the unit binds 127.0.0.1 only — the installer refuses to write a service that binds any other host.

A LaunchAgent, loaded with launchctl:

~/Library/LaunchAgents/dev.agentsean.plist

Runs at login, keeps the daemon alive, and logs to ~/.sean/daemon.log. Remove it with sean service uninstall, which runs launchctl unload and deletes the plist.

Upgrading

Check where you stand against a release channel:

$ sean update

It compares your version against the channel (stable by default; --channel extended-stable or --channel dev for the others) and, if you're behind, prints the exact command to move — a global reinstall pinned to the new version:

$ npm install -g agentsean@latest

An auto-update never runs while an Action is mid-flight — a fix in the middle of being written and verified is never interrupted by a version swap.

Uninstalling completely

One command stops the daemon, unwinds the service, and — by default — leaves your data alone:

$ sean uninstall

That stops Sean, removes the user service (the plist / unit / task from above), and tells you your history is still in ~/.sean. To erase everything it ever wrote, add --purge:

$ sean uninstall --purge

Then remove the package itself:

$ npm rm -g agentsean

Any diffs Sean wrote to your site are unaffected by uninstalling — they live in your CMS or Git history and remain reversible there. Uninstalling removes the engine, not its past work.

Troubleshooting the things that actually bite

PATH sean: command not found after npx

Expected. npx agentsean runs the package from a temp directory and never installs the sean binary. Either keep using npx agentsean <command>, or install once globally to get the short command:

$ npm i -g agentsean

If sean is still missing after a global install, your npm global bin directory isn't on PATH — npm bin -g prints it; add that to your shell profile.

Node "Node … is too old"

The daemon needs Node ≥ 22.19.0 and doctor fails closed below it. Check and upgrade:

$ node --version

Install a current Node from nodejs.org or via nvm. There is no compatibility shim for older runtimes — the code uses APIs that simply aren't there before 22.19.

Chromium The first JS-rendered crawl pauses to download

By design, Chromium is not fetched at install time. The first crawl that has to render JavaScript downloads it once (tens of MB), then caches it — doctor will show Playwright/Chromium not installed as a warning until then. If you never need JS rendering, you never pay for it; pass --no-js to audit to skip rendering entirely.

Port 127.0.0.1:7777 is already in use

doctor flags this as in use and no Sean pid file — something else holds the port. Point Sean at a different one:

$ sean start --port 7788

If it is a stale Sean, sean stop clears it. The port must be 1–65535; anything else is rejected before the socket opens.