Run it

Run it on your computer

On this page

You need Node.js 22 or later (with npm) and Git. Check with node --version; if it is older or missing, install Node 22 from nodejs.org, or with a version manager (nvm install 22, fnm install 22, or brew install node@22 on macOS). The global rer command itself needs that Node. It then provisions the checkout's own pinned Node and pnpm. Install dependencies, then start local setup:

npm install -g @runeditrun/rer@0.2.22
git clone https://github.com/just-every/run-happytohelp
cd run-happytohelp
rer install
rer dev

Dev uses its local address for the chat widget and generates a private owner password. Wait for RER_READY, then open the RER_OPEN address to enter as the real local owner and reach Setup. No private answers, email service or AI account are needed. Use rer dev --stop from the checkout to stop the managed app.

Scripted setup and command reference

rer setup --owner-email you@example.com --answers .seed/local-answers.json
rer dev --foreground

Prepare private answers as described in Install. Setup builds, applies local migrations, prepares the real first owner and stops its temporary app. Dev provides Vite assets and HMR and stays in the foreground with --foreground. It prints RER_READY URL after real health checks and RER_OPEN for entry as the local owner. Native password sign-in is retained. JSON and non-interactive commands never open a browser or ask stdin questions. Stop dev with Ctrl-C before:

rer verify
rer build
rer doctor
rer describe --json
rer check --profile first-party

Every new verb supports --help, --cwd PATH, --non-interactive and --json. Setup also accepts --owner-name, --port, --host and a private JSON --answers file using the installer model's names. Dev accepts --port and --host. Explicit ports never drift. Hosts are exactly 127.0.0.1, localhost or ::1. Setup rejects a conflicting saved owner or origin and preserves existing data and exact private settings.

rer reset --yes

Review reset's printed inventory first. It removes only canonical local state, installer state, CLI bookkeeping and declared generated settings. Source, dependencies, exports and deployment receipts survive. Active operations, symlinks and ambiguous legacy state cause a refusal. A second reset succeeds. A subsequent setup creates a fresh owner without previous domain rows.

Stop dev, then use rer export --output exports/installation.rer. The new private archive includes supported domain tables with an integrity hash and explicit exclusions. After rer reset --yes, restore with rer import --input exports/installation.rer --yes. Import validates the archive and restores atomically into an empty destination. Run setup afterwards to re-enter local configuration. Native identities/password hashes are retained; sessions, one-use links, private settings and transient execution state are excluded. Remote transfer exits 4.

Setup uses the shared manifest reader and browser installer model. Private answers use the declared rer-setup.json field names.

rer deploy --dry-run

With rer 0.2.22, supply the same private EMAIL_PROVIDER, EMAIL_FROM and EMAIL_API_KEY inputs for dry run and real deployment, as described in Operations. Dry run validates the input shape, real deployment declaration and build locally; no deployment occurs, no provider request is made and no mail is sent. Real rer deploy requires the documented owner-account credentials, committed source and real mail configuration in deploy.json; it provisions, migrates and checks health through Base deploy-kit. The default environment is production; choose one with --environment NAME. Local fixture tests do not establish provider acceptance. Release uses the unchanged Base producer and its existing required --repo and --output arguments, plus explicit --project/--repository where applicable. It never pushes or deploys.

Exit codes: 0 success/help; 1 execution, health or check failure; 2 invocation or syntax error; 3 missing input/tool/configuration; 4 safety or unsupported capability; 130/143 cancellation after owned cleanup. JSON is NDJSON with version 1, verb and event; bounded commands finish with one result containing ok and exitCode. Describe is one inspection object. Release retains its existing JSON receipt and 0/1/2 exits.

Independent projects may use OPERATIONS v2 with their own argv and inputs, without packages, editions, pnpm, this stack, an installer or these pins. Execution uses shell false, consumes wrapper flags before -- and forwards its remaining argv unchanged. Missing commands are refusals, with no inferred fallback. Declared child exits are preserved. Check validates structure; doctor inspects the local environment. Neither establishes remote or application acceptance.

Fixed preview and bounded serving

After the pinned Node 22.20.0 / pnpm 10.12.4 frozen installation and ordinary rer setup, inspect production output with:

rer preview
# In another terminal:
rer preview --stop
rer dev --idle-timeout 1800 --foreground
rer dev --stop

Use preview for fixed production output; use dev for live edits and HMR. Preview reuses an intact build only when the actual public inputs and output bytes match its nonsecret receipt. Neither mode resets the saved owner or .wrangler/state. Dev prints the private RER_OPEN address for automatic owner entry. Preview serves production output and prints its ready app address; sign in with the existing native password. Preview has no automatic dev identity or local email viewer. The same checkout has one managed instance. A compatible duplicate prints its URL, while another mode or explicit conflicting option refuses with exit 4 and its stop instruction.

Idle timeout precedence is --idle-timeout, RER_SERVER_IDLE_SECONDS, then 43200 seconds (12 hours). Positive integer seconds only. Application HTTP/assets activity resets the timer, active streams prevent expiry, and internal probes or HMR control traffic alone do not keep the app alive. Real application WebSocket messages count. --stop is idempotent and cannot take start flags.

The OS user's ~/.rer/servers registry (RER_SERVERS_DIR override) admits two combined dev/preview instances by default (RER_SERVER_LIMIT, positive integer). Starting instances count. At capacity, the oldest server with no active work and at least 60 seconds idle is stopped; otherwise the command lists safe URLs and stop instructions and refuses. Worktrees are distinct; symlink aliases are one checkout. Stops clean up owned descendants before freeing capacity/state.

Heavy bounded work joins ~/.rer/jobs; waiting commands report their live queue position. Package mode has no queue status command. Labels identify project, initiating command/phase and checkout. Nested jobs share only validated live membership. Original CI=true skips admission and permits heavy-command --no-queue; ordinary calls and CI=false queue. Help/check/describe/doctor, stop and reset inspection remain light. Use rer install for dependencies and rer deploy for deployment.

Contributor setup

For source work, select Node 22.20.0 and pnpm 10.12.4, then run pnpm install --frozen-lockfile. See contributor setup.

Edit this page on GitHub